commit 28ab89aaa11380306bafbf49265222f2a2da71da Author: Maxim Levitsky Date: Thu Jan 14 10:53:25 2021 +0200 kvm: x86: fix that errata for nested guests diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c index c31e005252d69..9cfa5946fac69 100644 --- a/arch/x86/kvm/svm/svm.c +++ b/arch/x86/kvm/svm/svm.c @@ -2027,6 +2027,26 @@ static int svm_emulate_vm_instr(struct kvm_vcpu *vcpu, u8 modrm) { struct vcpu_svm *svm = to_svm(vcpu); + if (is_guest_mode(vcpu)) { + switch (modrm) { + case 0xd8: /* VMRUN */ + svm->vmcb->control.exit_code = SVM_EXIT_VMRUN; + break; + case 0xda: /* VMLOAD */ + svm->vmcb->control.exit_code = SVM_EXIT_VMLOAD; + break; + case 0xdb: /* VMSAVE */ + svm->vmcb->control.exit_code = SVM_EXIT_VMLOAD; + break; + default: + goto inject_exception; + } + + svm->vmcb->control.exit_info_1 = 0; + svm->vmcb->control.exit_info_2 = 0; + return nested_svm_vmexit(svm); + } + switch (modrm) { case 0xd8: /* VMRUN */ return vmrun_interception(svm); @@ -2035,6 +2055,7 @@ static int svm_emulate_vm_instr(struct kvm_vcpu *vcpu, u8 modrm) case 0xdb: /* VMSAVE */ return vmsave_interception(svm); default: +inject_exception: /* inject a #GP for all other cases */ kvm_queue_exception_e(vcpu, GP_VECTOR, 0); return 1;