|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 06/38] arm: enable interrupts while handling traps
On Fri, 1 Jun 2012, Ian Campbell wrote:
> For most traps we can do this as soon as we have saved the necessary state.
> For IRQs and FIQs we must wait until we have acked the interrupt with the GIC.
>
> Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
Acked-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
> xen/arch/arm/entry.S | 17 ++++++++++++++---
> xen/arch/arm/gic.c | 2 ++
> xen/arch/arm/traps.c | 1 -
> 3 files changed, 16 insertions(+), 4 deletions(-)
>
> diff --git a/xen/arch/arm/entry.S b/xen/arch/arm/entry.S
> index 7a22e2d..5bc3906 100644
> --- a/xen/arch/arm/entry.S
> +++ b/xen/arch/arm/entry.S
> @@ -46,6 +46,17 @@ save_guest_regs:
> ALIGN;
> \
> trap_##trap:
> \
> SAVE_ALL;
> \
> + cpsie i; /* local_irq_enable */
> \
> + adr lr, return_from_trap;
> \
> + mov r0, sp;
> \
> + mov r11, sp;
> \
> + bic sp, #7; /* Align the stack pointer (noop on guest trap) */
> \
> + b do_trap_##trap
> +
> +#define DEFINE_TRAP_ENTRY_NOIRQ(trap)
> \
> + ALIGN;
> \
> +trap_##trap:
> \
> + SAVE_ALL;
> \
> adr lr, return_from_trap;
> \
> mov r0, sp;
> \
> mov r11, sp;
> \
> @@ -69,8 +80,8 @@ DEFINE_TRAP_ENTRY(supervisor_call)
> DEFINE_TRAP_ENTRY(prefetch_abort)
> DEFINE_TRAP_ENTRY(data_abort)
> DEFINE_TRAP_ENTRY(hypervisor)
> -DEFINE_TRAP_ENTRY(irq)
> -DEFINE_TRAP_ENTRY(fiq)
> +DEFINE_TRAP_ENTRY_NOIRQ(irq)
> +DEFINE_TRAP_ENTRY_NOIRQ(fiq)
>
> return_from_trap:
> mov sp, r11
> @@ -83,7 +94,7 @@ ENTRY(return_to_new_vcpu)
> ENTRY(return_to_guest)
> mov r11, sp
> bic sp, #7 /* Align the stack pointer */
> - bl leave_hypervisor_tail
> + bl leave_hypervisor_tail /* Disables interrupts on return */
> mov sp, r11
> RESTORE_ONE_BANKED(SP_usr)
> /* LR_usr is the same physical register as lr and is restored below */
> diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c
> index cc9d37b..1a2b95f 100644
> --- a/xen/arch/arm/gic.c
> +++ b/xen/arch/arm/gic.c
> @@ -509,6 +509,8 @@ void gic_interrupt(struct cpu_user_regs *regs, int is_fiq)
> uint32_t intack = GICC[GICC_IAR];
> unsigned int irq = intack & GICC_IA_IRQ;
>
> + local_irq_enable();
> +
> if ( irq == 1023 )
> /* Spurious interrupt */
> return;
> diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c
> index abc26a3..5ed754f 100644
> --- a/xen/arch/arm/traps.c
> +++ b/xen/arch/arm/traps.c
> @@ -412,7 +412,6 @@ static void do_debug_trap(struct cpu_user_regs *regs,
> unsigned int code)
> static void do_trap_hypercall(struct cpu_user_regs *regs, unsigned long iss)
> {
> arm_hypercall_t *call = NULL;
> - local_irq_enable();
>
> if ( iss != XEN_HYPERCALL_TAG )
> {
> --
> 1.7.9.1
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxx
> http://lists.xen.org/xen-devel
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |