[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v8 01/27] target-arm: extend async excp masking
From: |
Peter Maydell |
Subject: |
Re: [Qemu-devel] [PATCH v8 01/27] target-arm: extend async excp masking |
Date: |
Fri, 31 Oct 2014 19:00:14 +0000 |
On 30 October 2014 21:28, Greg Bellows <address@hidden> wrote:
> This patch extends arm_excp_unmasked() to use lookup tables for determining
> whether IRQ and FIQ exceptions are masked. The lookup tables are based on the
> ARMv8 and ARMv7 specification physical interrupt masking tables.
>
> If EL3 is using AArch64 IRQ/FIQ masking is ignored in all exception levels
> other than EL3 if SCR.{FIQ|IRQ} is set to 1 (routed to EL3).
>
> Signed-off-by: Greg Bellows <address@hidden>
>
> ---
>
> v7 -> v8
> - Add IRQ and FIQ exeception masking lookup tables.
> - Rewrite patch to use lookup tables for determining whether an excpetion is
> masked or not.
>
> v5 -> v6
> - Globally change Aarch# to AArch#
> - Fixed comment termination
>
> v4 -> v5
> - Merge with v4 patch 10
> ---
> target-arm/cpu.h | 218
> ++++++++++++++++++++++++++++++++++++++++++++++++-------
> 1 file changed, 190 insertions(+), 28 deletions(-)
Having got through the rest of the series I'm coming back
to this one, which I skipped because it needed checking
against the ARM ARM.
I definitely don't like the use of tables here -- it is in almost
all of the cases simply repeating the routing calculations.
All you actually need here is:
if (target_el < current_el) {
/* Don't take exception */
return false;
}
if (target_el > current_el && target_el != 1) {
if (target_el == 3 && !arm_el_is_aa64(env, 3)) {
/* In a 32 bit EL3 there are some awkward special cases where we
* must honour the PSTATE/CPSR mask bits even when taking the
* exception to EL3.
*/
if (arm_is_secure(env)) {
goto honour_masking;
}
/* (We know at this point that SCR.FIQ/IRQ must be set.) */
if (excp_idx == EXCP_FIQ && HCR.FMO == 0 && SCR.FW == 1) {
goto honour_masking;
}
/* If we supported SError then the async external abort routing
* would have a similar case for SCR.AW here. There is no
SCR.IW for IRQs.
*/
if (excp_idx == EXCP_IRQ && HCR.IMO == 0) {
goto honour_masking;
}
}
/* Take the exception unconditionally. */
return true;
}
honour_masking:
/* If we get here then we check the PSTATE flags. */
(I think the 'gotos' here are clearer than turning the if statement inside out
to avoid them...)
> - unsigned int target_el = arm_excp_target_el(cs, excp_idx);
> - /* FIXME: Use actual secure state. */
> - bool secure = false;
> - /* If in EL1/0, Physical IRQ routing to EL2 only happens from NS state.
> */
> - bool irq_can_hyp = !secure && cur_el < 2 && target_el == 2;
> - /* ARMv7-M interrupt return works by loading a magic value
> - * into the PC. On real hardware the load causes the
> - * return to occur. The qemu implementation performs the
> - * jump normally, then does the exception return when the
> - * CPU tries to execute code at the magic address.
> - * This will cause the magic PC value to be pushed to
> - * the stack if an interrupt occurred at the wrong time.
> - * We avoid this by disabling interrupts when
> - * pc contains a magic address.
You'll probably find it easier to base on top of the patches
I sent out that split out the M profile code from this
function (I'm planning to put those into target-arm.next soon
so they get in before hardfreeze).
thanks
-- PMM
- Re: [Qemu-devel] [PATCH v8 16/27] target-arm: add TTBR0_EL3 and make TTBR0/1 banked, (continued)
- [Qemu-devel] [PATCH v8 21/27] target-arm: make DFSR banked, Greg Bellows, 2014/10/31
- [Qemu-devel] [PATCH v8 24/27] target-arm: make VBAR banked, Greg Bellows, 2014/10/31
- [Qemu-devel] [PATCH v8 17/27] target-arm: add TCR_EL3 and make TTBCR banked, Greg Bellows, 2014/10/31
- [Qemu-devel] [PATCH v8 05/27] target-arm: add CPREG secure state support, Greg Bellows, 2014/10/31
- [Qemu-devel] [PATCH v8 01/27] target-arm: extend async excp masking, Greg Bellows, 2014/10/31
- Re: [Qemu-devel] [PATCH v8 01/27] target-arm: extend async excp masking,
Peter Maydell <=
- [Qemu-devel] [PATCH v8 04/27] target-arm: add non-secure Translation Block flag, Greg Bellows, 2014/10/31
- [Qemu-devel] [PATCH v8 25/27] target-arm: make c13 cp regs banked (FCSEIDR, ...), Greg Bellows, 2014/10/31
- [Qemu-devel] [PATCH v8 12/27] target-arm: add MVBAR support, Greg Bellows, 2014/10/31
- [Qemu-devel] [PATCH v8 10/27] target-arm: add NSACR register, Greg Bellows, 2014/10/31
- [Qemu-devel] [PATCH v8 23/27] target-arm: make PAR banked, Greg Bellows, 2014/10/31