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/config.h>
14 #include <linux/compat.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/tty.h>
27 #include <linux/personality.h>
28 #include <linux/binfmts.h>
29 #include <asm/ucontext.h>
30 #include <asm/uaccess.h>
31 #include <asm/lowcore.h>
32 #include "compat_linux.h"
33 #include "compat_ptrace.h"
35 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
39 __u8 callee_used_stack[__SIGNAL_FRAMESIZE32];
40 struct sigcontext32 sc;
43 __u8 retcode[S390_SYSCALL_SIZE];
48 __u8 callee_used_stack[__SIGNAL_FRAMESIZE32];
49 __u8 retcode[S390_SYSCALL_SIZE];
50 compat_siginfo_t info;
54 int copy_siginfo_to_user32(compat_siginfo_t __user *to, siginfo_t *from)
58 if (!access_ok (VERIFY_WRITE, to, sizeof(compat_siginfo_t)))
61 /* If you change siginfo_t structure, please be sure
62 this code is fixed accordingly.
63 It should never copy any pad contained in the structure
64 to avoid security leaks, but must copy the generic
65 3 ints plus the relevant union member.
66 This routine must convert siginfo from 64bit to 32bit as well
68 err = __put_user(from->si_signo, &to->si_signo);
69 err |= __put_user(from->si_errno, &to->si_errno);
70 err |= __put_user((short)from->si_code, &to->si_code);
71 if (from->si_code < 0)
72 err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
74 switch (from->si_code >> 16) {
75 case __SI_RT >> 16: /* This is not generated by the kernel as of now. */
76 case __SI_MESGQ >> 16:
77 err |= __put_user(from->si_int, &to->si_int);
80 err |= __put_user(from->si_pid, &to->si_pid);
81 err |= __put_user(from->si_uid, &to->si_uid);
84 err |= __put_user(from->si_pid, &to->si_pid);
85 err |= __put_user(from->si_uid, &to->si_uid);
86 err |= __put_user(from->si_utime, &to->si_utime);
87 err |= __put_user(from->si_stime, &to->si_stime);
88 err |= __put_user(from->si_status, &to->si_status);
90 case __SI_FAULT >> 16:
91 err |= __put_user((unsigned long) from->si_addr,
95 err |= __put_user(from->si_band, &to->si_band);
96 err |= __put_user(from->si_fd, &to->si_fd);
98 case __SI_TIMER >> 16:
99 err |= __put_user(from->si_tid, &to->si_tid);
100 err |= __put_user(from->si_overrun, &to->si_overrun);
101 err |= __put_user(from->si_int, &to->si_int);
110 int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from)
115 if (!access_ok (VERIFY_READ, from, sizeof(compat_siginfo_t)))
118 err = __get_user(to->si_signo, &from->si_signo);
119 err |= __get_user(to->si_errno, &from->si_errno);
120 err |= __get_user(to->si_code, &from->si_code);
123 err |= __copy_from_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
125 switch (to->si_code >> 16) {
126 case __SI_RT >> 16: /* This is not generated by the kernel as of now. */
127 case __SI_MESGQ >> 16:
128 err |= __get_user(to->si_int, &from->si_int);
130 case __SI_KILL >> 16:
131 err |= __get_user(to->si_pid, &from->si_pid);
132 err |= __get_user(to->si_uid, &from->si_uid);
134 case __SI_CHLD >> 16:
135 err |= __get_user(to->si_pid, &from->si_pid);
136 err |= __get_user(to->si_uid, &from->si_uid);
137 err |= __get_user(to->si_utime, &from->si_utime);
138 err |= __get_user(to->si_stime, &from->si_stime);
139 err |= __get_user(to->si_status, &from->si_status);
141 case __SI_FAULT >> 16:
142 err |= __get_user(tmp, &from->si_addr);
143 to->si_addr = (void __user *)(u64) (tmp & PSW32_ADDR_INSN);
145 case __SI_POLL >> 16:
146 err |= __get_user(to->si_band, &from->si_band);
147 err |= __get_user(to->si_fd, &from->si_fd);
149 case __SI_TIMER >> 16:
150 err |= __get_user(to->si_tid, &from->si_tid);
151 err |= __get_user(to->si_overrun, &from->si_overrun);
152 err |= __get_user(to->si_int, &from->si_int);
162 sys32_sigaction(int sig, const struct old_sigaction32 __user *act,
163 struct old_sigaction32 __user *oact)
165 struct k_sigaction new_ka, old_ka;
166 unsigned long sa_handler, sa_restorer;
170 compat_old_sigset_t mask;
171 if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
172 __get_user(sa_handler, &act->sa_handler) ||
173 __get_user(sa_restorer, &act->sa_restorer))
175 new_ka.sa.sa_handler = (__sighandler_t) sa_handler;
176 new_ka.sa.sa_restorer = (void (*)(void)) sa_restorer;
177 __get_user(new_ka.sa.sa_flags, &act->sa_flags);
178 __get_user(mask, &act->sa_mask);
179 siginitset(&new_ka.sa.sa_mask, mask);
182 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
185 sa_handler = (unsigned long) old_ka.sa.sa_handler;
186 sa_restorer = (unsigned long) old_ka.sa.sa_restorer;
187 if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
188 __put_user(sa_handler, &oact->sa_handler) ||
189 __put_user(sa_restorer, &oact->sa_restorer))
191 __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
192 __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
199 do_sigaction(int sig, const struct k_sigaction *act, struct k_sigaction *oact);
202 sys32_rt_sigaction(int sig, const struct sigaction32 __user *act,
203 struct sigaction32 __user *oact, size_t sigsetsize)
205 struct k_sigaction new_ka, old_ka;
206 unsigned long sa_handler;
208 compat_sigset_t set32;
210 /* XXX: Don't preclude handling different sized sigset_t's. */
211 if (sigsetsize != sizeof(compat_sigset_t))
215 ret = get_user(sa_handler, &act->sa_handler);
216 ret |= __copy_from_user(&set32, &act->sa_mask,
217 sizeof(compat_sigset_t));
218 switch (_NSIG_WORDS) {
219 case 4: new_ka.sa.sa_mask.sig[3] = set32.sig[6]
220 | (((long)set32.sig[7]) << 32);
221 case 3: new_ka.sa.sa_mask.sig[2] = set32.sig[4]
222 | (((long)set32.sig[5]) << 32);
223 case 2: new_ka.sa.sa_mask.sig[1] = set32.sig[2]
224 | (((long)set32.sig[3]) << 32);
225 case 1: new_ka.sa.sa_mask.sig[0] = set32.sig[0]
226 | (((long)set32.sig[1]) << 32);
228 ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
232 new_ka.sa.sa_handler = (__sighandler_t) sa_handler;
235 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
238 switch (_NSIG_WORDS) {
240 set32.sig[7] = (old_ka.sa.sa_mask.sig[3] >> 32);
241 set32.sig[6] = old_ka.sa.sa_mask.sig[3];
243 set32.sig[5] = (old_ka.sa.sa_mask.sig[2] >> 32);
244 set32.sig[4] = old_ka.sa.sa_mask.sig[2];
246 set32.sig[3] = (old_ka.sa.sa_mask.sig[1] >> 32);
247 set32.sig[2] = old_ka.sa.sa_mask.sig[1];
249 set32.sig[1] = (old_ka.sa.sa_mask.sig[0] >> 32);
250 set32.sig[0] = old_ka.sa.sa_mask.sig[0];
252 ret = put_user((unsigned long)old_ka.sa.sa_handler, &oact->sa_handler);
253 ret |= __copy_to_user(&oact->sa_mask, &set32,
254 sizeof(compat_sigset_t));
255 ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
262 sys32_sigaltstack(const stack_t32 __user *uss, stack_t32 __user *uoss,
263 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(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);
278 kss.ss_sp = (void __user *) ss_sp;
282 ret = do_sigaltstack((stack_t __user *) (uss ? &kss : NULL),
283 (stack_t __user *) (uoss ? &koss : NULL),
288 if (!access_ok(VERIFY_WRITE, uoss, sizeof(*uoss)))
290 ss_sp = (unsigned long) koss.ss_sp;
291 err |= __put_user(ss_sp, &uoss->ss_sp);
292 err |= __put_user(koss.ss_size, &uoss->ss_size);
293 err |= __put_user(koss.ss_flags, &uoss->ss_flags);
300 static int save_sigregs32(struct pt_regs *regs, _sigregs32 __user *sregs)
302 _s390_regs_common32 regs32;
305 regs32.psw.mask = PSW32_MASK_MERGE(PSW32_USER_BITS,
306 (__u32)(regs->psw.mask >> 32));
307 regs32.psw.addr = PSW32_ADDR_AMODE31 | (__u32) regs->psw.addr;
308 for (i = 0; i < NUM_GPRS; i++)
309 regs32.gprs[i] = (__u32) regs->gprs[i];
310 save_access_regs(current->thread.acrs);
311 memcpy(regs32.acrs, current->thread.acrs, sizeof(regs32.acrs));
312 err = __copy_to_user(&sregs->regs, ®s32, sizeof(regs32));
315 save_fp_regs(¤t->thread.fp_regs);
316 /* s390_fp_regs and _s390_fp_regs32 are the same ! */
317 return __copy_to_user(&sregs->fpregs, ¤t->thread.fp_regs,
318 sizeof(_s390_fp_regs32));
321 static int restore_sigregs32(struct pt_regs *regs,_sigregs32 __user *sregs)
323 _s390_regs_common32 regs32;
326 /* Alwys make any pending restarted system call return -EINTR */
327 current_thread_info()->restart_block.fn = do_no_restart_syscall;
329 err = __copy_from_user(®s32, &sregs->regs, sizeof(regs32));
332 regs->psw.mask = PSW_MASK_MERGE(regs->psw.mask,
333 (__u64)regs32.psw.mask << 32);
334 regs->psw.addr = (__u64)(regs32.psw.addr & PSW32_ADDR_INSN);
335 for (i = 0; i < NUM_GPRS; i++)
336 regs->gprs[i] = (__u64) regs32.gprs[i];
337 memcpy(current->thread.acrs, regs32.acrs, sizeof(current->thread.acrs));
338 restore_access_regs(current->thread.acrs);
340 err = __copy_from_user(¤t->thread.fp_regs, &sregs->fpregs,
341 sizeof(_s390_fp_regs32));
342 current->thread.fp_regs.fpc &= FPC_VALID_MASK;
346 restore_fp_regs(¤t->thread.fp_regs);
347 regs->trap = -1; /* disable syscall checks */
351 asmlinkage long sys32_sigreturn(struct pt_regs *regs)
353 sigframe32 __user *frame = (sigframe32 __user *)regs->gprs[15];
356 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
358 if (__copy_from_user(&set.sig, &frame->sc.oldmask, _SIGMASK_COPY_SIZE32))
361 sigdelsetmask(&set, ~_BLOCKABLE);
362 spin_lock_irq(¤t->sighand->siglock);
363 current->blocked = set;
365 spin_unlock_irq(¤t->sighand->siglock);
367 if (restore_sigregs32(regs, &frame->sregs))
370 return regs->gprs[2];
373 force_sig(SIGSEGV, current);
377 asmlinkage long sys32_rt_sigreturn(struct pt_regs *regs)
379 rt_sigframe32 __user *frame = (rt_sigframe32 __user *)regs->gprs[15];
384 mm_segment_t old_fs = get_fs();
386 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
388 if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
391 sigdelsetmask(&set, ~_BLOCKABLE);
392 spin_lock_irq(¤t->sighand->siglock);
393 current->blocked = set;
395 spin_unlock_irq(¤t->sighand->siglock);
397 if (restore_sigregs32(regs, &frame->uc.uc_mcontext))
400 err = __get_user(ss_sp, &frame->uc.uc_stack.ss_sp);
401 st.ss_sp = compat_ptr(ss_sp);
402 err |= __get_user(st.ss_size, &frame->uc.uc_stack.ss_size);
403 err |= __get_user(st.ss_flags, &frame->uc.uc_stack.ss_flags);
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 int 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))
508 force_sigsegv(sig, current);
512 static int setup_rt_frame32(int sig, struct k_sigaction *ka, siginfo_t *info,
513 sigset_t *set, struct pt_regs * regs)
516 rt_sigframe32 __user *frame = get_sigframe(ka, regs, sizeof(rt_sigframe32));
517 if (!access_ok(VERIFY_WRITE, frame, sizeof(rt_sigframe32)))
520 if (copy_siginfo_to_user32(&frame->info, info))
523 /* Create the ucontext. */
524 err |= __put_user(0, &frame->uc.uc_flags);
525 err |= __put_user(0, &frame->uc.uc_link);
526 err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
527 err |= __put_user(sas_ss_flags(regs->gprs[15]),
528 &frame->uc.uc_stack.ss_flags);
529 err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
530 err |= save_sigregs32(regs, &frame->uc.uc_mcontext);
531 err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
535 /* Set up to return from userspace. If provided, use a stub
536 already in userspace. */
537 if (ka->sa.sa_flags & SA_RESTORER) {
538 regs->gprs[14] = (__u64) ka->sa.sa_restorer;
540 regs->gprs[14] = (__u64) frame->retcode;
541 err |= __put_user(S390_SYSCALL_OPCODE | __NR_rt_sigreturn,
542 (u16 __user *)(frame->retcode));
545 /* Set up backchain. */
546 if (__put_user(regs->gprs[15], (unsigned int __user *) frame))
549 /* Set up registers for signal handler */
550 regs->gprs[15] = (__u64) frame;
551 regs->psw.addr = (__u64) ka->sa.sa_handler;
553 regs->gprs[2] = map_signal(sig);
554 regs->gprs[3] = (__u64) &frame->info;
555 regs->gprs[4] = (__u64) &frame->uc;
559 force_sigsegv(sig, current);
564 * OK, we're invoking a handler
568 handle_signal32(unsigned long sig, struct k_sigaction *ka,
569 siginfo_t *info, sigset_t *oldset, struct pt_regs * regs)
573 /* Set up the stack frame */
574 if (ka->sa.sa_flags & SA_SIGINFO)
575 ret = setup_rt_frame32(sig, ka, info, oldset, regs);
577 ret = setup_frame32(sig, ka, oldset, regs);
580 spin_lock_irq(¤t->sighand->siglock);
581 sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
582 if (!(ka->sa.sa_flags & SA_NODEFER))
583 sigaddset(¤t->blocked,sig);
585 spin_unlock_irq(¤t->sighand->siglock);