]> Pileus Git - ~andy/linux/blob - arch/mips/kernel/signal32.c
MIPS: Support for 64-bit FP with O32 binaries
[~andy/linux] / arch / mips / kernel / signal32.c
1 /*
2  * This file is subject to the terms and conditions of the GNU General Public
3  * License.  See the file "COPYING" in the main directory of this archive
4  * for more details.
5  *
6  * Copyright (C) 1991, 1992  Linus Torvalds
7  * Copyright (C) 1994 - 2000, 2006  Ralf Baechle
8  * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
9  */
10 #include <linux/cache.h>
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/syscalls.h>
18 #include <linux/errno.h>
19 #include <linux/wait.h>
20 #include <linux/ptrace.h>
21 #include <linux/suspend.h>
22 #include <linux/compiler.h>
23 #include <linux/uaccess.h>
24
25 #include <asm/abi.h>
26 #include <asm/asm.h>
27 #include <asm/compat-signal.h>
28 #include <linux/bitops.h>
29 #include <asm/cacheflush.h>
30 #include <asm/sim.h>
31 #include <asm/ucontext.h>
32 #include <asm/fpu.h>
33 #include <asm/war.h>
34 #include <asm/vdso.h>
35 #include <asm/dsp.h>
36
37 #include "signal-common.h"
38
39 static int (*save_fp_context32)(struct sigcontext32 __user *sc);
40 static int (*restore_fp_context32)(struct sigcontext32 __user *sc);
41
42 extern asmlinkage int _save_fp_context32(struct sigcontext32 __user *sc);
43 extern asmlinkage int _restore_fp_context32(struct sigcontext32 __user *sc);
44
45 extern asmlinkage int fpu_emulator_save_context32(struct sigcontext32 __user *sc);
46 extern asmlinkage int fpu_emulator_restore_context32(struct sigcontext32 __user *sc);
47
48 /*
49  * Including <asm/unistd.h> would give use the 64-bit syscall numbers ...
50  */
51 #define __NR_O32_restart_syscall        4253
52
53 /* 32-bit compatibility types */
54
55 typedef unsigned int __sighandler32_t;
56 typedef void (*vfptr_t)(void);
57
58 struct ucontext32 {
59         u32                 uc_flags;
60         s32                 uc_link;
61         compat_stack_t      uc_stack;
62         struct sigcontext32 uc_mcontext;
63         compat_sigset_t     uc_sigmask;   /* mask last for extensibility */
64 };
65
66 struct sigframe32 {
67         u32 sf_ass[4];          /* argument save space for o32 */
68         u32 sf_pad[2];          /* Was: signal trampoline */
69         struct sigcontext32 sf_sc;
70         compat_sigset_t sf_mask;
71 };
72
73 struct rt_sigframe32 {
74         u32 rs_ass[4];                  /* argument save space for o32 */
75         u32 rs_pad[2];                  /* Was: signal trampoline */
76         compat_siginfo_t rs_info;
77         struct ucontext32 rs_uc;
78 };
79
80 /*
81  * sigcontext handlers
82  */
83 static int protected_save_fp_context32(struct sigcontext32 __user *sc)
84 {
85         int err;
86         while (1) {
87                 lock_fpu_owner();
88                 err = own_fpu_inatomic(1);
89                 if (!err)
90                         err = save_fp_context32(sc); /* this might fail */
91                 unlock_fpu_owner();
92                 if (likely(!err))
93                         break;
94                 /* touch the sigcontext and try again */
95                 err = __put_user(0, &sc->sc_fpregs[0]) |
96                         __put_user(0, &sc->sc_fpregs[31]) |
97                         __put_user(0, &sc->sc_fpc_csr);
98                 if (err)
99                         break;  /* really bad sigcontext */
100         }
101         return err;
102 }
103
104 static int protected_restore_fp_context32(struct sigcontext32 __user *sc)
105 {
106         int err, tmp __maybe_unused;
107         while (1) {
108                 lock_fpu_owner();
109                 err = own_fpu_inatomic(0);
110                 if (!err)
111                         err = restore_fp_context32(sc); /* this might fail */
112                 unlock_fpu_owner();
113                 if (likely(!err))
114                         break;
115                 /* touch the sigcontext and try again */
116                 err = __get_user(tmp, &sc->sc_fpregs[0]) |
117                         __get_user(tmp, &sc->sc_fpregs[31]) |
118                         __get_user(tmp, &sc->sc_fpc_csr);
119                 if (err)
120                         break;  /* really bad sigcontext */
121         }
122         return err;
123 }
124
125 static int setup_sigcontext32(struct pt_regs *regs,
126                               struct sigcontext32 __user *sc)
127 {
128         int err = 0;
129         int i;
130         u32 used_math;
131
132         err |= __put_user(regs->cp0_epc, &sc->sc_pc);
133
134         err |= __put_user(0, &sc->sc_regs[0]);
135         for (i = 1; i < 32; i++)
136                 err |= __put_user(regs->regs[i], &sc->sc_regs[i]);
137
138         err |= __put_user(regs->hi, &sc->sc_mdhi);
139         err |= __put_user(regs->lo, &sc->sc_mdlo);
140         if (cpu_has_dsp) {
141                 err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp);
142                 err |= __put_user(mfhi1(), &sc->sc_hi1);
143                 err |= __put_user(mflo1(), &sc->sc_lo1);
144                 err |= __put_user(mfhi2(), &sc->sc_hi2);
145                 err |= __put_user(mflo2(), &sc->sc_lo2);
146                 err |= __put_user(mfhi3(), &sc->sc_hi3);
147                 err |= __put_user(mflo3(), &sc->sc_lo3);
148         }
149
150         used_math = !!used_math();
151         err |= __put_user(used_math, &sc->sc_used_math);
152
153         if (used_math) {
154                 /*
155                  * Save FPU state to signal context.  Signal handler
156                  * will "inherit" current FPU state.
157                  */
158                 err |= protected_save_fp_context32(sc);
159         }
160         return err;
161 }
162
163 static int
164 check_and_restore_fp_context32(struct sigcontext32 __user *sc)
165 {
166         int err, sig;
167
168         err = sig = fpcsr_pending(&sc->sc_fpc_csr);
169         if (err > 0)
170                 err = 0;
171         err |= protected_restore_fp_context32(sc);
172         return err ?: sig;
173 }
174
175 static int restore_sigcontext32(struct pt_regs *regs,
176                                 struct sigcontext32 __user *sc)
177 {
178         u32 used_math;
179         int err = 0;
180         s32 treg;
181         int i;
182
183         /* Always make any pending restarted system calls return -EINTR */
184         current_thread_info()->restart_block.fn = do_no_restart_syscall;
185
186         err |= __get_user(regs->cp0_epc, &sc->sc_pc);
187         err |= __get_user(regs->hi, &sc->sc_mdhi);
188         err |= __get_user(regs->lo, &sc->sc_mdlo);
189         if (cpu_has_dsp) {
190                 err |= __get_user(treg, &sc->sc_hi1); mthi1(treg);
191                 err |= __get_user(treg, &sc->sc_lo1); mtlo1(treg);
192                 err |= __get_user(treg, &sc->sc_hi2); mthi2(treg);
193                 err |= __get_user(treg, &sc->sc_lo2); mtlo2(treg);
194                 err |= __get_user(treg, &sc->sc_hi3); mthi3(treg);
195                 err |= __get_user(treg, &sc->sc_lo3); mtlo3(treg);
196                 err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK);
197         }
198
199         for (i = 1; i < 32; i++)
200                 err |= __get_user(regs->regs[i], &sc->sc_regs[i]);
201
202         err |= __get_user(used_math, &sc->sc_used_math);
203         conditional_used_math(used_math);
204
205         if (used_math) {
206                 /* restore fpu context if we have used it before */
207                 if (!err)
208                         err = check_and_restore_fp_context32(sc);
209         } else {
210                 /* signal handler may have used FPU.  Give it up. */
211                 lose_fpu(0);
212         }
213
214         return err;
215 }
216
217 /*
218  *
219  */
220 extern void __put_sigset_unknown_nsig(void);
221 extern void __get_sigset_unknown_nsig(void);
222
223 static inline int put_sigset(const sigset_t *kbuf, compat_sigset_t __user *ubuf)
224 {
225         int err = 0;
226
227         if (!access_ok(VERIFY_WRITE, ubuf, sizeof(*ubuf)))
228                 return -EFAULT;
229
230         switch (_NSIG_WORDS) {
231         default:
232                 __put_sigset_unknown_nsig();
233         case 2:
234                 err |= __put_user(kbuf->sig[1] >> 32, &ubuf->sig[3]);
235                 err |= __put_user(kbuf->sig[1] & 0xffffffff, &ubuf->sig[2]);
236         case 1:
237                 err |= __put_user(kbuf->sig[0] >> 32, &ubuf->sig[1]);
238                 err |= __put_user(kbuf->sig[0] & 0xffffffff, &ubuf->sig[0]);
239         }
240
241         return err;
242 }
243
244 static inline int get_sigset(sigset_t *kbuf, const compat_sigset_t __user *ubuf)
245 {
246         int err = 0;
247         unsigned long sig[4];
248
249         if (!access_ok(VERIFY_READ, ubuf, sizeof(*ubuf)))
250                 return -EFAULT;
251
252         switch (_NSIG_WORDS) {
253         default:
254                 __get_sigset_unknown_nsig();
255         case 2:
256                 err |= __get_user(sig[3], &ubuf->sig[3]);
257                 err |= __get_user(sig[2], &ubuf->sig[2]);
258                 kbuf->sig[1] = sig[2] | (sig[3] << 32);
259         case 1:
260                 err |= __get_user(sig[1], &ubuf->sig[1]);
261                 err |= __get_user(sig[0], &ubuf->sig[0]);
262                 kbuf->sig[0] = sig[0] | (sig[1] << 32);
263         }
264
265         return err;
266 }
267
268 /*
269  * Atomically swap in the new signal mask, and wait for a signal.
270  */
271
272 asmlinkage int sys32_sigsuspend(compat_sigset_t __user *uset)
273 {
274         return compat_sys_rt_sigsuspend(uset, sizeof(compat_sigset_t));
275 }
276
277 SYSCALL_DEFINE3(32_sigaction, long, sig, const struct compat_sigaction __user *, act,
278         struct compat_sigaction __user *, oact)
279 {
280         struct k_sigaction new_ka, old_ka;
281         int ret;
282         int err = 0;
283
284         if (act) {
285                 old_sigset_t mask;
286                 s32 handler;
287
288                 if (!access_ok(VERIFY_READ, act, sizeof(*act)))
289                         return -EFAULT;
290                 err |= __get_user(handler, &act->sa_handler);
291                 new_ka.sa.sa_handler = (void __user *)(s64)handler;
292                 err |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
293                 err |= __get_user(mask, &act->sa_mask.sig[0]);
294                 if (err)
295                         return -EFAULT;
296
297                 siginitset(&new_ka.sa.sa_mask, mask);
298         }
299
300         ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
301
302         if (!ret && oact) {
303                 if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)))
304                         return -EFAULT;
305                 err |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
306                 err |= __put_user((u32)(u64)old_ka.sa.sa_handler,
307                                   &oact->sa_handler);
308                 err |= __put_user(old_ka.sa.sa_mask.sig[0], oact->sa_mask.sig);
309                 err |= __put_user(0, &oact->sa_mask.sig[1]);
310                 err |= __put_user(0, &oact->sa_mask.sig[2]);
311                 err |= __put_user(0, &oact->sa_mask.sig[3]);
312                 if (err)
313                         return -EFAULT;
314         }
315
316         return ret;
317 }
318
319 int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from)
320 {
321         int err;
322
323         if (!access_ok (VERIFY_WRITE, to, sizeof(compat_siginfo_t)))
324                 return -EFAULT;
325
326         /* If you change siginfo_t structure, please be sure
327            this code is fixed accordingly.
328            It should never copy any pad contained in the structure
329            to avoid security leaks, but must copy the generic
330            3 ints plus the relevant union member.
331            This routine must convert siginfo from 64bit to 32bit as well
332            at the same time.  */
333         err = __put_user(from->si_signo, &to->si_signo);
334         err |= __put_user(from->si_errno, &to->si_errno);
335         err |= __put_user((short)from->si_code, &to->si_code);
336         if (from->si_code < 0)
337                 err |= __copy_to_user(&to->_sifields._pad, &from->_sifields._pad, SI_PAD_SIZE);
338         else {
339                 switch (from->si_code >> 16) {
340                 case __SI_TIMER >> 16:
341                         err |= __put_user(from->si_tid, &to->si_tid);
342                         err |= __put_user(from->si_overrun, &to->si_overrun);
343                         err |= __put_user(from->si_int, &to->si_int);
344                         break;
345                 case __SI_CHLD >> 16:
346                         err |= __put_user(from->si_utime, &to->si_utime);
347                         err |= __put_user(from->si_stime, &to->si_stime);
348                         err |= __put_user(from->si_status, &to->si_status);
349                 default:
350                         err |= __put_user(from->si_pid, &to->si_pid);
351                         err |= __put_user(from->si_uid, &to->si_uid);
352                         break;
353                 case __SI_FAULT >> 16:
354                         err |= __put_user((unsigned long)from->si_addr, &to->si_addr);
355                         break;
356                 case __SI_POLL >> 16:
357                         err |= __put_user(from->si_band, &to->si_band);
358                         err |= __put_user(from->si_fd, &to->si_fd);
359                         break;
360                 case __SI_RT >> 16: /* This is not generated by the kernel as of now.  */
361                 case __SI_MESGQ >> 16:
362                         err |= __put_user(from->si_pid, &to->si_pid);
363                         err |= __put_user(from->si_uid, &to->si_uid);
364                         err |= __put_user(from->si_int, &to->si_int);
365                         break;
366                 }
367         }
368         return err;
369 }
370
371 int copy_siginfo_from_user32(siginfo_t *to, compat_siginfo_t __user *from)
372 {
373         memset(to, 0, sizeof *to);
374
375         if (copy_from_user(to, from, 3*sizeof(int)) ||
376             copy_from_user(to->_sifields._pad,
377                            from->_sifields._pad, SI_PAD_SIZE32))
378                 return -EFAULT;
379
380         return 0;
381 }
382
383 asmlinkage void sys32_sigreturn(nabi_no_regargs struct pt_regs regs)
384 {
385         struct sigframe32 __user *frame;
386         sigset_t blocked;
387         int sig;
388
389         frame = (struct sigframe32 __user *) regs.regs[29];
390         if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
391                 goto badframe;
392         if (__copy_conv_sigset_from_user(&blocked, &frame->sf_mask))
393                 goto badframe;
394
395         set_current_blocked(&blocked);
396
397         sig = restore_sigcontext32(&regs, &frame->sf_sc);
398         if (sig < 0)
399                 goto badframe;
400         else if (sig)
401                 force_sig(sig, current);
402
403         /*
404          * Don't let your children do this ...
405          */
406         __asm__ __volatile__(
407                 "move\t$29, %0\n\t"
408                 "j\tsyscall_exit"
409                 :/* no outputs */
410                 :"r" (&regs));
411         /* Unreached */
412
413 badframe:
414         force_sig(SIGSEGV, current);
415 }
416
417 asmlinkage void sys32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
418 {
419         struct rt_sigframe32 __user *frame;
420         sigset_t set;
421         int sig;
422
423         frame = (struct rt_sigframe32 __user *) regs.regs[29];
424         if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
425                 goto badframe;
426         if (__copy_conv_sigset_from_user(&set, &frame->rs_uc.uc_sigmask))
427                 goto badframe;
428
429         set_current_blocked(&set);
430
431         sig = restore_sigcontext32(&regs, &frame->rs_uc.uc_mcontext);
432         if (sig < 0)
433                 goto badframe;
434         else if (sig)
435                 force_sig(sig, current);
436
437         if (compat_restore_altstack(&frame->rs_uc.uc_stack))
438                 goto badframe;
439
440         /*
441          * Don't let your children do this ...
442          */
443         __asm__ __volatile__(
444                 "move\t$29, %0\n\t"
445                 "j\tsyscall_exit"
446                 :/* no outputs */
447                 :"r" (&regs));
448         /* Unreached */
449
450 badframe:
451         force_sig(SIGSEGV, current);
452 }
453
454 static int setup_frame_32(void *sig_return, struct k_sigaction *ka,
455                           struct pt_regs *regs, int signr, sigset_t *set)
456 {
457         struct sigframe32 __user *frame;
458         int err = 0;
459
460         frame = get_sigframe(ka, regs, sizeof(*frame));
461         if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
462                 goto give_sigsegv;
463
464         err |= setup_sigcontext32(regs, &frame->sf_sc);
465         err |= __copy_conv_sigset_to_user(&frame->sf_mask, set);
466
467         if (err)
468                 goto give_sigsegv;
469
470         /*
471          * Arguments to signal handler:
472          *
473          *   a0 = signal number
474          *   a1 = 0 (should be cause)
475          *   a2 = pointer to struct sigcontext
476          *
477          * $25 and c0_epc point to the signal handler, $29 points to the
478          * struct sigframe.
479          */
480         regs->regs[ 4] = signr;
481         regs->regs[ 5] = 0;
482         regs->regs[ 6] = (unsigned long) &frame->sf_sc;
483         regs->regs[29] = (unsigned long) frame;
484         regs->regs[31] = (unsigned long) sig_return;
485         regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
486
487         DEBUGP("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%lx\n",
488                current->comm, current->pid,
489                frame, regs->cp0_epc, regs->regs[31]);
490
491         return 0;
492
493 give_sigsegv:
494         force_sigsegv(signr, current);
495         return -EFAULT;
496 }
497
498 static int setup_rt_frame_32(void *sig_return, struct k_sigaction *ka,
499                              struct pt_regs *regs, int signr, sigset_t *set,
500                              siginfo_t *info)
501 {
502         struct rt_sigframe32 __user *frame;
503         int err = 0;
504
505         frame = get_sigframe(ka, regs, sizeof(*frame));
506         if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
507                 goto give_sigsegv;
508
509         /* Convert (siginfo_t -> compat_siginfo_t) and copy to user. */
510         err |= copy_siginfo_to_user32(&frame->rs_info, info);
511
512         /* Create the ucontext.  */
513         err |= __put_user(0, &frame->rs_uc.uc_flags);
514         err |= __put_user(0, &frame->rs_uc.uc_link);
515         err |= __compat_save_altstack(&frame->rs_uc.uc_stack, regs->regs[29]);
516         err |= setup_sigcontext32(regs, &frame->rs_uc.uc_mcontext);
517         err |= __copy_conv_sigset_to_user(&frame->rs_uc.uc_sigmask, set);
518
519         if (err)
520                 goto give_sigsegv;
521
522         /*
523          * Arguments to signal handler:
524          *
525          *   a0 = signal number
526          *   a1 = 0 (should be cause)
527          *   a2 = pointer to ucontext
528          *
529          * $25 and c0_epc point to the signal handler, $29 points to
530          * the struct rt_sigframe32.
531          */
532         regs->regs[ 4] = signr;
533         regs->regs[ 5] = (unsigned long) &frame->rs_info;
534         regs->regs[ 6] = (unsigned long) &frame->rs_uc;
535         regs->regs[29] = (unsigned long) frame;
536         regs->regs[31] = (unsigned long) sig_return;
537         regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
538
539         DEBUGP("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%lx\n",
540                current->comm, current->pid,
541                frame, regs->cp0_epc, regs->regs[31]);
542
543         return 0;
544
545 give_sigsegv:
546         force_sigsegv(signr, current);
547         return -EFAULT;
548 }
549
550 /*
551  * o32 compatibility on 64-bit kernels, without DSP ASE
552  */
553 struct mips_abi mips_abi_32 = {
554         .setup_frame    = setup_frame_32,
555         .signal_return_offset =
556                 offsetof(struct mips_vdso, o32_signal_trampoline),
557         .setup_rt_frame = setup_rt_frame_32,
558         .rt_signal_return_offset =
559                 offsetof(struct mips_vdso, o32_rt_signal_trampoline),
560         .restart        = __NR_O32_restart_syscall
561 };
562
563 static int signal32_init(void)
564 {
565         if (cpu_has_fpu) {
566                 save_fp_context32 = _save_fp_context32;
567                 restore_fp_context32 = _restore_fp_context32;
568         } else {
569                 save_fp_context32 = fpu_emulator_save_context32;
570                 restore_fp_context32 = fpu_emulator_restore_context32;
571         }
572
573         return 0;
574 }
575
576 arch_initcall(signal32_init);