lkml.org 
[lkml]   [2016]   [Sep]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 07/11] arm64/tracing: fix compat syscall handling
    Date
    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@imgtec.com>
    Cc: Steven Rostedt <rostedt@goodmis.org>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: Will Deacon <will.deacon@arm.com>
    Cc: linux-arm-kernel@lists.infradead.org
    ---
    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 14f7b65..64a8c53 100644
    --- a/arch/arm64/kernel/Makefile
    +++ b/arch/arm64/kernel/Makefile
    @@ -28,6 +28,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 ebecf9a..53348d1 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
    \
     
     \ /
      Last update: 2016-09-17 09:59    [W:3.102 / U:0.348 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site