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: Max Filippov <jcmvbkbc@gmail.com>
This commit is contained in:
parent
6a986984b6
commit
3aee3e25de
|
@ -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)
|
||||||
#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)
|
||||||
|
|
||||||
/* regs->syscall = regs->areg[2] */
|
/* regs->syscall = regs->areg[2] */
|
||||||
|
|
||||||
l32i a3, a2, PT_AREG2
|
l32i a7, a2, PT_AREG2
|
||||||
mov a6, a2
|
s32i a7, a2, PT_SYSCALL
|
||||||
s32i a3, a2, PT_SYSCALL
|
|
||||||
call4 do_syscall_trace_enter
|
|
||||||
mov a3, a6
|
|
||||||
|
|
||||||
|
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
|
||||||
|
call4 do_syscall_trace_enter
|
||||||
|
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)
|
||||||
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,
|
||||||
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)
|
||||||
|
|
Loading…
Reference in New Issue