Index: oldkernel/linux/arch/i386/kernel/signal.c diff -u linux/arch/i386/kernel/signal.c:1.2 linux/arch/i386/kernel/signal.c:1.3 --- linux/arch/i386/kernel/signal.c:1.2 Thu Jun 1 15:05:19 2000 +++ linux/arch/i386/kernel/signal.c Thu Jun 1 17:04:57 2000 @@ -154,14 +154,11 @@ static inline int restore_i387_hard(struct _fpstate *buf) { - int err = 0; struct task_struct *tsk = current; clear_fpu(tsk); - err = i387_user_to_hard(&tsk->tss.i387.hard, - (struct user_i387_struct *)buf); - err |= get_user(tsk->tss.i387.hard.fsave.swd, &buf->status); - return err; + return i387_user_to_hard(&tsk->tss.i387.hard, + (struct user_i387_struct *)buf); } static inline int restore_i387(struct _fpstate *buf) @@ -312,12 +309,14 @@ static inline int save_i387_hard(struct _fpstate * buf) { int err = 0; + unsigned long status; struct task_struct *tsk = current; unlazy_fpu(tsk); err = i387_hard_to_user((struct user_i387_struct *)buf, &tsk->tss.i387.hard); - err |= put_user(tsk->tss.i387.hard.fsave.swd, &buf->status); + i387_get_swd(status, tsk->tss.i387.hard); + err |= put_user(status, &buf->status); if (err) return -1; return 1; Index: oldkernel/linux/include/asm-i386/i387.h diff -u linux/include/asm-i386/i387.h:1.1 linux/include/asm-i386/i387.h:1.2 --- linux/include/asm-i386/i387.h:1.1 Thu Jun 1 15:05:19 2000 +++ linux/include/asm-i386/i387.h Thu Jun 1 17:04:57 2000 @@ -68,6 +68,15 @@ } \ } while(0) +#define i387_get_swd(v,x) \ +do { \ + if (boot_cpu_data.x86_capability & X86_FEATURE_FXSR) { \ + v = (unsigned long) (x).fxsave.fxswd; \ + } else { \ + v = (unsigned long) (x).fsave.swd; \ + } \ +} while(0) + #define i387_set_twd(x,v) \ do { \ if (boot_cpu_data.x86_capability & X86_FEATURE_FXSR) { \ @@ -114,6 +123,9 @@ #define i387_set_swd(x,v) \ do { (x).fsave.swd = ((long)(v) | 0xffff0000); } while(0) + +#define i387_get_swd(v,x) \ +do { v = (unsigned long) (x).fsave.swd; } while(0) #define i387_set_twd(x,v) \ do { (x).fsave.twd = ((long)(v) | 0xffff0000); } while(0)