Add arch_syscall_addr for arm64 and define NR_compat_syscalls, as the number of compat syscalls for arm64 exceeds the number defined by NR_syscalls. Signed-off-by: Marcin Nowakowski <marcin.nowakowski@xxxxxxxxxx> Cc: Steven Rostedt <rostedt@xxxxxxxxxxx> Cc: Ingo Molnar <mingo@xxxxxxxxxx> Cc: Catalin Marinas <catalin.marinas@xxxxxxx> Cc: Will Deacon <will.deacon@xxxxxxx> Cc: linux-arm-kernel@xxxxxxxxxxxxxxxxxxx --- arch/arm64/include/asm/ftrace.h | 12 +----------- arch/arm64/include/asm/unistd.h | 1 + arch/arm64/kernel/Makefile | 1 + arch/arm64/kernel/ftrace.c | 16 ++++++++++++++++ 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/arch/arm64/include/asm/ftrace.h b/arch/arm64/include/asm/ftrace.h index caa955f..b57ff7c 100644 --- a/arch/arm64/include/asm/ftrace.h +++ b/arch/arm64/include/asm/ftrace.h @@ -41,17 +41,7 @@ static inline unsigned long ftrace_call_adjust(unsigned long addr) #define ftrace_return_address(n) return_address(n) -/* - * Because AArch32 mode does not share the same syscall table with AArch64, - * tracing compat syscalls may result in reporting bogus syscalls or even - * hang-up, so just do not trace them. - * See kernel/trace/trace_syscalls.c - * - * x86 code says: - * If the user really wants these, then they should use the - * raw syscall tracepoints with filtering. - */ -#define ARCH_TRACE_IGNORE_COMPAT_SYSCALLS +#define ARCH_COMPAT_SYSCALL_NUMBERS_OVERLAP 1 static inline bool arch_trace_is_compat_syscall(struct pt_regs *regs) { return is_compat_task(); diff --git a/arch/arm64/include/asm/unistd.h b/arch/arm64/include/asm/unistd.h index e78ac26..276d049 100644 --- a/arch/arm64/include/asm/unistd.h +++ b/arch/arm64/include/asm/unistd.h @@ -45,6 +45,7 @@ #define __ARM_NR_compat_set_tls (__ARM_NR_COMPAT_BASE+5) #define __NR_compat_syscalls 394 +#define NR_compat_syscalls (__NR_compat_syscalls) #endif #define __ARCH_WANT_SYS_CLONE diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 7d66bba..7ea9cd3 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -30,6 +30,7 @@ $(obj)/%.stub.o: $(obj)/%.o FORCE arm64-obj-$(CONFIG_COMPAT) += sys32.o kuser32.o signal32.o \ sys_compat.o entry32.o arm64-obj-$(CONFIG_FUNCTION_TRACER) += ftrace.o entry-ftrace.o +arm64-obj-$(CONFIG_FTRACE_SYSCALLS) += ftrace.o arm64-obj-$(CONFIG_MODULES) += arm64ksyms.o module.o arm64-obj-$(CONFIG_ARM64_MODULE_PLTS) += module-plts.o arm64-obj-$(CONFIG_PERF_EVENTS) += perf_regs.o perf_callchain.o diff --git a/arch/arm64/kernel/ftrace.c b/arch/arm64/kernel/ftrace.c index 40ad08a..75d010f 100644 --- a/arch/arm64/kernel/ftrace.c +++ b/arch/arm64/kernel/ftrace.c @@ -176,4 +176,20 @@ int ftrace_disable_ftrace_graph_caller(void) return ftrace_modify_graph_caller(false); } #endif /* CONFIG_DYNAMIC_FTRACE */ + #endif /* CONFIG_FUNCTION_GRAPH_TRACER */ + +#if (defined CONFIG_FTRACE_SYSCALLS) && (defined CONFIG_COMPAT) + +extern const void *sys_call_table[]; +extern const void *compat_sys_call_table[]; + +unsigned long __init arch_syscall_addr(int nr, bool compat) +{ + if (compat) + return (unsigned long)compat_sys_call_table[nr]; + + return (unsigned long)sys_call_table[nr]; +} + +#endif /* CONFIG_FTRACE_SYSCALLS && CONFIG_COMPAT */ -- 2.7.4 -- To unsubscribe from this list: send the line "unsubscribe linux-api" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html