2 * arch/s390/kernel/signal32.c
5 * Copyright (C) 2000 IBM Deutschland Entwicklung GmbH, IBM Corporation
6 * Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
7 * Gerhard Tonn (ton@de.ibm.com)
9 * Copyright (C) 1991, 1992 Linus Torvalds
11 * 1997-11-28 Modified for POSIX.1b signals by Richard Henderson
14 #include <linux/config.h>
15 #include <linux/sched.h>
17 #include <linux/smp.h>
18 #include <linux/smp_lock.h>
19 #include <linux/kernel.h>
20 #include <linux/signal.h>
21 #include <linux/errno.h>
22 #include <linux/wait.h>
23 #include <linux/ptrace.h>
24 #include <linux/unistd.h>
25 #include <linux/stddef.h>
26 #include <linux/personality.h>
27 #include <asm/ucontext.h>
28 #include <asm/uaccess.h>
31 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
33 #define _USER_PSW_MASK32 0x0705C00080000000
37 __u8 callee_used_stack[__SIGNAL_FRAMESIZE32];
38 struct sigcontext32 sc;
40 __u8 retcode[S390_SYSCALL_SIZE];
45 __u8 callee_used_stack[__SIGNAL_FRAMESIZE32];
46 __u8 retcode[S390_SYSCALL_SIZE];
47 struct siginfo32 info;
51 asmlinkage int FASTCALL(do_signal(struct pt_regs *regs, sigset_t *oldset));
53 int do_signal32(struct pt_regs *regs, sigset_t *oldset);
55 int copy_siginfo_to_user32(siginfo_t32 *to, siginfo_t *from)
59 if (!access_ok (VERIFY_WRITE, to, sizeof(siginfo_t32)))
62 /* If you change siginfo_t structure, please be sure
63 this code is fixed accordingly.
64 It should never copy any pad contained in the structure
65 to avoid security leaks, but must copy the generic
66 3 ints plus the relevant union member.
67 This routine must convert siginfo from 64bit to 32bit as well
69 err = __put_user(from->si_signo, &to->si_signo);
70 err |= __put_user(from->si_errno, &to->si_errno);
71 err |= __put_user((short)from->si_code, &to->si_code);
72 if (from->si_code < 0)
73 err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
75 switch (from->si_code >> 16) {
77 err |= __put_user(from->si_pid, &to->si_pid);
78 err |= __put_user(from->si_uid, &to->si_uid);
81 err |= __put_user(from->si_pid, &to->si_pid);
82 err |= __put_user(from->si_uid, &to->si_uid);
83 err |= __put_user(from->si_utime, &to->si_utime);
84 err |= __put_user(from->si_stime, &to->si_stime);
85 err |= __put_user(from->si_status, &to->si_status);
87 case __SI_FAULT >> 16:
88 err |= __put_user(from->si_addr, &to->si_addr);
91 case __SI_TIMER >> 16:
92 err |= __put_user(from->si_band, &to->si_band);
93 err |= __put_user(from->si_fd, &to->si_fd);
97 /* case __SI_RT: This is not generated by the kernel as of now. */
104 * Atomically swap in the new signal mask, and wait for a signal.
107 sys32_sigsuspend(struct pt_regs * regs,int history0, int history1, old_sigset_t mask)
112 spin_lock_irq(¤t->sigmask_lock);
113 saveset = current->blocked;
114 siginitset(¤t->blocked, mask);
115 recalc_sigpending(current);
116 spin_unlock_irq(¤t->sigmask_lock);
117 regs->gprs[2] = -EINTR;
120 set_current_state(TASK_INTERRUPTIBLE);
122 if (do_signal32(regs, &saveset))
128 sys32_rt_sigsuspend(struct pt_regs * regs,sigset_t32 *unewset, size_t sigsetsize)
130 sigset_t saveset, newset;
133 /* XXX: Don't preclude handling different sized sigset_t's. */
134 if (sigsetsize != sizeof(sigset_t))
137 if (copy_from_user(&set32, unewset, sizeof(set32)))
139 switch (_NSIG_WORDS) {
140 case 4: newset.sig[3] = set32.sig[6] + (((long)set32.sig[7]) << 32);
141 case 3: newset.sig[2] = set32.sig[4] + (((long)set32.sig[5]) << 32);
142 case 2: newset.sig[1] = set32.sig[2] + (((long)set32.sig[3]) << 32);
143 case 1: newset.sig[0] = set32.sig[0] + (((long)set32.sig[1]) << 32);
145 sigdelsetmask(&newset, ~_BLOCKABLE);
147 spin_lock_irq(¤t->sigmask_lock);
148 saveset = current->blocked;
149 current->blocked = newset;
150 recalc_sigpending(current);
151 spin_unlock_irq(¤t->sigmask_lock);
152 regs->gprs[2] = -EINTR;
155 set_current_state(TASK_INTERRUPTIBLE);
157 if (do_signal32(regs, &saveset))
163 sys32_sigaction(int sig, const struct old_sigaction32 *act,
164 struct old_sigaction32 *oact)
166 struct k_sigaction new_ka, old_ka;
171 if (verify_area(VERIFY_READ, act, sizeof(*act)) ||
172 __get_user((unsigned long)new_ka.sa.sa_handler, &act->sa_handler) ||
173 __get_user((unsigned long)new_ka.sa.sa_restorer, &act->sa_restorer))
175 __get_user(new_ka.sa.sa_flags, &act->sa_flags);
176 __get_user(mask, &act->sa_mask);
177 siginitset(&new_ka.sa.sa_mask, mask);
180 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
183 if (verify_area(VERIFY_WRITE, oact, sizeof(*oact)) ||
184 __put_user((unsigned long)old_ka.sa.sa_handler, &oact->sa_handler) ||
185 __put_user((unsigned long)old_ka.sa.sa_restorer, &oact->sa_restorer))
187 __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
188 __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
195 do_sigaction(int sig, const struct k_sigaction *act, struct k_sigaction *oact);
198 sys32_rt_sigaction(int sig, const struct sigaction32 *act,
199 struct sigaction32 *oact, size_t sigsetsize)
201 struct k_sigaction new_ka, old_ka;
205 /* XXX: Don't preclude handling different sized sigset_t's. */
206 if (sigsetsize != sizeof(sigset_t32))
210 ret = get_user((unsigned long)new_ka.sa.sa_handler, &act->sa_handler);
211 ret |= __copy_from_user(&set32, &act->sa_mask,
213 switch (_NSIG_WORDS) {
214 case 4: new_ka.sa.sa_mask.sig[3] = set32.sig[6]
215 | (((long)set32.sig[7]) << 32);
216 case 3: new_ka.sa.sa_mask.sig[2] = set32.sig[4]
217 | (((long)set32.sig[5]) << 32);
218 case 2: new_ka.sa.sa_mask.sig[1] = set32.sig[2]
219 | (((long)set32.sig[3]) << 32);
220 case 1: new_ka.sa.sa_mask.sig[0] = set32.sig[0]
221 | (((long)set32.sig[1]) << 32);
223 ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
229 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
232 switch (_NSIG_WORDS) {
234 set32.sig[7] = (old_ka.sa.sa_mask.sig[3] >> 32);
235 set32.sig[6] = old_ka.sa.sa_mask.sig[3];
237 set32.sig[5] = (old_ka.sa.sa_mask.sig[2] >> 32);
238 set32.sig[4] = old_ka.sa.sa_mask.sig[2];
240 set32.sig[3] = (old_ka.sa.sa_mask.sig[1] >> 32);
241 set32.sig[2] = old_ka.sa.sa_mask.sig[1];
243 set32.sig[1] = (old_ka.sa.sa_mask.sig[0] >> 32);
244 set32.sig[0] = old_ka.sa.sa_mask.sig[0];
246 ret = put_user((unsigned long)old_ka.sa.sa_handler, &oact->sa_handler);
247 ret |= __copy_to_user(&oact->sa_mask, &set32,
249 ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
256 sys32_sigaltstack(const stack_t32 *uss, stack_t32 *uoss, struct pt_regs *regs)
260 mm_segment_t old_fs = get_fs();
263 if (!access_ok(VERIFY_READ, uss, sizeof(*uss)))
265 err |= __get_user(kss.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);
273 ret = do_sigaltstack(uss ? &kss : NULL , uoss ? &koss : NULL, regs->gprs[15]);
277 if (!access_ok(VERIFY_WRITE, uoss, sizeof(*uoss)))
279 err |= __put_user(koss.ss_sp, &uoss->ss_sp);
280 err |= __put_user(koss.ss_size, &uoss->ss_size);
281 err |= __put_user(koss.ss_flags, &uoss->ss_flags);
288 static int save_sigregs32(struct pt_regs *regs,_sigregs32 *sregs)
294 for(i=0; i<NUM_GPRS; i++)
295 err |= __put_user(regs->gprs[i], &sregs->regs.gprs[i]);
296 for(i=0; i<NUM_ACRS; i++)
297 err |= __put_user(regs->acrs[i], &sregs->regs.acrs[i]);
298 err |= __copy_to_user(&sregs->regs.psw.mask, ®s->psw.mask, 4);
299 err |= __copy_to_user(&sregs->regs.psw.addr, ((char*)®s->psw.addr)+4, 4);
302 save_fp_regs(&fpregs);
303 __put_user(fpregs.fpc, &sregs->fpregs.fpc);
304 for(i=0; i<NUM_FPRS; i++)
305 err |= __put_user(fpregs.fprs[i].ui, &sregs->fpregs.fprs[i].d);
311 static int restore_sigregs32(struct pt_regs *regs,_sigregs32 *sregs)
315 psw_t saved_psw=regs->psw;
318 for(i=0; i<NUM_GPRS; i++)
319 err |= __get_user(regs->gprs[i], &sregs->regs.gprs[i]);
320 for(i=0; i<NUM_ACRS; i++)
321 err |= __get_user(regs->acrs[i], &sregs->regs.acrs[i]);
322 err |= __copy_from_user(®s->psw.mask, &sregs->regs.psw.mask, 4);
323 err |= __copy_from_user(((char*)®s->psw.addr)+4, &sregs->regs.psw.addr, 4);
327 regs->trap = -1; /* disable syscall checks */
328 regs->psw.mask=(saved_psw.mask&~PSW_MASK_DEBUGCHANGE)|
329 (regs->psw.mask&PSW_MASK_DEBUGCHANGE);
330 regs->psw.addr=(saved_psw.addr&~PSW_ADDR_DEBUGCHANGE)|
331 (regs->psw.addr&PSW_ADDR_DEBUGCHANGE);
332 __get_user(fpregs.fpc, &sregs->fpregs.fpc);
333 for(i=0; i<NUM_FPRS; i++)
334 err |= __get_user(fpregs.fprs[i].ui, &sregs->fpregs.fprs[i].d);
336 restore_fp_regs(&fpregs);
341 asmlinkage long sys32_sigreturn(struct pt_regs *regs)
343 sigframe32 *frame = (sigframe32 *)regs->gprs[15];
346 if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
348 if (__copy_from_user(&set.sig, &frame->sc.oldmask, _SIGMASK_COPY_SIZE32))
351 sigdelsetmask(&set, ~_BLOCKABLE);
352 spin_lock_irq(¤t->sigmask_lock);
353 current->blocked = set;
354 recalc_sigpending(current);
355 spin_unlock_irq(¤t->sigmask_lock);
357 if (restore_sigregs32(regs, &frame->sregs))
360 return regs->gprs[2];
363 force_sig(SIGSEGV, current);
367 asmlinkage long sys32_rt_sigreturn(struct pt_regs *regs)
369 rt_sigframe32 *frame = (rt_sigframe32 *)regs->gprs[15];
373 mm_segment_t old_fs = get_fs();
375 if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
377 if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
380 sigdelsetmask(&set, ~_BLOCKABLE);
381 spin_lock_irq(¤t->sigmask_lock);
382 current->blocked = set;
383 recalc_sigpending(current);
384 spin_unlock_irq(¤t->sigmask_lock);
386 if (restore_sigregs32(regs, &frame->uc.uc_mcontext))
389 err = __get_user(st.ss_sp, &frame->uc.uc_stack.ss_sp);
390 st.ss_sp = (void *) A((unsigned long)st.ss_sp);
391 err |= __get_user(st.ss_size, &frame->uc.uc_stack.ss_size);
392 err |= __get_user(st.ss_flags, &frame->uc.uc_stack.ss_flags);
396 /* It is more difficult to avoid calling this function than to
397 call it and ignore errors. */
399 do_sigaltstack(&st, NULL, regs->gprs[15]);
402 return regs->gprs[2];
405 force_sig(SIGSEGV, current);
410 * Set up a signal frame.
415 * Determine which stack to use..
418 get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
422 /* Default to using normal stack */
423 sp = (unsigned long) A(regs->gprs[15]);
425 /* This is the X/Open sanctioned signal stack switching. */
426 if (ka->sa.sa_flags & SA_ONSTACK) {
427 if (! on_sig_stack(sp))
428 sp = current->sas_ss_sp + current->sas_ss_size;
431 /* This is the legacy signal stack switching. */
432 else if (!user_mode(regs) &&
433 !(ka->sa.sa_flags & SA_RESTORER) &&
434 ka->sa.sa_restorer) {
435 sp = (unsigned long) ka->sa.sa_restorer;
438 return (void *)((sp - frame_size) & -8ul);
441 static inline int map_signal(int sig)
443 if (current->exec_domain
444 && current->exec_domain->signal_invmap
446 return current->exec_domain->signal_invmap[sig];
451 static void setup_frame32(int sig, struct k_sigaction *ka,
452 sigset_t *set, struct pt_regs * regs)
454 sigframe32 *frame = get_sigframe(ka, regs, sizeof(sigframe32));
455 if (!access_ok(VERIFY_WRITE, frame, sizeof(sigframe32)))
458 if (__copy_to_user(&frame->sc.oldmask, &set->sig, _SIGMASK_COPY_SIZE32))
461 if (save_sigregs32(regs, &frame->sregs))
463 if (__put_user(&frame->sregs, &frame->sc.sregs))
466 /* Set up to return from userspace. If provided, use a stub
467 already in userspace. */
468 if (ka->sa.sa_flags & SA_RESTORER) {
469 regs->gprs[14] = FIX_PSW(ka->sa.sa_restorer);
471 regs->gprs[14] = FIX_PSW(frame->retcode);
472 if (__put_user(S390_SYSCALL_OPCODE | __NR_sigreturn,
473 (u16 *)(frame->retcode)))
477 /* Set up backchain. */
478 if (__put_user((unsigned int) regs->gprs[15], (unsigned int *) frame))
481 /* Set up registers for signal handler */
482 regs->gprs[15] = (addr_t)frame;
483 regs->psw.addr = FIX_PSW(ka->sa.sa_handler);
484 regs->psw.mask = _USER_PSW_MASK32;
486 regs->gprs[2] = map_signal(sig);
487 regs->gprs[3] = (addr_t)&frame->sc;
489 /* We forgot to include these in the sigcontext.
490 To avoid breaking binary compatibility, they are passed as args. */
491 regs->gprs[4] = current->thread.trap_no;
492 regs->gprs[5] = current->thread.prot_addr;
497 ka->sa.sa_handler = SIG_DFL;
498 force_sig(SIGSEGV, current);
501 static void setup_rt_frame32(int sig, struct k_sigaction *ka, siginfo_t *info,
502 sigset_t *set, struct pt_regs * regs)
505 rt_sigframe32 *frame = get_sigframe(ka, regs, sizeof(rt_sigframe32));
506 if (!access_ok(VERIFY_WRITE, frame, sizeof(rt_sigframe32)))
509 if (copy_siginfo_to_user32(&frame->info, info))
512 /* Create the ucontext. */
513 err |= __put_user(0, &frame->uc.uc_flags);
514 err |= __put_user(0, &frame->uc.uc_link);
515 err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
516 err |= __put_user(sas_ss_flags(regs->gprs[15]),
517 &frame->uc.uc_stack.ss_flags);
518 err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
519 err |= save_sigregs32(regs, &frame->uc.uc_mcontext);
520 err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
524 /* Set up to return from userspace. If provided, use a stub
525 already in userspace. */
526 if (ka->sa.sa_flags & SA_RESTORER) {
527 regs->gprs[14] = FIX_PSW(ka->sa.sa_restorer);
529 regs->gprs[14] = FIX_PSW(frame->retcode);
530 err |= __put_user(S390_SYSCALL_OPCODE | __NR_rt_sigreturn,
531 (u16 *)(frame->retcode));
534 /* Set up backchain. */
535 if (__put_user((unsigned int) regs->gprs[15], (unsigned int *) frame))
538 /* Set up registers for signal handler */
539 regs->gprs[15] = (addr_t)frame;
540 regs->psw.addr = FIX_PSW(ka->sa.sa_handler);
541 regs->psw.mask = _USER_PSW_MASK32;
543 regs->gprs[2] = map_signal(sig);
544 regs->gprs[3] = (addr_t)&frame->info;
545 regs->gprs[4] = (addr_t)&frame->uc;
550 ka->sa.sa_handler = SIG_DFL;
551 force_sig(SIGSEGV, current);
555 * OK, we're invoking a handler
559 handle_signal32(unsigned long sig, struct k_sigaction *ka,
560 siginfo_t *info, sigset_t *oldset, struct pt_regs * regs)
562 /* Are we from a system call? */
563 if (regs->trap == __LC_SVC_OLD_PSW) {
564 /* If so, check system call restarting.. */
565 switch (regs->gprs[2]) {
566 case -ERESTARTNOHAND:
567 regs->gprs[2] = -EINTR;
571 if (!(ka->sa.sa_flags & SA_RESTART)) {
572 regs->gprs[2] = -EINTR;
576 case -ERESTARTNOINTR:
577 regs->gprs[2] = regs->orig_gpr2;
582 /* Set up the stack frame */
583 if (ka->sa.sa_flags & SA_SIGINFO)
584 setup_rt_frame32(sig, ka, info, oldset, regs);
586 setup_frame32(sig, ka, oldset, regs);
588 if (ka->sa.sa_flags & SA_ONESHOT)
589 ka->sa.sa_handler = SIG_DFL;
591 if (!(ka->sa.sa_flags & SA_NODEFER)) {
592 spin_lock_irq(¤t->sigmask_lock);
593 sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
594 sigaddset(¤t->blocked,sig);
595 recalc_sigpending(current);
596 spin_unlock_irq(¤t->sigmask_lock);
601 * Note that 'init' is a special process: it doesn't get signals it doesn't
602 * want to handle. Thus you cannot kill init even with a SIGKILL even by
605 * Note that we go through the signals twice: once to check the signals that
606 * the kernel can handle, and then we build all the user-level signal handling
607 * stack-frames in one go after that.
609 int do_signal32(struct pt_regs *regs, sigset_t *oldset)
612 struct k_sigaction *ka;
615 * We want the common case to go fast, which
616 * is why we may in certain cases get here from
617 * kernel mode. Just return without doing anything
620 if (!user_mode(regs))
624 oldset = ¤t->blocked;
629 spin_lock_irq(¤t->sigmask_lock);
630 signr = dequeue_signal(¤t->blocked, &info);
631 spin_unlock_irq(¤t->sigmask_lock);
636 if ((current->ptrace & PT_PTRACED) && signr != SIGKILL) {
637 /* Let the debugger run. */
638 current->exit_code = signr;
639 set_current_state(TASK_STOPPED);
640 notify_parent(current, SIGCHLD);
643 /* We're back. Did the debugger cancel the sig? */
644 if (!(signr = current->exit_code))
646 current->exit_code = 0;
648 /* The debugger continued. Ignore SIGSTOP. */
649 if (signr == SIGSTOP)
652 /* Update the siginfo structure. Is this good? */
653 if (signr != info.si_signo) {
654 info.si_signo = signr;
656 info.si_code = SI_USER;
657 info.si_pid = current->p_pptr->pid;
658 info.si_uid = current->p_pptr->uid;
661 /* If the (new) signal is now blocked, requeue it. */
662 if (sigismember(¤t->blocked, signr)) {
663 send_sig_info(signr, &info, current);
668 ka = ¤t->sig->action[signr-1];
669 if (ka->sa.sa_handler == SIG_IGN) {
670 if (signr != SIGCHLD)
672 /* Check for SIGCHLD: it's special. */
673 while (sys_wait4(-1, NULL, WNOHANG, NULL) > 0)
678 if (ka->sa.sa_handler == SIG_DFL) {
679 int exit_code = signr;
681 /* Init gets no signals it doesn't want. */
682 if (current->pid == 1)
686 case SIGCONT: case SIGCHLD: case SIGWINCH: case SIGURG:
689 case SIGTSTP: case SIGTTIN: case SIGTTOU:
690 if (is_orphaned_pgrp(current->pgrp))
695 set_current_state(TASK_STOPPED);
696 current->exit_code = signr;
697 if (!(current->p_pptr->sig->action[SIGCHLD-1].sa.sa_flags & SA_NOCLDSTOP))
698 notify_parent(current, SIGCHLD);
702 case SIGQUIT: case SIGILL: case SIGTRAP:
703 case SIGABRT: case SIGFPE: case SIGSEGV:
704 case SIGBUS: case SIGSYS: case SIGXCPU: case SIGXFSZ:
705 if (do_coredump(signr, regs))
710 sig_exit(signr, exit_code, &info);
715 /* Whee! Actually deliver the signal. */
716 handle_signal32(signr, ka, &info, oldset, regs);
720 /* Did we come from a system call? */
721 if ( regs->trap == __LC_SVC_OLD_PSW /* System Call! */ ) {
722 /* Restart the system call - no handlers present */
723 if (regs->gprs[2] == -ERESTARTNOHAND ||
724 regs->gprs[2] == -ERESTARTSYS ||
725 regs->gprs[2] == -ERESTARTNOINTR) {
726 regs->gprs[2] = regs->orig_gpr2;