diff options
Diffstat (limited to 'arch/x86/kernel/signal.c')
-rw-r--r-- | arch/x86/kernel/signal.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c index bed431a38162..e10f96a7e047 100644 --- a/arch/x86/kernel/signal.c +++ b/arch/x86/kernel/signal.c | |||
@@ -114,7 +114,7 @@ int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, | |||
114 | regs->orig_ax = -1; /* disable syscall checks */ | 114 | regs->orig_ax = -1; /* disable syscall checks */ |
115 | 115 | ||
116 | get_user_ex(buf, &sc->fpstate); | 116 | get_user_ex(buf, &sc->fpstate); |
117 | err |= restore_i387_xstate(buf); | 117 | err |= restore_xstate_sig(buf, config_enabled(CONFIG_X86_32)); |
118 | 118 | ||
119 | get_user_ex(*pax, &sc->ax); | 119 | get_user_ex(*pax, &sc->ax); |
120 | } get_user_catch(err); | 120 | } get_user_catch(err); |
@@ -206,7 +206,9 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size, | |||
206 | void __user **fpstate) | 206 | void __user **fpstate) |
207 | { | 207 | { |
208 | /* Default to using normal stack */ | 208 | /* Default to using normal stack */ |
209 | unsigned long math_size = 0; | ||
209 | unsigned long sp = regs->sp; | 210 | unsigned long sp = regs->sp; |
211 | unsigned long buf_fx = 0; | ||
210 | int onsigstack = on_sig_stack(sp); | 212 | int onsigstack = on_sig_stack(sp); |
211 | 213 | ||
212 | /* redzone */ | 214 | /* redzone */ |
@@ -228,10 +230,8 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size, | |||
228 | } | 230 | } |
229 | 231 | ||
230 | if (used_math()) { | 232 | if (used_math()) { |
231 | sp -= sig_xstate_size; | 233 | sp = alloc_mathframe(sp, config_enabled(CONFIG_X86_32), |
232 | #ifdef CONFIG_X86_64 | 234 | &buf_fx, &math_size); |
233 | sp = round_down(sp, 64); | ||
234 | #endif /* CONFIG_X86_64 */ | ||
235 | *fpstate = (void __user *)sp; | 235 | *fpstate = (void __user *)sp; |
236 | } | 236 | } |
237 | 237 | ||
@@ -244,8 +244,9 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, size_t frame_size, | |||
244 | if (onsigstack && !likely(on_sig_stack(sp))) | 244 | if (onsigstack && !likely(on_sig_stack(sp))) |
245 | return (void __user *)-1L; | 245 | return (void __user *)-1L; |
246 | 246 | ||
247 | /* save i387 state */ | 247 | /* save i387 and extended state */ |
248 | if (used_math() && save_i387_xstate(*fpstate) < 0) | 248 | if (used_math() && |
249 | save_xstate_sig(*fpstate, (void __user *)buf_fx, math_size) < 0) | ||
249 | return (void __user *)-1L; | 250 | return (void __user *)-1L; |
250 | 251 | ||
251 | return (void __user *)sp; | 252 | return (void __user *)sp; |