2 * arch/s390/kernel/compat_signal.c
4 * Copyright (C) IBM Corp. 2000,2006
5 * Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
6 * Gerhard Tonn (ton@de.ibm.com)
8 * Copyright (C) 1991, 1992 Linus Torvalds
10 * 1997-11-28 Modified for POSIX.1b signals by Richard Henderson
13 #include <linux/compat.h>
14 #include <linux/sched.h>
16 #include <linux/smp.h>
17 #include <linux/kernel.h>
18 #include <linux/signal.h>
19 #include <linux/errno.h>
20 #include <linux/wait.h>
21 #include <linux/ptrace.h>
22 #include <linux/unistd.h>
23 #include <linux/stddef.h>
24 #include <linux/tty.h>
25 #include <linux/personality.h>
26 #include <linux/binfmts.h>
27 #include <asm/ucontext.h>
28 #include <asm/uaccess.h>
29 #include <asm/lowcore.h>
30 #include "compat_linux.h"
31 #include "compat_ptrace.h"
34 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
38 __u8 callee_used_stack[__SIGNAL_FRAMESIZE32];
39 struct sigcontext32 sc;
42 __u32 gprs_high[NUM_GPRS];
43 __u8 retcode[S390_SYSCALL_SIZE];
48 __u8 callee_used_stack[__SIGNAL_FRAMESIZE32];
49 __u8 retcode[S390_SYSCALL_SIZE];
50 compat_siginfo_t info;
52 __u32 gprs_high[NUM_GPRS];
55 static inline void sigset_to_sigset32(unsigned long *set64,
56 compat_sigset_word *set32)
58 set32[0] = (compat_sigset_word) set64[0];
59 set32[1] = (compat_sigset_word)(set64[0] >> 32);
62 static inline void sigset32_to_sigset(compat_sigset_word *set32,
65 set64[0] = (unsigned long) set32[0] | ((unsigned long) set32[1] << 32);
68 int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
72 if (!access_ok (VERIFY_WRITE, to, sizeof(compat_siginfo_t)))
75 /* If you change siginfo_t structure, please be sure
76 this code is fixed accordingly.
77 It should never copy any pad contained in the structure
78 to avoid security leaks, but must copy the generic
79 3 ints plus the relevant union member.
80 This routine must convert siginfo from 64bit to 32bit as well
82 err = __put_user(from->si_signo, &to->si_signo);
83 err |= __put_user(from->si_errno, &to->si_errno);
84 err |= __put_user((short)from->si_code, &to->si_code);
85 if (from->si_code < 0)
86 err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
88 switch (from->si_code >> 16) {
89 case __SI_RT >> 16: /* This is not generated by the kernel as of now. */
90 case __SI_MESGQ >> 16:
91 err |= __put_user(from->si_int, &to->si_int);
94 err |= __put_user(from->si_pid, &to->si_pid);
95 err |= __put_user(from->si_uid, &to->si_uid);
98 err |= __put_user(from->si_pid, &to->si_pid);
99 err |= __put_user(from->si_uid, &to->si_uid);
100 err |= __put_user(from->si_utime, &to->si_utime);
101 err |= __put_user(from->si_stime, &to->si_stime);
102 err |= __put_user(from->si_status, &to->si_status);
104 case __SI_FAULT >> 16:
105 err |= __put_user((unsigned long) from->si_addr,
108 case __SI_POLL >> 16:
109 err |= __put_user(from->si_band, &to->si_band);
110 err |= __put_user(from->si_fd, &to->si_fd);
112 case __SI_TIMER >> 16:
113 err |= __put_user(from->si_tid, &to->si_tid);
114 err |= __put_user(from->si_overrun, &to->si_overrun);
115 err |= __put_user(from->si_int, &to->si_int);
124 int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from)
129 if (!access_ok (VERIFY_READ, from, sizeof(compat_siginfo_t)))
132 err = __get_user(to->si_signo, &from->si_signo);
133 err |= __get_user(to->si_errno, &from->si_errno);
134 err |= __get_user(to->si_code, &from->si_code);
137 err |= __copy_from_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
139 switch (to->si_code >> 16) {
140 case __SI_RT >> 16: /* This is not generated by the kernel as of now. */
141 case __SI_MESGQ >> 16:
142 err |= __get_user(to->si_int, &from->si_int);
144 case __SI_KILL >> 16:
145 err |= __get_user(to->si_pid, &from->si_pid);
146 err |= __get_user(to->si_uid, &from->si_uid);
148 case __SI_CHLD >> 16:
149 err |= __get_user(to->si_pid, &from->si_pid);
150 err |= __get_user(to->si_uid, &from->si_uid);
151 err |= __get_user(to->si_utime, &from->si_utime);
152 err |= __get_user(to->si_stime, &from->si_stime);
153 err |= __get_user(to->si_status, &from->si_status);
155 case __SI_FAULT >> 16:
156 err |= __get_user(tmp, &from->si_addr);
157 to->si_addr = (void __force __user *)
158 (u64) (tmp & PSW32_ADDR_INSN);
160 case __SI_POLL >> 16:
161 err |= __get_user(to->si_band, &from->si_band);
162 err |= __get_user(to->si_fd, &from->si_fd);
164 case __SI_TIMER >> 16:
165 err |= __get_user(to->si_tid, &from->si_tid);
166 err |= __get_user(to->si_overrun, &from->si_overrun);
167 err |= __get_user(to->si_int, &from->si_int);
177 sys32_sigaction(int sig, const struct old_sigaction32 __user *act,
178 struct old_sigaction32 __user *oact)
180 struct k_sigaction new_ka, old_ka;
181 unsigned long sa_handler, sa_restorer;
185 compat_old_sigset_t mask;
186 if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
187 __get_user(sa_handler, &act->sa_handler) ||
188 __get_user(sa_restorer, &act->sa_restorer) ||
189 __get_user(new_ka.sa.sa_flags, &act->sa_flags) ||
190 __get_user(mask, &act->sa_mask))
192 new_ka.sa.sa_handler = (__sighandler_t) sa_handler;
193 new_ka.sa.sa_restorer = (void (*)(void)) sa_restorer;
194 siginitset(&new_ka.sa.sa_mask, mask);
197 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
200 sa_handler = (unsigned long) old_ka.sa.sa_handler;
201 sa_restorer = (unsigned long) old_ka.sa.sa_restorer;
202 if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
203 __put_user(sa_handler, &oact->sa_handler) ||
204 __put_user(sa_restorer, &oact->sa_restorer) ||
205 __put_user(old_ka.sa.sa_flags, &oact->sa_flags) ||
206 __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask))
214 sys32_rt_sigaction(int sig, const struct sigaction32 __user *act,
215 struct sigaction32 __user *oact, size_t sigsetsize)
217 struct k_sigaction new_ka, old_ka;
218 unsigned long sa_handler;
220 compat_sigset_t set32;
222 /* XXX: Don't preclude handling different sized sigset_t's. */
223 if (sigsetsize != sizeof(compat_sigset_t))
227 ret = get_user(sa_handler, &act->sa_handler);
228 ret |= __copy_from_user(&set32, &act->sa_mask,
229 sizeof(compat_sigset_t));
230 new_ka.sa.sa_mask.sig[0] =
231 set32.sig[0] | (((long)set32.sig[1]) << 32);
232 ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
236 new_ka.sa.sa_handler = (__sighandler_t) sa_handler;
239 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
242 set32.sig[1] = (old_ka.sa.sa_mask.sig[0] >> 32);
243 set32.sig[0] = old_ka.sa.sa_mask.sig[0];
244 ret = put_user((unsigned long)old_ka.sa.sa_handler, &oact->sa_handler);
245 ret |= __copy_to_user(&oact->sa_mask, &set32,
246 sizeof(compat_sigset_t));
247 ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
254 sys32_sigaltstack(const stack_t32 __user *uss, stack_t32 __user *uoss)
256 struct pt_regs *regs = task_pt_regs(current);
260 mm_segment_t old_fs = get_fs();
263 if (!access_ok(VERIFY_READ, uss, sizeof(*uss)))
265 err |= __get_user(ss_sp, &uss->ss_sp);
266 err |= __get_user(kss.ss_size, &uss->ss_size);
267 err |= __get_user(kss.ss_flags, &uss->ss_flags);
270 kss.ss_sp = (void __user *) ss_sp;
274 ret = do_sigaltstack((stack_t __force __user *) (uss ? &kss : NULL),
275 (stack_t __force __user *) (uoss ? &koss : NULL),
280 if (!access_ok(VERIFY_WRITE, uoss, sizeof(*uoss)))
282 ss_sp = (unsigned long) koss.ss_sp;
283 err |= __put_user(ss_sp, &uoss->ss_sp);
284 err |= __put_user(koss.ss_size, &uoss->ss_size);
285 err |= __put_user(koss.ss_flags, &uoss->ss_flags);
292 static int save_sigregs32(struct pt_regs *regs, _sigregs32 __user *sregs)
294 _s390_regs_common32 regs32;
297 regs32.psw.mask = psw32_user_bits |
298 ((__u32)(regs->psw.mask >> 32) & PSW32_MASK_USER);
299 regs32.psw.addr = (__u32) regs->psw.addr |
300 (__u32)(regs->psw.mask & PSW_MASK_BA);
301 for (i = 0; i < NUM_GPRS; i++)
302 regs32.gprs[i] = (__u32) regs->gprs[i];
303 save_access_regs(current->thread.acrs);
304 memcpy(regs32.acrs, current->thread.acrs, sizeof(regs32.acrs));
305 err = __copy_to_user(&sregs->regs, ®s32, sizeof(regs32));
308 save_fp_regs(¤t->thread.fp_regs);
309 /* s390_fp_regs and _s390_fp_regs32 are the same ! */
310 return __copy_to_user(&sregs->fpregs, ¤t->thread.fp_regs,
311 sizeof(_s390_fp_regs32));
314 static int restore_sigregs32(struct pt_regs *regs,_sigregs32 __user *sregs)
316 _s390_regs_common32 regs32;
319 /* Alwys make any pending restarted system call return -EINTR */
320 current_thread_info()->restart_block.fn = do_no_restart_syscall;
322 err = __copy_from_user(®s32, &sregs->regs, sizeof(regs32));
325 regs->psw.mask = (regs->psw.mask & ~PSW_MASK_USER) |
326 (__u64)(regs32.psw.mask & PSW32_MASK_USER) << 32 |
327 (__u64)(regs32.psw.addr & PSW32_ADDR_AMODE);
328 /* Check for invalid user address space control. */
329 if ((regs->psw.mask & PSW_MASK_ASC) >= (psw_kernel_bits & PSW_MASK_ASC))
330 regs->psw.mask = (psw_user_bits & PSW_MASK_ASC) |
331 (regs->psw.mask & ~PSW_MASK_ASC);
332 regs->psw.addr = (__u64)(regs32.psw.addr & PSW32_ADDR_INSN);
333 for (i = 0; i < NUM_GPRS; i++)
334 regs->gprs[i] = (__u64) regs32.gprs[i];
335 memcpy(current->thread.acrs, regs32.acrs, sizeof(current->thread.acrs));
336 restore_access_regs(current->thread.acrs);
338 err = __copy_from_user(¤t->thread.fp_regs, &sregs->fpregs,
339 sizeof(_s390_fp_regs32));
340 current->thread.fp_regs.fpc &= FPC_VALID_MASK;
344 restore_fp_regs(¤t->thread.fp_regs);
345 clear_thread_flag(TIF_SYSCALL); /* No longer in a system call */
349 static int save_sigregs_gprs_high(struct pt_regs *regs, __u32 __user *uregs)
351 __u32 gprs_high[NUM_GPRS];
354 for (i = 0; i < NUM_GPRS; i++)
355 gprs_high[i] = regs->gprs[i] >> 32;
357 return __copy_to_user(uregs, &gprs_high, sizeof(gprs_high));
360 static int restore_sigregs_gprs_high(struct pt_regs *regs, __u32 __user *uregs)
362 __u32 gprs_high[NUM_GPRS];
365 err = __copy_from_user(&gprs_high, uregs, sizeof(gprs_high));
368 for (i = 0; i < NUM_GPRS; i++)
369 *(__u32 *)®s->gprs[i] = gprs_high[i];
373 asmlinkage long sys32_sigreturn(void)
375 struct pt_regs *regs = task_pt_regs(current);
376 sigframe32 __user *frame = (sigframe32 __user *)regs->gprs[15];
377 compat_sigset_t cset;
380 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
382 if (__copy_from_user(&cset.sig, &frame->sc.oldmask, _SIGMASK_COPY_SIZE32))
384 sigset32_to_sigset(cset.sig, set.sig);
385 sigdelsetmask(&set, ~_BLOCKABLE);
386 set_current_blocked(&set);
387 if (restore_sigregs32(regs, &frame->sregs))
389 if (restore_sigregs_gprs_high(regs, frame->gprs_high))
391 return regs->gprs[2];
393 force_sig(SIGSEGV, current);
397 asmlinkage long sys32_rt_sigreturn(void)
399 struct pt_regs *regs = task_pt_regs(current);
400 rt_sigframe32 __user *frame = (rt_sigframe32 __user *)regs->gprs[15];
401 compat_sigset_t cset;
406 mm_segment_t old_fs = get_fs();
408 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
410 if (__copy_from_user(&cset, &frame->uc.uc_sigmask, sizeof(cset)))
412 sigset32_to_sigset(cset.sig, set.sig);
413 sigdelsetmask(&set, ~_BLOCKABLE);
414 set_current_blocked(&set);
415 if (restore_sigregs32(regs, &frame->uc.uc_mcontext))
417 if (restore_sigregs_gprs_high(regs, frame->gprs_high))
419 err = __get_user(ss_sp, &frame->uc.uc_stack.ss_sp);
420 st.ss_sp = compat_ptr(ss_sp);
421 err |= __get_user(st.ss_size, &frame->uc.uc_stack.ss_size);
422 err |= __get_user(st.ss_flags, &frame->uc.uc_stack.ss_flags);
426 do_sigaltstack((stack_t __force __user *)&st, NULL, regs->gprs[15]);
428 return regs->gprs[2];
430 force_sig(SIGSEGV, current);
435 * Set up a signal frame.
440 * Determine which stack to use..
442 static inline void __user *
443 get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
447 /* Default to using normal stack */
448 sp = (unsigned long) A(regs->gprs[15]);
450 /* Overflow on alternate signal stack gives SIGSEGV. */
451 if (on_sig_stack(sp) && !on_sig_stack((sp - frame_size) & -8UL))
452 return (void __user *) -1UL;
454 /* This is the X/Open sanctioned signal stack switching. */
455 if (ka->sa.sa_flags & SA_ONSTACK) {
456 if (! sas_ss_flags(sp))
457 sp = current->sas_ss_sp + current->sas_ss_size;
460 /* This is the legacy signal stack switching. */
461 else if (!user_mode(regs) &&
462 !(ka->sa.sa_flags & SA_RESTORER) &&
463 ka->sa.sa_restorer) {
464 sp = (unsigned long) ka->sa.sa_restorer;
467 return (void __user *)((sp - frame_size) & -8ul);
470 static inline int map_signal(int sig)
472 if (current_thread_info()->exec_domain
473 && current_thread_info()->exec_domain->signal_invmap
475 return current_thread_info()->exec_domain->signal_invmap[sig];
480 static int setup_frame32(int sig, struct k_sigaction *ka,
481 sigset_t *set, struct pt_regs * regs)
483 sigframe32 __user *frame = get_sigframe(ka, regs, sizeof(sigframe32));
484 compat_sigset_t cset;
486 if (!access_ok(VERIFY_WRITE, frame, sizeof(sigframe32)))
489 if (frame == (void __user *) -1UL)
492 sigset_to_sigset32(set->sig, cset.sig);
493 if (__copy_to_user(&frame->sc.oldmask, &cset.sig, _SIGMASK_COPY_SIZE32))
496 if (save_sigregs32(regs, &frame->sregs))
498 if (save_sigregs_gprs_high(regs, frame->gprs_high))
500 if (__put_user((unsigned long) &frame->sregs, &frame->sc.sregs))
503 /* Set up to return from userspace. If provided, use a stub
504 already in userspace. */
505 if (ka->sa.sa_flags & SA_RESTORER) {
506 regs->gprs[14] = (__u64) ka->sa.sa_restorer | PSW32_ADDR_AMODE;
508 regs->gprs[14] = (__u64) frame->retcode | PSW32_ADDR_AMODE;
509 if (__put_user(S390_SYSCALL_OPCODE | __NR_sigreturn,
510 (u16 __force __user *)(frame->retcode)))
514 /* Set up backchain. */
515 if (__put_user(regs->gprs[15], (unsigned int __user *) frame))
518 /* Set up registers for signal handler */
519 regs->gprs[15] = (__force __u64) frame;
520 /* Force 31 bit amode and default user address space control. */
521 regs->psw.mask = PSW_MASK_BA |
522 (psw_user_bits & PSW_MASK_ASC) |
523 (regs->psw.mask & ~PSW_MASK_ASC);
524 regs->psw.addr = (__force __u64) ka->sa.sa_handler;
526 regs->gprs[2] = map_signal(sig);
527 regs->gprs[3] = (__force __u64) &frame->sc;
529 /* We forgot to include these in the sigcontext.
530 To avoid breaking binary compatibility, they are passed as args. */
531 regs->gprs[4] = current->thread.trap_no;
532 regs->gprs[5] = current->thread.prot_addr;
534 /* Place signal number on stack to allow backtrace from handler. */
535 if (__put_user(regs->gprs[2], (int __force __user *) &frame->signo))
540 force_sigsegv(sig, current);
544 static int setup_rt_frame32(int sig, struct k_sigaction *ka, siginfo_t *info,
545 sigset_t *set, struct pt_regs * regs)
547 compat_sigset_t cset;
549 rt_sigframe32 __user *frame = get_sigframe(ka, regs, sizeof(rt_sigframe32));
550 if (!access_ok(VERIFY_WRITE, frame, sizeof(rt_sigframe32)))
553 if (frame == (void __user *) -1UL)
556 if (copy_siginfo_to_user32(&frame->info, info))
559 /* Create the ucontext. */
560 sigset_to_sigset32(set->sig, cset.sig);
561 err |= __put_user(UC_EXTENDED, &frame->uc.uc_flags);
562 err |= __put_user(0, &frame->uc.uc_link);
563 err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
564 err |= __put_user(sas_ss_flags(regs->gprs[15]),
565 &frame->uc.uc_stack.ss_flags);
566 err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
567 err |= save_sigregs32(regs, &frame->uc.uc_mcontext);
568 err |= save_sigregs_gprs_high(regs, frame->gprs_high);
569 err |= __copy_to_user(&frame->uc.uc_sigmask, &cset, sizeof(cset));
573 /* Set up to return from userspace. If provided, use a stub
574 already in userspace. */
575 if (ka->sa.sa_flags & SA_RESTORER) {
576 regs->gprs[14] = (__u64) ka->sa.sa_restorer;
578 regs->gprs[14] = (__u64) frame->retcode;
579 err |= __put_user(S390_SYSCALL_OPCODE | __NR_rt_sigreturn,
580 (u16 __force __user *)(frame->retcode));
583 /* Set up backchain. */
584 if (__put_user(regs->gprs[15], (unsigned int __force __user *) frame))
587 /* Set up registers for signal handler */
588 regs->gprs[15] = (__force __u64) frame;
589 /* Force 31 bit amode and default user address space control. */
590 regs->psw.mask = PSW_MASK_BA |
591 (psw_user_bits & PSW_MASK_ASC) |
592 (regs->psw.mask & ~PSW_MASK_ASC);
593 regs->psw.addr = (__u64) ka->sa.sa_handler;
595 regs->gprs[2] = map_signal(sig);
596 regs->gprs[3] = (__force __u64) &frame->info;
597 regs->gprs[4] = (__force __u64) &frame->uc;
601 force_sigsegv(sig, current);
606 * OK, we're invoking a handler
609 int handle_signal32(unsigned long sig, struct k_sigaction *ka,
610 siginfo_t *info, sigset_t *oldset, struct pt_regs *regs)
615 /* Set up the stack frame */
616 if (ka->sa.sa_flags & SA_SIGINFO)
617 ret = setup_rt_frame32(sig, ka, info, oldset, regs);
619 ret = setup_frame32(sig, ka, oldset, regs);
622 sigorsets(&blocked, ¤t->blocked, &ka->sa.sa_mask);
623 if (!(ka->sa.sa_flags & SA_NODEFER))
624 sigaddset(&blocked, sig);
625 set_current_blocked(&blocked);