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#endif
39
40#include <asm/uaccess.h>
41#include <asm/cacheflush.h>
42#include <asm/syscalls.h>
43#include <asm/sigcontext.h>
44#include <asm/vdso.h>
45#include <asm/switch_to.h>
46#include <asm/tm.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
58#ifdef CONFIG_PPC64
59#define sys_rt_sigreturn compat_sys_rt_sigreturn
60#define sys_swapcontext compat_sys_swapcontext
61#define sys_sigreturn compat_sys_sigreturn
62
63#define old_sigaction old_sigaction32
64#define sigcontext sigcontext32
65#define mcontext mcontext32
66#define ucontext ucontext32
67
68#define __save_altstack __compat_save_altstack
69
70
71
72
73
74#define UCONTEXTSIZEWITHOUTVSX \
75 (sizeof(struct ucontext) - sizeof(elf_vsrreghalf_t32))
76
77
78
79
80
81
82
83
84#define GP_REGS_SIZE min(sizeof(elf_gregset_t32), sizeof(struct pt_regs32))
85#undef __SIGNAL_FRAMESIZE
86#define __SIGNAL_FRAMESIZE __SIGNAL_FRAMESIZE32
87#undef ELF_NVRREG
88#define ELF_NVRREG ELF_NVRREG32
89
90
91
92
93
94static inline int put_sigset_t(compat_sigset_t __user *uset, sigset_t *set)
95{
96 compat_sigset_t cset;
97
98 switch (_NSIG_WORDS) {
99 case 4: cset.sig[6] = set->sig[3] & 0xffffffffull;
100 cset.sig[7] = set->sig[3] >> 32;
101 case 3: cset.sig[4] = set->sig[2] & 0xffffffffull;
102 cset.sig[5] = set->sig[2] >> 32;
103 case 2: cset.sig[2] = set->sig[1] & 0xffffffffull;
104 cset.sig[3] = set->sig[1] >> 32;
105 case 1: cset.sig[0] = set->sig[0] & 0xffffffffull;
106 cset.sig[1] = set->sig[0] >> 32;
107 }
108 return copy_to_user(uset, &cset, sizeof(*uset));
109}
110
111static inline int get_sigset_t(sigset_t *set,
112 const compat_sigset_t __user *uset)
113{
114 compat_sigset_t s32;
115
116 if (copy_from_user(&s32, uset, sizeof(*uset)))
117 return -EFAULT;
118
119
120
121
122
123 switch (_NSIG_WORDS) {
124 case 4: set->sig[3] = s32.sig[6] | (((long)s32.sig[7]) << 32);
125 case 3: set->sig[2] = s32.sig[4] | (((long)s32.sig[5]) << 32);
126 case 2: set->sig[1] = s32.sig[2] | (((long)s32.sig[3]) << 32);
127 case 1: set->sig[0] = s32.sig[0] | (((long)s32.sig[1]) << 32);
128 }
129 return 0;
130}
131
132#define to_user_ptr(p) ptr_to_compat(p)
133#define from_user_ptr(p) compat_ptr(p)
134
135static inline int save_general_regs(struct pt_regs *regs,
136 struct mcontext __user *frame)
137{
138 elf_greg_t64 *gregs = (elf_greg_t64 *)regs;
139 int i;
140
141 WARN_ON(!FULL_REGS(regs));
142
143 for (i = 0; i <= PT_RESULT; i ++) {
144 if (i == 14 && !FULL_REGS(regs))
145 i = 32;
146 if (__put_user((unsigned int)gregs[i], &frame->mc_gregs[i]))
147 return -EFAULT;
148 }
149 return 0;
150}
151
152static inline int restore_general_regs(struct pt_regs *regs,
153 struct mcontext __user *sr)
154{
155 elf_greg_t64 *gregs = (elf_greg_t64 *)regs;
156 int i;
157
158 for (i = 0; i <= PT_RESULT; i++) {
159 if ((i == PT_MSR) || (i == PT_SOFTE))
160 continue;
161 if (__get_user(gregs[i], &sr->mc_gregs[i]))
162 return -EFAULT;
163 }
164 return 0;
165}
166
167#else
168
169#define GP_REGS_SIZE min(sizeof(elf_gregset_t), sizeof(struct pt_regs))
170
171static inline int put_sigset_t(sigset_t __user *uset, sigset_t *set)
172{
173 return copy_to_user(uset, set, sizeof(*uset));
174}
175
176static inline int get_sigset_t(sigset_t *set, const sigset_t __user *uset)
177{
178 return copy_from_user(set, uset, sizeof(*uset));
179}
180
181#define to_user_ptr(p) ((unsigned long)(p))
182#define from_user_ptr(p) ((void __user *)(p))
183
184static inline int save_general_regs(struct pt_regs *regs,
185 struct mcontext __user *frame)
186{
187 WARN_ON(!FULL_REGS(regs));
188 return __copy_to_user(&frame->mc_gregs, regs, GP_REGS_SIZE);
189}
190
191static inline int restore_general_regs(struct pt_regs *regs,
192 struct mcontext __user *sr)
193{
194
195 if (__copy_from_user(regs, &sr->mc_gregs,
196 PT_MSR * sizeof(elf_greg_t)))
197 return -EFAULT;
198
199 if (__copy_from_user(®s->orig_gpr3, &sr->mc_gregs[PT_ORIG_R3],
200 GP_REGS_SIZE - PT_ORIG_R3 * sizeof(elf_greg_t)))
201 return -EFAULT;
202 return 0;
203}
204#endif
205
206
207
208
209
210
211
212
213
214
215
216
217
218struct sigframe {
219 struct sigcontext sctx;
220 struct mcontext mctx;
221#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
222 struct sigcontext sctx_transact;
223 struct mcontext mctx_transact;
224#endif
225
226
227
228
229 int abigap[56];
230};
231
232
233#define tramp mc_pad
234
235
236
237
238
239
240
241
242
243
244
245
246struct rt_sigframe {
247#ifdef CONFIG_PPC64
248 compat_siginfo_t info;
249#else
250 struct siginfo info;
251#endif
252 struct ucontext uc;
253#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
254 struct ucontext uc_transact;
255#endif
256
257
258
259
260 int abigap[56];
261};
262
263#ifdef CONFIG_VSX
264unsigned long copy_fpr_to_user(void __user *to,
265 struct task_struct *task)
266{
267 u64 buf[ELF_NFPREG];
268 int i;
269
270
271 for (i = 0; i < (ELF_NFPREG - 1) ; i++)
272 buf[i] = task->thread.TS_FPR(i);
273 buf[i] = task->thread.fp_state.fpscr;
274 return __copy_to_user(to, buf, ELF_NFPREG * sizeof(double));
275}
276
277unsigned long copy_fpr_from_user(struct task_struct *task,
278 void __user *from)
279{
280 u64 buf[ELF_NFPREG];
281 int i;
282
283 if (__copy_from_user(buf, from, ELF_NFPREG * sizeof(double)))
284 return 1;
285 for (i = 0; i < (ELF_NFPREG - 1) ; i++)
286 task->thread.TS_FPR(i) = buf[i];
287 task->thread.fp_state.fpscr = buf[i];
288
289 return 0;
290}
291
292unsigned long copy_vsx_to_user(void __user *to,
293 struct task_struct *task)
294{
295 u64 buf[ELF_NVSRHALFREG];
296 int i;
297
298
299 for (i = 0; i < ELF_NVSRHALFREG; i++)
300 buf[i] = task->thread.fp_state.fpr[i][TS_VSRLOWOFFSET];
301 return __copy_to_user(to, buf, ELF_NVSRHALFREG * sizeof(double));
302}
303
304unsigned long copy_vsx_from_user(struct task_struct *task,
305 void __user *from)
306{
307 u64 buf[ELF_NVSRHALFREG];
308 int i;
309
310 if (__copy_from_user(buf, from, ELF_NVSRHALFREG * sizeof(double)))
311 return 1;
312 for (i = 0; i < ELF_NVSRHALFREG ; i++)
313 task->thread.fp_state.fpr[i][TS_VSRLOWOFFSET] = buf[i];
314 return 0;
315}
316
317#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
318unsigned long copy_transact_fpr_to_user(void __user *to,
319 struct task_struct *task)
320{
321 u64 buf[ELF_NFPREG];
322 int i;
323
324
325 for (i = 0; i < (ELF_NFPREG - 1) ; i++)
326 buf[i] = task->thread.TS_TRANS_FPR(i);
327 buf[i] = task->thread.transact_fp.fpscr;
328 return __copy_to_user(to, buf, ELF_NFPREG * sizeof(double));
329}
330
331unsigned long copy_transact_fpr_from_user(struct task_struct *task,
332 void __user *from)
333{
334 u64 buf[ELF_NFPREG];
335 int i;
336
337 if (__copy_from_user(buf, from, ELF_NFPREG * sizeof(double)))
338 return 1;
339 for (i = 0; i < (ELF_NFPREG - 1) ; i++)
340 task->thread.TS_TRANS_FPR(i) = buf[i];
341 task->thread.transact_fp.fpscr = buf[i];
342
343 return 0;
344}
345
346unsigned long copy_transact_vsx_to_user(void __user *to,
347 struct task_struct *task)
348{
349 u64 buf[ELF_NVSRHALFREG];
350 int i;
351
352
353 for (i = 0; i < ELF_NVSRHALFREG; i++)
354 buf[i] = task->thread.transact_fp.fpr[i][TS_VSRLOWOFFSET];
355 return __copy_to_user(to, buf, ELF_NVSRHALFREG * sizeof(double));
356}
357
358unsigned long copy_transact_vsx_from_user(struct task_struct *task,
359 void __user *from)
360{
361 u64 buf[ELF_NVSRHALFREG];
362 int i;
363
364 if (__copy_from_user(buf, from, ELF_NVSRHALFREG * sizeof(double)))
365 return 1;
366 for (i = 0; i < ELF_NVSRHALFREG ; i++)
367 task->thread.transact_fp.fpr[i][TS_VSRLOWOFFSET] = buf[i];
368 return 0;
369}
370#endif
371#else
372inline unsigned long copy_fpr_to_user(void __user *to,
373 struct task_struct *task)
374{
375 return __copy_to_user(to, task->thread.fp_state.fpr,
376 ELF_NFPREG * sizeof(double));
377}
378
379inline unsigned long copy_fpr_from_user(struct task_struct *task,
380 void __user *from)
381{
382 return __copy_from_user(task->thread.fp_state.fpr, from,
383 ELF_NFPREG * sizeof(double));
384}
385
386#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
387inline unsigned long copy_transact_fpr_to_user(void __user *to,
388 struct task_struct *task)
389{
390 return __copy_to_user(to, task->thread.transact_fp.fpr,
391 ELF_NFPREG * sizeof(double));
392}
393
394inline unsigned long copy_transact_fpr_from_user(struct task_struct *task,
395 void __user *from)
396{
397 return __copy_from_user(task->thread.transact_fp.fpr, from,
398 ELF_NFPREG * sizeof(double));
399}
400#endif
401#endif
402
403
404
405
406
407
408static int save_user_regs(struct pt_regs *regs, struct mcontext __user *frame,
409 struct mcontext __user *tm_frame, int sigret,
410 int ctx_has_vsx_region)
411{
412 unsigned long msr = regs->msr;
413
414
415 flush_fp_to_thread(current);
416
417
418 if (save_general_regs(regs, frame))
419 return 1;
420
421#ifdef CONFIG_ALTIVEC
422
423 if (current->thread.used_vr) {
424 flush_altivec_to_thread(current);
425 if (__copy_to_user(&frame->mc_vregs, ¤t->thread.vr_state,
426 ELF_NVRREG * sizeof(vector128)))
427 return 1;
428
429
430 msr |= MSR_VEC;
431 }
432
433
434
435
436
437
438
439
440 if (cpu_has_feature(CPU_FTR_ALTIVEC))
441 current->thread.vrsave = mfspr(SPRN_VRSAVE);
442 if (__put_user(current->thread.vrsave, (u32 __user *)&frame->mc_vregs[32]))
443 return 1;
444#endif
445 if (copy_fpr_to_user(&frame->mc_fregs, current))
446 return 1;
447
448
449
450
451
452 msr &= ~MSR_VSX;
453#ifdef CONFIG_VSX
454
455
456
457
458
459
460 if (current->thread.used_vsr && ctx_has_vsx_region) {
461 __giveup_vsx(current);
462 if (copy_vsx_to_user(&frame->mc_vsregs, current))
463 return 1;
464 msr |= MSR_VSX;
465 } else if (!ctx_has_vsx_region)
466
467
468
469
470
471 msr &= ~MSR_VSX;
472
473
474#endif
475#ifdef CONFIG_SPE
476
477 if (current->thread.used_spe) {
478 flush_spe_to_thread(current);
479 if (__copy_to_user(&frame->mc_vregs, current->thread.evr,
480 ELF_NEVRREG * sizeof(u32)))
481 return 1;
482
483
484 msr |= MSR_SPE;
485 }
486
487
488
489 if (__put_user(current->thread.spefscr, (u32 __user *)&frame->mc_vregs + ELF_NEVRREG))
490 return 1;
491#endif
492
493 if (__put_user(msr, &frame->mc_gregs[PT_MSR]))
494 return 1;
495
496
497
498 if (tm_frame && __put_user(0, &tm_frame->mc_gregs[PT_MSR]))
499 return 1;
500
501 if (sigret) {
502
503 if (__put_user(0x38000000UL + sigret, &frame->tramp[0])
504 || __put_user(0x44000002UL, &frame->tramp[1]))
505 return 1;
506 flush_icache_range((unsigned long) &frame->tramp[0],
507 (unsigned long) &frame->tramp[2]);
508 }
509
510 return 0;
511}
512
513#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
514
515
516
517
518
519
520
521
522
523static int save_tm_user_regs(struct pt_regs *regs,
524 struct mcontext __user *frame,
525 struct mcontext __user *tm_frame, int sigret)
526{
527 unsigned long msr = regs->msr;
528
529
530
531
532
533
534 regs->msr &= ~MSR_TS_MASK;
535
536
537 flush_fp_to_thread(current);
538
539
540 if (save_general_regs(¤t->thread.ckpt_regs, frame)
541 || save_general_regs(regs, tm_frame))
542 return 1;
543
544
545
546
547
548
549
550 if (__put_user((msr >> 32), &tm_frame->mc_gregs[PT_MSR]))
551 return 1;
552
553#ifdef CONFIG_ALTIVEC
554
555 if (current->thread.used_vr) {
556 flush_altivec_to_thread(current);
557 if (__copy_to_user(&frame->mc_vregs, ¤t->thread.vr_state,
558 ELF_NVRREG * sizeof(vector128)))
559 return 1;
560 if (msr & MSR_VEC) {
561 if (__copy_to_user(&tm_frame->mc_vregs,
562 ¤t->thread.transact_vr,
563 ELF_NVRREG * sizeof(vector128)))
564 return 1;
565 } else {
566 if (__copy_to_user(&tm_frame->mc_vregs,
567 ¤t->thread.vr_state,
568 ELF_NVRREG * sizeof(vector128)))
569 return 1;
570 }
571
572
573
574
575 msr |= MSR_VEC;
576 }
577
578
579
580
581
582
583 if (cpu_has_feature(CPU_FTR_ALTIVEC))
584 current->thread.vrsave = mfspr(SPRN_VRSAVE);
585 if (__put_user(current->thread.vrsave,
586 (u32 __user *)&frame->mc_vregs[32]))
587 return 1;
588 if (msr & MSR_VEC) {
589 if (__put_user(current->thread.transact_vrsave,
590 (u32 __user *)&tm_frame->mc_vregs[32]))
591 return 1;
592 } else {
593 if (__put_user(current->thread.vrsave,
594 (u32 __user *)&tm_frame->mc_vregs[32]))
595 return 1;
596 }
597#endif
598
599 if (copy_fpr_to_user(&frame->mc_fregs, current))
600 return 1;
601 if (msr & MSR_FP) {
602 if (copy_transact_fpr_to_user(&tm_frame->mc_fregs, current))
603 return 1;
604 } else {
605 if (copy_fpr_to_user(&tm_frame->mc_fregs, current))
606 return 1;
607 }
608
609#ifdef CONFIG_VSX
610
611
612
613
614
615
616 if (current->thread.used_vsr) {
617 __giveup_vsx(current);
618 if (copy_vsx_to_user(&frame->mc_vsregs, current))
619 return 1;
620 if (msr & MSR_VSX) {
621 if (copy_transact_vsx_to_user(&tm_frame->mc_vsregs,
622 current))
623 return 1;
624 } else {
625 if (copy_vsx_to_user(&tm_frame->mc_vsregs, current))
626 return 1;
627 }
628
629 msr |= MSR_VSX;
630 }
631#endif
632#ifdef CONFIG_SPE
633
634
635
636 if (current->thread.used_spe) {
637 flush_spe_to_thread(current);
638 if (__copy_to_user(&frame->mc_vregs, current->thread.evr,
639 ELF_NEVRREG * sizeof(u32)))
640 return 1;
641
642
643 msr |= MSR_SPE;
644 }
645
646
647 if (__put_user(current->thread.spefscr, (u32 __user *)&frame->mc_vregs + ELF_NEVRREG))
648 return 1;
649#endif
650
651 if (__put_user(msr, &frame->mc_gregs[PT_MSR]))
652 return 1;
653 if (sigret) {
654
655 if (__put_user(0x38000000UL + sigret, &frame->tramp[0])
656 || __put_user(0x44000002UL, &frame->tramp[1]))
657 return 1;
658 flush_icache_range((unsigned long) &frame->tramp[0],
659 (unsigned long) &frame->tramp[2]);
660 }
661
662 return 0;
663}
664#endif
665
666
667
668
669
670static long restore_user_regs(struct pt_regs *regs,
671 struct mcontext __user *sr, int sig)
672{
673 long err;
674 unsigned int save_r2 = 0;
675 unsigned long msr;
676#ifdef CONFIG_VSX
677 int i;
678#endif
679
680
681
682
683
684 if (!sig)
685 save_r2 = (unsigned int)regs->gpr[2];
686 err = restore_general_regs(regs, sr);
687 regs->trap = 0;
688 err |= __get_user(msr, &sr->mc_gregs[PT_MSR]);
689 if (!sig)
690 regs->gpr[2] = (unsigned long) save_r2;
691 if (err)
692 return 1;
693
694
695 if (sig)
696 regs->msr = (regs->msr & ~MSR_LE) | (msr & MSR_LE);
697
698
699
700
701
702
703
704
705 discard_lazy_cpu_state();
706
707#ifdef CONFIG_ALTIVEC
708
709
710
711
712 regs->msr &= ~MSR_VEC;
713 if (msr & MSR_VEC) {
714
715 if (__copy_from_user(¤t->thread.vr_state, &sr->mc_vregs,
716 sizeof(sr->mc_vregs)))
717 return 1;
718 } else if (current->thread.used_vr)
719 memset(¤t->thread.vr_state, 0,
720 ELF_NVRREG * sizeof(vector128));
721
722
723 if (__get_user(current->thread.vrsave, (u32 __user *)&sr->mc_vregs[32]))
724 return 1;
725 if (cpu_has_feature(CPU_FTR_ALTIVEC))
726 mtspr(SPRN_VRSAVE, current->thread.vrsave);
727#endif
728 if (copy_fpr_from_user(current, &sr->mc_fregs))
729 return 1;
730
731#ifdef CONFIG_VSX
732
733
734
735
736 regs->msr &= ~MSR_VSX;
737 if (msr & MSR_VSX) {
738
739
740
741
742 if (copy_vsx_from_user(current, &sr->mc_vsregs))
743 return 1;
744 } else if (current->thread.used_vsr)
745 for (i = 0; i < 32 ; i++)
746 current->thread.fp_state.fpr[i][TS_VSRLOWOFFSET] = 0;
747#endif
748
749
750
751
752 regs->msr &= ~(MSR_FP | MSR_FE0 | MSR_FE1);
753
754#ifdef CONFIG_SPE
755
756
757 regs->msr &= ~MSR_SPE;
758 if (msr & MSR_SPE) {
759
760 if (__copy_from_user(current->thread.evr, &sr->mc_vregs,
761 ELF_NEVRREG * sizeof(u32)))
762 return 1;
763 } else if (current->thread.used_spe)
764 memset(current->thread.evr, 0, ELF_NEVRREG * sizeof(u32));
765
766
767 if (__get_user(current->thread.spefscr, (u32 __user *)&sr->mc_vregs + ELF_NEVRREG))
768 return 1;
769#endif
770
771 return 0;
772}
773
774#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
775
776
777
778
779
780static long restore_tm_user_regs(struct pt_regs *regs,
781 struct mcontext __user *sr,
782 struct mcontext __user *tm_sr)
783{
784 long err;
785 unsigned long msr, msr_hi;
786#ifdef CONFIG_VSX
787 int i;
788#endif
789
790
791
792
793
794
795
796
797 err = restore_general_regs(regs, tm_sr);
798 err |= restore_general_regs(¤t->thread.ckpt_regs, sr);
799
800 err |= __get_user(current->thread.tm_tfhar, &sr->mc_gregs[PT_NIP]);
801
802 err |= __get_user(msr, &sr->mc_gregs[PT_MSR]);
803 if (err)
804 return 1;
805
806
807 regs->msr = (regs->msr & ~MSR_LE) | (msr & MSR_LE);
808
809
810
811
812
813
814
815
816 discard_lazy_cpu_state();
817
818#ifdef CONFIG_ALTIVEC
819 regs->msr &= ~MSR_VEC;
820 if (msr & MSR_VEC) {
821
822 if (__copy_from_user(¤t->thread.vr_state, &sr->mc_vregs,
823 sizeof(sr->mc_vregs)) ||
824 __copy_from_user(¤t->thread.transact_vr,
825 &tm_sr->mc_vregs,
826 sizeof(sr->mc_vregs)))
827 return 1;
828 } else if (current->thread.used_vr) {
829 memset(¤t->thread.vr_state, 0,
830 ELF_NVRREG * sizeof(vector128));
831 memset(¤t->thread.transact_vr, 0,
832 ELF_NVRREG * sizeof(vector128));
833 }
834
835
836 if (__get_user(current->thread.vrsave,
837 (u32 __user *)&sr->mc_vregs[32]) ||
838 __get_user(current->thread.transact_vrsave,
839 (u32 __user *)&tm_sr->mc_vregs[32]))
840 return 1;
841 if (cpu_has_feature(CPU_FTR_ALTIVEC))
842 mtspr(SPRN_VRSAVE, current->thread.vrsave);
843#endif
844
845 regs->msr &= ~(MSR_FP | MSR_FE0 | MSR_FE1);
846
847 if (copy_fpr_from_user(current, &sr->mc_fregs) ||
848 copy_transact_fpr_from_user(current, &tm_sr->mc_fregs))
849 return 1;
850
851#ifdef CONFIG_VSX
852 regs->msr &= ~MSR_VSX;
853 if (msr & MSR_VSX) {
854
855
856
857
858 if (copy_vsx_from_user(current, &sr->mc_vsregs) ||
859 copy_transact_vsx_from_user(current, &tm_sr->mc_vsregs))
860 return 1;
861 } else if (current->thread.used_vsr)
862 for (i = 0; i < 32 ; i++) {
863 current->thread.fp_state.fpr[i][TS_VSRLOWOFFSET] = 0;
864 current->thread.transact_fp.fpr[i][TS_VSRLOWOFFSET] = 0;
865 }
866#endif
867
868#ifdef CONFIG_SPE
869
870
871
872 regs->msr &= ~MSR_SPE;
873 if (msr & MSR_SPE) {
874 if (__copy_from_user(current->thread.evr, &sr->mc_vregs,
875 ELF_NEVRREG * sizeof(u32)))
876 return 1;
877 } else if (current->thread.used_spe)
878 memset(current->thread.evr, 0, ELF_NEVRREG * sizeof(u32));
879
880
881 if (__get_user(current->thread.spefscr, (u32 __user *)&sr->mc_vregs
882 + ELF_NEVRREG))
883 return 1;
884#endif
885
886
887 if (__get_user(msr_hi, &tm_sr->mc_gregs[PT_MSR]))
888 return 1;
889 msr_hi <<= 32;
890
891 if (MSR_TM_RESV(msr_hi))
892 return 1;
893
894 regs->msr = (regs->msr & ~MSR_TS_MASK) | (msr_hi & MSR_TS_MASK);
895
896
897
898
899 tm_enable();
900
901 current->thread.tm_texasr |= TEXASR_FS;
902
903 tm_recheckpoint(¤t->thread, msr);
904
905
906 if (msr & MSR_FP) {
907 do_load_up_transact_fpu(¤t->thread);
908 regs->msr |= (MSR_FP | current->thread.fpexc_mode);
909 }
910#ifdef CONFIG_ALTIVEC
911 if (msr & MSR_VEC) {
912 do_load_up_transact_altivec(¤t->thread);
913 regs->msr |= MSR_VEC;
914 }
915#endif
916
917 return 0;
918}
919#endif
920
921#ifdef CONFIG_PPC64
922int copy_siginfo_to_user32(struct compat_siginfo __user *d, siginfo_t *s)
923{
924 int err;
925
926 if (!access_ok (VERIFY_WRITE, d, sizeof(*d)))
927 return -EFAULT;
928
929
930
931
932
933
934
935
936
937 err = __put_user(s->si_signo, &d->si_signo);
938 err |= __put_user(s->si_errno, &d->si_errno);
939 err |= __put_user((short)s->si_code, &d->si_code);
940 if (s->si_code < 0)
941 err |= __copy_to_user(&d->_sifields._pad, &s->_sifields._pad,
942 SI_PAD_SIZE32);
943 else switch(s->si_code >> 16) {
944 case __SI_CHLD >> 16:
945 err |= __put_user(s->si_pid, &d->si_pid);
946 err |= __put_user(s->si_uid, &d->si_uid);
947 err |= __put_user(s->si_utime, &d->si_utime);
948 err |= __put_user(s->si_stime, &d->si_stime);
949 err |= __put_user(s->si_status, &d->si_status);
950 break;
951 case __SI_FAULT >> 16:
952 err |= __put_user((unsigned int)(unsigned long)s->si_addr,
953 &d->si_addr);
954 break;
955 case __SI_POLL >> 16:
956 err |= __put_user(s->si_band, &d->si_band);
957 err |= __put_user(s->si_fd, &d->si_fd);
958 break;
959 case __SI_TIMER >> 16:
960 err |= __put_user(s->si_tid, &d->si_tid);
961 err |= __put_user(s->si_overrun, &d->si_overrun);
962 err |= __put_user(s->si_int, &d->si_int);
963 break;
964 case __SI_SYS >> 16:
965 err |= __put_user(ptr_to_compat(s->si_call_addr), &d->si_call_addr);
966 err |= __put_user(s->si_syscall, &d->si_syscall);
967 err |= __put_user(s->si_arch, &d->si_arch);
968 break;
969 case __SI_RT >> 16:
970 case __SI_MESGQ >> 16:
971 err |= __put_user(s->si_int, &d->si_int);
972
973 case __SI_KILL >> 16:
974 default:
975 err |= __put_user(s->si_pid, &d->si_pid);
976 err |= __put_user(s->si_uid, &d->si_uid);
977 break;
978 }
979 return err;
980}
981
982#define copy_siginfo_to_user copy_siginfo_to_user32
983
984int copy_siginfo_from_user32(siginfo_t *to, struct compat_siginfo __user *from)
985{
986 memset(to, 0, sizeof *to);
987
988 if (copy_from_user(to, from, 3*sizeof(int)) ||
989 copy_from_user(to->_sifields._pad,
990 from->_sifields._pad, SI_PAD_SIZE32))
991 return -EFAULT;
992
993 return 0;
994}
995#endif
996
997
998
999
1000
1001int handle_rt_signal32(unsigned long sig, struct k_sigaction *ka,
1002 siginfo_t *info, sigset_t *oldset,
1003 struct pt_regs *regs)
1004{
1005 struct rt_sigframe __user *rt_sf;
1006 struct mcontext __user *frame;
1007 struct mcontext __user *tm_frame = NULL;
1008 void __user *addr;
1009 unsigned long newsp = 0;
1010 int sigret;
1011 unsigned long tramp;
1012
1013
1014
1015 rt_sf = get_sigframe(ka, get_tm_stackpointer(regs), sizeof(*rt_sf), 1);
1016 addr = rt_sf;
1017 if (unlikely(rt_sf == NULL))
1018 goto badframe;
1019
1020
1021 if (copy_siginfo_to_user(&rt_sf->info, info)
1022 || __put_user(0, &rt_sf->uc.uc_flags)
1023 || __save_altstack(&rt_sf->uc.uc_stack, regs->gpr[1])
1024 || __put_user(to_user_ptr(&rt_sf->uc.uc_mcontext),
1025 &rt_sf->uc.uc_regs)
1026 || put_sigset_t(&rt_sf->uc.uc_sigmask, oldset))
1027 goto badframe;
1028
1029
1030 frame = &rt_sf->uc.uc_mcontext;
1031 addr = frame;
1032 if (vdso32_rt_sigtramp && current->mm->context.vdso_base) {
1033 sigret = 0;
1034 tramp = current->mm->context.vdso_base + vdso32_rt_sigtramp;
1035 } else {
1036 sigret = __NR_rt_sigreturn;
1037 tramp = (unsigned long) frame->tramp;
1038 }
1039
1040#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
1041 tm_frame = &rt_sf->uc_transact.uc_mcontext;
1042 if (MSR_TM_ACTIVE(regs->msr)) {
1043 if (__put_user((unsigned long)&rt_sf->uc_transact,
1044 &rt_sf->uc.uc_link) ||
1045 __put_user((unsigned long)tm_frame,
1046 &rt_sf->uc_transact.uc_regs))
1047 goto badframe;
1048 if (save_tm_user_regs(regs, frame, tm_frame, sigret))
1049 goto badframe;
1050 }
1051 else
1052#endif
1053 {
1054 if (__put_user(0, &rt_sf->uc.uc_link))
1055 goto badframe;
1056 if (save_user_regs(regs, frame, tm_frame, sigret, 1))
1057 goto badframe;
1058 }
1059 regs->link = tramp;
1060
1061 current->thread.fp_state.fpscr = 0;
1062
1063
1064 newsp = ((unsigned long)rt_sf) - (__SIGNAL_FRAMESIZE + 16);
1065 addr = (void __user *)regs->gpr[1];
1066 if (put_user(regs->gpr[1], (u32 __user *)newsp))
1067 goto badframe;
1068
1069
1070 regs->gpr[1] = newsp;
1071 regs->gpr[3] = sig;
1072 regs->gpr[4] = (unsigned long) &rt_sf->info;
1073 regs->gpr[5] = (unsigned long) &rt_sf->uc;
1074 regs->gpr[6] = (unsigned long) rt_sf;
1075 regs->nip = (unsigned long) ka->sa.sa_handler;
1076
1077 regs->msr &= ~MSR_LE;
1078 regs->msr |= (MSR_KERNEL & MSR_LE);
1079 return 1;
1080
1081badframe:
1082 if (show_unhandled_signals)
1083 printk_ratelimited(KERN_INFO
1084 "%s[%d]: bad frame in handle_rt_signal32: "
1085 "%p nip %08lx lr %08lx\n",
1086 current->comm, current->pid,
1087 addr, regs->nip, regs->link);
1088
1089 force_sigsegv(sig, current);
1090 return 0;
1091}
1092
1093static int do_setcontext(struct ucontext __user *ucp, struct pt_regs *regs, int sig)
1094{
1095 sigset_t set;
1096 struct mcontext __user *mcp;
1097
1098 if (get_sigset_t(&set, &ucp->uc_sigmask))
1099 return -EFAULT;
1100#ifdef CONFIG_PPC64
1101 {
1102 u32 cmcp;
1103
1104 if (__get_user(cmcp, &ucp->uc_regs))
1105 return -EFAULT;
1106 mcp = (struct mcontext __user *)(u64)cmcp;
1107
1108 }
1109#else
1110 if (__get_user(mcp, &ucp->uc_regs))
1111 return -EFAULT;
1112 if (!access_ok(VERIFY_READ, mcp, sizeof(*mcp)))
1113 return -EFAULT;
1114#endif
1115 set_current_blocked(&set);
1116 if (restore_user_regs(regs, mcp, sig))
1117 return -EFAULT;
1118
1119 return 0;
1120}
1121
1122#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
1123static int do_setcontext_tm(struct ucontext __user *ucp,
1124 struct ucontext __user *tm_ucp,
1125 struct pt_regs *regs)
1126{
1127 sigset_t set;
1128 struct mcontext __user *mcp;
1129 struct mcontext __user *tm_mcp;
1130 u32 cmcp;
1131 u32 tm_cmcp;
1132
1133 if (get_sigset_t(&set, &ucp->uc_sigmask))
1134 return -EFAULT;
1135
1136 if (__get_user(cmcp, &ucp->uc_regs) ||
1137 __get_user(tm_cmcp, &tm_ucp->uc_regs))
1138 return -EFAULT;
1139 mcp = (struct mcontext __user *)(u64)cmcp;
1140 tm_mcp = (struct mcontext __user *)(u64)tm_cmcp;
1141
1142
1143 set_current_blocked(&set);
1144 if (restore_tm_user_regs(regs, mcp, tm_mcp))
1145 return -EFAULT;
1146
1147 return 0;
1148}
1149#endif
1150
1151long sys_swapcontext(struct ucontext __user *old_ctx,
1152 struct ucontext __user *new_ctx,
1153 int ctx_size, int r6, int r7, int r8, struct pt_regs *regs)
1154{
1155 unsigned char tmp;
1156 int ctx_has_vsx_region = 0;
1157
1158#ifdef CONFIG_PPC64
1159 unsigned long new_msr = 0;
1160
1161 if (new_ctx) {
1162 struct mcontext __user *mcp;
1163 u32 cmcp;
1164
1165
1166
1167
1168
1169
1170 if (__get_user(cmcp, &new_ctx->uc_regs))
1171 return -EFAULT;
1172 mcp = (struct mcontext __user *)(u64)cmcp;
1173 if (__get_user(new_msr, &mcp->mc_gregs[PT_MSR]))
1174 return -EFAULT;
1175 }
1176
1177
1178
1179
1180 if (ctx_size < UCONTEXTSIZEWITHOUTVSX)
1181 return -EINVAL;
1182
1183
1184
1185
1186 if ((ctx_size < sizeof(struct ucontext)) &&
1187 (new_msr & MSR_VSX))
1188 return -EINVAL;
1189
1190 if (ctx_size >= sizeof(struct ucontext))
1191 ctx_has_vsx_region = 1;
1192#else
1193
1194
1195
1196 if (ctx_size < sizeof(struct ucontext))
1197 return -EINVAL;
1198#endif
1199 if (old_ctx != NULL) {
1200 struct mcontext __user *mctx;
1201
1202
1203
1204
1205
1206
1207
1208
1209 mctx = (struct mcontext __user *)
1210 ((unsigned long) &old_ctx->uc_mcontext & ~0xfUL);
1211 if (!access_ok(VERIFY_WRITE, old_ctx, ctx_size)
1212 || save_user_regs(regs, mctx, NULL, 0, ctx_has_vsx_region)
1213 || put_sigset_t(&old_ctx->uc_sigmask, ¤t->blocked)
1214 || __put_user(to_user_ptr(mctx), &old_ctx->uc_regs))
1215 return -EFAULT;
1216 }
1217 if (new_ctx == NULL)
1218 return 0;
1219 if (!access_ok(VERIFY_READ, new_ctx, ctx_size)
1220 || __get_user(tmp, (u8 __user *) new_ctx)
1221 || __get_user(tmp, (u8 __user *) new_ctx + ctx_size - 1))
1222 return -EFAULT;
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235 if (do_setcontext(new_ctx, regs, 0))
1236 do_exit(SIGSEGV);
1237
1238 set_thread_flag(TIF_RESTOREALL);
1239 return 0;
1240}
1241
1242long sys_rt_sigreturn(int r3, int r4, int r5, int r6, int r7, int r8,
1243 struct pt_regs *regs)
1244{
1245 struct rt_sigframe __user *rt_sf;
1246 int tm_restore = 0;
1247#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
1248 struct ucontext __user *uc_transact;
1249 unsigned long msr_hi;
1250 unsigned long tmp;
1251#endif
1252
1253 current_thread_info()->restart_block.fn = do_no_restart_syscall;
1254
1255 rt_sf = (struct rt_sigframe __user *)
1256 (regs->gpr[1] + __SIGNAL_FRAMESIZE + 16);
1257 if (!access_ok(VERIFY_READ, rt_sf, sizeof(*rt_sf)))
1258 goto bad;
1259
1260#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271 if (MSR_TM_SUSPENDED(mfmsr()))
1272 tm_reclaim_current(0);
1273
1274 if (__get_user(tmp, &rt_sf->uc.uc_link))
1275 goto bad;
1276 uc_transact = (struct ucontext __user *)(uintptr_t)tmp;
1277 if (uc_transact) {
1278 u32 cmcp;
1279 struct mcontext __user *mcp;
1280
1281 if (__get_user(cmcp, &uc_transact->uc_regs))
1282 return -EFAULT;
1283 mcp = (struct mcontext __user *)(u64)cmcp;
1284
1285
1286 if (__get_user(msr_hi, &mcp->mc_gregs[PT_MSR]))
1287 goto bad;
1288
1289 if (MSR_TM_ACTIVE(msr_hi<<32)) {
1290
1291 if (!cpu_has_feature(CPU_FTR_TM))
1292 goto bad;
1293
1294
1295
1296 tm_restore = 1;
1297 if (do_setcontext_tm(&rt_sf->uc, uc_transact, regs))
1298 goto bad;
1299 }
1300 }
1301 if (!tm_restore) {
1302
1303
1304
1305
1306
1307 regs->msr &= ~MSR_TS_MASK;
1308 }
1309
1310#endif
1311 if (!tm_restore)
1312 if (do_setcontext(&rt_sf->uc, regs, 1))
1313 goto bad;
1314
1315
1316
1317
1318
1319
1320
1321
1322#ifdef CONFIG_PPC64
1323 if (compat_restore_altstack(&rt_sf->uc.uc_stack))
1324 goto bad;
1325#else
1326 if (restore_altstack(&rt_sf->uc.uc_stack))
1327 goto bad;
1328#endif
1329 set_thread_flag(TIF_RESTOREALL);
1330 return 0;
1331
1332 bad:
1333 if (show_unhandled_signals)
1334 printk_ratelimited(KERN_INFO
1335 "%s[%d]: bad frame in sys_rt_sigreturn: "
1336 "%p nip %08lx lr %08lx\n",
1337 current->comm, current->pid,
1338 rt_sf, regs->nip, regs->link);
1339
1340 force_sig(SIGSEGV, current);
1341 return 0;
1342}
1343
1344#ifdef CONFIG_PPC32
1345int sys_debug_setcontext(struct ucontext __user *ctx,
1346 int ndbg, struct sig_dbg_op __user *dbg,
1347 int r6, int r7, int r8,
1348 struct pt_regs *regs)
1349{
1350 struct sig_dbg_op op;
1351 int i;
1352 unsigned char tmp;
1353 unsigned long new_msr = regs->msr;
1354#ifdef CONFIG_PPC_ADV_DEBUG_REGS
1355 unsigned long new_dbcr0 = current->thread.debug.dbcr0;
1356#endif
1357
1358 for (i=0; i<ndbg; i++) {
1359 if (copy_from_user(&op, dbg + i, sizeof(op)))
1360 return -EFAULT;
1361 switch (op.dbg_type) {
1362 case SIG_DBG_SINGLE_STEPPING:
1363#ifdef CONFIG_PPC_ADV_DEBUG_REGS
1364 if (op.dbg_value) {
1365 new_msr |= MSR_DE;
1366 new_dbcr0 |= (DBCR0_IDM | DBCR0_IC);
1367 } else {
1368 new_dbcr0 &= ~DBCR0_IC;
1369 if (!DBCR_ACTIVE_EVENTS(new_dbcr0,
1370 current->thread.debug.dbcr1)) {
1371 new_msr &= ~MSR_DE;
1372 new_dbcr0 &= ~DBCR0_IDM;
1373 }
1374 }
1375#else
1376 if (op.dbg_value)
1377 new_msr |= MSR_SE;
1378 else
1379 new_msr &= ~MSR_SE;
1380#endif
1381 break;
1382 case SIG_DBG_BRANCH_TRACING:
1383#ifdef CONFIG_PPC_ADV_DEBUG_REGS
1384 return -EINVAL;
1385#else
1386 if (op.dbg_value)
1387 new_msr |= MSR_BE;
1388 else
1389 new_msr &= ~MSR_BE;
1390#endif
1391 break;
1392
1393 default:
1394 return -EINVAL;
1395 }
1396 }
1397
1398
1399
1400
1401
1402
1403 regs->msr = new_msr;
1404#ifdef CONFIG_PPC_ADV_DEBUG_REGS
1405 current->thread.debug.dbcr0 = new_dbcr0;
1406#endif
1407
1408 if (!access_ok(VERIFY_READ, ctx, sizeof(*ctx))
1409 || __get_user(tmp, (u8 __user *) ctx)
1410 || __get_user(tmp, (u8 __user *) (ctx + 1) - 1))
1411 return -EFAULT;
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424 if (do_setcontext(ctx, regs, 1)) {
1425 if (show_unhandled_signals)
1426 printk_ratelimited(KERN_INFO "%s[%d]: bad frame in "
1427 "sys_debug_setcontext: %p nip %08lx "
1428 "lr %08lx\n",
1429 current->comm, current->pid,
1430 ctx, regs->nip, regs->link);
1431
1432 force_sig(SIGSEGV, current);
1433 goto out;
1434 }
1435
1436
1437
1438
1439
1440
1441
1442
1443 restore_altstack(&ctx->uc_stack);
1444
1445 set_thread_flag(TIF_RESTOREALL);
1446 out:
1447 return 0;
1448}
1449#endif
1450
1451
1452
1453
1454int handle_signal32(unsigned long sig, struct k_sigaction *ka,
1455 siginfo_t *info, sigset_t *oldset, struct pt_regs *regs)
1456{
1457 struct sigcontext __user *sc;
1458 struct sigframe __user *frame;
1459 struct mcontext __user *tm_mctx = NULL;
1460 unsigned long newsp = 0;
1461 int sigret;
1462 unsigned long tramp;
1463
1464
1465 frame = get_sigframe(ka, get_tm_stackpointer(regs), sizeof(*frame), 1);
1466 if (unlikely(frame == NULL))
1467 goto badframe;
1468 sc = (struct sigcontext __user *) &frame->sctx;
1469
1470#if _NSIG != 64
1471#error "Please adjust handle_signal()"
1472#endif
1473 if (__put_user(to_user_ptr(ka->sa.sa_handler), &sc->handler)
1474 || __put_user(oldset->sig[0], &sc->oldmask)
1475#ifdef CONFIG_PPC64
1476 || __put_user((oldset->sig[0] >> 32), &sc->_unused[3])
1477#else
1478 || __put_user(oldset->sig[1], &sc->_unused[3])
1479#endif
1480 || __put_user(to_user_ptr(&frame->mctx), &sc->regs)
1481 || __put_user(sig, &sc->signal))
1482 goto badframe;
1483
1484 if (vdso32_sigtramp && current->mm->context.vdso_base) {
1485 sigret = 0;
1486 tramp = current->mm->context.vdso_base + vdso32_sigtramp;
1487 } else {
1488 sigret = __NR_sigreturn;
1489 tramp = (unsigned long) frame->mctx.tramp;
1490 }
1491
1492#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
1493 tm_mctx = &frame->mctx_transact;
1494 if (MSR_TM_ACTIVE(regs->msr)) {
1495 if (save_tm_user_regs(regs, &frame->mctx, &frame->mctx_transact,
1496 sigret))
1497 goto badframe;
1498 }
1499 else
1500#endif
1501 {
1502 if (save_user_regs(regs, &frame->mctx, tm_mctx, sigret, 1))
1503 goto badframe;
1504 }
1505
1506 regs->link = tramp;
1507
1508 current->thread.fp_state.fpscr = 0;
1509
1510
1511 newsp = ((unsigned long)frame) - __SIGNAL_FRAMESIZE;
1512 if (put_user(regs->gpr[1], (u32 __user *)newsp))
1513 goto badframe;
1514
1515 regs->gpr[1] = newsp;
1516 regs->gpr[3] = sig;
1517 regs->gpr[4] = (unsigned long) sc;
1518 regs->nip = (unsigned long) ka->sa.sa_handler;
1519
1520 regs->msr &= ~MSR_LE;
1521 return 1;
1522
1523badframe:
1524 if (show_unhandled_signals)
1525 printk_ratelimited(KERN_INFO
1526 "%s[%d]: bad frame in handle_signal32: "
1527 "%p nip %08lx lr %08lx\n",
1528 current->comm, current->pid,
1529 frame, regs->nip, regs->link);
1530
1531 force_sigsegv(sig, current);
1532 return 0;
1533}
1534
1535
1536
1537
1538long sys_sigreturn(int r3, int r4, int r5, int r6, int r7, int r8,
1539 struct pt_regs *regs)
1540{
1541 struct sigframe __user *sf;
1542 struct sigcontext __user *sc;
1543 struct sigcontext sigctx;
1544 struct mcontext __user *sr;
1545 void __user *addr;
1546 sigset_t set;
1547#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
1548 struct mcontext __user *mcp, *tm_mcp;
1549 unsigned long msr_hi;
1550#endif
1551
1552
1553 current_thread_info()->restart_block.fn = do_no_restart_syscall;
1554
1555 sf = (struct sigframe __user *)(regs->gpr[1] + __SIGNAL_FRAMESIZE);
1556 sc = &sf->sctx;
1557 addr = sc;
1558 if (copy_from_user(&sigctx, sc, sizeof(sigctx)))
1559 goto badframe;
1560
1561#ifdef CONFIG_PPC64
1562
1563
1564
1565
1566 set.sig[0] = sigctx.oldmask + ((long)(sigctx._unused[3]) << 32);
1567#else
1568 set.sig[0] = sigctx.oldmask;
1569 set.sig[1] = sigctx._unused[3];
1570#endif
1571 set_current_blocked(&set);
1572
1573#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
1574 mcp = (struct mcontext __user *)&sf->mctx;
1575 tm_mcp = (struct mcontext __user *)&sf->mctx_transact;
1576 if (__get_user(msr_hi, &tm_mcp->mc_gregs[PT_MSR]))
1577 goto badframe;
1578 if (MSR_TM_ACTIVE(msr_hi<<32)) {
1579 if (!cpu_has_feature(CPU_FTR_TM))
1580 goto badframe;
1581 if (restore_tm_user_regs(regs, mcp, tm_mcp))
1582 goto badframe;
1583 } else
1584#endif
1585 {
1586 sr = (struct mcontext __user *)from_user_ptr(sigctx.regs);
1587 addr = sr;
1588 if (!access_ok(VERIFY_READ, sr, sizeof(*sr))
1589 || restore_user_regs(regs, sr, 1))
1590 goto badframe;
1591 }
1592
1593 set_thread_flag(TIF_RESTOREALL);
1594 return 0;
1595
1596badframe:
1597 if (show_unhandled_signals)
1598 printk_ratelimited(KERN_INFO
1599 "%s[%d]: bad frame in sys_sigreturn: "
1600 "%p nip %08lx lr %08lx\n",
1601 current->comm, current->pid,
1602 addr, regs->nip, regs->link);
1603
1604 force_sig(SIGSEGV, current);
1605 return 0;
1606}
1607