Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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

* 'kvm-updates/2.6.36' of git://git.kernel.org/pub/scm/virt/kvm/kvm:
KVM: Fix fs/gs reload oops with invalid ldt

+19 -44
-24
arch/x86/include/asm/kvm_host.h
··· 652 652 return (struct kvm_mmu_page *)page_private(page); 653 653 } 654 654 655 - static inline u16 kvm_read_fs(void) 656 - { 657 - u16 seg; 658 - asm("mov %%fs, %0" : "=g"(seg)); 659 - return seg; 660 - } 661 - 662 - static inline u16 kvm_read_gs(void) 663 - { 664 - u16 seg; 665 - asm("mov %%gs, %0" : "=g"(seg)); 666 - return seg; 667 - } 668 - 669 655 static inline u16 kvm_read_ldt(void) 670 656 { 671 657 u16 ldt; 672 658 asm("sldt %0" : "=g"(ldt)); 673 659 return ldt; 674 - } 675 - 676 - static inline void kvm_load_fs(u16 sel) 677 - { 678 - asm("mov %0, %%fs" : : "rm"(sel)); 679 - } 680 - 681 - static inline void kvm_load_gs(u16 sel) 682 - { 683 - asm("mov %0, %%gs" : : "rm"(sel)); 684 660 } 685 661 686 662 static inline void kvm_load_ldt(u16 sel)
+10 -5
arch/x86/kvm/svm.c
··· 3163 3163 sync_lapic_to_cr8(vcpu); 3164 3164 3165 3165 save_host_msrs(vcpu); 3166 - fs_selector = kvm_read_fs(); 3167 - gs_selector = kvm_read_gs(); 3166 + savesegment(fs, fs_selector); 3167 + savesegment(gs, gs_selector); 3168 3168 ldt_selector = kvm_read_ldt(); 3169 3169 svm->vmcb->save.cr2 = vcpu->arch.cr2; 3170 3170 /* required for live migration with NPT */ ··· 3251 3251 vcpu->arch.regs[VCPU_REGS_RSP] = svm->vmcb->save.rsp; 3252 3252 vcpu->arch.regs[VCPU_REGS_RIP] = svm->vmcb->save.rip; 3253 3253 3254 - kvm_load_fs(fs_selector); 3255 - kvm_load_gs(gs_selector); 3256 - kvm_load_ldt(ldt_selector); 3257 3254 load_host_msrs(vcpu); 3255 + loadsegment(fs, fs_selector); 3256 + #ifdef CONFIG_X86_64 3257 + load_gs_index(gs_selector); 3258 + wrmsrl(MSR_KERNEL_GS_BASE, current->thread.gs); 3259 + #else 3260 + loadsegment(gs, gs_selector); 3261 + #endif 3262 + kvm_load_ldt(ldt_selector); 3258 3263 3259 3264 reload_tss(vcpu); 3260 3265
+9 -15
arch/x86/kvm/vmx.c
··· 803 803 */ 804 804 vmx->host_state.ldt_sel = kvm_read_ldt(); 805 805 vmx->host_state.gs_ldt_reload_needed = vmx->host_state.ldt_sel; 806 - vmx->host_state.fs_sel = kvm_read_fs(); 806 + savesegment(fs, vmx->host_state.fs_sel); 807 807 if (!(vmx->host_state.fs_sel & 7)) { 808 808 vmcs_write16(HOST_FS_SELECTOR, vmx->host_state.fs_sel); 809 809 vmx->host_state.fs_reload_needed = 0; ··· 811 811 vmcs_write16(HOST_FS_SELECTOR, 0); 812 812 vmx->host_state.fs_reload_needed = 1; 813 813 } 814 - vmx->host_state.gs_sel = kvm_read_gs(); 814 + savesegment(gs, vmx->host_state.gs_sel); 815 815 if (!(vmx->host_state.gs_sel & 7)) 816 816 vmcs_write16(HOST_GS_SELECTOR, vmx->host_state.gs_sel); 817 817 else { ··· 841 841 842 842 static void __vmx_load_host_state(struct vcpu_vmx *vmx) 843 843 { 844 - unsigned long flags; 845 - 846 844 if (!vmx->host_state.loaded) 847 845 return; 848 846 849 847 ++vmx->vcpu.stat.host_state_reload; 850 848 vmx->host_state.loaded = 0; 851 849 if (vmx->host_state.fs_reload_needed) 852 - kvm_load_fs(vmx->host_state.fs_sel); 850 + loadsegment(fs, vmx->host_state.fs_sel); 853 851 if (vmx->host_state.gs_ldt_reload_needed) { 854 852 kvm_load_ldt(vmx->host_state.ldt_sel); 855 - /* 856 - * If we have to reload gs, we must take care to 857 - * preserve our gs base. 858 - */ 859 - local_irq_save(flags); 860 - kvm_load_gs(vmx->host_state.gs_sel); 861 853 #ifdef CONFIG_X86_64 862 - wrmsrl(MSR_GS_BASE, vmcs_readl(HOST_GS_BASE)); 854 + load_gs_index(vmx->host_state.gs_sel); 855 + wrmsrl(MSR_KERNEL_GS_BASE, current->thread.gs); 856 + #else 857 + loadsegment(gs, vmx->host_state.gs_sel); 863 858 #endif 864 - local_irq_restore(flags); 865 859 } 866 860 reload_tss(); 867 861 #ifdef CONFIG_X86_64 ··· 2583 2589 vmcs_write16(HOST_CS_SELECTOR, __KERNEL_CS); /* 22.2.4 */ 2584 2590 vmcs_write16(HOST_DS_SELECTOR, __KERNEL_DS); /* 22.2.4 */ 2585 2591 vmcs_write16(HOST_ES_SELECTOR, __KERNEL_DS); /* 22.2.4 */ 2586 - vmcs_write16(HOST_FS_SELECTOR, kvm_read_fs()); /* 22.2.4 */ 2587 - vmcs_write16(HOST_GS_SELECTOR, kvm_read_gs()); /* 22.2.4 */ 2592 + vmcs_write16(HOST_FS_SELECTOR, 0); /* 22.2.4 */ 2593 + vmcs_write16(HOST_GS_SELECTOR, 0); /* 22.2.4 */ 2588 2594 vmcs_write16(HOST_SS_SELECTOR, __KERNEL_DS); /* 22.2.4 */ 2589 2595 #ifdef CONFIG_X86_64 2590 2596 rdmsrl(MSR_FS_BASE, a);