From: Sven Schnelle <svens@linux.ibm.com>
To: Heiko Carstens <hca@linux.ibm.com>,
Vasily Gorbik <gor@linux.ibm.com>,
Alexander Gordeev <agordeev@linux.ibm.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>,
"Thomas Gleixner" <tglx@kernel.org>,
"Christian Borntraeger" <borntraeger@linux.ibm.com>,
"Michal Suchánek" <msuchanek@suse.de>,
"Peter Zijlstra" <peterz@infradead.org>,
linux-s390@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH 2/2] s390/syscall: Keep syscall number in extra ptregs member
Date: Wed, 15 Jul 2026 15:38:30 +0200 [thread overview]
Message-ID: <20260715133830.2619853-3-svens@linux.ibm.com> (raw)
In-Reply-To: <20260715133830.2619853-1-svens@linux.ibm.com>
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@linux.ibm.com>
---
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/include/asm/ptrace.h b/arch/s390/include/asm/ptrace.h
index f39b349da9a7..2edc85ddcba8 100644
--- a/arch/s390/include/asm/ptrace.h
+++ b/arch/s390/include/asm/ptrace.h
@@ -130,7 +130,7 @@ struct pt_regs {
unsigned long int_parm_long;
};
struct {
- unsigned long __unused;
+ unsigned long syscall_nr;
unsigned long syscall_ret;
};
struct tpi_info tpi_info;
diff --git a/arch/s390/include/asm/syscall.h b/arch/s390/include/asm/syscall.h
index 22b6ed20a9ae..abb0d4348912 100644
--- a/arch/s390/include/asm/syscall.h
+++ b/arch/s390/include/asm/syscall.h
@@ -14,13 +14,15 @@
#include <linux/err.h>
#include <asm/ptrace.h>
+#define SVC_LEN 2
extern const sys_call_ptr_t sys_call_table[];
static inline long syscall_get_nr(struct task_struct *task,
struct pt_regs *regs)
{
- return test_pt_regs_flag(regs, PIF_SYSCALL) ?
- (regs->int_code & 0xffff) : -1;
+ if (!test_pt_regs_flag(regs, PIF_SYSCALL))
+ return -1;
+ return regs->syscall_nr;
}
static inline void syscall_set_nr(struct task_struct *task,
@@ -32,7 +34,7 @@ static inline void syscall_set_nr(struct task_struct *task,
* the target task is stopped for tracing on entering syscall, so
* there is no need to have the same check syscall_get_nr() has.
*/
- regs->int_code = (regs->int_code & ~0xffff) | (nr & 0xffff);
+ regs->syscall_nr = nr;
}
static inline void syscall_rollback(struct task_struct *task,
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;
}
*(addr_t *)((addr_t) ®s->psw + addr) = data;
} else if (addr < offsetof(struct user, regs.orig_gpr2)) {
diff --git a/arch/s390/kernel/signal.c b/arch/s390/kernel/signal.c
index 4874de5edea0..c3c69294ff33 100644
--- a/arch/s390/kernel/signal.c
+++ b/arch/s390/kernel/signal.c
@@ -447,12 +447,12 @@ void arch_do_signal_or_restart(struct pt_regs *regs)
* call information.
*/
current->thread.system_call =
- test_pt_regs_flag(regs, PIF_SYSCALL) ? regs->int_code : 0;
+ test_pt_regs_flag(regs, PIF_SYSCALL) ? regs->syscall_nr : 0;
if (get_signal(&ksig)) {
/* Whee! Actually deliver the signal. */
if (current->thread.system_call) {
- regs->int_code = current->thread.system_call;
+ regs->syscall_nr = current->thread.system_call;
/* Check for system call restarting. */
switch (regs->gprs[2]) {
case -ERESTART_RESTARTBLOCK:
@@ -467,9 +467,7 @@ void arch_do_signal_or_restart(struct pt_regs *regs)
fallthrough;
case -ERESTARTNOINTR:
regs->gprs[2] = regs->orig_gpr2;
- regs->psw.addr =
- __rewind_psw(regs->psw,
- regs->int_code >> 16);
+ regs->psw.addr = __rewind_psw(regs->psw, SVC_LEN);
break;
}
}
@@ -484,7 +482,7 @@ void arch_do_signal_or_restart(struct pt_regs *regs)
/* No handlers present - check for system call restart */
clear_pt_regs_flag(regs, PIF_SYSCALL);
if (current->thread.system_call) {
- regs->int_code = current->thread.system_call;
+ regs->syscall_nr = current->thread.system_call;
switch (regs->gprs[2]) {
case -ERESTART_RESTARTBLOCK:
/* Restart with sys_restart_syscall */
@@ -498,7 +496,7 @@ void arch_do_signal_or_restart(struct pt_regs *regs)
case -ERESTARTSYS:
case -ERESTARTNOINTR:
regs->gprs[2] = regs->orig_gpr2;
- regs->psw.addr = __rewind_psw(regs->psw, regs->int_code >> 16);
+ regs->psw.addr = __rewind_psw(regs->psw, SVC_LEN);
if (test_thread_flag(TIF_SINGLE_STEP))
clear_thread_flag(TIF_PER_TRAP);
break;
diff --git a/arch/s390/kernel/syscall.c b/arch/s390/kernel/syscall.c
index ce244dceec6d..62e283ffef37 100644
--- a/arch/s390/kernel/syscall.c
+++ b/arch/s390/kernel/syscall.c
@@ -100,7 +100,10 @@ void noinstr __do_syscall(struct pt_regs *regs, int per_trap)
enter_from_user_mode(regs);
add_random_kstack_offset();
regs->psw = get_lowcore()->svc_old_psw;
- regs->int_code = get_lowcore()->svc_int_code;
+ nr = get_lowcore()->svc_int_code & 0xffff;
+ if (likely(!nr))
+ nr = regs->gprs[1];
+ regs->syscall_nr = nr;
update_timer_sys();
if (cpu_has_bear())
current->thread.last_break = regs->last_break;
@@ -110,12 +113,6 @@ void noinstr __do_syscall(struct pt_regs *regs, int per_trap)
set_thread_flag(TIF_PER_TRAP);
regs->flags = 0;
set_pt_regs_flag(regs, PIF_SYSCALL);
- nr = regs->int_code & 0xffff;
- if (likely(!nr)) {
- nr = regs->gprs[1] & 0xffff;
- regs->int_code &= ~0xffffUL;
- regs->int_code |= nr;
- }
regs->gprs[2] = nr;
regs->syscall_ret = -ENOSYS;
if (nr == __NR_restart_syscall && !(current->restart_block.arch_data & 1)) {
--
2.53.0
next prev parent reply other threads:[~2026-07-15 13:39 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-15 13:38 [PATCH RFC 0/2] s390: keep syscall number / return value in separate pt_regs members Sven Schnelle
2026-07-15 13:38 ` [PATCH 1/2] s390/syscall: Keep syscall return in extra ptregs member Sven Schnelle
2026-07-15 13:38 ` Sven Schnelle [this message]
2026-07-15 13:59 ` [PATCH 2/2] s390/syscall: Keep syscall number " Heiko Carstens
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260715133830.2619853-3-svens@linux.ibm.com \
--to=svens@linux.ibm.com \
--cc=agordeev@linux.ibm.com \
--cc=borntraeger@linux.ibm.com \
--cc=gor@linux.ibm.com \
--cc=hca@linux.ibm.com \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=msuchanek@suse.de \
--cc=peterz@infradead.org \
--cc=tglx@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome