2 * Copyright (C) 2003 PathScale, Inc.
3 * Copyright (C) 2003 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
4 * Licensed under the GPL
8 #include <linux/personality.h>
9 #include <linux/ptrace.h>
10 #include <linux/kernel.h>
11 #include <linux/syscalls.h>
12 #include <asm/unistd.h>
13 #include <linux/uaccess.h>
14 #include <asm/ucontext.h>
15 #include <frame_kern.h>
16 #include <registers.h>
19 #include <linux/regset.h>
20 #include <asm/sigframe.h>
24 struct _fpstate_64 fpstate
;
25 struct _header xstate_hdr
;
26 struct _ymmh_state ymmh
;
27 /* New processor state extensions go here: */
30 #define _xstate_64 _xstate
33 static int copy_sc_from_user(struct pt_regs
*regs
,
34 struct sigcontext __user
*from
)
36 struct _xstate_64 __user
*from_fp64
;
40 /* Always make any pending restarted system calls return -EINTR */
41 current
->restart_block
.fn
= do_no_restart_syscall
;
43 err
= copy_from_user(&sc
, from
, sizeof(sc
));
47 #define GETREG(regno, regname) regs->regs.gp[HOST_##regno] = sc.regname
77 GETREG(EFLAGS
, flags
);
85 from_fp64
= ((void __user
*)sc
.fpstate
) +
86 offsetof(struct _fpstate_32
, _fxsr_env
);
88 from_fp64
= (void __user
*)sc
.fpstate
;
91 err
= copy_from_user(regs
->regs
.fp
, from_fp64
, host_fp_size
);
96 /* Data is duplicated and this copy is the important one */
97 err
= copy_regset_from_user(current
,
98 task_user_regset_view(current
),
100 sizeof(struct user_i387_struct
),
101 (void __user
*)sc
.fpstate
);
109 static int copy_sc_to_user(struct sigcontext __user
*to
,
110 struct _xstate __user
*to_fp
, struct pt_regs
*regs
,
113 struct _xstate_64 __user
*to_fp64
;
114 struct sigcontext sc
;
115 struct faultinfo
* fi
= ¤t
->thread
.arch
.faultinfo
;
117 memset(&sc
, 0, sizeof(struct sigcontext
));
119 #define PUTREG(regno, regname) sc.regname = regs->regs.gp[HOST_##regno]
147 sc
.err
= fi
->error_code
;
148 sc
.trapno
= fi
->trap_no
;
151 PUTREG(EFLAGS
, flags
);
153 PUTREG(SP
, sp_at_signal
);
158 sc
.fpstate
= (unsigned long)to_fp
;
160 err
= copy_to_user(to
, &sc
, sizeof(struct sigcontext
));
165 err
= copy_regset_to_user(current
,
166 task_user_regset_view(current
),
168 sizeof(struct _fpstate_32
), to_fp
);
172 __put_user(X86_FXSR_MAGIC
, &to_fp
->fpstate
.magic
);
174 BUILD_BUG_ON(offsetof(struct _xstate
, xstate_hdr
) !=
175 offsetof(struct _xstate_64
, xstate_hdr
) +
176 offsetof(struct _fpstate_32
, _fxsr_env
));
177 to_fp64
= (void __user
*)to_fp
+
178 offsetof(struct _fpstate_32
, _fxsr_env
);
181 #endif /* CONFIG_X86_32 */
183 if (copy_to_user(to_fp64
, regs
->regs
.fp
, host_fp_size
))
187 * Put magic/size values for userspace. We do not bother to verify them
188 * later on, however, userspace needs them should it try to read the
189 * XSTATE data. And ptrace does not fill in these parts.
191 BUILD_BUG_ON(sizeof(int) != FP_XSTATE_MAGIC2_SIZE
);
193 __put_user(offsetof(struct _fpstate_32
, _fxsr_env
) +
194 host_fp_size
+ FP_XSTATE_MAGIC2_SIZE
,
195 &to_fp64
->fpstate
.sw_reserved
.extended_size
);
197 __put_user(host_fp_size
+ FP_XSTATE_MAGIC2_SIZE
,
198 &to_fp64
->fpstate
.sw_reserved
.extended_size
);
200 __put_user(host_fp_size
, &to_fp64
->fpstate
.sw_reserved
.xstate_size
);
202 __put_user(FP_XSTATE_MAGIC1
, &to_fp64
->fpstate
.sw_reserved
.magic1
);
203 __put_user(FP_XSTATE_MAGIC2
,
204 (int __user
*)((void __user
*)to_fp64
+ host_fp_size
));
210 static int copy_ucontext_to_user(struct ucontext __user
*uc
,
211 struct _xstate __user
*fp
, sigset_t
*set
,
216 err
|= __save_altstack(&uc
->uc_stack
, sp
);
217 err
|= copy_sc_to_user(&uc
->uc_mcontext
, fp
, ¤t
->thread
.regs
, 0);
218 err
|= copy_to_user(&uc
->uc_sigmask
, set
, sizeof(*set
));
222 int setup_signal_stack_sc(unsigned long stack_top
, struct ksignal
*ksig
,
223 struct pt_regs
*regs
, sigset_t
*mask
)
225 size_t math_size
= offsetof(struct _fpstate_32
, _fxsr_env
) +
226 host_fp_size
+ FP_XSTATE_MAGIC2_SIZE
;
227 struct sigframe __user
*frame
;
228 void __user
*restorer
;
229 int err
= 0, sig
= ksig
->sig
;
232 /* This is the same calculation as i386 - ((sp + 4) & 15) == 0 */
233 stack_top
= ((stack_top
+ 4) & -16UL) - 4;
234 frame
= (struct sigframe __user
*) stack_top
- 1;
235 if (!access_ok(frame
, sizeof(*frame
)))
238 /* Add required space for math frame */
239 frame
= (struct sigframe __user
*)((unsigned long)frame
- math_size
);
241 restorer
= frame
->retcode
;
242 if (ksig
->ka
.sa
.sa_flags
& SA_RESTORER
)
243 restorer
= ksig
->ka
.sa
.sa_restorer
;
245 err
|= __put_user(restorer
, (void __user
* __user
*)&frame
->pretcode
);
246 err
|= __put_user(sig
, &frame
->sig
);
248 fp_to
= (unsigned long)frame
+ sizeof(*frame
);
250 err
|= copy_sc_to_user(&frame
->sc
,
251 (struct _xstate __user
*)fp_to
,
254 err
|= __copy_to_user(&frame
->extramask
, &mask
->sig
[1],
255 sizeof(frame
->extramask
));
258 * This is popl %eax ; movl $,%eax ; int $0x80
260 * WE DO NOT USE IT ANY MORE! It's only left here for historical
261 * reasons and because gdb uses it as a signature to notice
262 * signal handler stack frames.
264 err
|= __put_user(0xb858, (short __user
*)(frame
->retcode
+0));
265 err
|= __put_user(__NR_sigreturn
, (int __user
*)(frame
->retcode
+2));
266 err
|= __put_user(0x80cd, (short __user
*)(frame
->retcode
+6));
271 PT_REGS_SP(regs
) = (unsigned long) frame
;
272 PT_REGS_IP(regs
) = (unsigned long) ksig
->ka
.sa
.sa_handler
;
273 PT_REGS_AX(regs
) = (unsigned long) sig
;
274 PT_REGS_DX(regs
) = (unsigned long) 0;
275 PT_REGS_CX(regs
) = (unsigned long) 0;
279 int setup_signal_stack_si(unsigned long stack_top
, struct ksignal
*ksig
,
280 struct pt_regs
*regs
, sigset_t
*mask
)
282 size_t math_size
= offsetof(struct _fpstate_32
, _fxsr_env
) +
283 host_fp_size
+ FP_XSTATE_MAGIC2_SIZE
;
284 struct rt_sigframe __user
*frame
;
285 void __user
*restorer
;
286 int err
= 0, sig
= ksig
->sig
;
290 frame
= (struct rt_sigframe __user
*) stack_top
- 1;
291 if (!access_ok(frame
, sizeof(*frame
)))
294 /* Add required space for math frame */
295 frame
= (struct rt_sigframe __user
*)((unsigned long)frame
- math_size
);
297 restorer
= frame
->retcode
;
298 if (ksig
->ka
.sa
.sa_flags
& SA_RESTORER
)
299 restorer
= ksig
->ka
.sa
.sa_restorer
;
301 err
|= __put_user(restorer
, (void __user
* __user
*)&frame
->pretcode
);
302 err
|= __put_user(sig
, &frame
->sig
);
303 err
|= __put_user(&frame
->info
, (void __user
* __user
*)&frame
->pinfo
);
304 err
|= __put_user(&frame
->uc
, (void __user
* __user
*)&frame
->puc
);
305 err
|= copy_siginfo_to_user(&frame
->info
, &ksig
->info
);
307 fp_to
= (unsigned long)frame
+ sizeof(*frame
);
309 err
|= copy_ucontext_to_user(&frame
->uc
, (struct _xstate __user
*)fp_to
,
310 mask
, PT_REGS_SP(regs
));
313 * This is movl $,%eax ; int $0x80
315 * WE DO NOT USE IT ANY MORE! It's only left here for historical
316 * reasons and because gdb uses it as a signature to notice
317 * signal handler stack frames.
319 err
|= __put_user(0xb8, (char __user
*)(frame
->retcode
+0));
320 err
|= __put_user(__NR_rt_sigreturn
, (int __user
*)(frame
->retcode
+1));
321 err
|= __put_user(0x80cd, (short __user
*)(frame
->retcode
+5));
326 PT_REGS_SP(regs
) = (unsigned long) frame
;
327 PT_REGS_IP(regs
) = (unsigned long) ksig
->ka
.sa
.sa_handler
;
328 PT_REGS_AX(regs
) = (unsigned long) sig
;
329 PT_REGS_DX(regs
) = (unsigned long) &frame
->info
;
330 PT_REGS_CX(regs
) = (unsigned long) &frame
->uc
;
334 SYSCALL_DEFINE0(sigreturn
)
336 unsigned long sp
= PT_REGS_SP(¤t
->thread
.regs
);
337 struct sigframe __user
*frame
= (struct sigframe __user
*)(sp
- 8);
339 struct sigcontext __user
*sc
= &frame
->sc
;
340 int sig_size
= (_NSIG_WORDS
- 1) * sizeof(unsigned long);
342 if (copy_from_user(&set
.sig
[0], &sc
->oldmask
, sizeof(set
.sig
[0])) ||
343 copy_from_user(&set
.sig
[1], frame
->extramask
, sig_size
))
346 set_current_blocked(&set
);
348 if (copy_sc_from_user(¤t
->thread
.regs
, sc
))
351 /* Avoid ERESTART handling */
352 PT_REGS_SYSCALL_NR(¤t
->thread
.regs
) = -1;
353 return PT_REGS_SYSCALL_RET(¤t
->thread
.regs
);
362 int setup_signal_stack_si(unsigned long stack_top
, struct ksignal
*ksig
,
363 struct pt_regs
*regs
, sigset_t
*set
)
365 unsigned long math_size
= host_fp_size
+ FP_XSTATE_MAGIC2_SIZE
;
366 struct rt_sigframe __user
*frame
;
367 int err
= 0, sig
= ksig
->sig
;
370 frame
= (struct rt_sigframe __user
*)
371 round_down(stack_top
- sizeof(struct rt_sigframe
), 16);
373 /* Add required space for math frame */
374 frame
= (struct rt_sigframe __user
*)((unsigned long)frame
- math_size
);
376 /* Subtract 128 for a red zone and 8 for proper alignment */
377 frame
= (struct rt_sigframe __user
*) ((unsigned long) frame
- 128 - 8);
379 if (!access_ok(frame
, sizeof(*frame
) + math_size
))
382 if (ksig
->ka
.sa
.sa_flags
& SA_SIGINFO
) {
383 err
|= copy_siginfo_to_user(&frame
->info
, &ksig
->info
);
388 /* Create the ucontext. */
389 err
|= __put_user(0, &frame
->uc
.uc_flags
);
390 err
|= __put_user(NULL
, &frame
->uc
.uc_link
);
391 err
|= __save_altstack(&frame
->uc
.uc_stack
, PT_REGS_SP(regs
));
393 fp_to
= (unsigned long)frame
+ sizeof(*frame
);
395 err
|= copy_sc_to_user(&frame
->uc
.uc_mcontext
,
396 (struct _xstate __user
*)fp_to
,
399 err
|= __put_user(fp_to
, &frame
->uc
.uc_mcontext
.fpstate
);
400 if (sizeof(*set
) == 16) {
401 err
|= __put_user(set
->sig
[0], &frame
->uc
.uc_sigmask
.sig
[0]);
402 err
|= __put_user(set
->sig
[1], &frame
->uc
.uc_sigmask
.sig
[1]);
405 err
|= __copy_to_user(&frame
->uc
.uc_sigmask
, set
,
409 * Set up to return from userspace. If provided, use a stub
410 * already in userspace.
412 /* x86-64 should always use SA_RESTORER. */
413 if (ksig
->ka
.sa
.sa_flags
& SA_RESTORER
)
414 err
|= __put_user((void __user
*)ksig
->ka
.sa
.sa_restorer
,
417 /* could use a vstub here */
423 PT_REGS_SP(regs
) = (unsigned long) frame
;
424 PT_REGS_DI(regs
) = sig
;
425 /* In case the signal handler was declared without prototypes */
426 PT_REGS_AX(regs
) = 0;
429 * This also works for non SA_SIGINFO handlers because they expect the
430 * next argument after the signal number on the stack.
432 PT_REGS_SI(regs
) = (unsigned long) &frame
->info
;
433 PT_REGS_DX(regs
) = (unsigned long) &frame
->uc
;
434 PT_REGS_IP(regs
) = (unsigned long) ksig
->ka
.sa
.sa_handler
;
440 SYSCALL_DEFINE0(rt_sigreturn
)
442 unsigned long sp
= PT_REGS_SP(¤t
->thread
.regs
);
443 struct rt_sigframe __user
*frame
=
444 (struct rt_sigframe __user
*)(sp
- sizeof(long));
445 struct ucontext __user
*uc
= &frame
->uc
;
448 if (copy_from_user(&set
, &uc
->uc_sigmask
, sizeof(set
)))
451 set_current_blocked(&set
);
453 if (copy_sc_from_user(¤t
->thread
.regs
, &uc
->uc_mcontext
))
456 /* Avoid ERESTART handling */
457 PT_REGS_SYSCALL_NR(¤t
->thread
.regs
) = -1;
458 return PT_REGS_SYSCALL_RET(¤t
->thread
.regs
);