|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] xen/arm: gic-v3: Implement correctly the callback send_SGI
On Mon, 27 Apr 2015, Julien Grall wrote:
> 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
Spurious change?
Aside from this:
Acked-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
> #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 |