[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2 04/19] xen/arm: Restore HCR_EL2 register
Different domains may have different HCR_EL2 flags. For example, the 64-bit domain needs HCR_RW flag but the 32-bit does not need it. So we give each domain a default HCR_EL2 value and save it in the vCPU's context. HCR_EL2 register has only one bit can be updated automatically without explicit write (HCR_VSE). But we haven't used this bit currently, so we can consider that the HCR_EL2 register will not be modified while the guest is running. So save the HCR_EL2 while guest exiting to hypervisor is not neccessary. We just have to restore this register for each vCPU while context switching. The p2m_restore_state which will be invoked in context switch progress has included the writing of HCR_EL2 already. It updates the HCR_EL2.RW bit to tell the hardware how to interpret the stage-1 page table as the encodings are different between AArch64 and AArch32. We can reuse this write to restore the HCR_EL2 for each vCPU. Of course, the value of each vCPU's HCR_EL2 should be adjusted to have proper HCR_EL2.RW bit in this function. In the later patch of this series, we will set the HCR_EL2.RW for each vCPU while the domain is creating. Signed-off-by: wei chen <Wei.Chen@xxxxxxx> --- v1->v2: 1. Use vwfi to set HCR_EL2 for each vCPU directly. 2. Back HCR_EL2 for idle vCPU to avoid using p2m_restore_state with an uninitialized HCR_EL2 value in context. 3. Remove writing to HCR_EL2 from leave_hypervisor_tail. 4. Update commit message to explain why restore HCR_EL2 in p2m_restore_state. --- xen/arch/arm/domain.c | 4 ++++ xen/arch/arm/domain_build.c | 7 +++++++ xen/arch/arm/p2m.c | 9 +++------ xen/include/asm-arm/domain.h | 3 +++ 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c index a327a3b..c69e204 100644 --- a/xen/arch/arm/domain.c +++ b/xen/arch/arm/domain.c @@ -527,6 +527,10 @@ int vcpu_initialise(struct vcpu *v) v->arch.actlr = READ_SYSREG32(ACTLR_EL1); + v->arch.hcr_el2 = HCR_PTW|HCR_BSU_INNER|HCR_AMO|HCR_IMO|HCR_FMO|HCR_VM| + (vwfi != NATIVE ? (HCR_TWI|HCR_TWE) : 0) | + HCR_TSC|HCR_TAC|HCR_SWIO|HCR_TIDCP|HCR_FB; + processor_vcpu_initialise(v); if ( (rc = vcpu_vgic_init(v)) != 0 ) diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c index de59e5f..8af223e 100644 --- a/xen/arch/arm/domain_build.c +++ b/xen/arch/arm/domain_build.c @@ -2171,6 +2171,13 @@ int construct_dom0(struct domain *d) return rc; /* + * The HCR_EL2 will temporarily switch to dom0's HCR_EL2 value + * by p2m_restore_state. We have to save HCR_EL2 to idle vCPU's + * context for restoring it in later. + */ + current->arch.hcr_el2 = READ_SYSREG(HCR_EL2); + + /* * The following loads use the domain's p2m and require current to * be a vcpu of the domain, temporarily switch */ diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c index 6263760..83c4b7d 100644 --- a/xen/arch/arm/p2m.c +++ b/xen/arch/arm/p2m.c @@ -128,27 +128,24 @@ void p2m_save_state(struct vcpu *p) void p2m_restore_state(struct vcpu *n) { - register_t hcr; struct p2m_domain *p2m = &n->domain->arch.p2m; uint8_t *last_vcpu_ran; if ( is_idle_vcpu(n) ) return; - hcr = READ_SYSREG(HCR_EL2); - WRITE_SYSREG64(p2m->vttbr, VTTBR_EL2); isb(); if ( is_32bit_domain(n->domain) ) - hcr &= ~HCR_RW; + n->arch.hcr_el2 &= ~HCR_RW; else - hcr |= HCR_RW; + n->arch.hcr_el2 |= HCR_RW; WRITE_SYSREG(n->arch.sctlr, SCTLR_EL1); isb(); - WRITE_SYSREG(hcr, HCR_EL2); + WRITE_SYSREG(n->arch.hcr_el2, HCR_EL2); isb(); last_vcpu_ran = &p2m->last_vcpu_ran[smp_processor_id()]; diff --git a/xen/include/asm-arm/domain.h b/xen/include/asm-arm/domain.h index 09fe502..7b1dacc 100644 --- a/xen/include/asm-arm/domain.h +++ b/xen/include/asm-arm/domain.h @@ -204,6 +204,9 @@ struct arch_vcpu register_t tpidr_el1; register_t tpidrro_el0; + /* HYP configuration */ + register_t hcr_el2; + uint32_t teecr, teehbr; /* ThumbEE, 32-bit guests only */ #ifdef CONFIG_ARM_32 /* -- 2.7.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |