Commit 3aee3e25 authored by Max Filippov's avatar Max Filippov

xtensa: call do_syscall_trace_{enter,leave} selectively

Check whether calls to do_syscall_trace_{enter,leave} are necessary in
the system_call function. Define _TIF_WORK_MASK to a bitmask of flags
that reuire the calls. Fix comment.
Signed-off-by: default avatarMax Filippov <jcmvbkbc@gmail.com>
parent 6a986984
...@@ -101,8 +101,6 @@ static inline struct thread_info *current_thread_info(void) ...@@ -101,8 +101,6 @@ static inline struct thread_info *current_thread_info(void)
/* /*
* thread information flags * thread information flags
* - these are process state flags that various assembly files may need to access * - these are process state flags that various assembly files may need to access
* - pending work-to-be-done flags are in LSW
* - other flags in MSW
*/ */
#define TIF_SYSCALL_TRACE 0 /* syscall trace active */ #define TIF_SYSCALL_TRACE 0 /* syscall trace active */
#define TIF_SIGPENDING 1 /* signal pending */ #define TIF_SIGPENDING 1 /* signal pending */
...@@ -118,8 +116,7 @@ static inline struct thread_info *current_thread_info(void) ...@@ -118,8 +116,7 @@ static inline struct thread_info *current_thread_info(void)
#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED) #define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED)
#define _TIF_SINGLESTEP (1<<TIF_SINGLESTEP) #define _TIF_SINGLESTEP (1<<TIF_SINGLESTEP)
#define _TIF_WORK_MASK 0x0000FFFE /* work to do on interrupt/exception return */ #define _TIF_WORK_MASK (_TIF_SYSCALL_TRACE | _TIF_SINGLESTEP)
#define _TIF_ALLWORK_MASK 0x0000FFFF /* work to do on any return to u-space */
/* /*
* Thread-synchronous status. * Thread-synchronous status.
......
...@@ -1846,20 +1846,28 @@ ENTRY(system_call) ...@@ -1846,20 +1846,28 @@ ENTRY(system_call)
/* regs->syscall = regs->areg[2] */ /* regs->syscall = regs->areg[2] */
l32i a3, a2, PT_AREG2 l32i a7, a2, PT_AREG2
s32i a7, a2, PT_SYSCALL
GET_THREAD_INFO(a4, a1)
l32i a3, a4, TI_FLAGS
movi a4, _TIF_WORK_MASK
and a3, a3, a4
beqz a3, 1f
mov a6, a2 mov a6, a2
s32i a3, a2, PT_SYSCALL
call4 do_syscall_trace_enter call4 do_syscall_trace_enter
mov a3, a6 l32i a7, a2, PT_SYSCALL
1:
/* syscall = sys_call_table[syscall_nr] */ /* syscall = sys_call_table[syscall_nr] */
movi a4, sys_call_table movi a4, sys_call_table
movi a5, __NR_syscalls movi a5, __NR_syscalls
movi a6, -ENOSYS movi a6, -ENOSYS
bgeu a3, a5, 1f bgeu a7, a5, 1f
addx4 a4, a3, a4 addx4 a4, a7, a4
l32i a4, a4, 0 l32i a4, a4, 0
movi a5, sys_ni_syscall; movi a5, sys_ni_syscall;
beq a4, a5, 1f beq a4, a5, 1f
...@@ -1881,6 +1889,10 @@ ENTRY(system_call) ...@@ -1881,6 +1889,10 @@ ENTRY(system_call)
1: /* regs->areg[2] = return_value */ 1: /* regs->areg[2] = return_value */
s32i a6, a2, PT_AREG2 s32i a6, a2, PT_AREG2
bnez a3, 1f
retw
1:
mov a6, a2 mov a6, a2
call4 do_syscall_trace_leave call4 do_syscall_trace_leave
retw retw
......
...@@ -487,13 +487,12 @@ long arch_ptrace(struct task_struct *child, long request, ...@@ -487,13 +487,12 @@ long arch_ptrace(struct task_struct *child, long request,
return ret; return ret;
} }
unsigned long do_syscall_trace_enter(struct pt_regs *regs) void do_syscall_trace_enter(struct pt_regs *regs)
{ {
if (test_thread_flag(TIF_SYSCALL_TRACE) && if (test_thread_flag(TIF_SYSCALL_TRACE) &&
tracehook_report_syscall_entry(regs)) tracehook_report_syscall_entry(regs))
return NO_SYSCALL; regs->syscall = NO_SYSCALL;
return regs->areg[2];
} }
void do_syscall_trace_leave(struct pt_regs *regs) void do_syscall_trace_leave(struct pt_regs *regs)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment