diff --git a/xen/arch/arm/gic.c b/xen/arch/arm/gic.c index 0ca02349a7..054e1ca135 100644 --- a/xen/arch/arm/gic.c +++ b/xen/arch/arm/gic.c @@ -483,21 +483,37 @@ void __init gic_init(void) spin_unlock(&gic.lock); } -void send_SGI_mask(const cpumask_t *cpumask, enum gic_sgi sgi) +static void send_SGI(enum gic_sgi sgi, enum gic_sgi_mode irqmode, + const cpumask_t *cpu_mask) { unsigned int mask = 0; cpumask_t online_mask; + switch ( irqmode ) + { + case SGI_TARGET_OTHERS: + GICD[GICD_SGIR] = GICD_SGI_TARGET_OTHERS | sgi; + break; + case SGI_TARGET_SELF: + GICD[GICD_SGIR] = GICD_SGI_TARGET_SELF | sgi; + break; + case SGI_TARGET_LIST: + cpumask_and(&online_mask, cpu_mask, &cpu_online_map); + mask = gic_cpu_mask(&online_mask); + GICD[GICD_SGIR] = GICD_SGI_TARGET_LIST | + (mask << GICD_SGI_TARGET_SHIFT) | sgi; + break; + default: + BUG(); + } +} + +void send_SGI_mask(const cpumask_t *cpumask, enum gic_sgi sgi) +{ ASSERT(sgi < 16); /* There are only 16 SGIs */ - cpumask_and(&online_mask, cpumask, &cpu_online_map); - mask = gic_cpu_mask(&online_mask); - dsb(sy); - - GICD[GICD_SGIR] = GICD_SGI_TARGET_LIST - | (mask<