aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/signal_32.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/kernel/signal_32.c')
-rw-r--r--arch/x86/kernel/signal_32.c21
1 files changed, 7 insertions, 14 deletions
diff --git a/arch/x86/kernel/signal_32.c b/arch/x86/kernel/signal_32.c
index 545448b7aeb..d6dd057d0f2 100644
--- a/arch/x86/kernel/signal_32.c
+++ b/arch/x86/kernel/signal_32.c
@@ -142,6 +142,8 @@ static int
142restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, 142restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc,
143 unsigned long *pax) 143 unsigned long *pax)
144{ 144{
145 void __user *buf;
146 unsigned int tmpflags;
145 unsigned int err = 0; 147 unsigned int err = 0;
146 148
147 /* Always make any pending restarted system calls return -EINTR */ 149 /* Always make any pending restarted system calls return -EINTR */
@@ -156,21 +158,12 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc,
156 COPY_SEG_STRICT(cs); 158 COPY_SEG_STRICT(cs);
157 COPY_SEG_STRICT(ss); 159 COPY_SEG_STRICT(ss);
158 160
159 { 161 err |= __get_user(tmpflags, &sc->flags);
160 unsigned int tmpflags; 162 regs->flags = (regs->flags & ~FIX_EFLAGS) | (tmpflags & FIX_EFLAGS);
163 regs->orig_ax = -1; /* disable syscall checks */
161 164
162 err |= __get_user(tmpflags, &sc->flags); 165 err |= __get_user(buf, &sc->fpstate);
163 regs->flags = (regs->flags & ~FIX_EFLAGS) | 166 err |= restore_i387_xstate(buf);
164 (tmpflags & FIX_EFLAGS);
165 regs->orig_ax = -1; /* disable syscall checks */
166 }
167
168 {
169 void __user *buf;
170
171 err |= __get_user(buf, &sc->fpstate);
172 err |= restore_i387_xstate(buf);
173 }
174 167
175 err |= __get_user(*pax, &sc->ax); 168 err |= __get_user(*pax, &sc->ax);
176 return err; 169 return err;