arm64: ptrace: Consistently use pseudo-singlestep exceptions
authorWill Deacon <will@kernel.org>
Thu, 2 Jul 2020 20:16:20 +0000 (21:16 +0100)
committerWill Deacon <will@kernel.org>
Thu, 16 Jul 2020 10:41:07 +0000 (11:41 +0100)
commitac2081cdc4d99c57f219c1a6171526e0fa0a6fff
treee611aa9681fd5665310f37a5585feba904584f6e
parentbdc5c744c7b6457d18a95c26769dad0e7f480a08
arm64: ptrace: Consistently use pseudo-singlestep exceptions

Although the arm64 single-step state machine can be fast-forwarded in
cases where we wish to generate a SIGTRAP without actually executing an
instruction, this has two major limitations outside of simply skipping
an instruction due to emulation.

1. Stepping out of a ptrace signal stop into a signal handler where
   SIGTRAP is blocked. Fast-forwarding the stepping state machine in
   this case will result in a forced SIGTRAP, with the handler reset to
   SIG_DFL.

2. The hardware implicitly fast-forwards the state machine when executing
   an SVC instruction for issuing a system call. This can interact badly
   with subsequent ptrace stops signalled during the execution of the
   system call (e.g. SYSCALL_EXIT or seccomp traps), as they may corrupt
   the stepping state by updating the PSTATE for the tracee.

Resolve both of these issues by injecting a pseudo-singlestep exception
on entry to a signal handler and also on return to userspace following a
system call.

Cc: <stable@vger.kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Tested-by: Luis Machado <luis.machado@linaro.org>
Reported-by: Keno Fischer <keno@juliacomputing.com>
Signed-off-by: Will Deacon <will@kernel.org>
arch/arm64/include/asm/thread_info.h
arch/arm64/kernel/ptrace.c
arch/arm64/kernel/signal.c
arch/arm64/kernel/syscall.c