]> rtime.felk.cvut.cz Git - jailhouse.git/commitdiff
Revert "x86: Make FS_BASE MSR restoration VMX-specific"
authorJan Kiszka <jan.kiszka@siemens.com>
Wed, 6 May 2015 05:28:52 +0000 (07:28 +0200)
committerJan Kiszka <jan.kiszka@siemens.com>
Wed, 6 May 2015 05:28:52 +0000 (07:28 +0200)
This reverts commit ee283bcf1818076662d897d489260f09d2b46c6c.

Loading the FS selector with 0 in arch_cpu_restore clears the base on
real hardware. Thus we have to reload it and can't apply this
optimization.

This bug caused crashes of the jailhouse tool.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
hypervisor/arch/x86/setup.c
hypervisor/arch/x86/svm.c
hypervisor/arch/x86/vmx.c

index da48833ca499cdf21814af64104991b2b9654bb6..9899238af98fb40849a6778a6a0a5192ab3edf28 100644 (file)
@@ -280,5 +280,6 @@ void arch_cpu_restore(struct per_cpu *cpu_data, int return_code)
        gdt[cpu_data->linux_tss.selector / 8] &= ~DESC_TSS_BUSY;
        asm volatile("ltr %%ax" : : "a" (cpu_data->linux_tss.selector));
 
+       write_msr(MSR_FS_BASE, cpu_data->linux_fs.base);
        write_msr(MSR_GS_BASE, cpu_data->linux_gs.base);
 }
index 3ae81ca1c7f081b932687cbbc1445e53068aebaf..edc78d41984184ca725d618f92adadf9bee7f8ac 100644 (file)
@@ -460,6 +460,7 @@ void __attribute__((noreturn)) vcpu_deactivate_vmm(void)
        asm volatile("str %0" : "=m" (cpu_data->linux_tss.selector));
 
        cpu_data->linux_efer = vmcb->efer & (~EFER_SVME);
+       cpu_data->linux_fs.base = vmcb->fs.base;
        cpu_data->linux_gs.base = vmcb->gs.base;
 
        cpu_data->linux_ds.selector = vmcb->ds.selector;
index dfd82a58ecf7e3ad0099ef1b405a918af672a37c..94a2083c5689f2072becd1dd163480632359fd42 100644 (file)
@@ -717,10 +717,9 @@ void __attribute__((noreturn)) vcpu_deactivate_vmm(void)
        cpu_data->linux_tss.selector = vmcs_read32(GUEST_TR_SELECTOR);
 
        cpu_data->linux_efer = vmcs_read64(GUEST_IA32_EFER);
+       cpu_data->linux_fs.base = vmcs_read64(GUEST_FS_BASE);
        cpu_data->linux_gs.base = vmcs_read64(GUEST_GS_BASE);
 
-       write_msr(MSR_FS_BASE, vmcs_read64(GUEST_FS_BASE));
-
        write_msr(MSR_IA32_SYSENTER_CS, vmcs_read32(GUEST_SYSENTER_CS));
        write_msr(MSR_IA32_SYSENTER_EIP, vmcs_read64(GUEST_SYSENTER_EIP));
        write_msr(MSR_IA32_SYSENTER_ESP, vmcs_read64(GUEST_SYSENTER_ESP));