Re: [PATCH 2/2] s390/syscall: Keep syscall number in extra ptregs member

From: Heiko Carstens

Date: Wed Jul 15 2026 - 10:08:09 EST


On Wed, Jul 15, 2026 at 03:38:30PM +0200, Sven Schnelle wrote:
> Move the syscall number from ptregs::int_code to another union member
> called syscall_nr. This simplifies the code a bit.
>
> Signed-off-by: Sven Schnelle <svens@xxxxxxxxxxxxx>
> ---
> arch/s390/include/asm/ptrace.h | 2 +-
> arch/s390/include/asm/syscall.h | 8 +++++---
> arch/s390/kernel/ptrace.c | 2 +-
> arch/s390/kernel/signal.c | 12 +++++-------
> arch/s390/kernel/syscall.c | 11 ++++-------
> 5 files changed, 16 insertions(+), 19 deletions(-)

...

> diff --git a/arch/s390/kernel/ptrace.c b/arch/s390/kernel/ptrace.c
> index 125ca4c4e30c..00e825d01504 100644
> --- a/arch/s390/kernel/ptrace.c
> +++ b/arch/s390/kernel/ptrace.c
> @@ -349,7 +349,7 @@ static int __poke_user(struct task_struct *child, addr_t addr, addr_t data)
> addr == offsetof(struct user, regs.gprs[2])) {
> struct pt_regs *regs = task_pt_regs(child);
>
> - regs->int_code = 0x20000 | (data & 0xffff);
> + regs->syscall_nr = data;

This breaks peek_user(). So handling for that needs to be added too.

> - regs->psw.addr =
> - __rewind_psw(regs->psw,
> - regs->int_code >> 16);
> + regs->psw.addr = __rewind_psw(regs->psw, SVC_LEN);

Why? This is unrelated to what you want to achieve, and it is broken
if the svc instruction is executed via exrl. Plus, let's not use
hardcoded instruction lengths if the CPU provides you the correct
length anyway.

Besides that it _seems_ to be ok. :)