path: root/arch/s390/include
diff options
authorHeiko Carstens <heiko.carstens@de.ibm.com>2019-01-21 09:30:44 (GMT)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2019-01-23 11:38:07 (GMT)
commitfb8bfca06cbc8280976ea751501767ae1f37dff5 (patch)
treea58c7e0d13463e2cbe80a0db3ba2d36d9003b0a7 /arch/s390/include
parent90856087daca92bf1de820885ef4441613bf8e21 (diff)
s390: fix system call tracing
When converting to autogenerated compat syscall wrappers all system call entry points got a different symbol name: they all got a __s390x_ prefix. This caused breakage with system call tracing, since an appropriate arch_syscall_match_sym_name() was not provided. Add this function, and while at it also add code to avoid compat system call tracing. s390 has different system call tables for native 64 bit system calls and compat system calls. This isn't really supported in the common code. However there are hardly any compat binaries left, therefore just ignore compat system calls, like x86 and arm64 also do for the same reason. Fixes: aa0d6e70d3b3 ("s390: autogenerate compat syscall wrappers") Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390/include')
1 files changed, 25 insertions, 0 deletions
diff --git a/arch/s390/include/asm/ftrace.h b/arch/s390/include/asm/ftrace.h
index 8ea270f..5a3c95b 100644
--- a/arch/s390/include/asm/ftrace.h
+++ b/arch/s390/include/asm/ftrace.h
@@ -81,5 +81,30 @@ static inline void ftrace_generate_call_insn(struct ftrace_insn *insn,
+ * Even though the system call numbers are identical for s390/s390x a
+ * different system call table is used for compat tasks. This may lead
+ * to e.g. incorrect or missing trace event sysfs files.
+ * Therefore simply do not trace compat system calls at all.
+ * See kernel/trace/trace_syscalls.c.
+ */
+static inline bool arch_trace_is_compat_syscall(struct pt_regs *regs)
+ return is_compat_task();
+static inline bool arch_syscall_match_sym_name(const char *sym,
+ const char *name)
+ /*
+ * Skip __s390_ and __s390x_ prefix - due to compat wrappers
+ * and aliasing some symbols of 64 bit system call functions
+ * may get the __s390_ prefix instead of the __s390x_ prefix.
+ */
+ return !strcmp(sym + 7, name) || !strcmp(sym + 8, name);
#endif /* __ASSEMBLY__ */
#endif /* _ASM_S390_FTRACE_H */

Privacy Policy