[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 08/10] target/arm: Factor out code to calculate FSR f
From: |
Peter Maydell |
Subject: |
[Qemu-devel] [PULL 08/10] target/arm: Factor out code to calculate FSR for debug exceptions |
Date: |
Fri, 23 Mar 2018 18:49:56 +0000 |
When a debug exception is taken to AArch32, it appears as a Prefetch
Abort, and the Instruction Fault Status Register (IFSR) must be set.
The IFSR has two possible formats, depending on whether LPAE is in
use. Factor out the code in arm_debug_excp_handler() which picks
an FSR value into its own utility function, update it to use
arm_fi_to_lfsc() and arm_fi_to_sfsc() rather than hard-coded constants,
and use the correct condition to select long or short format.
In particular this fixes a bug where we could select the short
format because we're at EL0 and the EL1 translation regime is
not using LPAE, but then route the debug exception to EL2 because
of MDCR_EL2.TDE and hand EL2 the wrong format FSR.
Signed-off-by: Peter Maydell <address@hidden>
Reviewed-by: Philippe Mathieu-Daudé <address@hidden>
Message-id: address@hidden
---
target/arm/internals.h | 25 +++++++++++++++++++++++++
target/arm/op_helper.c | 12 ++----------
2 files changed, 27 insertions(+), 10 deletions(-)
diff --git a/target/arm/internals.h b/target/arm/internals.h
index 47cc224a46..8ce944b7a0 100644
--- a/target/arm/internals.h
+++ b/target/arm/internals.h
@@ -763,4 +763,29 @@ static inline bool regime_is_secure(CPUARMState *env,
ARMMMUIdx mmu_idx)
}
}
+/* Return the FSR value for a debug exception (watchpoint, hardware
+ * breakpoint or BKPT insn) targeting the specified exception level.
+ */
+static inline uint32_t arm_debug_exception_fsr(CPUARMState *env)
+{
+ ARMMMUFaultInfo fi = { .type = ARMFault_Debug };
+ int target_el = arm_debug_target_el(env);
+ bool using_lpae = false;
+
+ if (target_el == 2 || arm_el_is_aa64(env, target_el)) {
+ using_lpae = true;
+ } else {
+ if (arm_feature(env, ARM_FEATURE_LPAE) &&
+ (env->cp15.tcr_el[target_el].raw_tcr & TTBCR_EAE)) {
+ using_lpae = true;
+ }
+ }
+
+ if (using_lpae) {
+ return arm_fi_to_lfsc(&fi);
+ } else {
+ return arm_fi_to_sfsc(&fi);
+ }
+}
+
#endif
diff --git a/target/arm/op_helper.c b/target/arm/op_helper.c
index 4b123d2bd6..75efff9edf 100644
--- a/target/arm/op_helper.c
+++ b/target/arm/op_helper.c
@@ -1330,11 +1330,7 @@ void arm_debug_excp_handler(CPUState *cs)
cs->watchpoint_hit = NULL;
- if (extended_addresses_enabled(env)) {
- env->exception.fsr = (1 << 9) | 0x22;
- } else {
- env->exception.fsr = 0x2;
- }
+ env->exception.fsr = arm_debug_exception_fsr(env);
env->exception.vaddress = wp_hit->hitaddr;
raise_exception(env, EXCP_DATA_ABORT,
syn_watchpoint(same_el, 0, wnr),
@@ -1354,11 +1350,7 @@ void arm_debug_excp_handler(CPUState *cs)
return;
}
- if (extended_addresses_enabled(env)) {
- env->exception.fsr = (1 << 9) | 0x22;
- } else {
- env->exception.fsr = 0x2;
- }
+ env->exception.fsr = arm_debug_exception_fsr(env);
/* FAR is UNKNOWN, so doesn't need setting */
raise_exception(env, EXCP_PREFETCH_ABORT,
syn_breakpoint(same_el),
--
2.16.2
- [Qemu-devel] [PULL 00/10] target-arm queue, Peter Maydell, 2018/03/23
- [Qemu-devel] [PULL 02/10] sdhci: fix incorrect use of Error *, Peter Maydell, 2018/03/23
- [Qemu-devel] [PULL 03/10] hw/intc/arm_gicv3: Fix secure-GIC NS ICC_PMR and ICC_RPR accesses, Peter Maydell, 2018/03/23
- [Qemu-devel] [PULL 04/10] hw/arm/bcm2836: Use the Cortex-A7 instead of Cortex-A15, Peter Maydell, 2018/03/23
- [Qemu-devel] [PULL 05/10] i.MX: Support serial RS-232 break properly, Peter Maydell, 2018/03/23
- [Qemu-devel] [PULL 07/10] target/arm: Honour MDCR_EL2.TDE when routing exceptions due to BKPT/BRK, Peter Maydell, 2018/03/23
- [Qemu-devel] [PULL 01/10] arm/translate-a64: treat DISAS_UPDATE as variant of DISAS_EXIT, Peter Maydell, 2018/03/23
- [Qemu-devel] [PULL 10/10] target/arm: Always set FAR to a known unknown value for debug exceptions, Peter Maydell, 2018/03/23
- [Qemu-devel] [PULL 08/10] target/arm: Factor out code to calculate FSR for debug exceptions,
Peter Maydell <=
- [Qemu-devel] [PULL 06/10] mach-virt: Set VM's SMBIOS system version to mc->name, Peter Maydell, 2018/03/23
- [Qemu-devel] [PULL 09/10] target/arm: Set FSR for BKPT, BRK when raising exception, Peter Maydell, 2018/03/23
- Re: [Qemu-devel] [PULL 00/10] target-arm queue, no-reply, 2018/03/23
- Re: [Qemu-devel] [PULL 00/10] target-arm queue, Peter Maydell, 2018/03/25