]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
KVM: Correct ordering of ldt reload wrt fs/gs reload
authorAvi Kivity <avi@redhat.com>
Tue, 19 Oct 2010 16:48:35 +0000 (18:48 +0200)
committerAndi Kleen <ak@linux.intel.com>
Tue, 14 Dec 2010 22:40:09 +0000 (23:40 +0100)
commit 0a77fe4c188e25917799f2356d4aa5e6d80c39a2 upstream.

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>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Signed-off-by: Andi Kleen <ak@linux.intel.com>
arch/x86/kvm/svm.c
arch/x86/kvm/vmx.c

index 02a5603695e319102ed0d9cc203ff88dc853ba2a..9ca703219d72e23f98f7acfeb1bc66f3cd2e8344 100644 (file)
@@ -3184,9 +3184,9 @@ static void svm_vcpu_run(struct kvm_vcpu *vcpu)
        vcpu->arch.regs[VCPU_REGS_RSP] = svm->vmcb->save.rsp;
        vcpu->arch.regs[VCPU_REGS_RIP] = svm->vmcb->save.rip;
 
+       kvm_load_ldt(ldt_selector);
        kvm_load_fs(fs_selector);
        kvm_load_gs(gs_selector);
-       kvm_load_ldt(ldt_selector);
        load_host_msrs(vcpu);
 
        reload_tss(vcpu);
index 7d043883d9bc8e73891f78f3ef061b5eee5d622c..39ac45694d51d742f05e40030165e1ef639eedd3 100644 (file)
@@ -791,8 +791,6 @@ static void __vmx_load_host_state(struct vcpu_vmx *vmx)
 
        ++vmx->vcpu.stat.host_state_reload;
        vmx->host_state.loaded = 0;
-       if (vmx->host_state.fs_reload_needed)
-               kvm_load_fs(vmx->host_state.fs_sel);
        if (vmx->host_state.gs_ldt_reload_needed) {
                kvm_load_ldt(vmx->host_state.ldt_sel);
                /*
@@ -806,6 +804,8 @@ static void __vmx_load_host_state(struct vcpu_vmx *vmx)
 #endif
                local_irq_restore(flags);
        }
+       if (vmx->host_state.fs_reload_needed)
+               loadsegment(fs, vmx->host_state.fs_sel);
        reload_tss();
 #ifdef CONFIG_X86_64
        if (is_long_mode(&vmx->vcpu)) {