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/compat.h>
16 #include <linux/sched.h>
18 #include <linux/smp.h>
19 #include <linux/smp_lock.h>
20 #include <linux/kernel.h>
21 #include <linux/signal.h>
22 #include <linux/errno.h>
23 #include <linux/wait.h>
24 #include <linux/ptrace.h>
25 #include <linux/unistd.h>
26 #include <linux/stddef.h>
27 #include <linux/tty.h>
28 #include <linux/personality.h>
29 #include <linux/binfmts.h>
30 #include <asm/ucontext.h>
31 #include <asm/uaccess.h>
32 #include <asm/lowcore.h>
33 #include "compat_linux.h"
34 #include "compat_ptrace.h"
36 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
40 __u8 callee_used_stack[__SIGNAL_FRAMESIZE32];
41 struct sigcontext32 sc;
44 __u8 retcode[S390_SYSCALL_SIZE];
49 __u8 callee_used_stack[__SIGNAL_FRAMESIZE32];
50 __u8 retcode[S390_SYSCALL_SIZE];
51 struct siginfo32 info;
55 asmlinkage int FASTCALL(do_signal(struct pt_regs *regs, sigset_t *oldset));
57 int copy_siginfo_to_user32(siginfo_t32 __user *to, siginfo_t *from)
61 if (!access_ok (VERIFY_WRITE, to, sizeof(siginfo_t32)))
64 /* If you change siginfo_t structure, please be sure
65 this code is fixed accordingly.
66 It should never copy any pad contained in the structure
67 to avoid security leaks, but must copy the generic
68 3 ints plus the relevant union member.
69 This routine must convert siginfo from 64bit to 32bit as well
71 err = __put_user(from->si_signo, &to->si_signo);
72 err |= __put_user(from->si_errno, &to->si_errno);
73 err |= __put_user((short)from->si_code, &to->si_code);
74 if (from->si_code < 0)
75 err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
77 switch (from->si_code >> 16) {
78 case __SI_RT >> 16: /* This is not generated by the kernel as of now. */
79 case __SI_MESGQ >> 16:
80 err |= __put_user(from->si_int, &to->si_int);
83 err |= __put_user(from->si_pid, &to->si_pid);
84 err |= __put_user(from->si_uid, &to->si_uid);
87 err |= __put_user(from->si_pid, &to->si_pid);
88 err |= __put_user(from->si_uid, &to->si_uid);
89 err |= __put_user(from->si_utime, &to->si_utime);
90 err |= __put_user(from->si_stime, &to->si_stime);
91 err |= __put_user(from->si_status, &to->si_status);
93 case __SI_FAULT >> 16:
94 err |= __put_user((unsigned long) from->si_addr,
98 case __SI_TIMER >> 16:
99 err |= __put_user(from->si_band, &to->si_band);
100 err |= __put_user(from->si_fd, &to->si_fd);
110 * Atomically swap in the new signal mask, and wait for a signal.
113 sys32_sigsuspend(struct pt_regs * regs,int history0, int history1, old_sigset_t mask)
118 spin_lock_irq(¤t->sighand->siglock);
119 saveset = current->blocked;
120 siginitset(¤t->blocked, mask);
122 spin_unlock_irq(¤t->sighand->siglock);
123 regs->gprs[2] = -EINTR;
126 set_current_state(TASK_INTERRUPTIBLE);
128 if (do_signal(regs, &saveset))
134 sys32_rt_sigsuspend(struct pt_regs * regs, compat_sigset_t __user *unewset,
137 sigset_t saveset, newset;
138 compat_sigset_t set32;
140 /* XXX: Don't preclude handling different sized sigset_t's. */
141 if (sigsetsize != sizeof(sigset_t))
144 if (copy_from_user(&set32, unewset, sizeof(set32)))
146 switch (_NSIG_WORDS) {
147 case 4: newset.sig[3] = set32.sig[6] + (((long)set32.sig[7]) << 32);
148 case 3: newset.sig[2] = set32.sig[4] + (((long)set32.sig[5]) << 32);
149 case 2: newset.sig[1] = set32.sig[2] + (((long)set32.sig[3]) << 32);
150 case 1: newset.sig[0] = set32.sig[0] + (((long)set32.sig[1]) << 32);
152 sigdelsetmask(&newset, ~_BLOCKABLE);
154 spin_lock_irq(¤t->sighand->siglock);
155 saveset = current->blocked;
156 current->blocked = newset;
158 spin_unlock_irq(¤t->sighand->siglock);
159 regs->gprs[2] = -EINTR;
162 set_current_state(TASK_INTERRUPTIBLE);
164 if (do_signal(regs, &saveset))
170 sys32_sigaction(int sig, const struct old_sigaction32 __user *act,
171 struct old_sigaction32 __user *oact)
173 struct k_sigaction new_ka, old_ka;
177 compat_old_sigset_t mask;
178 if (verify_area(VERIFY_READ, act, sizeof(*act)) ||
179 __get_user((unsigned long)new_ka.sa.sa_handler, &act->sa_handler) ||
180 __get_user((unsigned long)new_ka.sa.sa_restorer, &act->sa_restorer))
182 __get_user(new_ka.sa.sa_flags, &act->sa_flags);
183 __get_user(mask, &act->sa_mask);
184 siginitset(&new_ka.sa.sa_mask, mask);
187 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
190 if (verify_area(VERIFY_WRITE, oact, sizeof(*oact)) ||
191 __put_user((unsigned long)old_ka.sa.sa_handler, &oact->sa_handler) ||
192 __put_user((unsigned long)old_ka.sa.sa_restorer, &oact->sa_restorer))
194 __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
195 __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
202 do_sigaction(int sig, const struct k_sigaction *act, struct k_sigaction *oact);
205 sys32_rt_sigaction(int sig, const struct sigaction32 __user *act,
206 struct sigaction32 __user *oact, size_t sigsetsize)
208 struct k_sigaction new_ka, old_ka;
210 compat_sigset_t set32;
212 /* XXX: Don't preclude handling different sized sigset_t's. */
213 if (sigsetsize != sizeof(compat_sigset_t))
217 ret = get_user((unsigned long)new_ka.sa.sa_handler, &act->sa_handler);
218 ret |= __copy_from_user(&set32, &act->sa_mask,
219 sizeof(compat_sigset_t));
220 switch (_NSIG_WORDS) {
221 case 4: new_ka.sa.sa_mask.sig[3] = set32.sig[6]
222 | (((long)set32.sig[7]) << 32);
223 case 3: new_ka.sa.sa_mask.sig[2] = set32.sig[4]
224 | (((long)set32.sig[5]) << 32);
225 case 2: new_ka.sa.sa_mask.sig[1] = set32.sig[2]
226 | (((long)set32.sig[3]) << 32);
227 case 1: new_ka.sa.sa_mask.sig[0] = set32.sig[0]
228 | (((long)set32.sig[1]) << 32);
230 ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
236 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
239 switch (_NSIG_WORDS) {
241 set32.sig[7] = (old_ka.sa.sa_mask.sig[3] >> 32);
242 set32.sig[6] = old_ka.sa.sa_mask.sig[3];
244 set32.sig[5] = (old_ka.sa.sa_mask.sig[2] >> 32);
245 set32.sig[4] = old_ka.sa.sa_mask.sig[2];
247 set32.sig[3] = (old_ka.sa.sa_mask.sig[1] >> 32);
248 set32.sig[2] = old_ka.sa.sa_mask.sig[1];
250 set32.sig[1] = (old_ka.sa.sa_mask.sig[0] >> 32);
251 set32.sig[0] = old_ka.sa.sa_mask.sig[0];
253 ret = put_user((unsigned long)old_ka.sa.sa_handler, &oact->sa_handler);
254 ret |= __copy_to_user(&oact->sa_mask, &set32,
255 sizeof(compat_sigset_t));
256 ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
263 sys32_sigaltstack(const stack_t32 __user *uss, stack_t32 __user *uoss,
264 struct pt_regs *regs)
268 mm_segment_t old_fs = get_fs();
271 if (!access_ok(VERIFY_READ, uss, sizeof(*uss)))
273 err |= __get_user((unsigned long) kss.ss_sp, &uss->ss_sp);
274 err |= __get_user(kss.ss_size, &uss->ss_size);
275 err |= __get_user(kss.ss_flags, &uss->ss_flags);
281 ret = do_sigaltstack((stack_t __user *) (uss ? &kss : NULL),
282 (stack_t __user *) (uoss ? &koss : NULL),
287 if (!access_ok(VERIFY_WRITE, uoss, sizeof(*uoss)))
289 err |= __put_user((unsigned long) koss.ss_sp, &uoss->ss_sp);
290 err |= __put_user(koss.ss_size, &uoss->ss_size);
291 err |= __put_user(koss.ss_flags, &uoss->ss_flags);
298 static int save_sigregs32(struct pt_regs *regs, _sigregs32 __user *sregs)
300 _s390_regs_common32 regs32;
303 regs32.psw.mask = PSW32_MASK_MERGE(PSW32_USER_BITS,
304 (__u32)(regs->psw.mask >> 32));
305 regs32.psw.addr = PSW32_ADDR_AMODE31 | (__u32) regs->psw.addr;
306 for (i = 0; i < NUM_GPRS; i++)
307 regs32.gprs[i] = (__u32) regs->gprs[i];
308 save_access_regs(current->thread.acrs);
309 memcpy(regs32.acrs, current->thread.acrs, sizeof(regs32.acrs));
310 err = __copy_to_user(&sregs->regs, ®s32, sizeof(regs32));
313 save_fp_regs(¤t->thread.fp_regs);
314 /* s390_fp_regs and _s390_fp_regs32 are the same ! */
315 return __copy_to_user(&sregs->fpregs, ¤t->thread.fp_regs,
316 sizeof(_s390_fp_regs32));
319 static int restore_sigregs32(struct pt_regs *regs,_sigregs32 __user *sregs)
321 _s390_regs_common32 regs32;
324 /* Alwys make any pending restarted system call return -EINTR */
325 current_thread_info()->restart_block.fn = do_no_restart_syscall;
327 err = __copy_from_user(®s32, &sregs->regs, sizeof(regs32));
330 regs->psw.mask = PSW_MASK_MERGE(regs->psw.mask,
331 (__u64)regs32.psw.mask << 32);
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 regs->trap = -1; /* disable syscall checks */
349 asmlinkage long sys32_sigreturn(struct pt_regs *regs)
351 sigframe32 __user *frame = (sigframe32 __user *)regs->gprs[15];
354 if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
356 if (__copy_from_user(&set.sig, &frame->sc.oldmask, _SIGMASK_COPY_SIZE32))
359 sigdelsetmask(&set, ~_BLOCKABLE);
360 spin_lock_irq(¤t->sighand->siglock);
361 current->blocked = set;
363 spin_unlock_irq(¤t->sighand->siglock);
365 if (restore_sigregs32(regs, &frame->sregs))
368 return regs->gprs[2];
371 force_sig(SIGSEGV, current);
375 asmlinkage long sys32_rt_sigreturn(struct pt_regs *regs)
377 rt_sigframe32 __user *frame = (rt_sigframe32 __user *)regs->gprs[15];
382 mm_segment_t old_fs = get_fs();
384 if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
386 if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
389 sigdelsetmask(&set, ~_BLOCKABLE);
390 spin_lock_irq(¤t->sighand->siglock);
391 current->blocked = set;
393 spin_unlock_irq(¤t->sighand->siglock);
395 if (restore_sigregs32(regs, &frame->uc.uc_mcontext))
398 err = __get_user(ss_sp, &frame->uc.uc_stack.ss_sp);
399 st.ss_sp = (void *) A((unsigned long)ss_sp);
400 err |= __get_user(st.ss_size, &frame->uc.uc_stack.ss_size);
401 err |= __get_user(st.ss_flags, &frame->uc.uc_stack.ss_flags);
405 /* It is more difficult to avoid calling this function than to
406 call it and ignore errors. */
408 do_sigaltstack((stack_t __user *)&st, NULL, regs->gprs[15]);
411 return regs->gprs[2];
414 force_sig(SIGSEGV, current);
419 * Set up a signal frame.
424 * Determine which stack to use..
426 static inline void __user *
427 get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
431 /* Default to using normal stack */
432 sp = (unsigned long) A(regs->gprs[15]);
434 /* This is the X/Open sanctioned signal stack switching. */
435 if (ka->sa.sa_flags & SA_ONSTACK) {
436 if (! on_sig_stack(sp))
437 sp = current->sas_ss_sp + current->sas_ss_size;
440 /* This is the legacy signal stack switching. */
441 else if (!user_mode(regs) &&
442 !(ka->sa.sa_flags & SA_RESTORER) &&
443 ka->sa.sa_restorer) {
444 sp = (unsigned long) ka->sa.sa_restorer;
447 return (void __user *)((sp - frame_size) & -8ul);
450 static inline int map_signal(int sig)
452 if (current_thread_info()->exec_domain
453 && current_thread_info()->exec_domain->signal_invmap
455 return current_thread_info()->exec_domain->signal_invmap[sig];
460 static void setup_frame32(int sig, struct k_sigaction *ka,
461 sigset_t *set, struct pt_regs * regs)
463 sigframe32 __user *frame = get_sigframe(ka, regs, sizeof(sigframe32));
464 if (!access_ok(VERIFY_WRITE, frame, sizeof(sigframe32)))
467 if (__copy_to_user(&frame->sc.oldmask, &set->sig, _SIGMASK_COPY_SIZE32))
470 if (save_sigregs32(regs, &frame->sregs))
472 if (__put_user((unsigned long) &frame->sregs, &frame->sc.sregs))
475 /* Set up to return from userspace. If provided, use a stub
476 already in userspace. */
477 if (ka->sa.sa_flags & SA_RESTORER) {
478 regs->gprs[14] = (__u64) ka->sa.sa_restorer;
480 regs->gprs[14] = (__u64) frame->retcode;
481 if (__put_user(S390_SYSCALL_OPCODE | __NR_sigreturn,
482 (u16 __user *)(frame->retcode)))
486 /* Set up backchain. */
487 if (__put_user(regs->gprs[15], (unsigned int __user *) frame))
490 /* Set up registers for signal handler */
491 regs->gprs[15] = (__u64) frame;
492 regs->psw.addr = (__u64) ka->sa.sa_handler;
494 regs->gprs[2] = map_signal(sig);
495 regs->gprs[3] = (__u64) &frame->sc;
497 /* We forgot to include these in the sigcontext.
498 To avoid breaking binary compatibility, they are passed as args. */
499 regs->gprs[4] = current->thread.trap_no;
500 regs->gprs[5] = current->thread.prot_addr;
502 /* Place signal number on stack to allow backtrace from handler. */
503 if (__put_user(regs->gprs[2], (int __user *) &frame->signo))
509 ka->sa.sa_handler = SIG_DFL;
510 force_sig(SIGSEGV, current);
513 static void setup_rt_frame32(int sig, struct k_sigaction *ka, siginfo_t *info,
514 sigset_t *set, struct pt_regs * regs)
517 rt_sigframe32 __user *frame = get_sigframe(ka, regs, sizeof(rt_sigframe32));
518 if (!access_ok(VERIFY_WRITE, frame, sizeof(rt_sigframe32)))
521 if (copy_siginfo_to_user32(&frame->info, info))
524 /* Create the ucontext. */
525 err |= __put_user(0, &frame->uc.uc_flags);
526 err |= __put_user(0, &frame->uc.uc_link);
527 err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
528 err |= __put_user(sas_ss_flags(regs->gprs[15]),
529 &frame->uc.uc_stack.ss_flags);
530 err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
531 err |= save_sigregs32(regs, &frame->uc.uc_mcontext);
532 err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
536 /* Set up to return from userspace. If provided, use a stub
537 already in userspace. */
538 if (ka->sa.sa_flags & SA_RESTORER) {
539 regs->gprs[14] = (__u64) ka->sa.sa_restorer;
541 regs->gprs[14] = (__u64) frame->retcode;
542 err |= __put_user(S390_SYSCALL_OPCODE | __NR_rt_sigreturn,
543 (u16 __user *)(frame->retcode));
546 /* Set up backchain. */
547 if (__put_user(regs->gprs[15], (unsigned int __user *) frame))
550 /* Set up registers for signal handler */
551 regs->gprs[15] = (__u64) frame;
552 regs->psw.addr = (__u64) ka->sa.sa_handler;
554 regs->gprs[2] = map_signal(sig);
555 regs->gprs[3] = (__u64) &frame->info;
556 regs->gprs[4] = (__u64) &frame->uc;
561 ka->sa.sa_handler = SIG_DFL;
562 force_sig(SIGSEGV, current);
566 * OK, we're invoking a handler
570 handle_signal32(unsigned long sig, siginfo_t *info, sigset_t *oldset,
571 struct pt_regs * regs)
573 struct k_sigaction *ka = ¤t->sighand->action[sig-1];
575 /* Set up the stack frame */
576 if (ka->sa.sa_flags & SA_SIGINFO)
577 setup_rt_frame32(sig, ka, info, oldset, regs);
579 setup_frame32(sig, ka, oldset, regs);
581 if (ka->sa.sa_flags & SA_ONESHOT)
582 ka->sa.sa_handler = SIG_DFL;
584 if (!(ka->sa.sa_flags & SA_NODEFER)) {
585 spin_lock_irq(¤t->sighand->siglock);
586 sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
587 sigaddset(¤t->blocked,sig);
589 spin_unlock_irq(¤t->sighand->siglock);