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

Commit f086f674 authored by Sudeep Holla's avatar Sudeep Holla Committed by Catalin Marinas
Browse files

arm64: ptrace: add support for syscall emulation



Add PTRACE_SYSEMU and PTRACE_SYSEMU_SINGLESTEP support on arm64.
We don't need any special handling for PTRACE_SYSEMU_SINGLESTEP.

It's quite difficult to generalize handling PTRACE_SYSEMU cross
architectures and avoid calls to tracehook_report_syscall_entry twice.
Different architecture have different mechanism to indicate NO_SYSCALL
and trying to generalise adds more code for no gain.

Cc: Will Deacon <will.deacon@arm.com>
Signed-off-by: default avatarSudeep Holla <sudeep.holla@arm.com>
Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
parent fd386638
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -75,6 +75,7 @@ void arch_release_task_struct(struct task_struct *tsk);
 *  TIF_SYSCALL_TRACE	- syscall trace active
 *  TIF_SYSCALL_TRACEPOINT - syscall tracepoint for ftrace
 *  TIF_SYSCALL_AUDIT	- syscall auditing
 *  TIF_SYSCALL_EMU     - syscall emulation active
 *  TIF_SECOMP		- syscall secure computing
 *  TIF_SIGPENDING	- signal pending
 *  TIF_NEED_RESCHED	- rescheduling necessary
@@ -91,6 +92,7 @@ void arch_release_task_struct(struct task_struct *tsk);
#define TIF_SYSCALL_AUDIT	9
#define TIF_SYSCALL_TRACEPOINT	10
#define TIF_SECCOMP		11
#define TIF_SYSCALL_EMU		12
#define TIF_MEMDIE		18	/* is terminating due to OOM killer */
#define TIF_FREEZE		19
#define TIF_RESTORE_SIGMASK	20
@@ -109,6 +111,7 @@ void arch_release_task_struct(struct task_struct *tsk);
#define _TIF_SYSCALL_AUDIT	(1 << TIF_SYSCALL_AUDIT)
#define _TIF_SYSCALL_TRACEPOINT	(1 << TIF_SYSCALL_TRACEPOINT)
#define _TIF_SECCOMP		(1 << TIF_SECCOMP)
#define _TIF_SYSCALL_EMU	(1 << TIF_SYSCALL_EMU)
#define _TIF_UPROBE		(1 << TIF_UPROBE)
#define _TIF_FSCHECK		(1 << TIF_FSCHECK)
#define _TIF_32BIT		(1 << TIF_32BIT)
@@ -120,7 +123,7 @@ void arch_release_task_struct(struct task_struct *tsk);

#define _TIF_SYSCALL_WORK	(_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \
				 _TIF_SYSCALL_TRACEPOINT | _TIF_SECCOMP | \
				 _TIF_NOHZ)
				 _TIF_NOHZ | _TIF_SYSCALL_EMU)

#define INIT_THREAD_INFO(tsk)						\
{									\
+5 −1
Original line number Diff line number Diff line
@@ -1819,8 +1819,12 @@ static void tracehook_report_syscall(struct pt_regs *regs,

int syscall_trace_enter(struct pt_regs *regs)
{
	if (test_thread_flag(TIF_SYSCALL_TRACE))
	if (test_thread_flag(TIF_SYSCALL_TRACE) ||
		test_thread_flag(TIF_SYSCALL_EMU)) {
		tracehook_report_syscall(regs, PTRACE_SYSCALL_ENTER);
		if (!in_syscall(regs) || test_thread_flag(TIF_SYSCALL_EMU))
			return -1;
	}

	/* Do the secure computing after ptrace; failures should be fast. */
	if (secure_computing(NULL) == -1)