[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] xen/arm: gic-v3: Implement correctly the callback send_SGI
Currently, the GICv3 drivers is only able to send an SGI when the cpumask is provided. Although with the modes SGI_TARGET_OTHERS and SGI_TARGET_SELF, no cpumask is provided. Any usage of those modes will crash the hypersivor. Move the rename gicv3_send_sgi to gicv3_send_sgi_list and implement the different modes: - SGI_TARGET_OTHERS: Set the Interrupt Routing Mode (bit 40) to 1 (see Table 4 on Section 4.2.6 PRD03-GENC-010745 24.0) - SGI_TARGET_SELF: Contrawise GICv2, the SGI registers doesn't provide a specific field. So use gicv3_send_sgi_list and pass the cpumask of the current CPU - SGI_TARGET_LIST: Directly call gicv3_send_sgi_list with the given cpumask Reported-by: Chen Baozi <baozich@xxxxxxxxx> Signed-off-by: Julien Grall <julien.grall@xxxxxxxxxx> --- xen/arch/arm/gic-v3.c | 25 +++++++++++++++++++++++-- xen/include/asm-arm/gic_v3_defs.h | 2 +- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/xen/arch/arm/gic-v3.c b/xen/arch/arm/gic-v3.c index b0f498e..e1574d8 100644 --- a/xen/arch/arm/gic-v3.c +++ b/xen/arch/arm/gic-v3.c @@ -808,8 +808,7 @@ out: return tlist; } -static void gicv3_send_sgi(enum gic_sgi sgi, enum gic_sgi_mode mode, - const cpumask_t *cpumask) +static void gicv3_send_sgi_list(enum gic_sgi sgi, const cpumask_t *cpumask) { int cpu = 0; uint64_t val; @@ -839,6 +838,28 @@ static void gicv3_send_sgi(enum gic_sgi sgi, enum gic_sgi_mode mode, isb(); } +static void gicv3_send_sgi(enum gic_sgi sgi, enum gic_sgi_mode mode, + const cpumask_t *cpumask) +{ + switch ( mode ) + { + case SGI_TARGET_OTHERS: + WRITE_SYSREG(ICH_SGI_TARGET_OTHERS << ICH_SGI_IRQMODE_SHIFT | + (register_t)sgi << ICH_SGI_IRQ_SHIFT, + ICC_SGI1R_EL1); + isb(); + break; + case SGI_TARGET_SELF: + gicv3_send_sgi_list(sgi, cpumask_of(smp_processor_id())); + break; + case SGI_TARGET_LIST: + gicv3_send_sgi_list(sgi, cpumask); + break; + default: + BUG(); + } +} + /* Shut down the per-CPU GIC interface */ static void gicv3_disable_interface(void) { diff --git a/xen/include/asm-arm/gic_v3_defs.h b/xen/include/asm-arm/gic_v3_defs.h index b8a1c2e..556f114 100644 --- a/xen/include/asm-arm/gic_v3_defs.h +++ b/xen/include/asm-arm/gic_v3_defs.h @@ -147,7 +147,7 @@ #define ICH_SGI_IRQMODE_SHIFT 40 #define ICH_SGI_IRQMODE_MASK 0x1 -#define ICH_SGI_TARGET_OTHERS 1 +#define ICH_SGI_TARGET_OTHERS 1UL #define ICH_SGI_TARGET_LIST 0 #define ICH_SGI_IRQ_SHIFT 24 #define ICH_SGI_IRQ_MASK 0xf -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |