|
@@ -203,8 +203,8 @@ void lguest_arch_run_guest(struct lg_cpu *cpu)
|
|
|
* we set it now, so we can trap and pass that trap to the Guest if it
|
|
|
* uses the FPU.
|
|
|
*/
|
|
|
- if (cpu->ts)
|
|
|
- unlazy_fpu(current);
|
|
|
+ if (cpu->ts && user_has_fpu())
|
|
|
+ stts();
|
|
|
|
|
|
/*
|
|
|
* SYSENTER is an optimized way of doing system calls. We can't allow
|
|
@@ -234,6 +234,10 @@ void lguest_arch_run_guest(struct lg_cpu *cpu)
|
|
|
if (boot_cpu_has(X86_FEATURE_SEP))
|
|
|
wrmsr(MSR_IA32_SYSENTER_CS, __KERNEL_CS, 0);
|
|
|
|
|
|
+ /* Clear the host TS bit if it was set above. */
|
|
|
+ if (cpu->ts && user_has_fpu())
|
|
|
+ clts();
|
|
|
+
|
|
|
/*
|
|
|
* If the Guest page faulted, then the cr2 register will tell us the
|
|
|
* bad virtual address. We have to grab this now, because once we
|
|
@@ -249,7 +253,7 @@ void lguest_arch_run_guest(struct lg_cpu *cpu)
|
|
|
* a different CPU. So all the critical stuff should be done
|
|
|
* before this.
|
|
|
*/
|
|
|
- else if (cpu->regs->trapnum == 7)
|
|
|
+ else if (cpu->regs->trapnum == 7 && !user_has_fpu())
|
|
|
math_state_restore();
|
|
|
}
|
|
|
|