aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86
diff options
context:
space:
mode:
authorAvi Kivity <avi@redhat.com>2010-10-19 12:48:35 -0400
committerMarcelo Tosatti <mtosatti@redhat.com>2010-11-17 16:47:59 -0500
commit0a77fe4c188e25917799f2356d4aa5e6d80c39a2 (patch)
treeaed5a7a44ac832a0cc0f63c9eaa760448eacc117 /arch/x86
parent59365d136d205cc20fe666ca7f89b1c5001b0d5a (diff)
KVM: Correct ordering of ldt reload wrt fs/gs reload
If fs or gs refer to the ldt, they must be reloaded after the ldt. Reorder the code to that effect. Userspace code that uses the ldt with kvm is nonexistent, so this doesn't fix a user-visible bug. Signed-off-by: Avi Kivity <avi@redhat.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Diffstat (limited to 'arch/x86')
-rw-r--r--arch/x86/kvm/svm.c2
-rw-r--r--arch/x86/kvm/vmx.c4
2 files changed, 3 insertions, 3 deletions
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
index 82e144a4e51..1ca12298ffc 100644
--- a/arch/x86/kvm/svm.c
+++ b/arch/x86/kvm/svm.c
@@ -3395,6 +3395,7 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu)
3395 vcpu->arch.regs[VCPU_REGS_RIP] = svm->vmcb->save.rip; 3395 vcpu->arch.regs[VCPU_REGS_RIP] = svm->vmcb->save.rip;
3396 3396
3397 load_host_msrs(vcpu); 3397 load_host_msrs(vcpu);
3398 kvm_load_ldt(ldt_selector);
3398 loadsegment(fs, fs_selector); 3399 loadsegment(fs, fs_selector);
3399#ifdef CONFIG_X86_64 3400#ifdef CONFIG_X86_64
3400 load_gs_index(gs_selector); 3401 load_gs_index(gs_selector);
@@ -3402,7 +3403,6 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu)
3402#else 3403#else
3403 loadsegment(gs, gs_selector); 3404 loadsegment(gs, gs_selector);
3404#endif 3405#endif
3405 kvm_load_ldt(ldt_selector);
3406 3406
3407 reload_tss(vcpu); 3407 reload_tss(vcpu);
3408 3408
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index 8da0e45ff7c..6fe7df75bfd 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -839,8 +839,6 @@ static void __vmx_load_host_state(struct vcpu_vmx *vmx)
839 839
840 ++vmx->vcpu.stat.host_state_reload; 840 ++vmx->vcpu.stat.host_state_reload;
841 vmx->host_state.loaded = 0; 841 vmx->host_state.loaded = 0;
842 if (vmx->host_state.fs_reload_needed)
843 loadsegment(fs, vmx->host_state.fs_sel);
844 if (vmx->host_state.gs_ldt_reload_needed) { 842 if (vmx->host_state.gs_ldt_reload_needed) {
845 kvm_load_ldt(vmx->host_state.ldt_sel); 843 kvm_load_ldt(vmx->host_state.ldt_sel);
846#ifdef CONFIG_X86_64 844#ifdef CONFIG_X86_64
@@ -850,6 +848,8 @@ static void __vmx_load_host_state(struct vcpu_vmx *vmx)
850 loadsegment(gs, vmx->host_state.gs_sel); 848 loadsegment(gs, vmx->host_state.gs_sel);
851#endif 849#endif
852 } 850 }
851 if (vmx->host_state.fs_reload_needed)
852 loadsegment(fs, vmx->host_state.fs_sel);
853 reload_tss(); 853 reload_tss();
854#ifdef CONFIG_X86_64 854#ifdef CONFIG_X86_64
855 if (is_long_mode(&vmx->vcpu)) { 855 if (is_long_mode(&vmx->vcpu)) {