[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] xen/arm: gic: Read unconditionally the source from the LRs
On Wed, 21 Mar 2018, Julien Grall wrote: > Commit 5cb00d1 "ARM: GIC: extend LR read/write functions to cover EOI > and source" extended gic_lr to cover the source. The new field was only > set for SGIs interrupt in the read function. However, the write function > is writing the field unconditionally for virtual interrupt. > > This means that if the caller was combining the 2 functions (e.g to > update the LR), the source need to be set to 0 by the caller. > Unfortunately, gic_update_one_lr is not zeroing the structure before > reading the LRs. This will lead to trigger the assert randomly. > > Instead of zeroing the structure in gic_update_one_lr, make sure that > the source is written unconditionally on read. This is also simplifying > the code to avoid an if statement in the read path. > > Lastly, properly update the comments in write_lr that was mistakenly > speaking about the read lr path. > > Signed-off-by: Julien Grall <julien.grall@xxxxxxx> Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx> and committed > --- > xen/arch/arm/gic-v2.c | 15 ++++++++------- > xen/arch/arm/gic-v3.c | 13 ++++++++----- > 2 files changed, 16 insertions(+), 12 deletions(-) > > diff --git a/xen/arch/arm/gic-v2.c b/xen/arch/arm/gic-v2.c > index 7dfe6fc68d..aa0fc6c1a1 100644 > --- a/xen/arch/arm/gic-v2.c > +++ b/xen/arch/arm/gic-v2.c > @@ -480,11 +480,12 @@ static void gicv2_read_lr(int lr, struct gic_lr *lr_reg) > else > { > lr_reg->virt.eoi = (lrv & GICH_V2_LR_MAINTENANCE_IRQ); > - if ( lr_reg->virq < NR_GIC_SGI ) > - { > - lr_reg->virt.source = (lrv >> GICH_V2_LR_CPUID_SHIFT) > - & GICH_V2_LR_CPUID_MASK; > - } > + /* > + * This is only valid for SGI, but it does not matter to always > + * read it as it should be 0 by default. > + */ > + lr_reg->virt.source = (lrv >> GICH_V2_LR_CPUID_SHIFT) > + & GICH_V2_LR_CPUID_MASK; > } > } > > @@ -512,8 +513,8 @@ static void gicv2_write_lr(int lr, const struct gic_lr > *lr_reg) > if ( lr_reg->virt.eoi ) > lrv |= GICH_V2_LR_MAINTENANCE_IRQ; > /* > - * This is only valid for SGI, but it does not matter to always > - * read it as it should be 0 by default. > + * Source is only valid for SGIs, the caller should make sure > + * the field virt.source is always 0 for non-SGI. > */ > ASSERT(!lr_reg->virt.source || lr_reg->virq < NR_GIC_SGI); > lrv |= (uint32_t)lr_reg->virt.source << GICH_V2_LR_CPUID_SHIFT; > diff --git a/xen/arch/arm/gic-v3.c b/xen/arch/arm/gic-v3.c > index 392cf91b58..cb41844af2 100644 > --- a/xen/arch/arm/gic-v3.c > +++ b/xen/arch/arm/gic-v3.c > @@ -1018,10 +1018,13 @@ static void gicv3_read_lr(int lr, struct gic_lr > *lr_reg) > else > { > lr_reg->virt.eoi = (lrv & ICH_LR_MAINTENANCE_IRQ); > - /* Source only exists for SGI and in GICv2 compatible mode */ > - if ( lr_reg->virq < NR_GIC_SGI && > - current->domain->arch.vgic.version == GIC_V2 ) > + /* Source only exists in GICv2 compatible mode */ > + if ( current->domain->arch.vgic.version == GIC_V2 ) > { > + /* > + * This is only valid for SGI, but it does not matter to always > + * read it as it should be 0 by default. > + */ > lr_reg->virt.source = (lrv >> ICH_LR_CPUID_SHIFT) > & ICH_LR_CPUID_MASK; > } > @@ -1056,8 +1059,8 @@ static void gicv3_write_lr(int lr_reg, const struct > gic_lr *lr) > if ( vgic_version == GIC_V2 ) > { > /* > - * This is only valid for SGI, but it does not matter to always > - * read it as it should be 0 by default. > + * Source is only valid for SGIs, the caller should make > + * sure the field virt.source is always 0 for non-SGI. > */ > ASSERT(!lr->virt.source || lr->virq < NR_GIC_SGI); > lrv |= (uint64_t)lr->virt.source << ICH_LR_CPUID_SHIFT; > -- > 2.11.0 > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |