]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
KVM: SEV: Set RESET GHCB MSR value during sev_es_init_vmcb()
authorSean Christopherson <seanjc@google.com>
Tue, 19 Aug 2025 23:48:31 +0000 (16:48 -0700)
committerSean Christopherson <seanjc@google.com>
Thu, 21 Aug 2025 15:45:04 +0000 (08:45 -0700)
Set the RESET value for the GHCB "MSR" during sev_es_init_vmcb() instead
of sev_es_vcpu_reset() to allow for dropping sev_es_vcpu_reset() entirely.

Note, the call to sev_init_vmcb() from sev_migrate_from() also kinda sorta
emulates a RESET, but sev_migrate_from() immediately overwrites ghcb_gpa
with the source's current value, so whether or not stuffing the GHCB
version is correct/desirable is moot.

No functional change intended.

Reviewed-by: Nikunj A Dadhania <nikunj@amd.com>
Link: https://lore.kernel.org/r/20250819234833.3080255-7-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/kvm/svm/sev.c

index c5726b09168037229123c6ccd794bb1ae22e642e..ee7a0584354890505c640d5c910ff7211a883b9d 100644 (file)
@@ -4480,7 +4480,7 @@ void sev_vcpu_after_set_cpuid(struct vcpu_svm *svm)
                vcpu->arch.reserved_gpa_bits &= ~(1UL << (best->ebx & 0x3f));
 }
 
-static void sev_es_init_vmcb(struct vcpu_svm *svm)
+static void sev_es_init_vmcb(struct vcpu_svm *svm, bool init_event)
 {
        struct kvm_sev_info *sev = to_kvm_sev_info(svm->vcpu.kvm);
        struct vmcb *vmcb = svm->vmcb01.ptr;
@@ -4541,6 +4541,15 @@ static void sev_es_init_vmcb(struct vcpu_svm *svm)
 
        /* Can't intercept XSETBV, HV can't modify XCR0 directly */
        svm_clr_intercept(svm, INTERCEPT_XSETBV);
+
+       /*
+        * Set the GHCB MSR value as per the GHCB specification when emulating
+        * vCPU RESET for an SEV-ES guest.
+        */
+       if (!init_event)
+               set_ghcb_msr(svm, GHCB_MSR_SEV_INFO((__u64)sev->ghcb_version,
+                                                   GHCB_VERSION_MIN,
+                                                   sev_enc_bit));
 }
 
 void sev_init_vmcb(struct vcpu_svm *svm, bool init_event)
@@ -4560,7 +4569,7 @@ void sev_init_vmcb(struct vcpu_svm *svm, bool init_event)
                sev_snp_init_protected_guest_state(vcpu);
 
        if (sev_es_guest(vcpu->kvm))
-               sev_es_init_vmcb(svm);
+               sev_es_init_vmcb(svm, init_event);
 }
 
 int sev_vcpu_create(struct kvm_vcpu *vcpu)
@@ -4585,17 +4594,6 @@ int sev_vcpu_create(struct kvm_vcpu *vcpu)
 
 void sev_es_vcpu_reset(struct vcpu_svm *svm)
 {
-       struct kvm_vcpu *vcpu = &svm->vcpu;
-       struct kvm_sev_info *sev = to_kvm_sev_info(vcpu->kvm);
-
-       /*
-        * Set the GHCB MSR value as per the GHCB specification when emulating
-        * vCPU RESET for an SEV-ES guest.
-        */
-       set_ghcb_msr(svm, GHCB_MSR_SEV_INFO((__u64)sev->ghcb_version,
-                                           GHCB_VERSION_MIN,
-                                           sev_enc_bit));
-
        mutex_init(&svm->sev_es.snp_vmsa_mutex);
 }