diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-5.15/0083-KVM-SVM-Move-RESET-emulation-to-svm_vcpu_reset.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-5.15/0083-KVM-SVM-Move-RESET-emulation-to-svm_vcpu_reset.patch | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-5.15/0083-KVM-SVM-Move-RESET-emulation-to-svm_vcpu_reset.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-5.15/0083-KVM-SVM-Move-RESET-emulation-to-svm_vcpu_reset.patch new file mode 100644 index 00000000..dd9629df --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-5.15/0083-KVM-SVM-Move-RESET-emulation-to-svm_vcpu_reset.patch @@ -0,0 +1,123 @@ +From 3f57aba7394c1f7e7b288866eef70e59825df219 Mon Sep 17 00:00:00 2001 +From: Sean Christopherson <seanjc@google.com> +Date: Mon, 20 Sep 2021 17:03:02 -0700 +Subject: [PATCH 83/86] KVM: SVM: Move RESET emulation to svm_vcpu_reset() + +commit 9ebe530b9f5da89f9628923348db767e5d497e7b upstream + +Move RESET emulation for SVM vCPUs to svm_vcpu_reset(), and drop an extra +init_vmcb() from svm_create_vcpu() in the process. Hopefully KVM will +someday expose a dedicated RESET ioctl(), and in the meantime separating +"create" from "RESET" is a nice cleanup. + +Keep the call to svm_switch_vmcb() so that misuse of svm->vmcb at worst +breaks the guest, e.g. premature accesses doesn't cause a NULL pointer +dereference. + +Cc: Reiji Watanabe <reijiw@google.com> +Signed-off-by: Sean Christopherson <seanjc@google.com> +Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> +Message-Id: <20210921000303.400537-10-seanjc@google.com> +Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> +Signed-off-by: Zhaolong Zhang <zhaolong.zhang@windriver.com> +--- + arch/x86/kvm/svm/sev.c | 6 +++--- + arch/x86/kvm/svm/svm.c | 29 +++++++++++++++++------------ + arch/x86/kvm/svm/svm.h | 2 +- + 3 files changed, 21 insertions(+), 16 deletions(-) + +diff --git a/arch/x86/kvm/svm/sev.c b/arch/x86/kvm/svm/sev.c +index 86f3096f042f..d02bf4dbb048 100644 +--- a/arch/x86/kvm/svm/sev.c ++++ b/arch/x86/kvm/svm/sev.c +@@ -2665,11 +2665,11 @@ void sev_es_init_vmcb(struct vcpu_svm *svm) + set_msr_interception(vcpu, svm->msrpm, MSR_IA32_LASTINTTOIP, 1, 1); + } + +-void sev_es_create_vcpu(struct vcpu_svm *svm) ++void sev_es_vcpu_reset(struct vcpu_svm *svm) + { + /* +- * Set the GHCB MSR value as per the GHCB specification when creating +- * a vCPU for an SEV-ES guest. ++ * 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(GHCB_VERSION_MAX, + GHCB_VERSION_MIN, +diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c +index 2947e3c965e3..2d3c8f766769 100644 +--- a/arch/x86/kvm/svm/svm.c ++++ b/arch/x86/kvm/svm/svm.c +@@ -1312,6 +1312,19 @@ static void init_vmcb(struct kvm_vcpu *vcpu) + + } + ++static void __svm_vcpu_reset(struct kvm_vcpu *vcpu) ++{ ++ struct vcpu_svm *svm = to_svm(vcpu); ++ ++ svm_vcpu_init_msrpm(vcpu, svm->msrpm); ++ ++ svm_init_osvw(vcpu); ++ vcpu->arch.microcode_version = 0x01000065; ++ ++ if (sev_es_guest(vcpu->kvm)) ++ sev_es_vcpu_reset(svm); ++} ++ + static void svm_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event) + { + struct vcpu_svm *svm = to_svm(vcpu); +@@ -1320,6 +1333,9 @@ static void svm_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event) + svm->virt_spec_ctrl = 0; + + init_vmcb(vcpu); ++ ++ if (!init_event) ++ __svm_vcpu_reset(vcpu); + } + + void svm_switch_vmcb(struct vcpu_svm *svm, struct kvm_vmcb_info *target_vmcb) +@@ -1379,24 +1395,13 @@ static int svm_create_vcpu(struct kvm_vcpu *vcpu) + + svm->vmcb01.ptr = page_address(vmcb01_page); + svm->vmcb01.pa = __sme_set(page_to_pfn(vmcb01_page) << PAGE_SHIFT); ++ svm_switch_vmcb(svm, &svm->vmcb01); + + if (vmsa_page) + svm->vmsa = page_address(vmsa_page); + + svm->guest_state_loaded = false; + +- svm_switch_vmcb(svm, &svm->vmcb01); +- init_vmcb(vcpu); +- +- svm_vcpu_init_msrpm(vcpu, svm->msrpm); +- +- svm_init_osvw(vcpu); +- vcpu->arch.microcode_version = 0x01000065; +- +- if (sev_es_guest(vcpu->kvm)) +- /* Perform SEV-ES specific VMCB creation updates */ +- sev_es_create_vcpu(svm); +- + return 0; + + error_free_vmsa_page: +diff --git a/arch/x86/kvm/svm/svm.h b/arch/x86/kvm/svm/svm.h +index cf2d8365aeb4..de536e692e02 100644 +--- a/arch/x86/kvm/svm/svm.h ++++ b/arch/x86/kvm/svm/svm.h +@@ -564,7 +564,7 @@ void sev_free_vcpu(struct kvm_vcpu *vcpu); + int sev_handle_vmgexit(struct kvm_vcpu *vcpu); + int sev_es_string_io(struct vcpu_svm *svm, int size, unsigned int port, int in); + void sev_es_init_vmcb(struct vcpu_svm *svm); +-void sev_es_create_vcpu(struct vcpu_svm *svm); ++void sev_es_vcpu_reset(struct vcpu_svm *svm); + void sev_vcpu_deliver_sipi_vector(struct kvm_vcpu *vcpu, u8 vector); + void sev_es_prepare_guest_switch(struct vcpu_svm *svm, unsigned int cpu); + void sev_es_unmap_ghcb(struct vcpu_svm *svm); +-- +2.37.3 + |