From nobody Mon Feb 9 07:52:05 2026 Received: from angie.orcam.me.uk (angie.orcam.me.uk [78.133.224.34]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 57FDB1E231F; Tue, 11 Feb 2025 18:22:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=78.133.224.34 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739298161; cv=none; b=sNoil1LNL+eztQfr286x9xrR0Qz3gRx2+Cl93vH+JzG9+3I9PjPeAlmSyyOEaJVuSAPMH427UfygxSHyTWjc9skP1qIf4xfaKl0nXBtJQJQwbP3Knyr2l/TrECF1W3CKFnLR99GQ0lR8o4w7gFfpS4la0H+nL2KmNaYIq9vpzws= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1739298161; c=relaxed/simple; bh=7dkQibdUy+NOc+u9G1470iGJGOPpU8BL2cSrqAQbM30=; h=Date:From:To:cc:Subject:Message-ID:MIME-Version:Content-Type; b=TGG/75aIYVHqIpcJASfVKgDK/WdLHUSXgGI114soiIuuCu0qxiLGlIknDRAHNvdLnOQEv/pvhH+RvnDV6104+xrPNx/10xBD9+KDpAQ1TT/hMtqleD9qB7xKSTMCXYGEHNy8dKR9hLpAGB1bsgMr+iUf6yXEArcKgaAkXw+Yg/k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=orcam.me.uk; spf=none smtp.mailfrom=orcam.me.uk; arc=none smtp.client-ip=78.133.224.34 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=orcam.me.uk Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=orcam.me.uk Received: by angie.orcam.me.uk (Postfix, from userid 500) id EF5F492009C; Tue, 11 Feb 2025 19:22:30 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by angie.orcam.me.uk (Postfix) with ESMTP id EAABA92009B; Tue, 11 Feb 2025 18:22:30 +0000 (GMT) Date: Tue, 11 Feb 2025 18:22:30 +0000 (GMT) From: "Maciej W. Rozycki" To: Thomas Bogendoerfer , Oleg Nesterov , "Dmitry V. Levin" cc: Jiaxun Yang , linux-mips@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH] MIPS: Export syscall stack arguments properly for remote use Message-ID: User-Agent: Alpine 2.21 (DEB 202 2017-01-01) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" We have several places across the kernel where we want to access another=20 task's syscall arguments, such as ptrace(2), seccomp(2), etc., by making=20 a call to syscall_get_arguments(). This works for register arguments right away by accessing the task's=20 `regs' member of `struct pt_regs', however for stack arguments seen with=20 32-bit/o32 kernels things are more complicated. Technically they ought=20 to be obtained from the user stack with calls to an access_remote_vm(),=20 but we have an easier way available already. So as to be able to access syscall stack arguments as regular function=20 arguments following the MIPS calling convention we copy them over from=20 the user stack to the kernel stack in arch/mips/kernel/scall32-o32.S, in=20 handle_sys(), to the current stack frame's outgoing argument space at=20 the top of the stack, which is where the handler called expects to see=20 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'=20 then, by renaming the existing member from `pad0' to `args' and using=20 generated offsets to access the space. No functional change though. With the change in place the o32 kernel stack frame layout at the entry=20 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=20 the psABI for the compiler to spill the incoming arguments from $a0-$a3=20 registers (which it sometimes does according to its needs) and the next=20 4 frame slots designated by the psABI for any stack function arguments=20 that follow. This data is also available for other tasks to peek/poke=20 at as reqired and where permitted. Signed-off-by: Maciej W. Rozycki --- arch/mips/include/asm/ptrace.h | 4 ++-- arch/mips/kernel/asm-offsets.c | 6 ++++++ arch/mips/kernel/scall32-o32.S | 8 ++++---- 3 files changed, 12 insertions(+), 6 deletions(-) linux-mips-scall32-o32-pt-regs-args.diff Index: linux-malta/arch/mips/include/asm/ptrace.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- linux-malta.orig/arch/mips/include/asm/ptrace.h +++ linux-malta/arch/mips/include/asm/ptrace.h @@ -27,8 +27,8 @@ */ struct pt_regs { #ifdef CONFIG_32BIT - /* Pad bytes for argument save space on the stack. */ - unsigned long pad0[8]; + /* Saved syscall stack arguments; entries 0-3 unused. */ + unsigned long args[8]; #endif =20 /* Saved main processor registers. */ Index: linux-malta/arch/mips/kernel/asm-offsets.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- linux-malta.orig/arch/mips/kernel/asm-offsets.c +++ linux-malta/arch/mips/kernel/asm-offsets.c @@ -27,6 +27,12 @@ void output_ptreg_defines(void) { COMMENT("MIPS pt_regs offsets."); +#ifdef CONFIG_32BIT + OFFSET(PT_ARG4, pt_regs, args[4]); + OFFSET(PT_ARG5, pt_regs, args[5]); + OFFSET(PT_ARG6, pt_regs, args[6]); + OFFSET(PT_ARG7, pt_regs, args[7]); +#endif OFFSET(PT_R0, pt_regs, regs[0]); OFFSET(PT_R1, pt_regs, regs[1]); OFFSET(PT_R2, pt_regs, regs[2]); Index: linux-malta/arch/mips/kernel/scall32-o32.S =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- linux-malta.orig/arch/mips/kernel/scall32-o32.S +++ linux-malta/arch/mips/kernel/scall32-o32.S @@ -64,10 +64,10 @@ load_a6: user_lw(t7, 24(t0)) # argument load_a7: user_lw(t8, 28(t0)) # argument #8 from usp loads_done: =20 - sw t5, 16(sp) # argument #5 to ksp - sw t6, 20(sp) # argument #6 to ksp - sw t7, 24(sp) # argument #7 to ksp - sw t8, 28(sp) # argument #8 to ksp + 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 =20 .section __ex_table,"a"