|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [RFC 22/22] xen/arm: gic-v3: Add support of vGICv2 when available
On Fri, 2015-06-05 at 17:35 +0100, Julien Grall wrote:
> >> */
> >> static void gicv3_enable_sre(void)
> >> {
> >> uint32_t val;
> >>
> >> val = READ_SYSREG32(ICC_SRE_EL2);
> >> - val |= GICC_SRE_EL2_SRE | GICC_SRE_EL2_ENEL1;
> >> + val |= GICC_SRE_EL2_SRE;
> >>
> >> WRITE_SYSREG32(val, ICC_SRE_EL2);
> >> isb();
> >> @@ -373,6 +372,20 @@ static void gicv3_save_state(struct vcpu *v)
> >>
> >> static void gicv3_restore_state(const struct vcpu *v)
> >> {
> >> + uint32_t val;
> >> +
> >> + val = READ_SYSREG32(ICC_SRE_EL2);
> >> + /*
> >> + * Don't give access to system registers when the guest is using
> >> + * GICv2
> >> + */
> >> + if ( v->domain->arch.vgic.version == GIC_V2 )
> >> + val &= ~GICC_SRE_EL2_ENEL1;
> >> + else
> >> + val |= GICC_SRE_EL2_ENEL1;
> >> + WRITE_SYSREG32(val, ICC_SRE_EL2);
> >
> > Perhaps save/restore v->arch.gic.v3.sre_el2 rather than reading and
> > recalculating each time? Then you just need to set sre_el2 appropriately
> > during domain init.
>
> Hmmm that would mean to reintroduce gicv_setup for setting sre_el2.
>
> What is your concern here?
I don't really like read/modify/write idiom in the restore path, I'd
prefer a straight save/restore model (I know we have some R/M/W
already).
> >> @@ -1107,6 +1127,32 @@ static int __init cmp_rdist(const void *a, const
> >> void *b)
> >> return ( l->base < r->base) ? -1 : 0;
> >> }
> >>
> >> +/* If the GICv3 supports GICv2, initialize it */
> >> +static void __init gicv3_init_v2(const struct dt_device_node *node)
> >> +{
> >> + int res;
> >> +
> >> + /*
> >> + * For GICv3 supporting GICv2, GICC and GICV base address will be
> >> + * provided.
> >> + */
> >> +
> >> + res = dt_device_get_address(node, 1 + gicv3_info.nr_rdist_regions,
> >> + &gicv3_info.cbase, NULL);
> >> + if ( res )
> >> + return;
> >> +
> >> + res = dt_device_get_address(node, 1 + gicv3_info.nr_rdist_regions + 2,
> >> + &gicv3_info.vbase, NULL);
> >> + if ( res )
> >> + return;
> >> +
> >> + printk("GICv3 compatible with GICv2 cbase %#"PRIpaddr" vbase
> >> %#"PRIpaddr"\n",
> >> + gicv3_info.cbase, gicv3_info.vbase);
> >> +
> >> + gicv3_info.vgic_versions |= GIC_V2;
> >
> > So I think this is a second type of compat, right? After this we
> > support:
> >
> > Guests using GICv2, via vgic-v2.c
> > Guests using GICv3, via vgic-v3.c
> >
> > But also:
> >
> > Guests using GICv2, via vgic-v3.c, i.e. vgicv3 in compat mode.
> >
> > Is that right? Is it intended?
>
> No, we don't support the last one. This variable is used to know which
> callback set we have to use.
>
> It may be clearer with the suggested solution in patch #16.
Lets see ;-)
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |