All of lore.kernel.org
 help / color / mirror / Atom feed
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) &regs->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


  parent reply	other threads:[~2026-07-15 13:39 UTC|newest]

Thread overview: 6+ 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 14:04   ` sashiko-bot
2026-07-15 13:38 ` Sven Schnelle [this message]
2026-07-15 13:59   ` [PATCH 2/2] s390/syscall: Keep syscall number " Heiko Carstens
2026-07-15 14:10   ` sashiko-bot

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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.