[PATCH 1/2] ipipe: Introduce and use ipipe_root_nr_syscalls

Jan Kiszka jan.kiszka at siemens.com
Thu Jan 31 18:01:00 CET 2019


From: Jan Kiszka <jan.kiszka at siemens.com>

At least one arch, infamous x86, has a difference of NR_syscalls
depending on compat vs. native ABI. Account for that by introducing a
function that can deliver the currently valid syscall number if an arch
implements such a service. In all other cases, this change is
functionally no difference.

Signed-off-by: Jan Kiszka <jan.kiszka at siemens.com>
---

Not sure if this should rather go into linux/ipipe.h.

 include/linux/ipipe_base.h | 4 ++++
 kernel/ipipe/core.c        | 5 +++--
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/include/linux/ipipe_base.h b/include/linux/ipipe_base.h
index a59e1d19eb40..62ae60209199 100644
--- a/include/linux/ipipe_base.h
+++ b/include/linux/ipipe_base.h
@@ -194,6 +194,10 @@ int __ipipe_notify_user_intreturn(void);
 
 #define __ipipe_serial_debug(__fmt, __args...)	raw_printk(__fmt, ##__args)
 
+#ifndef ipipe_root_nr_syscalls
+#define ipipe_root_nr_syscalls(ti)	NR_syscalls
+#endif
+
 #else /* !CONFIG_IPIPE */
 
 struct task_struct;
diff --git a/kernel/ipipe/core.c b/kernel/ipipe/core.c
index 4d61c0e57ba1..bc4eeb98f942 100644
--- a/kernel/ipipe/core.c
+++ b/kernel/ipipe/core.c
@@ -1018,6 +1018,7 @@ int ipipe_handle_syscall(struct thread_info *ti,
 			 unsigned long nr, struct pt_regs *regs)
 {
 	unsigned long local_flags = READ_ONCE(ti->ipipe_flags);
+	unsigned int nr_syscalls = ipipe_root_nr_syscalls(ti);
 	int ret;
 
 	/*
@@ -1051,7 +1052,7 @@ int ipipe_handle_syscall(struct thread_info *ti,
 	 * system call handler.
 	 */
 
-	if (nr >= NR_syscalls && (local_flags & _TIP_HEAD)) {
+	if (nr >= nr_syscalls && (local_flags & _TIP_HEAD)) {
 		ipipe_fastcall_hook(regs);
 		local_flags = READ_ONCE(ti->ipipe_flags);
 		if (local_flags & _TIP_HEAD) {
@@ -1064,7 +1065,7 @@ int ipipe_handle_syscall(struct thread_info *ti,
 		}
 	}
 
-	if ((local_flags & _TIP_NOTIFY) || nr >= NR_syscalls) {
+	if ((local_flags & _TIP_NOTIFY) || nr >= nr_syscalls) {
 		ret =__ipipe_notify_syscall(regs);
 		local_flags = READ_ONCE(ti->ipipe_flags);
 		if (local_flags & _TIP_HEAD)
-- 
2.16.4



More information about the Xenomai mailing list