diff options
| -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 5126d5d9ea0e..2e554a4ab337 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) | |||
| 176 | * we set it now, so we can trap and pass that trap to the Guest if it | 176 | * we set it now, so we can trap and pass that trap to the Guest if it |
| 177 | * uses the FPU. */ | 177 | * uses the FPU. */ |
| 178 | if (cpu->ts) | 178 | if (cpu->ts) |
| 179 | lguest_set_ts(); | 179 | unlazy_fpu(current); |
| 180 | 180 | ||
| 181 | /* SYSENTER is an optimized way of doing system calls. We can't allow | 181 | /* SYSENTER is an optimized way of doing system calls. We can't allow |
| 182 | * it because it always jumps to privilege level 0. A normal Guest | 182 | * 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) | |||
| 196 | * trap made the switcher code come back, and an error code which some | 196 | * trap made the switcher code come back, and an error code which some |
| 197 | * traps set. */ | 197 | * traps set. */ |
| 198 | 198 | ||
| 199 | /* Restore SYSENTER if it's supposed to be on. */ | ||
| 200 | if (boot_cpu_has(X86_FEATURE_SEP)) | ||
| 201 | wrmsr(MSR_IA32_SYSENTER_CS, __KERNEL_CS, 0); | ||
| 202 | |||
| 199 | /* If the Guest page faulted, then the cr2 register will tell us the | 203 | /* If the Guest page faulted, then the cr2 register will tell us the |
| 200 | * bad virtual address. We have to grab this now, because once we | 204 | * bad virtual address. We have to grab this now, because once we |
| 201 | * re-enable interrupts an interrupt could fault and thus overwrite | 205 | * re-enable interrupts an interrupt could fault and thus overwrite |
| @@ -203,13 +207,12 @@ void lguest_arch_run_guest(struct lg_cpu *cpu) | |||
| 203 | if (cpu->regs->trapnum == 14) | 207 | if (cpu->regs->trapnum == 14) |
| 204 | cpu->arch.last_pagefault = read_cr2(); | 208 | cpu->arch.last_pagefault = read_cr2(); |
| 205 | /* Similarly, if we took a trap because the Guest used the FPU, | 209 | /* Similarly, if we took a trap because the Guest used the FPU, |
| 206 | * we have to restore the FPU it expects to see. */ | 210 | * we have to restore the FPU it expects to see. |
| 211 | * math_state_restore() may sleep and we may even move off to | ||
| 212 | * a different CPU. So all the critical stuff should be done | ||
| 213 | * before this. */ | ||
| 207 | else if (cpu->regs->trapnum == 7) | 214 | else if (cpu->regs->trapnum == 7) |
| 208 | math_state_restore(); | 215 | math_state_restore(); |
| 209 | |||
| 210 | /* Restore SYSENTER if it's supposed to be on. */ | ||
| 211 | if (boot_cpu_has(X86_FEATURE_SEP)) | ||
| 212 | wrmsr(MSR_IA32_SYSENTER_CS, __KERNEL_CS, 0); | ||
| 213 | } | 216 | } |
| 214 | 217 | ||
| 215 | /*H:130 Now we've examined the hypercall code; our Guest can make requests. | 218 | /*H:130 Now we've examined the hypercall code; our Guest can make requests. |
