arm64: ptrace: allow tracer to skip a system call
If tracer modifies a syscall number to -1, this traced system call should be skipped with a return value specified in x0. This patch implements this semantics. Please note: * syscall entry tracing and syscall exit tracing (ftrace tracepoint and audit) are always executed, if enabled, even when skipping a system call (that is, -1). In this way, we can avoid a potential bug where audit_syscall_entry() might be called without audit_syscall_exit() at the previous system call being called, that would cause OOPs in audit_syscall_entry(). Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org> [will: fixed up conflict with blr rework] Signed-off-by: Will Deacon <will.deacon@arm.com>
This commit is contained in:
parent
766a85d7bc
commit
1014c81d9a
|
@ -669,8 +669,15 @@ ENDPROC(el0_svc)
|
|||
* switches, and waiting for our parent to respond.
|
||||
*/
|
||||
__sys_trace:
|
||||
mov x0, sp
|
||||
mov w0, #-1 // set default errno for
|
||||
cmp scno, x0 // user-issued syscall(-1)
|
||||
b.ne 1f
|
||||
mov x0, #-ENOSYS
|
||||
str x0, [sp, #S_X0]
|
||||
1: mov x0, sp
|
||||
bl syscall_trace_enter
|
||||
cmp w0, #-1 // skip the syscall?
|
||||
b.eq __sys_trace_return_skipped
|
||||
uxtw scno, w0 // syscall number (possibly new)
|
||||
mov x1, sp // pointer to regs
|
||||
cmp scno, sc_nr // check upper syscall limit
|
||||
|
@ -683,7 +690,8 @@ __sys_trace:
|
|||
blr x16 // call sys_* routine
|
||||
|
||||
__sys_trace_return:
|
||||
str x0, [sp] // save returned x0
|
||||
str x0, [sp, #S_X0] // save returned x0
|
||||
__sys_trace_return_skipped:
|
||||
mov x0, sp
|
||||
bl syscall_trace_exit
|
||||
b ret_to_user
|
||||
|
|
Loading…
Reference in a new issue