Messages in this thread Patch in this message | ![/](/images/icornerl.gif) | | Date | Fri, 9 May 2003 00:42:01 +0000 | From | paubert <> | Subject | [PATCH] Mask mxcsr according to cpu features. |
| |
[CC'ed to x86_64 and ia64 maintainers because they might have the same issues. For existing x86_64 processors, s/0xffbf/0xffff/ in arch/x86-64/ia32/{fpu32,ptrace32}.c might be sufficient]
With SSE2, mxcsr bit 6 is defined as controlling whether denormals should be treated as zeroes or not. Setting it no more causes an exception, but with the current code it would be cleared at every signal return which is a bit harsh.
The following patch fixes this (2.5, but easily ported to 2.4).
===== arch/i386/kernel/i387.c 1.16 vs edited ===== --- 1.16/arch/i386/kernel/i387.c Wed Apr 9 05:45:37 2003 +++ edited/arch/i386/kernel/i387.c Thu May 8 23:30:23 2003 @@ -25,6 +25,12 @@ #define HAVE_HWFP 1 #endif +/* mxcsr bits 31-16 must be zero for security reasons, + * bit 6 depends on cpu features. + */ +#define MXCSR_MASK (cpu_has_sse2 ? 0xffff : 0xffbf) + + /* * The _current_ task is using the FPU for the first time * so initialize it and set the mxcsr to its default @@ -208,7 +214,7 @@ void set_fpu_mxcsr( struct task_struct *tsk, unsigned short mxcsr ) { if ( cpu_has_xmm ) { - tsk->thread.i387.fxsave.mxcsr = (mxcsr & 0xffbf); + tsk->thread.i387.fxsave.mxcsr = (mxcsr & MXCSR_MASK); } } @@ -356,8 +362,7 @@ clear_fpu( tsk ); err = __copy_from_user( &tsk->thread.i387.fxsave, &buf->_fxsr_env[0], sizeof(struct i387_fxsave_struct) ); - /* mxcsr bit 6 and 31-16 must be zero for security reasons */ - tsk->thread.i387.fxsave.mxcsr &= 0xffbf; + tsk->thread.i387.fxsave.mxcsr &= MXCSR_MASK; return err ? 1 : convert_fxsr_from_user( &tsk->thread.i387.fxsave, buf ); } @@ -455,8 +460,7 @@ if ( cpu_has_fxsr ) { __copy_from_user( &tsk->thread.i387.fxsave, buf, sizeof(struct user_fxsr_struct) ); - /* mxcsr bit 6 and 31-16 must be zero for security reasons */ - tsk->thread.i387.fxsave.mxcsr &= 0xffbf; + tsk->thread.i387.fxsave.mxcsr &= MXCSR_MASK; return 0; } else { return -EIO; Gabriel - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| ![\](/images/icornerr.gif) |