[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.