@@ -779,6 +779,19 @@ void vcpu_mark_events_pending(struct vcpu *v)
vgic_vcpu_inject_irq(v, v->domain->arch.evtchn_irq, 1);
}
+/* The ARM spec declares that even if local irqs are masked in
+ * the CPSR register, an irq should wake up a cpu from WFI anyway.
+ * For this reason we need to check for irqs that need delivery,
+ * ignoring the CPSR register, *after* calling SCHEDOP_block to
+ * avoid races with vgic_vcpu_inject_irq.
+ */
+void vcpu_block_unless_event_pending(struct vcpu *v)
+{
+ vcpu_block();
+ if ( local_events_need_delivery_nomask() )
+ vcpu_unblock(current);
+}
+
/*
* Local variables:
* mode: C
@@ -1670,15 +1670,7 @@ asmlinkage void do_trap_hypervisor(struct cpu_user_regs *regs)
return;
}
/* at the moment we only trap WFI */
- vcpu_block();
- /* The ARM spec declares that even if local irqs are masked in
- * the CPSR register, an irq should wake up a cpu from WFI anyway.
- * For this reason we need to check for irqs that need delivery,
- * ignoring the CPSR register, *after* calling SCHEDOP_block to
- * avoid races with vgic_vcpu_inject_irq.
- */
- if ( local_events_need_delivery_nomask() )
- vcpu_unblock(current);
+ vcpu_block_unless_event_pending(current);
advance_pc(regs, hsr);
break;
case HSR_EC_CP15_32:
@@ -6,6 +6,7 @@
void vcpu_kick(struct vcpu *v);
void vcpu_mark_events_pending(struct vcpu *v);
+void vcpu_block_unless_event_pending(struct vcpu *v);
static inline int vcpu_event_delivery_is_enabled(struct vcpu *v)
{
WFI functionality is required at different places in xen. Moving it to seperate helper function so that it is easier to call WFI function and avoid duplication of code - renamed vcpu_block_event to vcpu_block_unless_event_pending Signed-off-by: Parth Dixit <parth.dixit@linaro.org> --- Changelog v4 - added space in comments - renamed vcpu_block_event to vcpu_block_unless_event_pending Changelog v3 : - new patch for helper function, this functionality existed in same patch in v2 xen/arch/arm/domain.c | 13 +++++++++++++ xen/arch/arm/traps.c | 10 +--------- xen/include/asm-arm/event.h | 1 + 3 files changed, 15 insertions(+), 9 deletions(-)