[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v7a 13/14] xen/arm: split vgic driver into generic and vgic-v2 driver



Hi Julien,


On Tue, Jul 1, 2014 at 6:38 PM, Julien Grall <julien.grall@xxxxxxxxxx> wrote:

>> -static int vgic_to_sgi(struct vcpu *v, register_t sgir)
>> +/* TODO: unsigned long is used to fit vcpu_mask. Change to cpu_mask */
>> +int vgic_to_sgi(struct vcpu *v, register_t sgir, enum gic_sgi_mode irqmode, 
>> int virq,
>> +                unsigned long vcpu_mask)
>
>
> [..]
>
>> +    case SGI_TARGET_OTHERS:
>
> [..]
>
>> +        break;
>> +    case SGI_TARGET_SELF:
>> +        set_bit(current->vcpu_id, &vcpu_mask);
>
> I already said it on V4, V5 and now V6a and don't see any change or
> comment from you side.
>
> For SGI_TARGET_{OTHERS,SELF}, you can't assume that vcpu_mask will be
> equal to 0...
>
> It comes directly guest write to GICD_SIGR. Please make sure to handle
> it correctly or the guest could send SGI to the wrong VCPUs.

Sorry I missed this patch to fix the comments.

First, if Guest uses this series of patches, mask is not written to GICD_SGIR
for OTHERS & SELF case in v2 driver

static void gicv2_send_SGI(enum gic_sgi sgi, enum gic_sgi_mode irqmode,
                           const cpumask_t *cpu_mask)
{
    unsigned int mask = 0;

    switch ( irqmode )
    {
    case SGI_TARGET_OTHERS:
        writel_relaxed(GICD_SGI_TARGET_OTHERS | sgi, GICD + GICD_SGIR);
        break;
    case SGI_TARGET_SELF:
        writel_relaxed(GICD_SGI_TARGET_SELF | sgi, GICD + GICD_SGIR);
        break;

Even if Guest writes some values to mask, then only way I check is to forcefully
make vcpu_mask as 0 for OTHERS & SELF case before using it with warning


>
> [..]
>
>> +struct vgic_ops {
>> +    /* Initialize vGIC */
>> +    int (*vcpu_init)(struct vcpu *v);
>> +    /* Domain specific initialization of vGIC */
>> +    int (*domain_init)(struct domain *d);
>> +    /* SGI handler of vGIC */
>> +    int (*send_sgi)(struct vcpu *v, register_t sgir);
>
> You've introduced vgic_send_sgi here, I'm not sure to understand why...
> Can you give more input?

    You have asked me make sending sgi as a callback.
So I have introduced the following way

On GICD_SGIR write by guest, vgic-v2.c calls vgic_send_sgi()
which will call the registered callback (*send_sgi).
Here send_sgi is registered with vgic_v2_to_sgi() which will inject
sgi

>
>> +};
>> +
>>  /* Number of ranks of interrupt registers for a domain */
>>  #define DOMAIN_NR_RANKS(d) (((d)->arch.vgic.nr_lines+31)/32)
>>
>> @@ -133,6 +142,8 @@ static inline void vgic_byte_write(uint32_t *reg, 
>> uint32_t var, int offset)
>>      *reg |= var;
>>  }
>>
>> +extern enum gic_sgi_mode irqmode;
>> +
>
> Hu? What is used for?

   This is forward declaration for below function in vgic.h file. May
be extern is not required here
   extern int vgic_to_sgi(struct vcpu *v, register_t sgir,
                       enum gic_sgi_mode irqmode, int virq,
                       unsigned long vcpu_mask);

_______________________________________________
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®.