Merge branch 'x86/fpu' into x86/smap
[linux-3.10.git] / arch / x86 / ia32 / ia32_signal.c
index 05e62a3..efc6a95 100644 (file)
@@ -32,6 +32,7 @@
 #include <asm/sigframe.h>
 #include <asm/sighandling.h>
 #include <asm/sys_ia32.h>
+#include <asm/smap.h>
 
 #define FIX_EFLAGS     __FIX_EFLAGS
 
@@ -162,7 +163,8 @@ asmlinkage long sys32_sigaltstack(const stack_ia32_t __user *uss_ptr,
        }
        seg = get_fs();
        set_fs(KERNEL_DS);
-       ret = do_sigaltstack(uss_ptr ? &uss : NULL, &uoss, regs->sp);
+       ret = do_sigaltstack((stack_t __force __user *) (uss_ptr ? &uss : NULL),
+                            (stack_t __force __user *) &uoss, regs->sp);
        set_fs(seg);
        if (ret >= 0 && uoss_ptr)  {
                if (!access_ok(VERIFY_WRITE, uoss_ptr, sizeof(stack_ia32_t)))
@@ -254,7 +256,7 @@ static int ia32_restore_sigcontext(struct pt_regs *regs,
                get_user_ex(*pax, &sc->ax);
        } get_user_catch(err);
 
-       err |= restore_i387_xstate_ia32(buf);
+       err |= restore_xstate_sig(buf, 1);
 
        return err;
 }
@@ -362,7 +364,7 @@ static int ia32_setup_sigcontext(struct sigcontext_ia32 __user *sc,
  */
 static void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
                                 size_t frame_size,
-                                void **fpstate)
+                                void __user **fpstate)
 {
        unsigned long sp;
 
@@ -382,9 +384,12 @@ static void __user *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
                sp = (unsigned long) ka->sa.sa_restorer;
 
        if (used_math()) {
-               sp = sp - sig_xstate_ia32_size;
-               *fpstate = (struct _fpstate_ia32 *) sp;
-               if (save_i387_xstate_ia32(*fpstate) < 0)
+               unsigned long fx_aligned, math_size;
+
+               sp = alloc_mathframe(sp, 1, &fx_aligned, &math_size);
+               *fpstate = (struct _fpstate_ia32 __user *) sp;
+               if (save_xstate_sig(*fpstate, (void __user *)fx_aligned,
+                                   math_size) < 0)
                        return (void __user *) -1L;
        }
 
@@ -449,7 +454,7 @@ int ia32_setup_frame(int sig, struct k_sigaction *ka,
                 * These are actually not used anymore, but left because some
                 * gdb versions depend on them as a marker.
                 */
-               put_user_ex(*((u64 *)&code), (u64 *)frame->retcode);
+               put_user_ex(*((u64 *)&code), (u64 __user *)frame->retcode);
        } put_user_catch(err);
 
        if (err)
@@ -526,7 +531,7 @@ int ia32_setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
                 * Not actually used anymore, but left because some gdb
                 * versions need it.
                 */
-               put_user_ex(*((u64 *)&code), (u64 *)frame->retcode);
+               put_user_ex(*((u64 *)&code), (u64 __user *)frame->retcode);
        } put_user_catch(err);
 
        err |= copy_siginfo_to_user32(&frame->info, info);