|
@@ -2790,8 +2790,6 @@ static bool update_transition_efer(struct vcpu_vmx *vmx, int efer_offset)
|
|
ignore_bits &= ~(u64)EFER_SCE;
|
|
ignore_bits &= ~(u64)EFER_SCE;
|
|
#endif
|
|
#endif
|
|
|
|
|
|
- clear_atomic_switch_msr(vmx, MSR_EFER);
|
|
|
|
-
|
|
|
|
/*
|
|
/*
|
|
* On EPT, we can't emulate NX, so we must switch EFER atomically.
|
|
* On EPT, we can't emulate NX, so we must switch EFER atomically.
|
|
* On CPUs that support "load IA32_EFER", always switch EFER
|
|
* On CPUs that support "load IA32_EFER", always switch EFER
|
|
@@ -2804,8 +2802,12 @@ static bool update_transition_efer(struct vcpu_vmx *vmx, int efer_offset)
|
|
if (guest_efer != host_efer)
|
|
if (guest_efer != host_efer)
|
|
add_atomic_switch_msr(vmx, MSR_EFER,
|
|
add_atomic_switch_msr(vmx, MSR_EFER,
|
|
guest_efer, host_efer, false);
|
|
guest_efer, host_efer, false);
|
|
|
|
+ else
|
|
|
|
+ clear_atomic_switch_msr(vmx, MSR_EFER);
|
|
return false;
|
|
return false;
|
|
} else {
|
|
} else {
|
|
|
|
+ clear_atomic_switch_msr(vmx, MSR_EFER);
|
|
|
|
+
|
|
guest_efer &= ~ignore_bits;
|
|
guest_efer &= ~ignore_bits;
|
|
guest_efer |= host_efer & ignore_bits;
|
|
guest_efer |= host_efer & ignore_bits;
|
|
|
|
|