]> git.ipfire.org Git - thirdparty/kernel/stable.git/blobdiff - arch/arm64/kvm/arm.c
Merge tag 'kvm-x86-generic-6.8' of https://github.com/kvm-x86/linux into HEAD
[thirdparty/kernel/stable.git] / arch / arm64 / kvm / arm.c
index 9725783745b47e80179a836e80bd32bf318c138b..a25265aca4324e490298794f5418aaa85b64480c 100644 (file)
@@ -409,7 +409,7 @@ void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu)
        kvm_mmu_free_memory_cache(&vcpu->arch.mmu_page_cache);
        kvm_timer_vcpu_terminate(vcpu);
        kvm_pmu_vcpu_destroy(vcpu);
-
+       kvm_vgic_vcpu_destroy(vcpu);
        kvm_arm_vcpu_destroy(vcpu);
 }
 
@@ -668,6 +668,12 @@ int kvm_arch_vcpu_run_pid_change(struct kvm_vcpu *vcpu)
                        return ret;
        }
 
+       if (vcpu_has_nv(vcpu)) {
+               ret = kvm_init_nv_sysregs(vcpu->kvm);
+               if (ret)
+                       return ret;
+       }
+
        ret = kvm_timer_enable(vcpu);
        if (ret)
                return ret;
@@ -1836,6 +1842,7 @@ static int kvm_init_vector_slots(void)
 static void __init cpu_prepare_hyp_mode(int cpu, u32 hyp_va_bits)
 {
        struct kvm_nvhe_init_params *params = per_cpu_ptr_nvhe_sym(kvm_init_params, cpu);
+       u64 mmfr0 = read_sanitised_ftr_reg(SYS_ID_AA64MMFR0_EL1);
        unsigned long tcr;
 
        /*
@@ -1858,6 +1865,10 @@ static void __init cpu_prepare_hyp_mode(int cpu, u32 hyp_va_bits)
        }
        tcr &= ~TCR_T0SZ_MASK;
        tcr |= TCR_T0SZ(hyp_va_bits);
+       tcr &= ~TCR_EL2_PS_MASK;
+       tcr |= FIELD_PREP(TCR_EL2_PS_MASK, kvm_get_parange(mmfr0));
+       if (kvm_lpa2_is_enabled())
+               tcr |= TCR_EL2_DS;
        params->tcr_el2 = tcr;
 
        params->pgd_pa = kvm_mmu_get_httbr();