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>
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);
}
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;
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));