[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] arm: enable interrupts while handling traps
# HG changeset patch # User Ian Campbell <ian.campbell@xxxxxxxxxx> # Date 1340724227 -3600 # Node ID 8af8392e3a29a924663c329a417e1912e9fbe867 # Parent e9e2127ef47a70dc926e4eed251c25ceafd7403a arm: enable interrupts while handling traps 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> Committed-by: Ian Campbell <ian.campbell@xxxxxxxxxx> --- diff -r e9e2127ef47a -r 8af8392e3a29 xen/arch/arm/entry.S --- a/xen/arch/arm/entry.S Tue Jun 26 16:23:46 2012 +0100 +++ b/xen/arch/arm/entry.S Tue Jun 26 16:23:47 2012 +0100 @@ -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 -r e9e2127ef47a -r 8af8392e3a29 xen/arch/arm/gic.c --- a/xen/arch/arm/gic.c Tue Jun 26 16:23:46 2012 +0100 +++ b/xen/arch/arm/gic.c Tue Jun 26 16:23:47 2012 +0100 @@ -509,6 +509,8 @@ void gic_interrupt(struct cpu_user_regs uint32_t intack = GICC[GICC_IAR]; unsigned int irq = intack & GICC_IA_IRQ; + local_irq_enable(); + if ( irq == 1023 ) /* Spurious interrupt */ return; diff -r e9e2127ef47a -r 8af8392e3a29 xen/arch/arm/traps.c --- a/xen/arch/arm/traps.c Tue Jun 26 16:23:46 2012 +0100 +++ b/xen/arch/arm/traps.c Tue Jun 26 16:23:47 2012 +0100 @@ -412,7 +412,6 @@ static void do_debug_trap(struct cpu_use 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 ) { _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |