diff options
| -rw-r--r-- | arch/x86/kvm/vmx.c | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 40aa29204baf..12ed6a8f6287 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
| @@ -2365,6 +2365,7 @@ static void vmx_save_host_state(struct kvm_vcpu *vcpu) | |||
| 2365 | struct vcpu_vmx *vmx = to_vmx(vcpu); | 2365 | struct vcpu_vmx *vmx = to_vmx(vcpu); |
| 2366 | #ifdef CONFIG_X86_64 | 2366 | #ifdef CONFIG_X86_64 |
| 2367 | int cpu = raw_smp_processor_id(); | 2367 | int cpu = raw_smp_processor_id(); |
| 2368 | unsigned long fs_base, kernel_gs_base; | ||
| 2368 | #endif | 2369 | #endif |
| 2369 | int i; | 2370 | int i; |
| 2370 | 2371 | ||
| @@ -2380,12 +2381,20 @@ static void vmx_save_host_state(struct kvm_vcpu *vcpu) | |||
| 2380 | vmx->host_state.gs_ldt_reload_needed = vmx->host_state.ldt_sel; | 2381 | vmx->host_state.gs_ldt_reload_needed = vmx->host_state.ldt_sel; |
| 2381 | 2382 | ||
| 2382 | #ifdef CONFIG_X86_64 | 2383 | #ifdef CONFIG_X86_64 |
| 2383 | save_fsgs_for_kvm(); | 2384 | if (likely(is_64bit_mm(current->mm))) { |
| 2384 | vmx->host_state.fs_sel = current->thread.fsindex; | 2385 | save_fsgs_for_kvm(); |
| 2385 | vmx->host_state.gs_sel = current->thread.gsindex; | 2386 | vmx->host_state.fs_sel = current->thread.fsindex; |
| 2386 | #else | 2387 | vmx->host_state.gs_sel = current->thread.gsindex; |
| 2387 | savesegment(fs, vmx->host_state.fs_sel); | 2388 | fs_base = current->thread.fsbase; |
| 2388 | savesegment(gs, vmx->host_state.gs_sel); | 2389 | kernel_gs_base = current->thread.gsbase; |
| 2390 | } else { | ||
| 2391 | #endif | ||
| 2392 | savesegment(fs, vmx->host_state.fs_sel); | ||
| 2393 | savesegment(gs, vmx->host_state.gs_sel); | ||
| 2394 | #ifdef CONFIG_X86_64 | ||
| 2395 | fs_base = read_msr(MSR_FS_BASE); | ||
| 2396 | kernel_gs_base = read_msr(MSR_KERNEL_GS_BASE); | ||
| 2397 | } | ||
| 2389 | #endif | 2398 | #endif |
| 2390 | if (!(vmx->host_state.fs_sel & 7)) { | 2399 | if (!(vmx->host_state.fs_sel & 7)) { |
| 2391 | vmcs_write16(HOST_FS_SELECTOR, vmx->host_state.fs_sel); | 2400 | vmcs_write16(HOST_FS_SELECTOR, vmx->host_state.fs_sel); |
| @@ -2405,10 +2414,10 @@ static void vmx_save_host_state(struct kvm_vcpu *vcpu) | |||
| 2405 | savesegment(ds, vmx->host_state.ds_sel); | 2414 | savesegment(ds, vmx->host_state.ds_sel); |
| 2406 | savesegment(es, vmx->host_state.es_sel); | 2415 | savesegment(es, vmx->host_state.es_sel); |
| 2407 | 2416 | ||
| 2408 | vmcs_writel(HOST_FS_BASE, current->thread.fsbase); | 2417 | vmcs_writel(HOST_FS_BASE, fs_base); |
| 2409 | vmcs_writel(HOST_GS_BASE, cpu_kernelmode_gs_base(cpu)); | 2418 | vmcs_writel(HOST_GS_BASE, cpu_kernelmode_gs_base(cpu)); |
| 2410 | 2419 | ||
| 2411 | vmx->msr_host_kernel_gs_base = current->thread.gsbase; | 2420 | vmx->msr_host_kernel_gs_base = kernel_gs_base; |
| 2412 | if (is_long_mode(&vmx->vcpu)) | 2421 | if (is_long_mode(&vmx->vcpu)) |
| 2413 | wrmsrl(MSR_KERNEL_GS_BASE, vmx->msr_guest_kernel_gs_base); | 2422 | wrmsrl(MSR_KERNEL_GS_BASE, vmx->msr_guest_kernel_gs_base); |
| 2414 | #else | 2423 | #else |
