Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a91c8f7e authored by AKASHI Takahiro's avatar AKASHI Takahiro Committed by Bernhard Thoben
Browse files

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: default avatarAKASHI Takahiro <takahiro.akashi@linaro.org>
[will: fixed up conflict with blr rework]
Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
(cherry picked from commit 6c552f2c72849c6f45904587d9643cfed57aee40)
parent 916c8d40
Loading
Loading
Loading
Loading
+9 −6
Original line number Diff line number Diff line
@@ -651,12 +651,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
	adr	lr, __sys_trace_return		// return address
	cmp	w0, #RET_SKIP_SYSCALL_TRACE	// skip syscall and tracing?
	b.eq	ret_to_user
	cmp	w0, #RET_SKIP_SYSCALL		// skip syscall?
	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
@@ -670,8 +673,8 @@ __sys_trace:
	br	x16				// call sys_* routine

__sys_trace_return:
	str	x0, [sp]			// save returned x0
__sys_trace_return_skipped:			// x0 already in regs[0]
	str	x0, [sp, #S_X0]			// save returned x0
__sys_trace_return_skipped:
	mov	x0, sp
	bl	syscall_trace_exit
	b	ret_to_user