blk: rq_data_dir() should not return a boolean
[cris-mirror.git] / arch / s390 / kernel / compat_signal.c
blobeb4664238613a0c7db83e7910ae065a9b584e95b
1 /*
2 * Copyright IBM Corp. 2000, 2006
3 * Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com)
4 * Gerhard Tonn (ton@de.ibm.com)
6 * Copyright (C) 1991, 1992 Linus Torvalds
8 * 1997-11-28 Modified for POSIX.1b signals by Richard Henderson
9 */
11 #include <linux/compat.h>
12 #include <linux/sched.h>
13 #include <linux/mm.h>
14 #include <linux/smp.h>
15 #include <linux/kernel.h>
16 #include <linux/signal.h>
17 #include <linux/errno.h>
18 #include <linux/wait.h>
19 #include <linux/ptrace.h>
20 #include <linux/unistd.h>
21 #include <linux/stddef.h>
22 #include <linux/tty.h>
23 #include <linux/personality.h>
24 #include <linux/binfmts.h>
25 #include <asm/ucontext.h>
26 #include <asm/uaccess.h>
27 #include <asm/lowcore.h>
28 #include <asm/switch_to.h>
29 #include "compat_linux.h"
30 #include "compat_ptrace.h"
31 #include "entry.h"
33 typedef struct
35 __u8 callee_used_stack[__SIGNAL_FRAMESIZE32];
36 struct sigcontext32 sc;
37 _sigregs32 sregs;
38 int signo;
39 _sigregs_ext32 sregs_ext;
40 __u16 svc_insn; /* Offset of svc_insn is NOT fixed! */
41 } sigframe32;
43 typedef struct
45 __u8 callee_used_stack[__SIGNAL_FRAMESIZE32];
46 __u16 svc_insn;
47 compat_siginfo_t info;
48 struct ucontext32 uc;
49 } rt_sigframe32;
51 int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from)
53 int err;
55 /* If you change siginfo_t structure, please be sure
56 this code is fixed accordingly.
57 It should never copy any pad contained in the structure
58 to avoid security leaks, but must copy the generic
59 3 ints plus the relevant union member.
60 This routine must convert siginfo from 64bit to 32bit as well
61 at the same time. */
62 err = __put_user(from->si_signo, &to->si_signo);
63 err |= __put_user(from->si_errno, &to->si_errno);
64 err |= __put_user((short)from->si_code, &to->si_code);
65 if (from->si_code < 0)
66 err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
67 else {
68 switch (from->si_code >> 16) {
69 case __SI_RT >> 16: /* This is not generated by the kernel as of now. */
70 case __SI_MESGQ >> 16:
71 err |= __put_user(from->si_int, &to->si_int);
72 /* fallthrough */
73 case __SI_KILL >> 16:
74 err |= __put_user(from->si_pid, &to->si_pid);
75 err |= __put_user(from->si_uid, &to->si_uid);
76 break;
77 case __SI_CHLD >> 16:
78 err |= __put_user(from->si_pid, &to->si_pid);
79 err |= __put_user(from->si_uid, &to->si_uid);
80 err |= __put_user(from->si_utime, &to->si_utime);
81 err |= __put_user(from->si_stime, &to->si_stime);
82 err |= __put_user(from->si_status, &to->si_status);
83 break;
84 case __SI_FAULT >> 16:
85 err |= __put_user((unsigned long) from->si_addr,
86 &to->si_addr);
87 break;
88 case __SI_POLL >> 16:
89 err |= __put_user(from->si_band, &to->si_band);
90 err |= __put_user(from->si_fd, &to->si_fd);
91 break;
92 case __SI_TIMER >> 16:
93 err |= __put_user(from->si_tid, &to->si_tid);
94 err |= __put_user(from->si_overrun, &to->si_overrun);
95 err |= __put_user(from->si_int, &to->si_int);
96 break;
97 default:
98 break;
101 return err ? -EFAULT : 0;
104 int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from)
106 int err;
107 u32 tmp;
109 err = __get_user(to->si_signo, &from->si_signo);
110 err |= __get_user(to->si_errno, &from->si_errno);
111 err |= __get_user(to->si_code, &from->si_code);
113 if (to->si_code < 0)
114 err |= __copy_from_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
115 else {
116 switch (to->si_code >> 16) {
117 case __SI_RT >> 16: /* This is not generated by the kernel as of now. */
118 case __SI_MESGQ >> 16:
119 err |= __get_user(to->si_int, &from->si_int);
120 /* fallthrough */
121 case __SI_KILL >> 16:
122 err |= __get_user(to->si_pid, &from->si_pid);
123 err |= __get_user(to->si_uid, &from->si_uid);
124 break;
125 case __SI_CHLD >> 16:
126 err |= __get_user(to->si_pid, &from->si_pid);
127 err |= __get_user(to->si_uid, &from->si_uid);
128 err |= __get_user(to->si_utime, &from->si_utime);
129 err |= __get_user(to->si_stime, &from->si_stime);
130 err |= __get_user(to->si_status, &from->si_status);
131 break;
132 case __SI_FAULT >> 16:
133 err |= __get_user(tmp, &from->si_addr);
134 to->si_addr = (void __force __user *)
135 (u64) (tmp & PSW32_ADDR_INSN);
136 break;
137 case __SI_POLL >> 16:
138 err |= __get_user(to->si_band, &from->si_band);
139 err |= __get_user(to->si_fd, &from->si_fd);
140 break;
141 case __SI_TIMER >> 16:
142 err |= __get_user(to->si_tid, &from->si_tid);
143 err |= __get_user(to->si_overrun, &from->si_overrun);
144 err |= __get_user(to->si_int, &from->si_int);
145 break;
146 default:
147 break;
150 return err ? -EFAULT : 0;
153 /* Store registers needed to create the signal frame */
154 static void store_sigregs(void)
156 save_access_regs(current->thread.acrs);
157 save_fpu_regs();
160 /* Load registers after signal return */
161 static void load_sigregs(void)
163 restore_access_regs(current->thread.acrs);
166 static int save_sigregs32(struct pt_regs *regs, _sigregs32 __user *sregs)
168 _sigregs32 user_sregs;
169 int i;
171 user_sregs.regs.psw.mask = (__u32)(regs->psw.mask >> 32);
172 user_sregs.regs.psw.mask &= PSW32_MASK_USER | PSW32_MASK_RI;
173 user_sregs.regs.psw.mask |= PSW32_USER_BITS;
174 user_sregs.regs.psw.addr = (__u32) regs->psw.addr |
175 (__u32)(regs->psw.mask & PSW_MASK_BA);
176 for (i = 0; i < NUM_GPRS; i++)
177 user_sregs.regs.gprs[i] = (__u32) regs->gprs[i];
178 memcpy(&user_sregs.regs.acrs, current->thread.acrs,
179 sizeof(user_sregs.regs.acrs));
180 fpregs_store((_s390_fp_regs *) &user_sregs.fpregs, &current->thread.fpu);
181 if (__copy_to_user(sregs, &user_sregs, sizeof(_sigregs32)))
182 return -EFAULT;
183 return 0;
186 static int restore_sigregs32(struct pt_regs *regs,_sigregs32 __user *sregs)
188 _sigregs32 user_sregs;
189 int i;
191 /* Alwys make any pending restarted system call return -EINTR */
192 current->restart_block.fn = do_no_restart_syscall;
194 if (__copy_from_user(&user_sregs, &sregs->regs, sizeof(user_sregs)))
195 return -EFAULT;
197 if (!is_ri_task(current) && (user_sregs.regs.psw.mask & PSW32_MASK_RI))
198 return -EINVAL;
200 /* Test the floating-point-control word. */
201 if (test_fp_ctl(user_sregs.fpregs.fpc))
202 return -EINVAL;
204 /* Use regs->psw.mask instead of PSW_USER_BITS to preserve PER bit. */
205 regs->psw.mask = (regs->psw.mask & ~(PSW_MASK_USER | PSW_MASK_RI)) |
206 (__u64)(user_sregs.regs.psw.mask & PSW32_MASK_USER) << 32 |
207 (__u64)(user_sregs.regs.psw.mask & PSW32_MASK_RI) << 32 |
208 (__u64)(user_sregs.regs.psw.addr & PSW32_ADDR_AMODE);
209 /* Check for invalid user address space control. */
210 if ((regs->psw.mask & PSW_MASK_ASC) == PSW_ASC_HOME)
211 regs->psw.mask = PSW_ASC_PRIMARY |
212 (regs->psw.mask & ~PSW_MASK_ASC);
213 regs->psw.addr = (__u64)(user_sregs.regs.psw.addr & PSW32_ADDR_INSN);
214 for (i = 0; i < NUM_GPRS; i++)
215 regs->gprs[i] = (__u64) user_sregs.regs.gprs[i];
216 memcpy(&current->thread.acrs, &user_sregs.regs.acrs,
217 sizeof(current->thread.acrs));
218 fpregs_load((_s390_fp_regs *) &user_sregs.fpregs, &current->thread.fpu);
220 clear_pt_regs_flag(regs, PIF_SYSCALL); /* No longer in a system call */
221 return 0;
224 static int save_sigregs_ext32(struct pt_regs *regs,
225 _sigregs_ext32 __user *sregs_ext)
227 __u32 gprs_high[NUM_GPRS];
228 __u64 vxrs[__NUM_VXRS_LOW];
229 int i;
231 /* Save high gprs to signal stack */
232 for (i = 0; i < NUM_GPRS; i++)
233 gprs_high[i] = regs->gprs[i] >> 32;
234 if (__copy_to_user(&sregs_ext->gprs_high, &gprs_high,
235 sizeof(sregs_ext->gprs_high)))
236 return -EFAULT;
238 /* Save vector registers to signal stack */
239 if (is_vx_task(current)) {
240 for (i = 0; i < __NUM_VXRS_LOW; i++)
241 vxrs[i] = *((__u64 *)(current->thread.fpu.vxrs + i) + 1);
242 if (__copy_to_user(&sregs_ext->vxrs_low, vxrs,
243 sizeof(sregs_ext->vxrs_low)) ||
244 __copy_to_user(&sregs_ext->vxrs_high,
245 current->thread.fpu.vxrs + __NUM_VXRS_LOW,
246 sizeof(sregs_ext->vxrs_high)))
247 return -EFAULT;
249 return 0;
252 static int restore_sigregs_ext32(struct pt_regs *regs,
253 _sigregs_ext32 __user *sregs_ext)
255 __u32 gprs_high[NUM_GPRS];
256 __u64 vxrs[__NUM_VXRS_LOW];
257 int i;
259 /* Restore high gprs from signal stack */
260 if (__copy_from_user(&gprs_high, &sregs_ext->gprs_high,
261 sizeof(&sregs_ext->gprs_high)))
262 return -EFAULT;
263 for (i = 0; i < NUM_GPRS; i++)
264 *(__u32 *)&regs->gprs[i] = gprs_high[i];
266 /* Restore vector registers from signal stack */
267 if (is_vx_task(current)) {
268 if (__copy_from_user(vxrs, &sregs_ext->vxrs_low,
269 sizeof(sregs_ext->vxrs_low)) ||
270 __copy_from_user(current->thread.fpu.vxrs + __NUM_VXRS_LOW,
271 &sregs_ext->vxrs_high,
272 sizeof(sregs_ext->vxrs_high)))
273 return -EFAULT;
274 for (i = 0; i < __NUM_VXRS_LOW; i++)
275 *((__u64 *)(current->thread.fpu.vxrs + i) + 1) = vxrs[i];
277 return 0;
280 COMPAT_SYSCALL_DEFINE0(sigreturn)
282 struct pt_regs *regs = task_pt_regs(current);
283 sigframe32 __user *frame = (sigframe32 __user *)regs->gprs[15];
284 sigset_t set;
286 if (__copy_from_user(&set.sig, &frame->sc.oldmask, _SIGMASK_COPY_SIZE32))
287 goto badframe;
288 set_current_blocked(&set);
289 save_fpu_regs();
290 if (restore_sigregs32(regs, &frame->sregs))
291 goto badframe;
292 if (restore_sigregs_ext32(regs, &frame->sregs_ext))
293 goto badframe;
294 load_sigregs();
295 return regs->gprs[2];
296 badframe:
297 force_sig(SIGSEGV, current);
298 return 0;
301 COMPAT_SYSCALL_DEFINE0(rt_sigreturn)
303 struct pt_regs *regs = task_pt_regs(current);
304 rt_sigframe32 __user *frame = (rt_sigframe32 __user *)regs->gprs[15];
305 sigset_t set;
307 if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
308 goto badframe;
309 set_current_blocked(&set);
310 if (compat_restore_altstack(&frame->uc.uc_stack))
311 goto badframe;
312 save_fpu_regs();
313 if (restore_sigregs32(regs, &frame->uc.uc_mcontext))
314 goto badframe;
315 if (restore_sigregs_ext32(regs, &frame->uc.uc_mcontext_ext))
316 goto badframe;
317 load_sigregs();
318 return regs->gprs[2];
319 badframe:
320 force_sig(SIGSEGV, current);
321 return 0;
325 * Set up a signal frame.
330 * Determine which stack to use..
332 static inline void __user *
333 get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
335 unsigned long sp;
337 /* Default to using normal stack */
338 sp = (unsigned long) A(regs->gprs[15]);
340 /* Overflow on alternate signal stack gives SIGSEGV. */
341 if (on_sig_stack(sp) && !on_sig_stack((sp - frame_size) & -8UL))
342 return (void __user *) -1UL;
344 /* This is the X/Open sanctioned signal stack switching. */
345 if (ka->sa.sa_flags & SA_ONSTACK) {
346 if (! sas_ss_flags(sp))
347 sp = current->sas_ss_sp + current->sas_ss_size;
350 return (void __user *)((sp - frame_size) & -8ul);
353 static int setup_frame32(struct ksignal *ksig, sigset_t *set,
354 struct pt_regs *regs)
356 int sig = ksig->sig;
357 sigframe32 __user *frame;
358 struct sigcontext32 sc;
359 unsigned long restorer;
360 size_t frame_size;
363 * gprs_high are always present for 31-bit compat tasks.
364 * The space for vector registers is only allocated if
365 * the machine supports it
367 frame_size = sizeof(*frame) - sizeof(frame->sregs_ext.__reserved);
368 if (!MACHINE_HAS_VX)
369 frame_size -= sizeof(frame->sregs_ext.vxrs_low) +
370 sizeof(frame->sregs_ext.vxrs_high);
371 frame = get_sigframe(&ksig->ka, regs, frame_size);
372 if (frame == (void __user *) -1UL)
373 return -EFAULT;
375 /* Set up backchain. */
376 if (__put_user(regs->gprs[15], (unsigned int __user *) frame))
377 return -EFAULT;
379 /* Create struct sigcontext32 on the signal stack */
380 memcpy(&sc.oldmask, &set->sig, _SIGMASK_COPY_SIZE32);
381 sc.sregs = (__u32)(unsigned long __force) &frame->sregs;
382 if (__copy_to_user(&frame->sc, &sc, sizeof(frame->sc)))
383 return -EFAULT;
385 /* Store registers needed to create the signal frame */
386 store_sigregs();
388 /* Create _sigregs32 on the signal stack */
389 if (save_sigregs32(regs, &frame->sregs))
390 return -EFAULT;
392 /* Place signal number on stack to allow backtrace from handler. */
393 if (__put_user(regs->gprs[2], (int __force __user *) &frame->signo))
394 return -EFAULT;
396 /* Create _sigregs_ext32 on the signal stack */
397 if (save_sigregs_ext32(regs, &frame->sregs_ext))
398 return -EFAULT;
400 /* Set up to return from userspace. If provided, use a stub
401 already in userspace. */
402 if (ksig->ka.sa.sa_flags & SA_RESTORER) {
403 restorer = (unsigned long __force)
404 ksig->ka.sa.sa_restorer | PSW32_ADDR_AMODE;
405 } else {
406 /* Signal frames without vectors registers are short ! */
407 __u16 __user *svc = (void __user *) frame + frame_size - 2;
408 if (__put_user(S390_SYSCALL_OPCODE | __NR_sigreturn, svc))
409 return -EFAULT;
410 restorer = (unsigned long __force) svc | PSW32_ADDR_AMODE;
413 /* Set up registers for signal handler */
414 regs->gprs[14] = restorer;
415 regs->gprs[15] = (__force __u64) frame;
416 /* Force 31 bit amode and default user address space control. */
417 regs->psw.mask = PSW_MASK_BA |
418 (PSW_USER_BITS & PSW_MASK_ASC) |
419 (regs->psw.mask & ~PSW_MASK_ASC);
420 regs->psw.addr = (__force __u64) ksig->ka.sa.sa_handler;
422 regs->gprs[2] = sig;
423 regs->gprs[3] = (__force __u64) &frame->sc;
425 /* We forgot to include these in the sigcontext.
426 To avoid breaking binary compatibility, they are passed as args. */
427 if (sig == SIGSEGV || sig == SIGBUS || sig == SIGILL ||
428 sig == SIGTRAP || sig == SIGFPE) {
429 /* set extra registers only for synchronous signals */
430 regs->gprs[4] = regs->int_code & 127;
431 regs->gprs[5] = regs->int_parm_long;
432 regs->gprs[6] = task_thread_info(current)->last_break;
435 return 0;
438 static int setup_rt_frame32(struct ksignal *ksig, sigset_t *set,
439 struct pt_regs *regs)
441 rt_sigframe32 __user *frame;
442 unsigned long restorer;
443 size_t frame_size;
444 u32 uc_flags;
446 frame_size = sizeof(*frame) -
447 sizeof(frame->uc.uc_mcontext_ext.__reserved);
449 * gprs_high are always present for 31-bit compat tasks.
450 * The space for vector registers is only allocated if
451 * the machine supports it
453 uc_flags = UC_GPRS_HIGH;
454 if (MACHINE_HAS_VX) {
455 if (is_vx_task(current))
456 uc_flags |= UC_VXRS;
457 } else
458 frame_size -= sizeof(frame->uc.uc_mcontext_ext.vxrs_low) +
459 sizeof(frame->uc.uc_mcontext_ext.vxrs_high);
460 frame = get_sigframe(&ksig->ka, regs, frame_size);
461 if (frame == (void __user *) -1UL)
462 return -EFAULT;
464 /* Set up backchain. */
465 if (__put_user(regs->gprs[15], (unsigned int __force __user *) frame))
466 return -EFAULT;
468 /* Set up to return from userspace. If provided, use a stub
469 already in userspace. */
470 if (ksig->ka.sa.sa_flags & SA_RESTORER) {
471 restorer = (unsigned long __force)
472 ksig->ka.sa.sa_restorer | PSW32_ADDR_AMODE;
473 } else {
474 __u16 __user *svc = &frame->svc_insn;
475 if (__put_user(S390_SYSCALL_OPCODE | __NR_rt_sigreturn, svc))
476 return -EFAULT;
477 restorer = (unsigned long __force) svc | PSW32_ADDR_AMODE;
480 /* Create siginfo on the signal stack */
481 if (copy_siginfo_to_user32(&frame->info, &ksig->info))
482 return -EFAULT;
484 /* Store registers needed to create the signal frame */
485 store_sigregs();
487 /* Create ucontext on the signal stack. */
488 if (__put_user(uc_flags, &frame->uc.uc_flags) ||
489 __put_user(0, &frame->uc.uc_link) ||
490 __compat_save_altstack(&frame->uc.uc_stack, regs->gprs[15]) ||
491 save_sigregs32(regs, &frame->uc.uc_mcontext) ||
492 __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)) ||
493 save_sigregs_ext32(regs, &frame->uc.uc_mcontext_ext))
494 return -EFAULT;
496 /* Set up registers for signal handler */
497 regs->gprs[14] = restorer;
498 regs->gprs[15] = (__force __u64) frame;
499 /* Force 31 bit amode and default user address space control. */
500 regs->psw.mask = PSW_MASK_BA |
501 (PSW_USER_BITS & PSW_MASK_ASC) |
502 (regs->psw.mask & ~PSW_MASK_ASC);
503 regs->psw.addr = (__u64 __force) ksig->ka.sa.sa_handler;
505 regs->gprs[2] = ksig->sig;
506 regs->gprs[3] = (__force __u64) &frame->info;
507 regs->gprs[4] = (__force __u64) &frame->uc;
508 regs->gprs[5] = task_thread_info(current)->last_break;
509 return 0;
513 * OK, we're invoking a handler
516 void handle_signal32(struct ksignal *ksig, sigset_t *oldset,
517 struct pt_regs *regs)
519 int ret;
521 /* Set up the stack frame */
522 if (ksig->ka.sa.sa_flags & SA_SIGINFO)
523 ret = setup_rt_frame32(ksig, oldset, regs);
524 else
525 ret = setup_frame32(ksig, oldset, regs);
527 signal_setup_done(ret, ksig, test_thread_flag(TIF_SINGLE_STEP));