|
@@ -102,6 +102,8 @@ static void __hyp_text __activate_traps_nvhe(struct kvm_vcpu *vcpu)
|
|
|
{
|
|
|
u64 val;
|
|
|
|
|
|
+ __activate_traps_common(vcpu);
|
|
|
+
|
|
|
val = CPTR_EL2_DEFAULT;
|
|
|
val |= CPTR_EL2_TTA | CPTR_EL2_TFP | CPTR_EL2_TZ;
|
|
|
write_sysreg(val, cptr_el2);
|
|
@@ -121,20 +123,12 @@ static void __hyp_text __activate_traps(struct kvm_vcpu *vcpu)
|
|
|
write_sysreg_s(vcpu->arch.vsesr_el2, SYS_VSESR_EL2);
|
|
|
|
|
|
__activate_traps_fpsimd32(vcpu);
|
|
|
- __activate_traps_common(vcpu);
|
|
|
__activate_traps_arch()(vcpu);
|
|
|
}
|
|
|
|
|
|
static void __hyp_text __deactivate_traps_vhe(void)
|
|
|
{
|
|
|
extern char vectors[]; /* kernel exception vectors */
|
|
|
- u64 mdcr_el2 = read_sysreg(mdcr_el2);
|
|
|
-
|
|
|
- mdcr_el2 &= MDCR_EL2_HPMN_MASK |
|
|
|
- MDCR_EL2_E2PB_MASK << MDCR_EL2_E2PB_SHIFT |
|
|
|
- MDCR_EL2_TPMS;
|
|
|
-
|
|
|
- write_sysreg(mdcr_el2, mdcr_el2);
|
|
|
write_sysreg(HCR_HOST_VHE_FLAGS, hcr_el2);
|
|
|
write_sysreg(CPACR_EL1_DEFAULT, cpacr_el1);
|
|
|
write_sysreg(vectors, vbar_el1);
|
|
@@ -144,6 +138,8 @@ static void __hyp_text __deactivate_traps_nvhe(void)
|
|
|
{
|
|
|
u64 mdcr_el2 = read_sysreg(mdcr_el2);
|
|
|
|
|
|
+ __deactivate_traps_common();
|
|
|
+
|
|
|
mdcr_el2 &= MDCR_EL2_HPMN_MASK;
|
|
|
mdcr_el2 |= MDCR_EL2_E2PB_MASK << MDCR_EL2_E2PB_SHIFT;
|
|
|
|
|
@@ -167,10 +163,27 @@ static void __hyp_text __deactivate_traps(struct kvm_vcpu *vcpu)
|
|
|
if (vcpu->arch.hcr_el2 & HCR_VSE)
|
|
|
vcpu->arch.hcr_el2 = read_sysreg(hcr_el2);
|
|
|
|
|
|
- __deactivate_traps_common();
|
|
|
__deactivate_traps_arch()();
|
|
|
}
|
|
|
|
|
|
+void activate_traps_vhe_load(struct kvm_vcpu *vcpu)
|
|
|
+{
|
|
|
+ __activate_traps_common(vcpu);
|
|
|
+}
|
|
|
+
|
|
|
+void deactivate_traps_vhe_put(void)
|
|
|
+{
|
|
|
+ u64 mdcr_el2 = read_sysreg(mdcr_el2);
|
|
|
+
|
|
|
+ mdcr_el2 &= MDCR_EL2_HPMN_MASK |
|
|
|
+ MDCR_EL2_E2PB_MASK << MDCR_EL2_E2PB_SHIFT |
|
|
|
+ MDCR_EL2_TPMS;
|
|
|
+
|
|
|
+ write_sysreg(mdcr_el2, mdcr_el2);
|
|
|
+
|
|
|
+ __deactivate_traps_common();
|
|
|
+}
|
|
|
+
|
|
|
static void __hyp_text __activate_vm(struct kvm *kvm)
|
|
|
{
|
|
|
write_sysreg(kvm->arch.vttbr, vttbr_el2);
|