Merge to Fedora kernel-2.6.18-1.2255_FC5-vs2.0.2.2-rc9 patched with stable patch...
[linux-2.6.git] / arch / x86_64 / ia32 / fpu32.c
index f9a2638..2c8209a 100644 (file)
@@ -2,7 +2,6 @@
  * Copyright 2002 Andi Kleen, SuSE Labs.
  * FXSAVE<->i387 conversion support. Based on code by Gareth Hughes.
  * This is used for ptrace, signals and coredumps in 32bit emulation.
- * $Id: fpu32.c,v 1.1 2002/03/21 14:16:32 ak Exp $
  */ 
 
 #include <linux/sched.h>
@@ -28,16 +27,17 @@ static inline unsigned short twd_i387_to_fxsr(unsigned short twd)
 static inline unsigned long twd_fxsr_to_i387(struct i387_fxsave_struct *fxsave)
 {
        struct _fpxreg *st = NULL;
+       unsigned long tos = (fxsave->swd >> 11) & 7;
        unsigned long twd = (unsigned long) fxsave->twd;
        unsigned long tag;
        unsigned long ret = 0xffff0000;
        int i;
 
-#define FPREG_ADDR(f, n)       ((char *)&(f)->st_space + (n) * 16);
+#define FPREG_ADDR(f, n)       ((void *)&(f)->st_space + (n) * 16);
 
        for (i = 0 ; i < 8 ; i++) {
                if (twd & 0x1) {
-                       st = (struct _fpxreg *) FPREG_ADDR( fxsave, i );
+                       st = FPREG_ADDR( fxsave, (i - tos) & 7 );
 
                        switch (st->exponent & 0x7fff) {
                        case 0x7fff:
@@ -156,7 +156,7 @@ int restore_i387_ia32(struct task_struct *tsk, struct _fpstate_ia32 __user *buf,
                                     sizeof(struct i387_fxsave_struct)))
                        return -1;
                tsk->thread.i387.fxsave.mxcsr &= mxcsr_feature_mask;
-               tsk->used_math = 1;
+               set_stopped_child_used_math(tsk);
        } 
        return convert_fxsr_from_user(&tsk->thread.i387.fxsave, buf);
 }