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