]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
xtensa: rearrange syscall tracing
authorMax Filippov <jcmvbkbc@gmail.com>
Mon, 25 Nov 2019 19:51:45 +0000 (11:51 -0800)
committerMax Filippov <jcmvbkbc@gmail.com>
Fri, 29 Nov 2019 22:39:12 +0000 (14:39 -0800)
system_call saves and restores syscall number across system call to make
clone and execv entry and exit tracing match. This complicates things
when syscall code may be changed by ptrace.
Preserve syscall code in copy_thread and start_thread directly instead of
doing tricks in system_call.

Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
arch/xtensa/include/asm/processor.h
arch/xtensa/kernel/entry.S
arch/xtensa/kernel/process.c

index 7495520d7a3e92b65c57207220f48142cb874214..6fa903daf2a2eb1e458c9b76433df8fa7a85176c 100644 (file)
@@ -195,6 +195,7 @@ struct thread_struct {
 /* Clearing a0 terminates the backtrace. */
 #define start_thread(regs, new_pc, new_sp) \
        do { \
+               unsigned long syscall = (regs)->syscall; \
                memset((regs), 0, sizeof(*(regs))); \
                (regs)->pc = (new_pc); \
                (regs)->ps = USER_PS_VALUE; \
@@ -204,7 +205,7 @@ struct thread_struct {
                (regs)->depc = 0; \
                (regs)->windowbase = 0; \
                (regs)->windowstart = 1; \
-               (regs)->syscall = NO_SYSCALL; \
+               (regs)->syscall = syscall; \
        } while (0)
 
 /* Forward declaration */
index 2ca209e71565b61d57f7ea639330639cea666690..59af494d99407ef17bc354e43d498ae74af9d91c 100644 (file)
@@ -1895,8 +1895,6 @@ ENTRY(system_call)
        l32i    a7, a2, PT_SYSCALL
 
 1:
-       s32i    a7, a1, 4
-
        /* syscall = sys_call_table[syscall_nr] */
 
        movi    a4, sys_call_table
@@ -1930,12 +1928,8 @@ ENTRY(system_call)
        abi_ret(4)
 
 1:
-       l32i    a4, a1, 4
-       l32i    a3, a2, PT_SYSCALL
-       s32i    a4, a2, PT_SYSCALL
        mov     a6, a2
        call4   do_syscall_trace_leave
-       s32i    a3, a2, PT_SYSCALL
        abi_ret(4)
 
 ENDPROC(system_call)
index db278a9e80c7e1d3a3f527e98938f58d30cc1da2..9e1c49134c07eca6a172e4b0f43e5ffeeef61f50 100644 (file)
@@ -264,6 +264,8 @@ int copy_thread(unsigned long clone_flags, unsigned long usp_thread_fn,
                               &regs->areg[XCHAL_NUM_AREGS - len/4], len);
                }
 
+               childregs->syscall = regs->syscall;
+
                /* The thread pointer is passed in the '4th argument' (= a5) */
                if (clone_flags & CLONE_SETTLS)
                        childregs->threadptr = childregs->areg[5];