diff options
Diffstat (limited to 'drivers/lguest/x86/core.c')
| -rw-r--r-- | drivers/lguest/x86/core.c | 10 | 
1 files changed, 7 insertions, 3 deletions
diff --git a/drivers/lguest/x86/core.c b/drivers/lguest/x86/core.c index 39809035320..4af12e1844d 100644 --- a/drivers/lguest/x86/core.c +++ b/drivers/lguest/x86/core.c @@ -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();  }  |