1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#include <linux/sched.h>
21#include <linux/mm.h>
22#include <linux/smp.h>
23#include <linux/kernel.h>
24#include <linux/signal.h>
25#include <linux/errno.h>
26#include <linux/elf.h>
27#include <linux/ptrace.h>
28#include <linux/ratelimit.h>
29#ifdef CONFIG_PPC64
30#include <linux/syscalls.h>
31#include <linux/compat.h>
32#else
33#include <linux/wait.h>
34#include <linux/unistd.h>
35#include <linux/stddef.h>
36#include <linux/tty.h>
37#include <linux/binfmts.h>
38#include <linux/freezer.h>
39#endif
40
41#include <asm/uaccess.h>
42#include <asm/cacheflush.h>
43#include <asm/syscalls.h>
44#include <asm/sigcontext.h>
45#include <asm/vdso.h>
46#include <asm/switch_to.h>
47#ifdef CONFIG_PPC64
48#include "ppc32.h"
49#include <asm/unistd.h>
50#else
51#include <asm/ucontext.h>
52#include <asm/pgtable.h>
53#endif
54
55#include "signal.h"
56
57#undef DEBUG_SIG
58
59#ifdef CONFIG_PPC64
60#define sys_sigsuspend compat_sys_sigsuspend
61#define sys_rt_sigsuspend compat_sys_rt_sigsuspend
62#define sys_rt_sigreturn compat_sys_rt_sigreturn
63#define sys_sigaction compat_sys_sigaction
64#define sys_swapcontext compat_sys_swapcontext
65#define sys_sigreturn compat_sys_sigreturn
66
67#define old_sigaction old_sigaction32
68#define sigcontext sigcontext32
69#define mcontext mcontext32
70#define ucontext ucontext32
71
72
73
74
75
76#define UCONTEXTSIZEWITHOUTVSX \
77 (sizeof(struct ucontext) - sizeof(elf_vsrreghalf_t32))
78
79
80
81
82
83
84
85
86#define GP_REGS_SIZE min(sizeof(elf_gregset_t32), sizeof(struct pt_regs32))
87#undef __SIGNAL_FRAMESIZE
88#define __SIGNAL_FRAMESIZE __SIGNAL_FRAMESIZE32
89#undef ELF_NVRREG
90#define ELF_NVRREG ELF_NVRREG32
91
92
93
94
95
96static inline int put_sigset_t(compat_sigset_t __user *uset, sigset_t *set)
97{
98 compat_sigset_t cset;
99
100 switch (_NSIG_WORDS) {
101 case 4: cset.sig[6] = set->sig[3] & 0xffffffffull;
102 cset.sig[7] = set->sig[3] >> 32;
103 case 3: cset.sig[4] = set->sig[2] & 0xffffffffull;
104 cset.sig[5] = set->sig[2] >> 32;
105 case 2: cset.sig[2] = set->sig[1] & 0xffffffffull;
106 cset.sig[3] = set->sig[1] >> 32;
107 case 1: cset.sig[0] = set->sig[0] & 0xffffffffull;
108 cset.sig[1] = set->sig[0] >> 32;
109 }
110 return copy_to_user(uset, &cset, sizeof(*uset));
111}
112
113static inline int get_sigset_t(sigset_t *set,
114 const compat_sigset_t __user *uset)
115{
116 compat_sigset_t s32;
117
118 if (copy_from_user(&s32, uset, sizeof(*uset)))
119 return -EFAULT;
120
121
122
123
124
125 switch (_NSIG_WORDS) {
126 case 4: set->sig[3] = s32.sig[6] | (((long)s32.sig[7]) << 32);
127 case 3: set->sig[2] = s32.sig[4] | (((long)s32.sig[5]) << 32);
128 case 2: set->sig[1] = s32.sig[2] | (((long)s32.sig[3]) << 32);
129 case 1: set->sig[0] = s32.sig[0] | (((long)s32.sig[1]) << 32);
130 }
131 return 0;
132}
133
134static inline int get_old_sigaction(struct k_sigaction *new_ka,
135 struct old_sigaction __user *act)
136{
137 compat_old_sigset_t mask;
138 compat_uptr_t handler, restorer;
139
140 if (get_user(handler, &act->sa_handler) ||
141 __get_user(restorer, &act->sa_restorer) ||
142 __get_user(new_ka->sa.sa_flags, &act->sa_flags) ||
143 __get_user(mask, &act->sa_mask))
144 return -EFAULT;
145 new_ka->sa.sa_handler = compat_ptr(handler);
146 new_ka->sa.sa_restorer = compat_ptr(restorer);
147 siginitset(&new_ka->sa.sa_mask, mask);
148 return 0;
149}
150
151#define to_user_ptr(p) ptr_to_compat(p)
152#define from_user_ptr(p) compat_ptr(p)
153
154static inline int save_general_regs(struct pt_regs *regs,
155 struct mcontext __user *frame)
156{
157 elf_greg_t64 *gregs = (elf_greg_t64 *)regs;
158 int i;
159
160 WARN_ON(!FULL_REGS(regs));
161
162 for (i = 0; i <= PT_RESULT; i ++) {
163 if (i == 14 && !FULL_REGS(regs))
164 i = 32;
165 if (__put_user((unsigned int)gregs[i], &frame->mc_gregs[i]))
166 return -EFAULT;
167 }
168 return 0;
169}
170
171static inline int restore_general_regs(struct pt_regs *regs,
172 struct mcontext __user *sr)
173{
174 elf_greg_t64 *gregs = (elf_greg_t64 *)regs;
175 int i;
176
177 for (i = 0; i <= PT_RESULT; i++) {
178 if ((i == PT_MSR) || (i == PT_SOFTE))
179 continue;
180 if (__get_user(gregs[i], &sr->mc_gregs[i]))
181 return -EFAULT;
182 }
183 return 0;
184}
185
186#else
187
188#define GP_REGS_SIZE min(sizeof(elf_gregset_t), sizeof(struct pt_regs))
189
190static inline int put_sigset_t(sigset_t __user *uset, sigset_t *set)
191{
192 return copy_to_user(uset, set, sizeof(*uset));
193}
194
195static inline int get_sigset_t(sigset_t *set, const sigset_t __user *uset)
196{
197 return copy_from_user(set, uset, sizeof(*uset));
198}
199
200static inline int get_old_sigaction(struct k_sigaction *new_ka,
201 struct old_sigaction __user *act)
202{
203 old_sigset_t mask;
204
205 if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
206 __get_user(new_ka->sa.sa_handler, &act->sa_handler) ||
207 __get_user(new_ka->sa.sa_restorer, &act->sa_restorer) ||
208 __get_user(new_ka->sa.sa_flags, &act->sa_flags) ||
209 __get_user(mask, &act->sa_mask))
210 return -EFAULT;
211 siginitset(&new_ka->sa.sa_mask, mask);
212 return 0;
213}
214
215#define to_user_ptr(p) ((unsigned long)(p))
216#define from_user_ptr(p) ((void __user *)(p))
217
218static inline int save_general_regs(struct pt_regs *regs,
219 struct mcontext __user *frame)
220{
221 WARN_ON(!FULL_REGS(regs));
222 return __copy_to_user(&frame->mc_gregs, regs, GP_REGS_SIZE);
223}
224
225static inline int restore_general_regs(struct pt_regs *regs,
226 struct mcontext __user *sr)
227{
228
229 if (__copy_from_user(regs, &sr->mc_gregs,
230 PT_MSR * sizeof(elf_greg_t)))
231 return -EFAULT;
232
233 if (__copy_from_user(®s->orig_gpr3, &sr->mc_gregs[PT_ORIG_R3],
234 GP_REGS_SIZE - PT_ORIG_R3 * sizeof(elf_greg_t)))
235 return -EFAULT;
236 return 0;
237}
238
239#endif
240
241
242
243
244long sys_sigsuspend(old_sigset_t mask)
245{
246 sigset_t blocked;
247 siginitset(&blocked, mask);
248 return sigsuspend(&blocked);
249}
250
251long sys_sigaction(int sig, struct old_sigaction __user *act,
252 struct old_sigaction __user *oact)
253{
254 struct k_sigaction new_ka, old_ka;
255 int ret;
256
257#ifdef CONFIG_PPC64
258 if (sig < 0)
259 sig = -sig;
260#endif
261
262 if (act) {
263 if (get_old_sigaction(&new_ka, act))
264 return -EFAULT;
265 }
266
267 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
268 if (!ret && oact) {
269 if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
270 __put_user(to_user_ptr(old_ka.sa.sa_handler),
271 &oact->sa_handler) ||
272 __put_user(to_user_ptr(old_ka.sa.sa_restorer),
273 &oact->sa_restorer) ||
274 __put_user(old_ka.sa.sa_flags, &oact->sa_flags) ||
275 __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask))
276 return -EFAULT;
277 }
278
279 return ret;
280}
281
282
283
284
285
286
287
288
289
290
291
292
293
294struct sigframe {
295 struct sigcontext sctx;
296 struct mcontext mctx;
297
298
299
300
301 int abigap[56];
302};
303
304
305#define tramp mc_pad
306
307
308
309
310
311
312
313
314
315
316
317
318struct rt_sigframe {
319#ifdef CONFIG_PPC64
320 compat_siginfo_t info;
321#else
322 struct siginfo info;
323#endif
324 struct ucontext uc;
325
326
327
328
329 int abigap[56];
330};
331
332#ifdef CONFIG_VSX
333unsigned long copy_fpr_to_user(void __user *to,
334 struct task_struct *task)
335{
336 double buf[ELF_NFPREG];
337 int i;
338
339
340 for (i = 0; i < (ELF_NFPREG - 1) ; i++)
341 buf[i] = task->thread.TS_FPR(i);
342 memcpy(&buf[i], &task->thread.fpscr, sizeof(double));
343 return __copy_to_user(to, buf, ELF_NFPREG * sizeof(double));
344}
345
346unsigned long copy_fpr_from_user(struct task_struct *task,
347 void __user *from)
348{
349 double buf[ELF_NFPREG];
350 int i;
351
352 if (__copy_from_user(buf, from, ELF_NFPREG * sizeof(double)))
353 return 1;
354 for (i = 0; i < (ELF_NFPREG - 1) ; i++)
355 task->thread.TS_FPR(i) = buf[i];
356 memcpy(&task->thread.fpscr, &buf[i], sizeof(double));
357
358 return 0;
359}
360
361unsigned long copy_vsx_to_user(void __user *to,
362 struct task_struct *task)
363{
364 double buf[ELF_NVSRHALFREG];
365 int i;
366
367
368 for (i = 0; i < ELF_NVSRHALFREG; i++)
369 buf[i] = task->thread.fpr[i][TS_VSRLOWOFFSET];
370 return __copy_to_user(to, buf, ELF_NVSRHALFREG * sizeof(double));
371}
372
373unsigned long copy_vsx_from_user(struct task_struct *task,
374 void __user *from)
375{
376 double buf[ELF_NVSRHALFREG];
377 int i;
378
379 if (__copy_from_user(buf, from, ELF_NVSRHALFREG * sizeof(double)))
380 return 1;
381 for (i = 0; i < ELF_NVSRHALFREG ; i++)
382 task->thread.fpr[i][TS_VSRLOWOFFSET] = buf[i];
383 return 0;
384}
385#else
386inline unsigned long copy_fpr_to_user(void __user *to,
387 struct task_struct *task)
388{
389 return __copy_to_user(to, task->thread.fpr,
390 ELF_NFPREG * sizeof(double));
391}
392
393inline unsigned long copy_fpr_from_user(struct task_struct *task,
394 void __user *from)
395{
396 return __copy_from_user(task->thread.fpr, from,
397 ELF_NFPREG * sizeof(double));
398}
399#endif
400
401
402
403
404
405
406static int save_user_regs(struct pt_regs *regs, struct mcontext __user *frame,
407 int sigret, int ctx_has_vsx_region)
408{
409 unsigned long msr = regs->msr;
410
411
412 flush_fp_to_thread(current);
413
414
415 if (save_general_regs(regs, frame))
416 return 1;
417
418#ifdef CONFIG_ALTIVEC
419
420 if (current->thread.used_vr) {
421 flush_altivec_to_thread(current);
422 if (__copy_to_user(&frame->mc_vregs, current->thread.vr,
423 ELF_NVRREG * sizeof(vector128)))
424 return 1;
425
426
427 msr |= MSR_VEC;
428 }
429
430
431
432
433
434
435
436 if (__put_user(current->thread.vrsave, (u32 __user *)&frame->mc_vregs[32]))
437 return 1;
438#endif
439 if (copy_fpr_to_user(&frame->mc_fregs, current))
440 return 1;
441#ifdef CONFIG_VSX
442
443
444
445
446
447
448 if (current->thread.used_vsr && ctx_has_vsx_region) {
449 __giveup_vsx(current);
450 if (copy_vsx_to_user(&frame->mc_vsregs, current))
451 return 1;
452 msr |= MSR_VSX;
453 }
454#endif
455#ifdef CONFIG_SPE
456
457 if (current->thread.used_spe) {
458 flush_spe_to_thread(current);
459 if (__copy_to_user(&frame->mc_vregs, current->thread.evr,
460 ELF_NEVRREG * sizeof(u32)))
461 return 1;
462
463
464 msr |= MSR_SPE;
465 }
466
467
468
469 if (__put_user(current->thread.spefscr, (u32 __user *)&frame->mc_vregs + ELF_NEVRREG))
470 return 1;
471#endif
472
473 if (__put_user(msr, &frame->mc_gregs[PT_MSR]))
474 return 1;
475 if (sigret) {
476
477 if (__put_user(0x38000000UL + sigret, &frame->tramp[0])
478 || __put_user(0x44000002UL, &frame->tramp[1]))
479 return 1;
480 flush_icache_range((unsigned long) &frame->tramp[0],
481 (unsigned long) &frame->tramp[2]);
482 }
483
484 return 0;
485}
486
487
488
489
490
491static long restore_user_regs(struct pt_regs *regs,
492 struct mcontext __user *sr, int sig)
493{
494 long err;
495 unsigned int save_r2 = 0;
496 unsigned long msr;
497#ifdef CONFIG_VSX
498 int i;
499#endif
500
501
502
503
504
505 if (!sig)
506 save_r2 = (unsigned int)regs->gpr[2];
507 err = restore_general_regs(regs, sr);
508 regs->trap = 0;
509 err |= __get_user(msr, &sr->mc_gregs[PT_MSR]);
510 if (!sig)
511 regs->gpr[2] = (unsigned long) save_r2;
512 if (err)
513 return 1;
514
515
516 if (sig)
517 regs->msr = (regs->msr & ~MSR_LE) | (msr & MSR_LE);
518
519
520
521
522
523
524
525
526 discard_lazy_cpu_state();
527
528#ifdef CONFIG_ALTIVEC
529
530
531
532
533 regs->msr &= ~MSR_VEC;
534 if (msr & MSR_VEC) {
535
536 if (__copy_from_user(current->thread.vr, &sr->mc_vregs,
537 sizeof(sr->mc_vregs)))
538 return 1;
539 } else if (current->thread.used_vr)
540 memset(current->thread.vr, 0, ELF_NVRREG * sizeof(vector128));
541
542
543 if (__get_user(current->thread.vrsave, (u32 __user *)&sr->mc_vregs[32]))
544 return 1;
545#endif
546 if (copy_fpr_from_user(current, &sr->mc_fregs))
547 return 1;
548
549#ifdef CONFIG_VSX
550
551
552
553
554 regs->msr &= ~MSR_VSX;
555 if (msr & MSR_VSX) {
556
557
558
559
560 if (copy_vsx_from_user(current, &sr->mc_vsregs))
561 return 1;
562 } else if (current->thread.used_vsr)
563 for (i = 0; i < 32 ; i++)
564 current->thread.fpr[i][TS_VSRLOWOFFSET] = 0;
565#endif
566
567
568
569
570 regs->msr &= ~(MSR_FP | MSR_FE0 | MSR_FE1);
571
572#ifdef CONFIG_SPE
573
574
575 regs->msr &= ~MSR_SPE;
576 if (msr & MSR_SPE) {
577
578 if (__copy_from_user(current->thread.evr, &sr->mc_vregs,
579 ELF_NEVRREG * sizeof(u32)))
580 return 1;
581 } else if (current->thread.used_spe)
582 memset(current->thread.evr, 0, ELF_NEVRREG * sizeof(u32));
583
584
585 if (__get_user(current->thread.spefscr, (u32 __user *)&sr->mc_vregs + ELF_NEVRREG))
586 return 1;
587#endif
588
589 return 0;
590}
591
592#ifdef CONFIG_PPC64
593long compat_sys_rt_sigaction(int sig, const struct sigaction32 __user *act,
594 struct sigaction32 __user *oact, size_t sigsetsize)
595{
596 struct k_sigaction new_ka, old_ka;
597 int ret;
598
599
600 if (sigsetsize != sizeof(compat_sigset_t))
601 return -EINVAL;
602
603 if (act) {
604 compat_uptr_t handler;
605
606 ret = get_user(handler, &act->sa_handler);
607 new_ka.sa.sa_handler = compat_ptr(handler);
608 ret |= get_sigset_t(&new_ka.sa.sa_mask, &act->sa_mask);
609 ret |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
610 if (ret)
611 return -EFAULT;
612 }
613
614 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
615 if (!ret && oact) {
616 ret = put_user(to_user_ptr(old_ka.sa.sa_handler), &oact->sa_handler);
617 ret |= put_sigset_t(&oact->sa_mask, &old_ka.sa.sa_mask);
618 ret |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
619 }
620 return ret;
621}
622
623
624
625
626
627
628
629
630long compat_sys_rt_sigprocmask(u32 how, compat_sigset_t __user *set,
631 compat_sigset_t __user *oset, size_t sigsetsize)
632{
633 sigset_t s;
634 sigset_t __user *up;
635 int ret;
636 mm_segment_t old_fs = get_fs();
637
638 if (set) {
639 if (get_sigset_t(&s, set))
640 return -EFAULT;
641 }
642
643 set_fs(KERNEL_DS);
644
645 up = (sigset_t __user *) &s;
646 ret = sys_rt_sigprocmask((int)how, set ? up : NULL, oset ? up : NULL,
647 sigsetsize);
648 set_fs(old_fs);
649 if (ret)
650 return ret;
651 if (oset) {
652 if (put_sigset_t(oset, &s))
653 return -EFAULT;
654 }
655 return 0;
656}
657
658long compat_sys_rt_sigpending(compat_sigset_t __user *set, compat_size_t sigsetsize)
659{
660 sigset_t s;
661 int ret;
662 mm_segment_t old_fs = get_fs();
663
664 set_fs(KERNEL_DS);
665
666 ret = sys_rt_sigpending((sigset_t __user *) &s, sigsetsize);
667 set_fs(old_fs);
668 if (!ret) {
669 if (put_sigset_t(set, &s))
670 return -EFAULT;
671 }
672 return ret;
673}
674
675
676int copy_siginfo_to_user32(struct compat_siginfo __user *d, siginfo_t *s)
677{
678 int err;
679
680 if (!access_ok (VERIFY_WRITE, d, sizeof(*d)))
681 return -EFAULT;
682
683
684
685
686
687
688
689
690
691 err = __put_user(s->si_signo, &d->si_signo);
692 err |= __put_user(s->si_errno, &d->si_errno);
693 err |= __put_user((short)s->si_code, &d->si_code);
694 if (s->si_code < 0)
695 err |= __copy_to_user(&d->_sifields._pad, &s->_sifields._pad,
696 SI_PAD_SIZE32);
697 else switch(s->si_code >> 16) {
698 case __SI_CHLD >> 16:
699 err |= __put_user(s->si_pid, &d->si_pid);
700 err |= __put_user(s->si_uid, &d->si_uid);
701 err |= __put_user(s->si_utime, &d->si_utime);
702 err |= __put_user(s->si_stime, &d->si_stime);
703 err |= __put_user(s->si_status, &d->si_status);
704 break;
705 case __SI_FAULT >> 16:
706 err |= __put_user((unsigned int)(unsigned long)s->si_addr,
707 &d->si_addr);
708 break;
709 case __SI_POLL >> 16:
710 err |= __put_user(s->si_band, &d->si_band);
711 err |= __put_user(s->si_fd, &d->si_fd);
712 break;
713 case __SI_TIMER >> 16:
714 err |= __put_user(s->si_tid, &d->si_tid);
715 err |= __put_user(s->si_overrun, &d->si_overrun);
716 err |= __put_user(s->si_int, &d->si_int);
717 break;
718 case __SI_RT >> 16:
719 case __SI_MESGQ >> 16:
720 err |= __put_user(s->si_int, &d->si_int);
721
722 case __SI_KILL >> 16:
723 default:
724 err |= __put_user(s->si_pid, &d->si_pid);
725 err |= __put_user(s->si_uid, &d->si_uid);
726 break;
727 }
728 return err;
729}
730
731#define copy_siginfo_to_user copy_siginfo_to_user32
732
733int copy_siginfo_from_user32(siginfo_t *to, struct compat_siginfo __user *from)
734{
735 memset(to, 0, sizeof *to);
736
737 if (copy_from_user(to, from, 3*sizeof(int)) ||
738 copy_from_user(to->_sifields._pad,
739 from->_sifields._pad, SI_PAD_SIZE32))
740 return -EFAULT;
741
742 return 0;
743}
744
745
746
747
748
749
750
751
752long compat_sys_rt_sigqueueinfo(u32 pid, u32 sig, compat_siginfo_t __user *uinfo)
753{
754 siginfo_t info;
755 int ret;
756 mm_segment_t old_fs = get_fs();
757
758 ret = copy_siginfo_from_user32(&info, uinfo);
759 if (unlikely(ret))
760 return ret;
761
762 set_fs (KERNEL_DS);
763
764 ret = sys_rt_sigqueueinfo((int)pid, (int)sig, (siginfo_t __user *) &info);
765 set_fs (old_fs);
766 return ret;
767}
768
769
770
771
772
773
774
775int compat_sys_sigaltstack(u32 __new, u32 __old, int r5,
776 int r6, int r7, int r8, struct pt_regs *regs)
777{
778 stack_32_t __user * newstack = compat_ptr(__new);
779 stack_32_t __user * oldstack = compat_ptr(__old);
780 stack_t uss, uoss;
781 int ret;
782 mm_segment_t old_fs;
783 unsigned long sp;
784 compat_uptr_t ss_sp;
785
786
787
788
789
790 sp = regs->gpr[1];
791
792
793 if (newstack) {
794 if (get_user(ss_sp, &newstack->ss_sp) ||
795 __get_user(uss.ss_flags, &newstack->ss_flags) ||
796 __get_user(uss.ss_size, &newstack->ss_size))
797 return -EFAULT;
798 uss.ss_sp = compat_ptr(ss_sp);
799 }
800
801 old_fs = get_fs();
802 set_fs(KERNEL_DS);
803
804 ret = do_sigaltstack(
805 newstack ? (stack_t __user *) &uss : NULL,
806 oldstack ? (stack_t __user *) &uoss : NULL,
807 sp);
808 set_fs(old_fs);
809
810 if (!ret && oldstack &&
811 (put_user(ptr_to_compat(uoss.ss_sp), &oldstack->ss_sp) ||
812 __put_user(uoss.ss_flags, &oldstack->ss_flags) ||
813 __put_user(uoss.ss_size, &oldstack->ss_size)))
814 return -EFAULT;
815 return ret;
816}
817#endif
818
819
820
821
822
823int handle_rt_signal32(unsigned long sig, struct k_sigaction *ka,
824 siginfo_t *info, sigset_t *oldset,
825 struct pt_regs *regs)
826{
827 struct rt_sigframe __user *rt_sf;
828 struct mcontext __user *frame;
829 void __user *addr;
830 unsigned long newsp = 0;
831
832
833
834 rt_sf = get_sigframe(ka, regs, sizeof(*rt_sf), 1);
835 addr = rt_sf;
836 if (unlikely(rt_sf == NULL))
837 goto badframe;
838
839
840 if (copy_siginfo_to_user(&rt_sf->info, info)
841 || __put_user(0, &rt_sf->uc.uc_flags)
842 || __put_user(0, &rt_sf->uc.uc_link)
843 || __put_user(current->sas_ss_sp, &rt_sf->uc.uc_stack.ss_sp)
844 || __put_user(sas_ss_flags(regs->gpr[1]),
845 &rt_sf->uc.uc_stack.ss_flags)
846 || __put_user(current->sas_ss_size, &rt_sf->uc.uc_stack.ss_size)
847 || __put_user(to_user_ptr(&rt_sf->uc.uc_mcontext),
848 &rt_sf->uc.uc_regs)
849 || put_sigset_t(&rt_sf->uc.uc_sigmask, oldset))
850 goto badframe;
851
852
853 frame = &rt_sf->uc.uc_mcontext;
854 addr = frame;
855 if (vdso32_rt_sigtramp && current->mm->context.vdso_base) {
856 if (save_user_regs(regs, frame, 0, 1))
857 goto badframe;
858 regs->link = current->mm->context.vdso_base + vdso32_rt_sigtramp;
859 } else {
860 if (save_user_regs(regs, frame, __NR_rt_sigreturn, 1))
861 goto badframe;
862 regs->link = (unsigned long) frame->tramp;
863 }
864
865 current->thread.fpscr.val = 0;
866
867
868 newsp = ((unsigned long)rt_sf) - (__SIGNAL_FRAMESIZE + 16);
869 addr = (void __user *)regs->gpr[1];
870 if (put_user(regs->gpr[1], (u32 __user *)newsp))
871 goto badframe;
872
873
874 regs->gpr[1] = newsp;
875 regs->gpr[3] = sig;
876 regs->gpr[4] = (unsigned long) &rt_sf->info;
877 regs->gpr[5] = (unsigned long) &rt_sf->uc;
878 regs->gpr[6] = (unsigned long) rt_sf;
879 regs->nip = (unsigned long) ka->sa.sa_handler;
880
881 regs->msr &= ~MSR_LE;
882 return 1;
883
884badframe:
885#ifdef DEBUG_SIG
886 printk("badframe in handle_rt_signal, regs=%p frame=%p newsp=%lx\n",
887 regs, frame, newsp);
888#endif
889 if (show_unhandled_signals)
890 printk_ratelimited(KERN_INFO
891 "%s[%d]: bad frame in handle_rt_signal32: "
892 "%p nip %08lx lr %08lx\n",
893 current->comm, current->pid,
894 addr, regs->nip, regs->link);
895
896 force_sigsegv(sig, current);
897 return 0;
898}
899
900static int do_setcontext(struct ucontext __user *ucp, struct pt_regs *regs, int sig)
901{
902 sigset_t set;
903 struct mcontext __user *mcp;
904
905 if (get_sigset_t(&set, &ucp->uc_sigmask))
906 return -EFAULT;
907#ifdef CONFIG_PPC64
908 {
909 u32 cmcp;
910
911 if (__get_user(cmcp, &ucp->uc_regs))
912 return -EFAULT;
913 mcp = (struct mcontext __user *)(u64)cmcp;
914
915 }
916#else
917 if (__get_user(mcp, &ucp->uc_regs))
918 return -EFAULT;
919 if (!access_ok(VERIFY_READ, mcp, sizeof(*mcp)))
920 return -EFAULT;
921#endif
922 set_current_blocked(&set);
923 if (restore_user_regs(regs, mcp, sig))
924 return -EFAULT;
925
926 return 0;
927}
928
929long sys_swapcontext(struct ucontext __user *old_ctx,
930 struct ucontext __user *new_ctx,
931 int ctx_size, int r6, int r7, int r8, struct pt_regs *regs)
932{
933 unsigned char tmp;
934 int ctx_has_vsx_region = 0;
935
936#ifdef CONFIG_PPC64
937 unsigned long new_msr = 0;
938
939 if (new_ctx) {
940 struct mcontext __user *mcp;
941 u32 cmcp;
942
943
944
945
946
947
948 if (__get_user(cmcp, &new_ctx->uc_regs))
949 return -EFAULT;
950 mcp = (struct mcontext __user *)(u64)cmcp;
951 if (__get_user(new_msr, &mcp->mc_gregs[PT_MSR]))
952 return -EFAULT;
953 }
954
955
956
957
958 if (ctx_size < UCONTEXTSIZEWITHOUTVSX)
959 return -EINVAL;
960
961
962
963
964 if ((ctx_size < sizeof(struct ucontext)) &&
965 (new_msr & MSR_VSX))
966 return -EINVAL;
967
968 if (ctx_size >= sizeof(struct ucontext))
969 ctx_has_vsx_region = 1;
970#else
971
972
973
974 if (ctx_size < sizeof(struct ucontext))
975 return -EINVAL;
976#endif
977 if (old_ctx != NULL) {
978 struct mcontext __user *mctx;
979
980
981
982
983
984
985
986
987 mctx = (struct mcontext __user *)
988 ((unsigned long) &old_ctx->uc_mcontext & ~0xfUL);
989 if (!access_ok(VERIFY_WRITE, old_ctx, ctx_size)
990 || save_user_regs(regs, mctx, 0, ctx_has_vsx_region)
991 || put_sigset_t(&old_ctx->uc_sigmask, ¤t->blocked)
992 || __put_user(to_user_ptr(mctx), &old_ctx->uc_regs))
993 return -EFAULT;
994 }
995 if (new_ctx == NULL)
996 return 0;
997 if (!access_ok(VERIFY_READ, new_ctx, ctx_size)
998 || __get_user(tmp, (u8 __user *) new_ctx)
999 || __get_user(tmp, (u8 __user *) new_ctx + ctx_size - 1))
1000 return -EFAULT;
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013 if (do_setcontext(new_ctx, regs, 0))
1014 do_exit(SIGSEGV);
1015
1016 set_thread_flag(TIF_RESTOREALL);
1017 return 0;
1018}
1019
1020long sys_rt_sigreturn(int r3, int r4, int r5, int r6, int r7, int r8,
1021 struct pt_regs *regs)
1022{
1023 struct rt_sigframe __user *rt_sf;
1024
1025
1026 current_thread_info()->restart_block.fn = do_no_restart_syscall;
1027
1028 rt_sf = (struct rt_sigframe __user *)
1029 (regs->gpr[1] + __SIGNAL_FRAMESIZE + 16);
1030 if (!access_ok(VERIFY_READ, rt_sf, sizeof(*rt_sf)))
1031 goto bad;
1032 if (do_setcontext(&rt_sf->uc, regs, 1))
1033 goto bad;
1034
1035
1036
1037
1038
1039
1040
1041
1042#ifdef CONFIG_PPC64
1043
1044
1045
1046
1047
1048 compat_sys_sigaltstack((u32)(u64)&rt_sf->uc.uc_stack, 0, 0, 0, 0, 0, regs);
1049#else
1050 do_sigaltstack(&rt_sf->uc.uc_stack, NULL, regs->gpr[1]);
1051#endif
1052 set_thread_flag(TIF_RESTOREALL);
1053 return 0;
1054
1055 bad:
1056 if (show_unhandled_signals)
1057 printk_ratelimited(KERN_INFO
1058 "%s[%d]: bad frame in sys_rt_sigreturn: "
1059 "%p nip %08lx lr %08lx\n",
1060 current->comm, current->pid,
1061 rt_sf, regs->nip, regs->link);
1062
1063 force_sig(SIGSEGV, current);
1064 return 0;
1065}
1066
1067#ifdef CONFIG_PPC32
1068int sys_debug_setcontext(struct ucontext __user *ctx,
1069 int ndbg, struct sig_dbg_op __user *dbg,
1070 int r6, int r7, int r8,
1071 struct pt_regs *regs)
1072{
1073 struct sig_dbg_op op;
1074 int i;
1075 unsigned char tmp;
1076 unsigned long new_msr = regs->msr;
1077#ifdef CONFIG_PPC_ADV_DEBUG_REGS
1078 unsigned long new_dbcr0 = current->thread.dbcr0;
1079#endif
1080
1081 for (i=0; i<ndbg; i++) {
1082 if (copy_from_user(&op, dbg + i, sizeof(op)))
1083 return -EFAULT;
1084 switch (op.dbg_type) {
1085 case SIG_DBG_SINGLE_STEPPING:
1086#ifdef CONFIG_PPC_ADV_DEBUG_REGS
1087 if (op.dbg_value) {
1088 new_msr |= MSR_DE;
1089 new_dbcr0 |= (DBCR0_IDM | DBCR0_IC);
1090 } else {
1091 new_dbcr0 &= ~DBCR0_IC;
1092 if (!DBCR_ACTIVE_EVENTS(new_dbcr0,
1093 current->thread.dbcr1)) {
1094 new_msr &= ~MSR_DE;
1095 new_dbcr0 &= ~DBCR0_IDM;
1096 }
1097 }
1098#else
1099 if (op.dbg_value)
1100 new_msr |= MSR_SE;
1101 else
1102 new_msr &= ~MSR_SE;
1103#endif
1104 break;
1105 case SIG_DBG_BRANCH_TRACING:
1106#ifdef CONFIG_PPC_ADV_DEBUG_REGS
1107 return -EINVAL;
1108#else
1109 if (op.dbg_value)
1110 new_msr |= MSR_BE;
1111 else
1112 new_msr &= ~MSR_BE;
1113#endif
1114 break;
1115
1116 default:
1117 return -EINVAL;
1118 }
1119 }
1120
1121
1122
1123
1124
1125
1126 regs->msr = new_msr;
1127#ifdef CONFIG_PPC_ADV_DEBUG_REGS
1128 current->thread.dbcr0 = new_dbcr0;
1129#endif
1130
1131 if (!access_ok(VERIFY_READ, ctx, sizeof(*ctx))
1132 || __get_user(tmp, (u8 __user *) ctx)
1133 || __get_user(tmp, (u8 __user *) (ctx + 1) - 1))
1134 return -EFAULT;
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147 if (do_setcontext(ctx, regs, 1)) {
1148 if (show_unhandled_signals)
1149 printk_ratelimited(KERN_INFO "%s[%d]: bad frame in "
1150 "sys_debug_setcontext: %p nip %08lx "
1151 "lr %08lx\n",
1152 current->comm, current->pid,
1153 ctx, regs->nip, regs->link);
1154
1155 force_sig(SIGSEGV, current);
1156 goto out;
1157 }
1158
1159
1160
1161
1162
1163
1164
1165
1166 do_sigaltstack(&ctx->uc_stack, NULL, regs->gpr[1]);
1167
1168 set_thread_flag(TIF_RESTOREALL);
1169 out:
1170 return 0;
1171}
1172#endif
1173
1174
1175
1176
1177int handle_signal32(unsigned long sig, struct k_sigaction *ka,
1178 siginfo_t *info, sigset_t *oldset, struct pt_regs *regs)
1179{
1180 struct sigcontext __user *sc;
1181 struct sigframe __user *frame;
1182 unsigned long newsp = 0;
1183
1184
1185 frame = get_sigframe(ka, regs, sizeof(*frame), 1);
1186 if (unlikely(frame == NULL))
1187 goto badframe;
1188 sc = (struct sigcontext __user *) &frame->sctx;
1189
1190#if _NSIG != 64
1191#error "Please adjust handle_signal()"
1192#endif
1193 if (__put_user(to_user_ptr(ka->sa.sa_handler), &sc->handler)
1194 || __put_user(oldset->sig[0], &sc->oldmask)
1195#ifdef CONFIG_PPC64
1196 || __put_user((oldset->sig[0] >> 32), &sc->_unused[3])
1197#else
1198 || __put_user(oldset->sig[1], &sc->_unused[3])
1199#endif
1200 || __put_user(to_user_ptr(&frame->mctx), &sc->regs)
1201 || __put_user(sig, &sc->signal))
1202 goto badframe;
1203
1204 if (vdso32_sigtramp && current->mm->context.vdso_base) {
1205 if (save_user_regs(regs, &frame->mctx, 0, 1))
1206 goto badframe;
1207 regs->link = current->mm->context.vdso_base + vdso32_sigtramp;
1208 } else {
1209 if (save_user_regs(regs, &frame->mctx, __NR_sigreturn, 1))
1210 goto badframe;
1211 regs->link = (unsigned long) frame->mctx.tramp;
1212 }
1213
1214 current->thread.fpscr.val = 0;
1215
1216
1217 newsp = ((unsigned long)frame) - __SIGNAL_FRAMESIZE;
1218 if (put_user(regs->gpr[1], (u32 __user *)newsp))
1219 goto badframe;
1220
1221 regs->gpr[1] = newsp;
1222 regs->gpr[3] = sig;
1223 regs->gpr[4] = (unsigned long) sc;
1224 regs->nip = (unsigned long) ka->sa.sa_handler;
1225
1226 regs->msr &= ~MSR_LE;
1227
1228 return 1;
1229
1230badframe:
1231#ifdef DEBUG_SIG
1232 printk("badframe in handle_signal, regs=%p frame=%p newsp=%lx\n",
1233 regs, frame, newsp);
1234#endif
1235 if (show_unhandled_signals)
1236 printk_ratelimited(KERN_INFO
1237 "%s[%d]: bad frame in handle_signal32: "
1238 "%p nip %08lx lr %08lx\n",
1239 current->comm, current->pid,
1240 frame, regs->nip, regs->link);
1241
1242 force_sigsegv(sig, current);
1243 return 0;
1244}
1245
1246
1247
1248
1249long sys_sigreturn(int r3, int r4, int r5, int r6, int r7, int r8,
1250 struct pt_regs *regs)
1251{
1252 struct sigcontext __user *sc;
1253 struct sigcontext sigctx;
1254 struct mcontext __user *sr;
1255 void __user *addr;
1256 sigset_t set;
1257
1258
1259 current_thread_info()->restart_block.fn = do_no_restart_syscall;
1260
1261 sc = (struct sigcontext __user *)(regs->gpr[1] + __SIGNAL_FRAMESIZE);
1262 addr = sc;
1263 if (copy_from_user(&sigctx, sc, sizeof(sigctx)))
1264 goto badframe;
1265
1266#ifdef CONFIG_PPC64
1267
1268
1269
1270
1271 set.sig[0] = sigctx.oldmask + ((long)(sigctx._unused[3]) << 32);
1272#else
1273 set.sig[0] = sigctx.oldmask;
1274 set.sig[1] = sigctx._unused[3];
1275#endif
1276 set_current_blocked(&set);
1277
1278 sr = (struct mcontext __user *)from_user_ptr(sigctx.regs);
1279 addr = sr;
1280 if (!access_ok(VERIFY_READ, sr, sizeof(*sr))
1281 || restore_user_regs(regs, sr, 1))
1282 goto badframe;
1283
1284 set_thread_flag(TIF_RESTOREALL);
1285 return 0;
1286
1287badframe:
1288 if (show_unhandled_signals)
1289 printk_ratelimited(KERN_INFO
1290 "%s[%d]: bad frame in sys_sigreturn: "
1291 "%p nip %08lx lr %08lx\n",
1292 current->comm, current->pid,
1293 addr, regs->nip, regs->link);
1294
1295 force_sig(SIGSEGV, current);
1296 return 0;
1297}
1298