[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 15/24] linux-user/arm: Deliver SIGTRAP for UDF patterns used as br
From: |
Peter Maydell |
Subject: |
[PULL 15/24] linux-user/arm: Deliver SIGTRAP for UDF patterns used as breakpoints |
Date: |
Mon, 23 Nov 2020 11:43:06 +0000 |
The Linux kernel doesn't use the official bkpt insn for breakpoints;
instead it uses three instructions in the guaranteed-to-UNDEF space,
and generates SIGTRAP for these rather than the SIGILL that most
UNDEF insns generate:
https://elixir.bootlin.com/linux/v5.9.8/source/arch/arm/kernel/ptrace.c#L197
Make QEMU treat these insns specially too. The main benefit of this
is that if you're running a debugger on a guest program that runs
into a GCC __builtin_trap() or LLVM "trap because execution should
never reach here" then you'll get the expected signal rather than a
SIGILL.
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-id: 20201117155634.6924-1-peter.maydell@linaro.org
---
linux-user/arm/cpu_loop.c | 28 ++++++++++++++++++++++++++++
1 file changed, 28 insertions(+)
diff --git a/linux-user/arm/cpu_loop.c b/linux-user/arm/cpu_loop.c
index 13629ee1f6a..3d272b56ef0 100644
--- a/linux-user/arm/cpu_loop.c
+++ b/linux-user/arm/cpu_loop.c
@@ -205,6 +205,24 @@ do_kernel_trap(CPUARMState *env)
return 0;
}
+static bool insn_is_linux_bkpt(uint32_t opcode, bool is_thumb)
+{
+ /*
+ * Return true if this insn is one of the three magic UDF insns
+ * which the kernel treats as breakpoint insns.
+ */
+ if (!is_thumb) {
+ return (opcode & 0x0fffffff) == 0x07f001f0;
+ } else {
+ /*
+ * Note that we get the two halves of the 32-bit T32 insn
+ * in the opposite order to the value the kernel uses in
+ * its undef_hook struct.
+ */
+ return ((opcode & 0xffff) == 0xde01) || (opcode == 0xa000f7f0);
+ }
+}
+
void cpu_loop(CPUARMState *env)
{
CPUState *cs = env_cpu(env);
@@ -234,6 +252,16 @@ void cpu_loop(CPUARMState *env)
/* FIXME - what to do if get_user() fails? */
get_user_code_u32(opcode, env->regs[15], env);
+ /*
+ * The Linux kernel treats some UDF patterns specially
+ * to use as breakpoints (instead of the architectural
+ * bkpt insn). These should trigger a SIGTRAP rather
+ * than SIGILL.
+ */
+ if (insn_is_linux_bkpt(opcode, env->thumb)) {
+ goto excp_debug;
+ }
+
rc = EmulateAll(opcode, &ts->fpa, env);
if (rc == 0) { /* illegal instruction */
info.si_signo = TARGET_SIGILL;
--
2.20.1
- [PULL 01/24] target/arm: fix stage 2 page-walks in 32-bit emulation, (continued)
- [PULL 01/24] target/arm: fix stage 2 page-walks in 32-bit emulation, Peter Maydell, 2020/11/23
- [PULL 06/24] MAINTAINERS: Cover system/arm/nuvoton.rst with Nuvoton NPCM7xx, Peter Maydell, 2020/11/23
- [PULL 07/24] MAINTAINERS: Fix system/arm/orangepi.rst path, Peter Maydell, 2020/11/23
- [PULL 08/24] MAINTAINERS: Cover system/arm/sbsa.rst with SBSA-REF machine, Peter Maydell, 2020/11/23
- [PULL 09/24] MAINTAINERS: Cover system/arm/sx1.rst with OMAP machines, Peter Maydell, 2020/11/23
- [PULL 10/24] docs/system: Deprecate raspi2/raspi3 machine aliases, Peter Maydell, 2020/11/23
- [PULL 11/24] docs/system/arm: Document the various raspi boards, Peter Maydell, 2020/11/23
- [PULL 12/24] docs/system/arm: Document OpenPOWER Witherspoon BMC model Front LEDs, Peter Maydell, 2020/11/23
- [PULL 13/24] docs/system/arm: Document the Sharp Zaurus SL-6000, Peter Maydell, 2020/11/23
- [PULL 14/24] target/arm: Make SYS_HEAPINFO work with RAM that doesn't start at 0, Peter Maydell, 2020/11/23
- [PULL 15/24] linux-user/arm: Deliver SIGTRAP for UDF patterns used as breakpoints,
Peter Maydell <=
- [PULL 16/24] docs: Move virtio-net-failover.rst into the system manual, Peter Maydell, 2020/11/23
- [PULL 17/24] docs: Move cpu-hotplug.rst into the system manual, Peter Maydell, 2020/11/23
- [PULL 18/24] docs: Move virtio-pmem.rst into the system manual, Peter Maydell, 2020/11/23
- [PULL 19/24] docs/system/virtio-pmem.rst: Fix minor style issues, Peter Maydell, 2020/11/23
- [PULL 20/24] docs: Split out 'pc' machine model docs into their own file, Peter Maydell, 2020/11/23
- [PULL 21/24] docs: Move microvm.rst into the system manual, Peter Maydell, 2020/11/23
- [PULL 22/24] docs: Move pr-manager.rst into the system manual, Peter Maydell, 2020/11/23
- [PULL 24/24] docs/system/pr-manager.rst: Fix minor docs nits, Peter Maydell, 2020/11/23
- [PULL 23/24] docs: Split qemu-pr-helper documentation into tools manual, Peter Maydell, 2020/11/23
- Re: [PULL 00/24] target-arm queue, Peter Maydell, 2020/11/23