Merge branch 'kvm-updates/2.6.37' of git://git.kernel.org/pub/scm/virt/kvm/kvm

* 'kvm-updates/2.6.37' of git://git.kernel.org/pub/scm/virt/kvm/kvm:
KVM: VMX: Fix host userspace gsbase corruption
KVM: Correct ordering of ldt reload wrt fs/gs reload

+10 -11
+1 -1
arch/x86/kvm/svm.c
··· 3395 vcpu->arch.regs[VCPU_REGS_RIP] = svm->vmcb->save.rip; 3396 3397 load_host_msrs(vcpu); 3398 loadsegment(fs, fs_selector); 3399 #ifdef CONFIG_X86_64 3400 load_gs_index(gs_selector); ··· 3403 #else 3404 loadsegment(gs, gs_selector); 3405 #endif 3406 - kvm_load_ldt(ldt_selector); 3407 3408 reload_tss(vcpu); 3409
··· 3395 vcpu->arch.regs[VCPU_REGS_RIP] = svm->vmcb->save.rip; 3396 3397 load_host_msrs(vcpu); 3398 + kvm_load_ldt(ldt_selector); 3399 loadsegment(fs, fs_selector); 3400 #ifdef CONFIG_X86_64 3401 load_gs_index(gs_selector); ··· 3402 #else 3403 loadsegment(gs, gs_selector); 3404 #endif 3405 3406 reload_tss(vcpu); 3407
+9 -10
arch/x86/kvm/vmx.c
··· 821 #endif 822 823 #ifdef CONFIG_X86_64 824 - if (is_long_mode(&vmx->vcpu)) { 825 - rdmsrl(MSR_KERNEL_GS_BASE, vmx->msr_host_kernel_gs_base); 826 wrmsrl(MSR_KERNEL_GS_BASE, vmx->msr_guest_kernel_gs_base); 827 - } 828 #endif 829 for (i = 0; i < vmx->save_nmsrs; ++i) 830 kvm_set_shared_msr(vmx->guest_msrs[i].index, ··· 838 839 ++vmx->vcpu.stat.host_state_reload; 840 vmx->host_state.loaded = 0; 841 - if (vmx->host_state.fs_reload_needed) 842 - loadsegment(fs, vmx->host_state.fs_sel); 843 if (vmx->host_state.gs_ldt_reload_needed) { 844 kvm_load_ldt(vmx->host_state.ldt_sel); 845 #ifdef CONFIG_X86_64 846 load_gs_index(vmx->host_state.gs_sel); 847 - wrmsrl(MSR_KERNEL_GS_BASE, current->thread.gs); 848 #else 849 loadsegment(gs, vmx->host_state.gs_sel); 850 #endif 851 } 852 reload_tss(); 853 #ifdef CONFIG_X86_64 854 - if (is_long_mode(&vmx->vcpu)) { 855 - rdmsrl(MSR_KERNEL_GS_BASE, vmx->msr_guest_kernel_gs_base); 856 - wrmsrl(MSR_KERNEL_GS_BASE, vmx->msr_host_kernel_gs_base); 857 - } 858 #endif 859 if (current_thread_info()->status & TS_USEDFPU) 860 clts();
··· 821 #endif 822 823 #ifdef CONFIG_X86_64 824 + rdmsrl(MSR_KERNEL_GS_BASE, vmx->msr_host_kernel_gs_base); 825 + if (is_long_mode(&vmx->vcpu)) 826 wrmsrl(MSR_KERNEL_GS_BASE, vmx->msr_guest_kernel_gs_base); 827 #endif 828 for (i = 0; i < vmx->save_nmsrs; ++i) 829 kvm_set_shared_msr(vmx->guest_msrs[i].index, ··· 839 840 ++vmx->vcpu.stat.host_state_reload; 841 vmx->host_state.loaded = 0; 842 + #ifdef CONFIG_X86_64 843 + if (is_long_mode(&vmx->vcpu)) 844 + rdmsrl(MSR_KERNEL_GS_BASE, vmx->msr_guest_kernel_gs_base); 845 + #endif 846 if (vmx->host_state.gs_ldt_reload_needed) { 847 kvm_load_ldt(vmx->host_state.ldt_sel); 848 #ifdef CONFIG_X86_64 849 load_gs_index(vmx->host_state.gs_sel); 850 #else 851 loadsegment(gs, vmx->host_state.gs_sel); 852 #endif 853 } 854 + if (vmx->host_state.fs_reload_needed) 855 + loadsegment(fs, vmx->host_state.fs_sel); 856 reload_tss(); 857 #ifdef CONFIG_X86_64 858 + wrmsrl(MSR_KERNEL_GS_BASE, vmx->msr_host_kernel_gs_base); 859 #endif 860 if (current_thread_info()->status & TS_USEDFPU) 861 clts();