[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 13/13] xen/arm: vgic-v3: Allow AArch32 guest booting with GICv3
On Wed, 7 Dec 2016, Julien Grall wrote: > AArch32 guest will use co-processor registers to access the GICv3 (see > 8.5 in IHI 0069C). Some of the registers have to be trapped and emulated > (e.g ICC_SGI1R), this is the purpose of this patch. > > The rest of the emulation already supports access required for AArch32 > so nothing has to be changed there. > > Note this is only enabling 32-bit guest using GICv3 on Xen ARM64. Further > work would be required to compile GICv3 and vGICv3 for Xen ARM32. > > Signed-off-by: Julien Grall <julien.grall@xxxxxxx> Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx> > --- > xen/arch/arm/traps.c | 12 ++++++++++++ > xen/arch/arm/vgic-v3.c | 20 ++++++++++++++++++++ > xen/include/asm-arm/cpregs.h | 3 +++ > xen/include/asm-arm/perfc_defn.h | 2 ++ > 4 files changed, 37 insertions(+) > > diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c > index 1fe02cb..eb85d92 100644 > --- a/xen/arch/arm/traps.c > +++ b/xen/arch/arm/traps.c > @@ -1876,6 +1876,18 @@ static void do_cp15_64(struct cpu_user_regs *regs, > break; > > /* > + * HCR_EL2.FMO or HCR_EL2.IMO > + * > + * GIC Architecture Specification (IHI 0069C): Section 4.6.3 > + */ > + case HSR_CPREG64(ICC_SGI1R): > + case HSR_CPREG64(ICC_ASGI1R): > + case HSR_CPREG64(ICC_SGI0R): > + if ( !vgic_emulate(regs, hsr) ) > + return inject_undef_exception(regs, hsr); > + break; > + > + /* > * CPTR_EL2.T{0..9,12..13} > * > * ARMv7 (DDI 0406C.b): B1.14.12 > diff --git a/xen/arch/arm/vgic-v3.c b/xen/arch/arm/vgic-v3.c > index f23135d..22c8ce0 100644 > --- a/xen/arch/arm/vgic-v3.c > +++ b/xen/arch/arm/vgic-v3.c > @@ -1335,12 +1335,32 @@ static bool vgic_v3_emulate_sysreg(struct > cpu_user_regs *regs, union hsr hsr) > } > } > > +static bool vgic_v3_emulate_cp64(struct cpu_user_regs *regs, union hsr hsr) > +{ > + struct hsr_cp64 cp64 = hsr.cp64; > + > + if ( cp64.read ) > + perfc_incr(vgic_cp64_reads); > + else > + perfc_incr(vgic_cp64_writes); > + > + switch ( hsr.bits & HSR_CP64_REGS_MASK ) > + { > + case HSR_CPREG64(ICC_SGI1R): > + return vreg_emulate_cp64(regs, hsr, vgic_v3_emulate_sgi1r); > + default: > + return false; > + } > +} > + > static bool vgic_v3_emulate_reg(struct cpu_user_regs *regs, union hsr hsr) > { > switch (hsr.ec) > { > case HSR_EC_SYSREG: > return vgic_v3_emulate_sysreg(regs, hsr); > + case HSR_EC_CP15_64: > + return vgic_v3_emulate_cp64(regs, hsr); > default: > return false; > } > diff --git a/xen/include/asm-arm/cpregs.h b/xen/include/asm-arm/cpregs.h > index e5cb00c..af45ec7 100644 > --- a/xen/include/asm-arm/cpregs.h > +++ b/xen/include/asm-arm/cpregs.h > @@ -246,6 +246,9 @@ > /* CP15 CR11: DMA Operations for TCM Access */ > > /* CP15 CR12: */ > +#define ICC_SGI1R p15,0,c12 /* Interrupt Controller SGI Group 1 > */ > +#define ICC_ASGI1R p15,1,c12 /* Interrupt Controller Alias SGI > Group 1 Register */ > +#define ICC_SGI0R p15,2,c12 /* Interrupt Controller SGI Group 0 > */ > #define VBAR p15,0,c12,c0,0 /* Vector Base Address Register */ > #define HVBAR p15,4,c12,c0,0 /* Hyp. Vector Base Address Register > */ > > diff --git a/xen/include/asm-arm/perfc_defn.h > b/xen/include/asm-arm/perfc_defn.h > index 69fabe7..5f957ee 100644 > --- a/xen/include/asm-arm/perfc_defn.h > +++ b/xen/include/asm-arm/perfc_defn.h > @@ -38,6 +38,8 @@ PERFCOUNTER(vgicd_reads, "vgicd: read") > PERFCOUNTER(vgicd_writes, "vgicd: write") > PERFCOUNTER(vgicr_reads, "vgicr: read") > PERFCOUNTER(vgicr_writes, "vgicr: write") > +PERFCOUNTER(vgic_cp64_reads, "vgic: cp64 read") > +PERFCOUNTER(vgic_cp64_writes, "vgic: cp64 write") > PERFCOUNTER(vgic_sysreg_reads, "vgic: sysreg read") > PERFCOUNTER(vgic_sysreg_writes, "vgic: sysreg write") > PERFCOUNTER(vgic_sgi_list , "vgic: SGI send to list") > -- > 1.9.1 > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |