mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-02 19:15:03 -04:00
Revert "KVM: VMX: Save HOST_CR3 in vmx_set_host_fs_gs()"
Undo a nested VMX fix as a step toward reverting the commit it fixed,15ad9762d6("KVM: VMX: Save HOST_CR3 in vmx_prepare_switch_to_guest()"), as the underlying premise that "host CR3 in the vcpu thread can only be changed when scheduling" is wrong. This reverts commita9f2705ec8. Signed-off-by: Sean Christopherson <seanjc@google.com> Message-Id: <20220224191917.3508476-2-seanjc@google.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
committed by
Paolo Bonzini
parent
e910a53fb4
commit
bca06b85fc
@@ -246,8 +246,7 @@ static void vmx_sync_vmcs_host_state(struct vcpu_vmx *vmx,
|
||||
src = &prev->host_state;
|
||||
dest = &vmx->loaded_vmcs->host_state;
|
||||
|
||||
vmx_set_vmcs_host_state(dest, src->cr3, src->fs_sel, src->gs_sel,
|
||||
src->fs_base, src->gs_base);
|
||||
vmx_set_host_fs_gs(dest, src->fs_sel, src->gs_sel, src->fs_base, src->gs_base);
|
||||
dest->ldt_sel = src->ldt_sel;
|
||||
#ifdef CONFIG_X86_64
|
||||
dest->ds_sel = src->ds_sel;
|
||||
|
||||
@@ -1080,14 +1080,9 @@ static void pt_guest_exit(struct vcpu_vmx *vmx)
|
||||
wrmsrl(MSR_IA32_RTIT_CTL, vmx->pt_desc.host.ctl);
|
||||
}
|
||||
|
||||
void vmx_set_vmcs_host_state(struct vmcs_host_state *host, unsigned long cr3,
|
||||
u16 fs_sel, u16 gs_sel,
|
||||
unsigned long fs_base, unsigned long gs_base)
|
||||
void vmx_set_host_fs_gs(struct vmcs_host_state *host, u16 fs_sel, u16 gs_sel,
|
||||
unsigned long fs_base, unsigned long gs_base)
|
||||
{
|
||||
if (unlikely(cr3 != host->cr3)) {
|
||||
vmcs_writel(HOST_CR3, cr3);
|
||||
host->cr3 = cr3;
|
||||
}
|
||||
if (unlikely(fs_sel != host->fs_sel)) {
|
||||
if (!(fs_sel & 7))
|
||||
vmcs_write16(HOST_FS_SELECTOR, fs_sel);
|
||||
@@ -1119,6 +1114,7 @@ void vmx_prepare_switch_to_guest(struct kvm_vcpu *vcpu)
|
||||
#ifdef CONFIG_X86_64
|
||||
int cpu = raw_smp_processor_id();
|
||||
#endif
|
||||
unsigned long cr3;
|
||||
unsigned long fs_base, gs_base;
|
||||
u16 fs_sel, gs_sel;
|
||||
int i;
|
||||
@@ -1182,8 +1178,14 @@ void vmx_prepare_switch_to_guest(struct kvm_vcpu *vcpu)
|
||||
gs_base = segment_base(gs_sel);
|
||||
#endif
|
||||
|
||||
vmx_set_vmcs_host_state(host_state, __get_current_cr3_fast(),
|
||||
fs_sel, gs_sel, fs_base, gs_base);
|
||||
vmx_set_host_fs_gs(host_state, fs_sel, gs_sel, fs_base, gs_base);
|
||||
|
||||
/* Host CR3 including its PCID is stable when guest state is loaded. */
|
||||
cr3 = __get_current_cr3_fast();
|
||||
if (unlikely(cr3 != host_state->cr3)) {
|
||||
vmcs_writel(HOST_CR3, cr3);
|
||||
host_state->cr3 = cr3;
|
||||
}
|
||||
|
||||
vmx->guest_state_loaded = true;
|
||||
}
|
||||
|
||||
@@ -374,9 +374,8 @@ int allocate_vpid(void);
|
||||
void free_vpid(int vpid);
|
||||
void vmx_set_constant_host_state(struct vcpu_vmx *vmx);
|
||||
void vmx_prepare_switch_to_guest(struct kvm_vcpu *vcpu);
|
||||
void vmx_set_vmcs_host_state(struct vmcs_host_state *host, unsigned long cr3,
|
||||
u16 fs_sel, u16 gs_sel,
|
||||
unsigned long fs_base, unsigned long gs_base);
|
||||
void vmx_set_host_fs_gs(struct vmcs_host_state *host, u16 fs_sel, u16 gs_sel,
|
||||
unsigned long fs_base, unsigned long gs_base);
|
||||
int vmx_get_cpl(struct kvm_vcpu *vcpu);
|
||||
bool vmx_emulation_required(struct kvm_vcpu *vcpu);
|
||||
unsigned long vmx_get_rflags(struct kvm_vcpu *vcpu);
|
||||
|
||||
Reference in New Issue
Block a user