linux/arch/mips
Dmitry V. Levin 733a90561a MIPS: fix mips_get_syscall_arg() for o32
This makes ptrace/get_syscall_info selftest pass on mips o32 and
mips64 o32 by fixing the following two test assertions:

1. get_syscall_info test assertion on mips o32:
  # get_syscall_info.c:218:get_syscall_info:Expected exp_args[5] (3134521044) == info.entry.args[4] (4911432)
  # get_syscall_info.c:219:get_syscall_info:wait #1: entry stop mismatch

2. get_syscall_info test assertion on mips64 o32:
  # get_syscall_info.c:209:get_syscall_info:Expected exp_args[2] (3134324433) == info.entry.args[1] (18446744072548908753)
  # get_syscall_info.c:210:get_syscall_info:wait #1: entry stop mismatch

The first assertion happens due to mips_get_syscall_arg() trying to access
another task's context but failing to do it properly because get_user() it
calls just peeks at the current task's context.  It usually does not crash
because the default user stack always gets assigned the same VMA, but it
is pure luck which mips_get_syscall_arg() wouldn't have if e.g. the stack
was switched (via setcontext(3) or however) or a non-default process's
thread peeked at, and in any case irrelevant data is obtained just as
observed with the test case.

mips_get_syscall_arg() ought to be using access_remote_vm() instead to
retrieve the other task's stack contents, but given that the data has been
already obtained and saved in `struct pt_regs' it would be an overkill.

The first assertion is fixed for mips o32 by using struct pt_regs.args
instead of get_user() to obtain syscall arguments.  This approach works
due to this piece in arch/mips/kernel/scall32-o32.S:

        /*
         * Ok, copy the args from the luser stack to the kernel stack.
         */

        .set    push
        .set    noreorder
        .set    nomacro

    load_a4: user_lw(t5, 16(t0))		# argument #5 from usp
    load_a5: user_lw(t6, 20(t0))		# argument #6 from usp
    load_a6: user_lw(t7, 24(t0))		# argument #7 from usp
    load_a7: user_lw(t8, 28(t0))		# argument #8 from usp
    loads_done:

        sw	t5, PT_ARG4(sp)		# argument #5 to ksp
        sw	t6, PT_ARG5(sp)		# argument #6 to ksp
        sw	t7, PT_ARG6(sp)		# argument #7 to ksp
        sw	t8, PT_ARG7(sp)		# argument #8 to ksp
        .set	pop

        .section __ex_table,"a"
        PTR_WD	load_a4, bad_stack_a4
        PTR_WD	load_a5, bad_stack_a5
        PTR_WD	load_a6, bad_stack_a6
        PTR_WD	load_a7, bad_stack_a7
        .previous

arch/mips/kernel/scall64-o32.S has analogous code for mips64 o32 that
allows fixing the issue by obtaining syscall arguments from struct
pt_regs.regs[4..11] instead of the erroneous use of get_user().

The second assertion is fixed by truncating 64-bit values to 32-bit
syscall arguments.

Fixes: c0ff3c53d4 ("MIPS: Enable HAVE_ARCH_TRACEHOOK.")
Signed-off-by: Dmitry V. Levin <ldv@strace.io>
Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
2025-02-13 12:41:29 +01:00
..
alchemy
ath25
ath79
bcm47xx
bcm63xx
bmips
boot Char/Misc/IIO driver updates for 6.14-rc1 2025-01-27 16:51:51 -08:00
cavium-octeon
cobalt
configs This update includes the following changes: 2025-01-24 07:48:10 -08:00
crypto mips/crc32: expose CRC32 functions through lib 2024-12-01 17:23:01 -08:00
dec
fw
generic
include MIPS: fix mips_get_syscall_arg() for o32 2025-02-13 12:41:29 +01:00
ingenic
jazz
kernel MIPS: Export syscall stack arguments properly for remote use 2025-02-13 12:41:18 +01:00
kvm KVM: MIPS: Use kvm_faultin_pfn() to map pfns into the guest 2024-10-25 13:00:49 -04:00
lantiq
lib mips/crc32: expose CRC32 functions through lib 2024-12-01 17:23:01 -08:00
loongson2ef
loongson32
loongson64 MIPS: Loongson64: env: Use str_on_off() helper in prom_lefi_init_env() 2025-01-20 20:27:54 +01:00
math-emu mips/math-emu: fix emulation of the prefx instruction 2025-01-11 12:49:05 +01:00
mm asm-generic: pgalloc: provide generic __pgd_{alloc,free} 2025-01-25 20:22:24 -08:00
mobileye
mti-malta
n64
net
pci Cleanups and fixes 2025-01-27 09:00:25 -08:00
pic32
power
ralink clocksource/drivers/ralink: Add Ralink System Tick Counter driver 2024-11-13 13:49:33 +01:00
rb532
sgi-ip22 mips: sgi-ip22: Replace "s[n]?printf" with sysfs_emit in sysfs callbacks 2024-10-30 23:45:17 +01:00
sgi-ip27
sgi-ip30
sgi-ip32
sibyte
sni
tools
txx9
vdso MIPS: vdso: Avoid name conflict around "vdso_data" 2024-11-02 12:37:33 +01:00
Kbuild
Kbuild.platforms
Kconfig Cleanups and fixes 2025-01-27 09:00:25 -08:00
Kconfig.debug
Makefile MIPS: migrate to generic rule for built-in DTBs 2025-01-11 13:53:42 +01:00
Makefile.postlink