Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 172340
b: refs/heads/master
c: d569672
h: refs/heads/master
v: v3
  • Loading branch information
Avi Kivity committed Dec 3, 2009
1 parent dc599f8 commit ae437f4
Show file tree
Hide file tree
Showing 4 changed files with 9 additions and 8 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: f50146bd7bdb75435638e60d4960edd9bcdf88b8
refs/heads/master: d5696725b2a4c59503f5e0bc33adeee7f30cd45b
2 changes: 1 addition & 1 deletion trunk/arch/x86/include/asm/kvm_host.h
Original file line number Diff line number Diff line change
Expand Up @@ -812,6 +812,6 @@ int kvm_arch_interrupt_allowed(struct kvm_vcpu *vcpu);
int kvm_cpu_get_interrupt(struct kvm_vcpu *v);

void kvm_define_shared_msr(unsigned index, u32 msr);
void kvm_set_shared_msr(unsigned index, u64 val);
void kvm_set_shared_msr(unsigned index, u64 val, u64 mask);

#endif /* _ASM_X86_KVM_HOST_H */
9 changes: 5 additions & 4 deletions trunk/arch/x86/kvm/vmx.c
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ struct vmcs {
struct shared_msr_entry {
unsigned index;
u64 data;
u64 mask;
};

struct vcpu_vmx {
Expand Down Expand Up @@ -601,12 +602,10 @@ static bool update_transition_efer(struct vcpu_vmx *vmx, int efer_offset)
if (guest_efer & EFER_LMA)
ignore_bits &= ~(u64)EFER_SCE;
#endif
if ((guest_efer & ~ignore_bits) == (host_efer & ~ignore_bits))
return false;

guest_efer &= ~ignore_bits;
guest_efer |= host_efer & ignore_bits;
vmx->guest_msrs[efer_offset].data = guest_efer;
vmx->guest_msrs[efer_offset].mask = ~ignore_bits;
return true;
}

Expand Down Expand Up @@ -657,7 +656,8 @@ static void vmx_save_host_state(struct kvm_vcpu *vcpu)
#endif
for (i = 0; i < vmx->save_nmsrs; ++i)
kvm_set_shared_msr(vmx->guest_msrs[i].index,
vmx->guest_msrs[i].data);
vmx->guest_msrs[i].data,
vmx->guest_msrs[i].mask);
}

static void __vmx_load_host_state(struct vcpu_vmx *vmx)
Expand Down Expand Up @@ -2394,6 +2394,7 @@ static int vmx_vcpu_setup(struct vcpu_vmx *vmx)
data = data_low | ((u64)data_high << 32);
vmx->guest_msrs[j].index = i;
vmx->guest_msrs[j].data = 0;
vmx->guest_msrs[j].mask = -1ull;
++vmx->nmsrs;
}

Expand Down
4 changes: 2 additions & 2 deletions trunk/arch/x86/kvm/x86.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit ae437f4

Please sign in to comment.