diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0071-KVM-SVM-VMRUN-should-use-associated-ASID-when-SEV-is.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0071-KVM-SVM-VMRUN-should-use-associated-ASID-when-SEV-is.patch | 162 |
1 files changed, 0 insertions, 162 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0071-KVM-SVM-VMRUN-should-use-associated-ASID-when-SEV-is.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0071-KVM-SVM-VMRUN-should-use-associated-ASID-when-SEV-is.patch deleted file mode 100644 index 5cf128d8..00000000 --- a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71-e3000/0071-KVM-SVM-VMRUN-should-use-associated-ASID-when-SEV-is.patch +++ /dev/null @@ -1,162 +0,0 @@ -From 6d4852ea9d190fbb0607d7b067662b30dac7983e Mon Sep 17 00:00:00 2001 -From: Sudheesh Mavila <sudheesh.mavila@amd.com> -Date: Tue, 14 Aug 2018 22:13:30 +0530 -Subject: [PATCH 71/95] KVM: SVM: VMRUN should use associated ASID when SEV is - enabled -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - - commit 70cd94e60c733e3afc18b0e6aab789c13b5571da - - SEV hardware uses ASIDs to associate a memory encryption key with a - guest VM. During guest creation, a SEV VM uses the SEV_CMD_ACTIVATE - command to bind a particular ASID to the guest. Lets make sure that the - VMCB is programmed with the bound ASID before a VMRUN. - - Cc: Thomas Gleixner <tglx@linutronix.de> - Cc: Ingo Molnar <mingo@redhat.com> - Cc: "H. Peter Anvin" <hpa@zytor.com> - Cc: Paolo Bonzini <pbonzini@redhat.com> - Cc: "Radim Krčmář" <rkrcmar@redhat.com> - Cc: Joerg Roedel <joro@8bytes.org> - Cc: Borislav Petkov <bp@suse.de> - Cc: Tom Lendacky <thomas.lendacky@amd.com> - Cc: x86@kernel.org - Cc: kvm@vger.kernel.org - Cc: linux-kernel@vger.kernel.org - Signed-off-by: Brijesh Singh <brijesh.singh@amd.com> - Reviewed-by: Borislav Petkov <bp@suse.de> - -Signed-off-by: Sudheesh Mavila <sudheesh.mavila@amd.com> ---- - arch/x86/kvm/svm.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- - 1 file changed, 56 insertions(+), 2 deletions(-) - -diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c -index c41635b..f4fc0b2 100755 ---- a/arch/x86/kvm/svm.c -+++ b/arch/x86/kvm/svm.c -@@ -225,6 +225,9 @@ struct vcpu_svm { - */ - struct list_head ir_list; - spinlock_t ir_list_lock; -+ -+ /* which host CPU was used for running this vcpu */ -+ unsigned int last_cpu; - }; - - /* -@@ -355,6 +358,13 @@ static inline bool sev_guest(struct kvm *kvm) - return sev->active; - } - -+static inline int sev_get_asid(struct kvm *kvm) -+{ -+ struct kvm_sev_info *sev = &kvm->arch.sev_info; -+ -+ return sev->asid; -+} -+ - static inline void mark_all_dirty(struct vmcb *vmcb) - { - vmcb->control.clean = 0; -@@ -566,6 +576,9 @@ struct svm_cpu_data { - - struct page *save_area; - struct vmcb *current_vmcb; -+ -+ /* index = sev_asid, value = vmcb pointer */ -+ struct vmcb **sev_vmcbs; - }; - - static DEFINE_PER_CPU(struct svm_cpu_data *, svm_data); -@@ -879,6 +892,7 @@ static void svm_cpu_uninit(int cpu) - return; - - per_cpu(svm_data, raw_smp_processor_id()) = NULL; -+ kfree(sd->sev_vmcbs); - __free_page(sd->save_area); - kfree(sd); - } -@@ -892,11 +906,18 @@ static int svm_cpu_init(int cpu) - if (!sd) - return -ENOMEM; - sd->cpu = cpu; -- sd->save_area = alloc_page(GFP_KERNEL); - r = -ENOMEM; -+ sd->save_area = alloc_page(GFP_KERNEL); - if (!sd->save_area) - goto err_1; - -+ if (svm_sev_enabled()) { -+ r = -ENOMEM; -+ sd->sev_vmcbs = kmalloc((max_sev_asid + 1) * sizeof(void *), GFP_KERNEL); -+ if (!sd->sev_vmcbs) -+ goto err_1; -+ } -+ - per_cpu(svm_data, cpu) = sd; - - return 0; -@@ -1535,10 +1556,16 @@ static int avic_init_backing_page(struct kvm_vcpu *vcpu) - - static void __sev_asid_free(int asid) - { -- int pos; -+ struct svm_cpu_data *sd; -+ int cpu, pos; - - pos = asid - 1; - clear_bit(pos, sev_asid_bitmap); -+ -+ for_each_possible_cpu(cpu) { -+ sd = per_cpu(svm_data, cpu); -+ sd->sev_vmcbs[pos] = NULL; -+ } - } - - static void sev_asid_free(struct kvm *kvm) -@@ -4603,12 +4630,39 @@ static void reload_tss(struct kvm_vcpu *vcpu) - load_TR_desc(); - } - -+static void pre_sev_run(struct vcpu_svm *svm, int cpu) -+{ -+ struct svm_cpu_data *sd = per_cpu(svm_data, cpu); -+ int asid = sev_get_asid(svm->vcpu.kvm); -+ -+ /* Assign the asid allocated with this SEV guest */ -+ svm->vmcb->control.asid = asid; -+ -+ /* -+ * Flush guest TLB: -+ * -+ * 1) when different VMCB for the same ASID is to be run on the same host CPU. -+ * 2) or this VMCB was executed on different host CPU in previous VMRUNs. -+ */ -+ if (sd->sev_vmcbs[asid] == svm->vmcb && -+ svm->last_cpu == cpu) -+ return; -+ -+ svm->last_cpu = cpu; -+ sd->sev_vmcbs[asid] = svm->vmcb; -+ svm->vmcb->control.tlb_ctl = TLB_CONTROL_FLUSH_ASID; -+ mark_dirty(svm->vmcb, VMCB_ASID); -+} -+ - static void pre_svm_run(struct vcpu_svm *svm) - { - int cpu = raw_smp_processor_id(); - - struct svm_cpu_data *sd = per_cpu(svm_data, cpu); - -+ if (sev_guest(svm->vcpu.kvm)) -+ return pre_sev_run(svm, cpu); -+ - /* FIXME: handle wraparound of asid_generation */ - if (svm->asid_generation != sd->asid_generation) - new_asid(svm, sd); --- -2.7.4 - |