diff options
| author | David Woodhouse <David.Woodhouse@intel.com> | 2008-07-11 14:36:25 +0100 | 
|---|---|---|
| committer | David Woodhouse <David.Woodhouse@intel.com> | 2008-07-11 14:36:25 +0100 | 
| commit | a8931ef380c92d121ae74ecfb03b2d63f72eea6f (patch) | |
| tree | 980fb6b019e11e6cb1ece55b7faff184721a8053 /drivers/lguest/x86/core.c | |
| parent | 90574d0a4d4b73308ae54a2a57a4f3f1fa98e984 (diff) | |
| parent | e5a5816f7875207cb0a0a7032e39a4686c5e10a4 (diff) | |
| download | olio-linux-3.10-a8931ef380c92d121ae74ecfb03b2d63f72eea6f.tar.xz olio-linux-3.10-a8931ef380c92d121ae74ecfb03b2d63f72eea6f.zip  | |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
Diffstat (limited to 'drivers/lguest/x86/core.c')
| -rw-r--r-- | drivers/lguest/x86/core.c | 15 | 
1 files changed, 9 insertions, 6 deletions
diff --git a/drivers/lguest/x86/core.c b/drivers/lguest/x86/core.c index 5126d5d9ea0..2e554a4ab33 100644 --- a/drivers/lguest/x86/core.c +++ b/drivers/lguest/x86/core.c @@ -176,7 +176,7 @@ 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) -		lguest_set_ts(); +		unlazy_fpu(current);  	/* SYSENTER is an optimized way of doing system calls.  We can't allow  	 * it because it always jumps to privilege level 0.  A normal Guest @@ -196,6 +196,10 @@ void lguest_arch_run_guest(struct lg_cpu *cpu)  	 * trap made the switcher code come back, and an error code which some  	 * traps set.  */ +	 /* Restore SYSENTER if it's supposed to be on. */ +	 if (boot_cpu_has(X86_FEATURE_SEP)) +		wrmsr(MSR_IA32_SYSENTER_CS, __KERNEL_CS, 0); +  	/* 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  	 * re-enable interrupts an interrupt could fault and thus overwrite @@ -203,13 +207,12 @@ void lguest_arch_run_guest(struct lg_cpu *cpu)  	if (cpu->regs->trapnum == 14)  		cpu->arch.last_pagefault = read_cr2();  	/* Similarly, if we took a trap because the Guest used the FPU, -	 * we have to restore the FPU it expects to see. */ +	 * we have to restore the FPU it expects to see. +	 * math_state_restore() may sleep and we may even move off to +	 * a different CPU. So all the critical stuff should be done +	 * before this.  */  	else if (cpu->regs->trapnum == 7)  		math_state_restore(); - -	/* Restore SYSENTER if it's supposed to be on. */ -	if (boot_cpu_has(X86_FEATURE_SEP)) -		wrmsr(MSR_IA32_SYSENTER_CS, __KERNEL_CS, 0);  }  /*H:130 Now we've examined the hypercall code; our Guest can make requests.  |