return;
}
-void gic_inject_irq_start(void)
+static void gic_inject_irq_start(void)
{
uint32_t hcr;
hcr = READ_CP32(HCR);
isb();
}
-void gic_inject_irq_stop(void)
+static void gic_inject_irq_stop(void)
{
uint32_t hcr;
hcr = READ_CP32(HCR);
}
}
+void gic_inject(void)
+{
+ if (!gic.lr_mask)
+ gic_inject_irq_stop();
+ else
+ gic_inject_irq_start();
+}
+
int gic_route_irq_to_guest(struct domain *d, unsigned int irq,
const char * devname)
{
GICC[GICC_DIR] = virq;
}
list_del_init(&p->inflight);
- cpu_raise_softirq(current->processor, VGIC_SOFTIRQ);
spin_unlock(¤t->arch.vgic.lock);
i++;
extern void gic_route_irqs(void);
+extern void gic_inject(void);
+
extern void __cpuinit init_maintenance_interrupt(void);
extern void gic_set_guest_irq(unsigned int irq,
unsigned int state, unsigned int priority);
-extern void gic_inject_irq_start(void);
-extern void gic_inject_irq_stop(void);
extern int gic_route_irq_to_guest(struct domain *d, unsigned int irq,
const char * devname);
while (1)
{
local_irq_disable();
- if (!softirq_pending(smp_processor_id()))
+ if (!softirq_pending(smp_processor_id())) {
+ gic_inject();
return;
+ }
local_irq_enable();
do_softirq();
}
list_add_tail(&n->inflight, &v->arch.vgic.inflight_irqs);
spin_unlock(&v->arch.vgic.lock);
/* we have a new higher priority irq, inject it into the guest */
- cpu_raise_softirq(v->processor, VGIC_SOFTIRQ);
}
-static void vgic_softirq(void)
-{
- if (list_empty(¤t->arch.vgic.inflight_irqs))
- return;
-
- gic_inject_irq_start();
-}
-
-static int __init init_vgic_softirq(void)
-{
- open_softirq(VGIC_SOFTIRQ, vgic_softirq);
- return 0;
-}
-__initcall(init_vgic_softirq);
/*
* Local variables:
* mode: C
#ifndef __ASM_SOFTIRQ_H__
#define __ASM_SOFTIRQ_H__
-#define VGIC_SOFTIRQ (NR_COMMON_SOFTIRQS + 0)
-#define NR_ARCH_SOFTIRQS 1
+#define NR_ARCH_SOFTIRQS 0
#endif /* __ASM_SOFTIRQ_H__ */
/*