linux/arch/mips/kernel
Maciej W. Rozycki ed975485a1 MIPS: Export syscall stack arguments properly for remote use
We have several places across the kernel where we want to access another
task's syscall arguments, such as ptrace(2), seccomp(2), etc., by making
a call to syscall_get_arguments().

This works for register arguments right away by accessing the task's
`regs' member of `struct pt_regs', however for stack arguments seen with
32-bit/o32 kernels things are more complicated.  Technically they ought
to be obtained from the user stack with calls to an access_remote_vm(),
but we have an easier way available already.

So as to be able to access syscall stack arguments as regular function
arguments following the MIPS calling convention we copy them over from
the user stack to the kernel stack in arch/mips/kernel/scall32-o32.S, in
handle_sys(), to the current stack frame's outgoing argument space at
the top of the stack, which is where the handler called expects to see
its incoming arguments.  This area is also pointed at by the `pt_regs'
pointer obtained by task_pt_regs().

Make the o32 stack argument space a proper member of `struct pt_regs'
then, by renaming the existing member from `pad0' to `args' and using
generated offsets to access the space.  No functional change though.

With the change in place the o32 kernel stack frame layout at the entry
to a syscall handler invoked by handle_sys() is therefore as follows:

$sp + 68 -> |         ...         | <- pt_regs.regs[9]
            +---------------------+
$sp + 64 -> |         $t0         | <- pt_regs.regs[8]
            +---------------------+
$sp + 60 -> |   $a3/argument #4   | <- pt_regs.regs[7]
            +---------------------+
$sp + 56 -> |   $a2/argument #3   | <- pt_regs.regs[6]
            +---------------------+
$sp + 52 -> |   $a1/argument #2   | <- pt_regs.regs[5]
            +---------------------+
$sp + 48 -> |   $a0/argument #1   | <- pt_regs.regs[4]
            +---------------------+
$sp + 44 -> |         $v1         | <- pt_regs.regs[3]
            +---------------------+
$sp + 40 -> |         $v0         | <- pt_regs.regs[2]
            +---------------------+
$sp + 36 -> |         $at         | <- pt_regs.regs[1]
            +---------------------+
$sp + 32 -> |        $zero        | <- pt_regs.regs[0]
            +---------------------+
$sp + 28 -> |  stack argument #8  | <- pt_regs.args[7]
            +---------------------+
$sp + 24 -> |  stack argument #7  | <- pt_regs.args[6]
            +---------------------+
$sp + 20 -> |  stack argument #6  | <- pt_regs.args[5]
            +---------------------+
$sp + 16 -> |  stack argument #5  | <- pt_regs.args[4]
            +---------------------+
$sp + 12 -> | psABI space for $a3 | <- pt_regs.args[3]
            +---------------------+
$sp +  8 -> | psABI space for $a2 | <- pt_regs.args[2]
            +---------------------+
$sp +  4 -> | psABI space for $a1 | <- pt_regs.args[1]
            +---------------------+
$sp +  0 -> | psABI space for $a0 | <- pt_regs.args[0]
            +---------------------+

holding user data received and with the first 4 frame slots reserved by
the psABI for the compiler to spill the incoming arguments from $a0-$a3
registers (which it sometimes does according to its needs) and the next
4 frame slots designated by the psABI for any stack function arguments
that follow.  This data is also available for other tasks to peek/poke
at as reqired and where permitted.

Signed-off-by: Maciej W. Rozycki <macro@orcam.me.uk>
Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
2025-02-13 12:41:18 +01:00
..
syscalls Revert "mips: fix shmctl/semctl/msgctl syscall for o32" 2025-01-31 09:28:38 +01:00
.gitignore
Makefile
access-helper.h
asm-offsets.c MIPS: Export syscall stack arguments properly for remote use 2025-02-13 12:41:18 +01:00
bmips_5xxx_init.S
bmips_vec.S
branch.c
cacheinfo.c
cevt-bcm1480.c MIPS: Fix the wrong format specifier 2025-01-11 12:33:01 +01:00
cevt-ds1287.c
cevt-gt641xx.c
cevt-r4k.c MIPS: cevt-r4k: Don't call get_c0_compare_int if timer irq is installed 2024-08-20 10:36:52 +02:00
cevt-sb1250.c
cevt-txx9.c
cmpxchg.c MIPS: export __cmpxchg_small() 2024-10-23 18:10:24 +02:00
cps-vec-ns16550.S
cps-vec.S
cpu-probe.c
cpu-r3k-probe.c
crash.c
crash_dump.c
csrc-bcm1480.c
csrc-ioasic.c
csrc-r4k.c Revert "MIPS: csrc-r4k: Apply verification clocksource flags" 2024-08-25 15:26:30 -07:00
csrc-sb1250.c
early_printk.c
early_printk_8250.c
elf.c
entry.S
fpu-probe.c
fpu-probe.h
ftrace.c MIPS: ftrace: Declare ftrace_get_parent_ra_addr() as static 2025-01-11 12:37:05 +01:00
genex.S
gpio_txx9.c
head.S MIPS: Add a blank line after __HEAD 2025-01-11 12:32:12 +01:00
i8253.c
idle.c
irq-gt641xx.c
irq-msc01.c
irq.c
irq_txx9.c
jump_label.c
kgdb.c
kprobes.c
linux32.c
machine_kexec.c
mcount.S
mips-cm.c
mips-cpc.c
mips-mt-fpaff.c
mips-mt.c MIPS: kernel: Rename read/write_c0_ecc to read/writec0_errctl 2025-01-11 12:31:21 +01:00
mips-r2-to-r6-emul.c
module.c
octeon_switch.S
perf_event.c
perf_event_mipsxx.c
perf_regs.c
pm-cps.c
pm.c
probes-common.h
proc.c MIPS: kernel: proc: Use str_yes_no() helper function 2024-11-12 15:46:20 +01:00
process.c
prom.c of/fdt: add dt_phys arg to early_init_dt_scan and early_init_dt_verify 2024-10-29 15:32:45 -05:00
ptrace.c
ptrace32.c
r4k-bugs64.c
r4k_fpu.S
r4k_switch.S
r2300_fpu.S
r2300_switch.S
relocate.c of/fdt: add dt_phys arg to early_init_dt_scan and early_init_dt_verify 2024-10-29 15:32:45 -05:00
relocate_kernel.S
reset.c
rtlx-mt.c
rtlx.c
scall32-o32.S MIPS: Export syscall stack arguments properly for remote use 2025-02-13 12:41:18 +01:00
scall64-n32.S
scall64-n64.S
scall64-o32.S
segment.c
setup.c mm/memblock: add memblock_alloc_or_panic interface 2025-01-25 20:22:38 -08:00
signal-common.h
signal.c
signal32.c
signal_n32.c
signal_o32.c
smp-bmips.c
smp-cps.c MIPS: Allow using more than 32-bit addresses for reset vectors when possible 2024-10-30 23:45:48 +01:00
smp-mt.c
smp-up.c
smp.c smp: Mark smp_prepare_boot_cpu() __init 2024-09-08 16:01:10 +02:00
spinlock_test.c
spram.c MIPS: kernel: Rename read/write_c0_ecc to read/writec0_errctl 2025-01-11 12:31:21 +01:00
stacktrace.c
sync-r4k.c
syscall.c
sysrq.c
time.c
topology.c
traps.c MIPS: traps: Use str_enabled_disabled() in parity_protection_init() 2025-01-11 12:38:54 +01:00
unaligned.c
uprobes.c
vdso.c mips: vdso: prefer do_mmap() to mmap_region() 2025-01-25 20:22:37 -08:00
vmlinux.lds.S MIPS: Place __kernel_entry at the beginning of text section 2024-11-27 09:36:01 +09:00
vpe-mt.c
vpe.c
watch.c