[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 20/25] target-arm: kvm - re-inject guest debug except
From: |
Peter Maydell |
Subject: |
[Qemu-devel] [PULL 20/25] target-arm: kvm - re-inject guest debug exceptions |
Date: |
Thu, 17 Dec 2015 11:50:15 +0000 |
From: Alex Bennée <address@hidden>
If we can't find details for the debug exception in our debug state
then we can assume the exception is due to debugging inside the guest.
To inject the exception into the guest state we re-use the TCG exception
code (do_interrupt).
However while guest debugging is in effect we currently can't handle the
guest using single step as we will keep trapping to back to userspace.
GDB makes heavy use of single-step behind the scenes which effectively
means the guest's ability to debug itself is disabled while it is being
debugged.
Signed-off-by: Alex Bennée <address@hidden>
Message-id: address@hidden
[PMM: Fixed a few typos in comments and commit message]
Reviewed-by: Peter Maydell <address@hidden>
Signed-off-by: Peter Maydell <address@hidden>
---
target-arm/helper-a64.c | 12 ++++++++++--
target-arm/kvm64.c | 24 +++++++++++++++++-------
2 files changed, 27 insertions(+), 9 deletions(-)
diff --git a/target-arm/helper-a64.c b/target-arm/helper-a64.c
index deb8dbe..fc3ccdf 100644
--- a/target-arm/helper-a64.c
+++ b/target-arm/helper-a64.c
@@ -25,6 +25,7 @@
#include "qemu/bitops.h"
#include "internals.h"
#include "qemu/crc32c.h"
+#include "sysemu/kvm.h"
#include <zlib.h> /* For crc32 */
/* C2.4.7 Multiply and divide */
@@ -469,7 +470,8 @@ void aarch64_cpu_do_interrupt(CPUState *cs)
new_el);
if (qemu_loglevel_mask(CPU_LOG_INT)
&& !excp_is_internal(cs->exception_index)) {
- qemu_log_mask(CPU_LOG_INT, "...with ESR 0x%" PRIx32 "\n",
+ qemu_log_mask(CPU_LOG_INT, "...with ESR %x/0x%" PRIx32 "\n",
+ env->exception.syndrome >> ARM_EL_EC_SHIFT,
env->exception.syndrome);
}
@@ -535,6 +537,12 @@ void aarch64_cpu_do_interrupt(CPUState *cs)
aarch64_restore_sp(env, new_el);
env->pc = addr;
- cs->interrupt_request |= CPU_INTERRUPT_EXITTB;
+
+ qemu_log_mask(CPU_LOG_INT, "...to EL%d PC 0x%" PRIx64 " PSTATE 0x%x\n",
+ new_el, env->pc, pstate_read(env));
+
+ if (!kvm_enabled()) {
+ cs->interrupt_request |= CPU_INTERRUPT_EXITTB;
+ }
}
#endif
diff --git a/target-arm/kvm64.c b/target-arm/kvm64.c
index 771ecdb..bb9531f 100644
--- a/target-arm/kvm64.c
+++ b/target-arm/kvm64.c
@@ -871,6 +871,7 @@ bool kvm_arm_handle_debug(CPUState *cs, struct
kvm_debug_exit_arch *debug_exit)
{
int hsr_ec = debug_exit->hsr >> ARM_EL_EC_SHIFT;
ARMCPU *cpu = ARM_CPU(cs);
+ CPUClass *cc = CPU_GET_CLASS(cs);
CPUARMState *env = &cpu->env;
/* Ensure PC is synchronised */
@@ -881,7 +882,14 @@ bool kvm_arm_handle_debug(CPUState *cs, struct
kvm_debug_exit_arch *debug_exit)
if (cs->singlestep_enabled) {
return true;
} else {
- error_report("Came out of SINGLE STEP when not enabled");
+ /*
+ * The kernel should have suppressed the guest's ability to
+ * single step at this point so something has gone wrong.
+ */
+ error_report("%s: guest single-step while debugging unsupported"
+ " (%"PRIx64", %"PRIx32")\n",
+ __func__, env->pc, debug_exit->hsr);
+ return false;
}
break;
case EC_AA64_BKPT:
@@ -908,12 +916,14 @@ bool kvm_arm_handle_debug(CPUState *cs, struct
kvm_debug_exit_arch *debug_exit)
__func__, debug_exit->hsr, env->pc);
}
- /* If we don't handle this it could be it really is for the
- guest to handle */
- qemu_log_mask(LOG_UNIMP,
- "%s: re-injecting exception not yet implemented"
- " (0x%"PRIx32", %"PRIx64")\n",
- __func__, hsr_ec, env->pc);
+ /* If we are not handling the debug exception it must belong to
+ * the guest. Let's re-use the existing TCG interrupt code to set
+ * everything up properly.
+ */
+ cs->exception_index = EXCP_BKPT;
+ env->exception.syndrome = debug_exit->hsr;
+ env->exception.vaddress = debug_exit->far;
+ cc->do_interrupt(cs);
return false;
}
--
1.9.1
- [Qemu-devel] [PULL 00/25] target-arm queue, Peter Maydell, 2015/12/17
- [Qemu-devel] [PULL 05/25] target-arm: Fix and improve AA32 singlestep translation completion code, Peter Maydell, 2015/12/17
- [Qemu-devel] [PULL 22/25] i.MX: Fix i.MX31 default/reset configuration, Peter Maydell, 2015/12/17
- [Qemu-devel] [PULL 20/25] target-arm: kvm - re-inject guest debug exceptions,
Peter Maydell <=
- [Qemu-devel] [PULL 23/25] i.MX: rename i.MX CCM get_clock() function and CLK ID enum names, Peter Maydell, 2015/12/17
- [Qemu-devel] [PULL 24/25] i.MX: Split the CCM class into an abstract base class and a concrete class, Peter Maydell, 2015/12/17
- [Qemu-devel] [PULL 17/25] target-arm: kvm - implement software breakpoints, Peter Maydell, 2015/12/17
- [Qemu-devel] [PULL 19/25] target-arm: kvm - add support for HW assisted debug, Peter Maydell, 2015/12/17
- [Qemu-devel] [PULL 21/25] tests/guest-debug: introduce basic gdbstub tests, Peter Maydell, 2015/12/17
- [Qemu-devel] [PULL 18/25] target-arm: kvm - support for single step, Peter Maydell, 2015/12/17
- [Qemu-devel] [PULL 10/25] ARM: ACPI: Add power button device in ACPI DSDT table, Peter Maydell, 2015/12/17
- [Qemu-devel] [PULL 15/25] ARM: Virt: Add gpio-keys node for Poweroff using DT, Peter Maydell, 2015/12/17
- [Qemu-devel] [PULL 16/25] target-arm: kvm64 - introduce kvm_arm_init_debug(), Peter Maydell, 2015/12/17
- [Qemu-devel] [PULL 25/25] i.MX: Add an i.MX25 specific CCM class/instance, Peter Maydell, 2015/12/17