KVM: VMX: Fix comparison of guest efer with stale host value

update_transition_efer() masks out some efer bits when deciding whether
to switch the msr during guest entry; for example, NX is emulated using the
mmu so we don't need to disable it, and LMA/LME are handled by the hardware.

However, with shared msrs, the comparison is made against a stale value;
at the time of the guest switch we may be running with another guest's efer.

Fix by deferring the mask/compare to the actual point of guest entry.

Noted by Marcelo.

Signed-off-by: Avi Kivity <avi@redhat.com>
This commit is contained in:
Avi Kivity
2009-12-02 12:28:47 +02:00
parent f50146bd7b
commit d5696725b2
3 changed files with 8 additions and 7 deletions

View File

@@ -185,11 +185,11 @@ static void kvm_shared_msr_cpu_online(void)
locals->current_value[i] = shared_msrs_global.msrs[i].value;
}
void kvm_set_shared_msr(unsigned slot, u64 value)
void kvm_set_shared_msr(unsigned slot, u64 value, u64 mask)
{
struct kvm_shared_msrs *smsr = &__get_cpu_var(shared_msrs);
if (value == smsr->current_value[slot])
if (((value ^ smsr->current_value[slot]) & mask) == 0)
return;
smsr->current_value[slot] = value;
wrmsrl(shared_msrs_global.msrs[slot].msr, value);