From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ian Campbell Subject: [PATCH V2 05/40] arm: enable interrupts while handling traps Date: Tue, 26 Jun 2012 10:29:29 +0000 Message-ID: <1340706604-1313-5-git-send-email-ian.campbell@citrix.com> References: <1340706574.3832.57.camel@zakaz.uk.xensource.com> <1340706604-1313-1-git-send-email-ian.campbell@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1340706604-1313-1-git-send-email-ian.campbell@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xen.org Cc: Ian Campbell List-Id: xen-devel@lists.xenproject.org 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 Acked-by: Stefano Stabellini --- 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