kvm: vmx: Skip all SYSCALL MSRs in setup_msrs() when !EFER.SCE
Like IA32_STAR, IA32_LSTAR and IA32_FMASK only need to contain guest values on VM-entry when the guest is in long mode and EFER.SCE is set. Signed-off-by: Jim Mattson <jmattson@google.com> Reviewed-by: Peter Shier <pshier@google.com> Reviewed-by: Marc Orr <marcorr@google.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
db31c8f5af
commit
84c8c5b8f8
|
@ -1375,19 +1375,19 @@ static void setup_msrs(struct vcpu_vmx *vmx)
|
||||||
|
|
||||||
save_nmsrs = 0;
|
save_nmsrs = 0;
|
||||||
#ifdef CONFIG_X86_64
|
#ifdef CONFIG_X86_64
|
||||||
if (is_long_mode(&vmx->vcpu)) {
|
/*
|
||||||
index = __find_msr_index(vmx, MSR_SYSCALL_MASK);
|
* The SYSCALL MSRs are only needed on long mode guests, and only
|
||||||
|
* when EFER.SCE is set.
|
||||||
|
*/
|
||||||
|
if (is_long_mode(&vmx->vcpu) && (vmx->vcpu.arch.efer & EFER_SCE)) {
|
||||||
|
index = __find_msr_index(vmx, MSR_STAR);
|
||||||
if (index >= 0)
|
if (index >= 0)
|
||||||
move_msr_up(vmx, index, save_nmsrs++);
|
move_msr_up(vmx, index, save_nmsrs++);
|
||||||
index = __find_msr_index(vmx, MSR_LSTAR);
|
index = __find_msr_index(vmx, MSR_LSTAR);
|
||||||
if (index >= 0)
|
if (index >= 0)
|
||||||
move_msr_up(vmx, index, save_nmsrs++);
|
move_msr_up(vmx, index, save_nmsrs++);
|
||||||
/*
|
index = __find_msr_index(vmx, MSR_SYSCALL_MASK);
|
||||||
* MSR_STAR is only needed on long mode guests, and only
|
if (index >= 0)
|
||||||
* if efer.sce is enabled.
|
|
||||||
*/
|
|
||||||
index = __find_msr_index(vmx, MSR_STAR);
|
|
||||||
if ((index >= 0) && (vmx->vcpu.arch.efer & EFER_SCE))
|
|
||||||
move_msr_up(vmx, index, save_nmsrs++);
|
move_msr_up(vmx, index, save_nmsrs++);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue