[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v7 41/41] target/arm: Raise only one interrupt in arm_cpu_exec_in
From: |
Richard Henderson |
Subject: |
[PATCH v7 41/41] target/arm: Raise only one interrupt in arm_cpu_exec_interrupt |
Date: |
Thu, 6 Feb 2020 10:54:48 +0000 |
The fall through organization of this function meant that we
would raise an interrupt, then might overwrite that with another.
Since interrupt prioritization is IMPLEMENTATION DEFINED, we
can recognize these in any order we choose.
Unify the code to raise the interrupt in a block at the end.
Tested-by: Alex Bennée <address@hidden>
Reviewed-by: Peter Maydell <address@hidden>
Signed-off-by: Richard Henderson <address@hidden>
---
target/arm/cpu.c | 30 ++++++++++++------------------
1 file changed, 12 insertions(+), 18 deletions(-)
diff --git a/target/arm/cpu.c b/target/arm/cpu.c
index 4ffc09909d..b0762a76c4 100644
--- a/target/arm/cpu.c
+++ b/target/arm/cpu.c
@@ -535,17 +535,15 @@ bool arm_cpu_exec_interrupt(CPUState *cs, int
interrupt_request)
uint64_t hcr_el2 = arm_hcr_el2_eff(env);
uint32_t target_el;
uint32_t excp_idx;
- bool ret = false;
+
+ /* The prioritization of interrupts is IMPLEMENTATION DEFINED. */
if (interrupt_request & CPU_INTERRUPT_FIQ) {
excp_idx = EXCP_FIQ;
target_el = arm_phys_excp_target_el(cs, excp_idx, cur_el, secure);
if (arm_excp_unmasked(cs, excp_idx, target_el,
cur_el, secure, hcr_el2)) {
- cs->exception_index = excp_idx;
- env->exception.target_el = target_el;
- cc->do_interrupt(cs);
- ret = true;
+ goto found;
}
}
if (interrupt_request & CPU_INTERRUPT_HARD) {
@@ -553,10 +551,7 @@ bool arm_cpu_exec_interrupt(CPUState *cs, int
interrupt_request)
target_el = arm_phys_excp_target_el(cs, excp_idx, cur_el, secure);
if (arm_excp_unmasked(cs, excp_idx, target_el,
cur_el, secure, hcr_el2)) {
- cs->exception_index = excp_idx;
- env->exception.target_el = target_el;
- cc->do_interrupt(cs);
- ret = true;
+ goto found;
}
}
if (interrupt_request & CPU_INTERRUPT_VIRQ) {
@@ -564,10 +559,7 @@ bool arm_cpu_exec_interrupt(CPUState *cs, int
interrupt_request)
target_el = 1;
if (arm_excp_unmasked(cs, excp_idx, target_el,
cur_el, secure, hcr_el2)) {
- cs->exception_index = excp_idx;
- env->exception.target_el = target_el;
- cc->do_interrupt(cs);
- ret = true;
+ goto found;
}
}
if (interrupt_request & CPU_INTERRUPT_VFIQ) {
@@ -575,14 +567,16 @@ bool arm_cpu_exec_interrupt(CPUState *cs, int
interrupt_request)
target_el = 1;
if (arm_excp_unmasked(cs, excp_idx, target_el,
cur_el, secure, hcr_el2)) {
- cs->exception_index = excp_idx;
- env->exception.target_el = target_el;
- cc->do_interrupt(cs);
- ret = true;
+ goto found;
}
}
+ return false;
- return ret;
+ found:
+ cs->exception_index = excp_idx;
+ env->exception.target_el = target_el;
+ cc->do_interrupt(cs);
+ return true;
}
#if !defined(CONFIG_USER_ONLY) || !defined(TARGET_AARCH64)
--
2.20.1
- [PATCH v7 32/41] target/arm: Update arm_phys_excp_target_el for TGE, (continued)
- [PATCH v7 32/41] target/arm: Update arm_phys_excp_target_el for TGE, Richard Henderson, 2020/02/06
- [PATCH v7 27/41] target/arm: Update define_one_arm_cp_reg_with_opaque for VHE, Richard Henderson, 2020/02/06
- [PATCH v7 25/41] target/arm: Add the hypervisor virtual counter, Richard Henderson, 2020/02/06
- [PATCH v7 26/41] target/arm: Update timer access for VHE, Richard Henderson, 2020/02/06
- [PATCH v7 30/41] target/arm: Flush tlb for ASID changes in EL2&0 translation regime, Richard Henderson, 2020/02/06
- [PATCH v7 28/41] target/arm: Add VHE system register redirection and aliasing, Richard Henderson, 2020/02/06
- [PATCH v7 37/41] target/arm: Enable ARMv8.1-VHE in -cpu max, Richard Henderson, 2020/02/06
- [PATCH v7 39/41] target/arm: Pass more cpu state to arm_excp_unmasked, Richard Henderson, 2020/02/06
- [PATCH v7 33/41] target/arm: Update {fp,sve}_exception_el for VHE, Richard Henderson, 2020/02/06
- [PATCH v7 38/41] target/arm: Move arm_excp_unmasked to cpu.c, Richard Henderson, 2020/02/06
- [PATCH v7 41/41] target/arm: Raise only one interrupt in arm_cpu_exec_interrupt,
Richard Henderson <=
- [PATCH v7 22/41] target/arm: Update arm_sctlr for VHE, Richard Henderson, 2020/02/06
- [PATCH v7 21/41] target/arm: Update arm_mmu_idx for VHE, Richard Henderson, 2020/02/06
- [PATCH v7 31/41] target/arm: Flush tlbs for E2&0 translation regime, Richard Henderson, 2020/02/06
- [PATCH v7 29/41] target/arm: Add VHE timer register redirection and aliasing, Richard Henderson, 2020/02/06
- [PATCH v7 34/41] target/arm: check TGE and E2H flags for EL0 pauth traps, Richard Henderson, 2020/02/06
- [PATCH v7 36/41] target/arm: Update arm_cpu_do_interrupt_aarch64 for VHE, Richard Henderson, 2020/02/06
- [PATCH v7 35/41] target/arm: Update get_a64_user_mem_index for VHE, Richard Henderson, 2020/02/06
- [PATCH v7 40/41] target/arm: Use bool for unmasked in arm_excp_unmasked, Richard Henderson, 2020/02/06
- Re: [PATCH v7 00/41] target/arm: Implement ARMv8.1-VHE, Peter Maydell, 2020/02/07