|
@@ -389,19 +389,17 @@ convert_from_fxsr(struct user_i387_ia32_struct *env, struct task_struct *tsk)
|
|
|
#ifdef CONFIG_X86_64
|
|
|
env->fip = fxsave->rip;
|
|
|
env->foo = fxsave->rdp;
|
|
|
+ /*
|
|
|
+ * should be actually ds/cs at fpu exception time, but
|
|
|
+ * that information is not available in 64bit mode.
|
|
|
+ */
|
|
|
+ env->fcs = task_pt_regs(tsk)->cs;
|
|
|
if (tsk == current) {
|
|
|
- /*
|
|
|
- * should be actually ds/cs at fpu exception time, but
|
|
|
- * that information is not available in 64bit mode.
|
|
|
- */
|
|
|
- asm("mov %%ds, %[fos]" : [fos] "=r" (env->fos));
|
|
|
- asm("mov %%cs, %[fcs]" : [fcs] "=r" (env->fcs));
|
|
|
+ savesegment(ds, env->fos);
|
|
|
} else {
|
|
|
- struct pt_regs *regs = task_pt_regs(tsk);
|
|
|
-
|
|
|
- env->fos = 0xffff0000 | tsk->thread.ds;
|
|
|
- env->fcs = regs->cs;
|
|
|
+ env->fos = tsk->thread.ds;
|
|
|
}
|
|
|
+ env->fos |= 0xffff0000;
|
|
|
#else
|
|
|
env->fip = fxsave->fip;
|
|
|
env->fcs = (u16) fxsave->fcs | ((u32) fxsave->fop << 16);
|