diff options
author | 2020-05-18 13:08:37 -0400 | |
---|---|---|
committer | 2020-06-01 04:26:03 -0400 | |
commit | c513f484c5582a8efadf3d72298e2285b041536e (patch) | |
tree | b8450accf8e427bb6e7ceaa9c4711bae0bc2d6c9 /arch/x86/kvm/svm/nested.c | |
parent | KVM: nSVM: split nested_vmcb_check_controls (diff) | |
download | wireguard-linux-c513f484c5582a8efadf3d72298e2285b041536e.tar.xz wireguard-linux-c513f484c5582a8efadf3d72298e2285b041536e.zip |
KVM: nSVM: leave guest mode when clearing EFER.SVME
According to the AMD manual, the effect of turning off EFER.SVME while a
guest is running is undefined. We make it leave guest mode immediately,
similar to the effect of clearing the VMX bit in MSR_IA32_FEAT_CTL.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to '')
-rw-r--r-- | arch/x86/kvm/svm/nested.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/arch/x86/kvm/svm/nested.c b/arch/x86/kvm/svm/nested.c index bd3a89cd4070..369eca73fe3e 100644 --- a/arch/x86/kvm/svm/nested.c +++ b/arch/x86/kvm/svm/nested.c @@ -618,6 +618,22 @@ int nested_svm_vmexit(struct vcpu_svm *svm) return 0; } +/* + * Forcibly leave nested mode in order to be able to reset the VCPU later on. + */ +void svm_leave_nested(struct vcpu_svm *svm) +{ + if (is_guest_mode(&svm->vcpu)) { + struct vmcb *hsave = svm->nested.hsave; + struct vmcb *vmcb = svm->vmcb; + + svm->nested.nested_run_pending = 0; + leave_guest_mode(&svm->vcpu); + copy_vmcb_control_area(&vmcb->control, &hsave->control); + nested_svm_uninit_mmu_context(&svm->vcpu); + } +} + static int nested_svm_exit_handled_msr(struct vcpu_svm *svm) { u32 offset, msr, value; |