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 }
466#endif
467#ifdef CONFIG_SPE
468
469 if (current->thread.used_spe) {
470 flush_spe_to_thread(current);
471 if (__copy_to_user(&frame->mc_vregs, current->thread.evr,
472 ELF_NEVRREG * sizeof(u32)))
473 return 1;
474
475
476 msr |= MSR_SPE;
477 }
478
479
480
481 if (__put_user(current->thread.spefscr, (u32 __user *)&frame->mc_vregs + ELF_NEVRREG))
482 return 1;
483#endif
484
485 if (__put_user(msr, &frame->mc_gregs[PT_MSR]))
486 return 1;
487
488
489
490 if (tm_frame && __put_user(0, &tm_frame->mc_gregs[PT_MSR]))
491 return 1;
492
493 if (sigret) {
494
495 if (__put_user(0x38000000UL + sigret, &frame->tramp[0])
496 || __put_user(0x44000002UL, &frame->tramp[1]))
497 return 1;
498 flush_icache_range((unsigned long) &frame->tramp[0],
499 (unsigned long) &frame->tramp[2]);
500 }
501
502 return 0;
503}
504
505#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
506
507
508
509
510
511
512
513
514
515static int save_tm_user_regs(struct pt_regs *regs,
516 struct mcontext __user *frame,
517 struct mcontext __user *tm_frame, int sigret)
518{
519 unsigned long msr = regs->msr;
520
521
522
523
524
525
526 regs->msr &= ~MSR_TS_MASK;
527
528
529 flush_fp_to_thread(current);
530
531
532 if (save_general_regs(¤t->thread.ckpt_regs, frame)
533 || save_general_regs(regs, tm_frame))
534 return 1;
535
536
537
538
539
540
541
542 if (__put_user((msr >> 32), &tm_frame->mc_gregs[PT_MSR]))
543 return 1;
544
545#ifdef CONFIG_ALTIVEC
546
547 if (current->thread.used_vr) {
548 flush_altivec_to_thread(current);
549 if (__copy_to_user(&frame->mc_vregs, ¤t->thread.vr_state,
550 ELF_NVRREG * sizeof(vector128)))
551 return 1;
552 if (msr & MSR_VEC) {
553 if (__copy_to_user(&tm_frame->mc_vregs,
554 ¤t->thread.transact_vr,
555 ELF_NVRREG * sizeof(vector128)))
556 return 1;
557 } else {
558 if (__copy_to_user(&tm_frame->mc_vregs,
559 ¤t->thread.vr_state,
560 ELF_NVRREG * sizeof(vector128)))
561 return 1;
562 }
563
564
565
566
567 msr |= MSR_VEC;
568 }
569
570
571
572
573
574
575 if (cpu_has_feature(CPU_FTR_ALTIVEC))
576 current->thread.vrsave = mfspr(SPRN_VRSAVE);
577 if (__put_user(current->thread.vrsave,
578 (u32 __user *)&frame->mc_vregs[32]))
579 return 1;
580 if (msr & MSR_VEC) {
581 if (__put_user(current->thread.transact_vrsave,
582 (u32 __user *)&tm_frame->mc_vregs[32]))
583 return 1;
584 } else {
585 if (__put_user(current->thread.vrsave,
586 (u32 __user *)&tm_frame->mc_vregs[32]))
587 return 1;
588 }
589#endif
590
591 if (copy_fpr_to_user(&frame->mc_fregs, current))
592 return 1;
593 if (msr & MSR_FP) {
594 if (copy_transact_fpr_to_user(&tm_frame->mc_fregs, current))
595 return 1;
596 } else {
597 if (copy_fpr_to_user(&tm_frame->mc_fregs, current))
598 return 1;
599 }
600
601#ifdef CONFIG_VSX
602
603
604
605
606
607
608 if (current->thread.used_vsr) {
609 __giveup_vsx(current);
610 if (copy_vsx_to_user(&frame->mc_vsregs, current))
611 return 1;
612 if (msr & MSR_VSX) {
613 if (copy_transact_vsx_to_user(&tm_frame->mc_vsregs,
614 current))
615 return 1;
616 } else {
617 if (copy_vsx_to_user(&tm_frame->mc_vsregs, current))
618 return 1;
619 }
620
621 msr |= MSR_VSX;
622 }
623#endif
624#ifdef CONFIG_SPE
625
626
627
628 if (current->thread.used_spe) {
629 flush_spe_to_thread(current);
630 if (__copy_to_user(&frame->mc_vregs, current->thread.evr,
631 ELF_NEVRREG * sizeof(u32)))
632 return 1;
633
634
635 msr |= MSR_SPE;
636 }
637
638
639 if (__put_user(current->thread.spefscr, (u32 __user *)&frame->mc_vregs + ELF_NEVRREG))
640 return 1;
641#endif
642
643 if (__put_user(msr, &frame->mc_gregs[PT_MSR]))
644 return 1;
645 if (sigret) {
646
647 if (__put_user(0x38000000UL + sigret, &frame->tramp[0])
648 || __put_user(0x44000002UL, &frame->tramp[1]))
649 return 1;
650 flush_icache_range((unsigned long) &frame->tramp[0],
651 (unsigned long) &frame->tramp[2]);
652 }
653
654 return 0;
655}
656#endif
657
658
659
660
661
662static long restore_user_regs(struct pt_regs *regs,
663 struct mcontext __user *sr, int sig)
664{
665 long err;
666 unsigned int save_r2 = 0;
667 unsigned long msr;
668#ifdef CONFIG_VSX
669 int i;
670#endif
671
672
673
674
675
676 if (!sig)
677 save_r2 = (unsigned int)regs->gpr[2];
678 err = restore_general_regs(regs, sr);
679 regs->trap = 0;
680 err |= __get_user(msr, &sr->mc_gregs[PT_MSR]);
681 if (!sig)
682 regs->gpr[2] = (unsigned long) save_r2;
683 if (err)
684 return 1;
685
686
687 if (sig)
688 regs->msr = (regs->msr & ~MSR_LE) | (msr & MSR_LE);
689
690
691
692
693
694
695
696
697 discard_lazy_cpu_state();
698
699#ifdef CONFIG_ALTIVEC
700
701
702
703
704 regs->msr &= ~MSR_VEC;
705 if (msr & MSR_VEC) {
706
707 if (__copy_from_user(¤t->thread.vr_state, &sr->mc_vregs,
708 sizeof(sr->mc_vregs)))
709 return 1;
710 } else if (current->thread.used_vr)
711 memset(¤t->thread.vr_state, 0,
712 ELF_NVRREG * sizeof(vector128));
713
714
715 if (__get_user(current->thread.vrsave, (u32 __user *)&sr->mc_vregs[32]))
716 return 1;
717 if (cpu_has_feature(CPU_FTR_ALTIVEC))
718 mtspr(SPRN_VRSAVE, current->thread.vrsave);
719#endif
720 if (copy_fpr_from_user(current, &sr->mc_fregs))
721 return 1;
722
723#ifdef CONFIG_VSX
724
725
726
727
728 regs->msr &= ~MSR_VSX;
729 if (msr & MSR_VSX) {
730
731
732
733
734 if (copy_vsx_from_user(current, &sr->mc_vsregs))
735 return 1;
736 } else if (current->thread.used_vsr)
737 for (i = 0; i < 32 ; i++)
738 current->thread.fp_state.fpr[i][TS_VSRLOWOFFSET] = 0;
739#endif
740
741
742
743
744 regs->msr &= ~(MSR_FP | MSR_FE0 | MSR_FE1);
745
746#ifdef CONFIG_SPE
747
748
749 regs->msr &= ~MSR_SPE;
750 if (msr & MSR_SPE) {
751
752 if (__copy_from_user(current->thread.evr, &sr->mc_vregs,
753 ELF_NEVRREG * sizeof(u32)))
754 return 1;
755 } else if (current->thread.used_spe)
756 memset(current->thread.evr, 0, ELF_NEVRREG * sizeof(u32));
757
758
759 if (__get_user(current->thread.spefscr, (u32 __user *)&sr->mc_vregs + ELF_NEVRREG))
760 return 1;
761#endif
762
763 return 0;
764}
765
766#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
767
768
769
770
771
772static long restore_tm_user_regs(struct pt_regs *regs,
773 struct mcontext __user *sr,
774 struct mcontext __user *tm_sr)
775{
776 long err;
777 unsigned long msr, msr_hi;
778#ifdef CONFIG_VSX
779 int i;
780#endif
781
782
783
784
785
786
787
788
789 err = restore_general_regs(regs, tm_sr);
790 err |= restore_general_regs(¤t->thread.ckpt_regs, sr);
791
792 err |= __get_user(current->thread.tm_tfhar, &sr->mc_gregs[PT_NIP]);
793
794 err |= __get_user(msr, &sr->mc_gregs[PT_MSR]);
795 if (err)
796 return 1;
797
798
799 regs->msr = (regs->msr & ~MSR_LE) | (msr & MSR_LE);
800
801
802
803
804
805
806
807
808 discard_lazy_cpu_state();
809
810#ifdef CONFIG_ALTIVEC
811 regs->msr &= ~MSR_VEC;
812 if (msr & MSR_VEC) {
813
814 if (__copy_from_user(¤t->thread.vr_state, &sr->mc_vregs,
815 sizeof(sr->mc_vregs)) ||
816 __copy_from_user(¤t->thread.transact_vr,
817 &tm_sr->mc_vregs,
818 sizeof(sr->mc_vregs)))
819 return 1;
820 } else if (current->thread.used_vr) {
821 memset(¤t->thread.vr_state, 0,
822 ELF_NVRREG * sizeof(vector128));
823 memset(¤t->thread.transact_vr, 0,
824 ELF_NVRREG * sizeof(vector128));
825 }
826
827
828 if (__get_user(current->thread.vrsave,
829 (u32 __user *)&sr->mc_vregs[32]) ||
830 __get_user(current->thread.transact_vrsave,
831 (u32 __user *)&tm_sr->mc_vregs[32]))
832 return 1;
833 if (cpu_has_feature(CPU_FTR_ALTIVEC))
834 mtspr(SPRN_VRSAVE, current->thread.vrsave);
835#endif
836
837 regs->msr &= ~(MSR_FP | MSR_FE0 | MSR_FE1);
838
839 if (copy_fpr_from_user(current, &sr->mc_fregs) ||
840 copy_transact_fpr_from_user(current, &tm_sr->mc_fregs))
841 return 1;
842
843#ifdef CONFIG_VSX
844 regs->msr &= ~MSR_VSX;
845 if (msr & MSR_VSX) {
846
847
848
849
850 if (copy_vsx_from_user(current, &sr->mc_vsregs) ||
851 copy_transact_vsx_from_user(current, &tm_sr->mc_vsregs))
852 return 1;
853 } else if (current->thread.used_vsr)
854 for (i = 0; i < 32 ; i++) {
855 current->thread.fp_state.fpr[i][TS_VSRLOWOFFSET] = 0;
856 current->thread.transact_fp.fpr[i][TS_VSRLOWOFFSET] = 0;
857 }
858#endif
859
860#ifdef CONFIG_SPE
861
862
863
864 regs->msr &= ~MSR_SPE;
865 if (msr & MSR_SPE) {
866 if (__copy_from_user(current->thread.evr, &sr->mc_vregs,
867 ELF_NEVRREG * sizeof(u32)))
868 return 1;
869 } else if (current->thread.used_spe)
870 memset(current->thread.evr, 0, ELF_NEVRREG * sizeof(u32));
871
872
873 if (__get_user(current->thread.spefscr, (u32 __user *)&sr->mc_vregs
874 + ELF_NEVRREG))
875 return 1;
876#endif
877
878
879
880
881
882 tm_enable();
883
884 current->thread.tm_texasr |= TEXASR_FS;
885
886 tm_recheckpoint(¤t->thread, msr);
887
888 if (__get_user(msr_hi, &tm_sr->mc_gregs[PT_MSR]))
889 return 1;
890
891 regs->msr = (regs->msr & ~MSR_TS_MASK) | ((msr_hi<<32) & MSR_TS_MASK);
892
893
894 if (msr & MSR_FP) {
895 do_load_up_transact_fpu(¤t->thread);
896 regs->msr |= (MSR_FP | current->thread.fpexc_mode);
897 }
898#ifdef CONFIG_ALTIVEC
899 if (msr & MSR_VEC) {
900 do_load_up_transact_altivec(¤t->thread);
901 regs->msr |= MSR_VEC;
902 }
903#endif
904
905 return 0;
906}
907#endif
908
909#ifdef CONFIG_PPC64
910int copy_siginfo_to_user32(struct compat_siginfo __user *d, const siginfo_t *s)
911{
912 int err;
913
914 if (!access_ok (VERIFY_WRITE, d, sizeof(*d)))
915 return -EFAULT;
916
917
918
919
920
921
922
923
924
925 err = __put_user(s->si_signo, &d->si_signo);
926 err |= __put_user(s->si_errno, &d->si_errno);
927 err |= __put_user((short)s->si_code, &d->si_code);
928 if (s->si_code < 0)
929 err |= __copy_to_user(&d->_sifields._pad, &s->_sifields._pad,
930 SI_PAD_SIZE32);
931 else switch(s->si_code >> 16) {
932 case __SI_CHLD >> 16:
933 err |= __put_user(s->si_pid, &d->si_pid);
934 err |= __put_user(s->si_uid, &d->si_uid);
935 err |= __put_user(s->si_utime, &d->si_utime);
936 err |= __put_user(s->si_stime, &d->si_stime);
937 err |= __put_user(s->si_status, &d->si_status);
938 break;
939 case __SI_FAULT >> 16:
940 err |= __put_user((unsigned int)(unsigned long)s->si_addr,
941 &d->si_addr);
942 break;
943 case __SI_POLL >> 16:
944 err |= __put_user(s->si_band, &d->si_band);
945 err |= __put_user(s->si_fd, &d->si_fd);
946 break;
947 case __SI_TIMER >> 16:
948 err |= __put_user(s->si_tid, &d->si_tid);
949 err |= __put_user(s->si_overrun, &d->si_overrun);
950 err |= __put_user(s->si_int, &d->si_int);
951 break;
952 case __SI_RT >> 16:
953 case __SI_MESGQ >> 16:
954 err |= __put_user(s->si_int, &d->si_int);
955
956 case __SI_KILL >> 16:
957 default:
958 err |= __put_user(s->si_pid, &d->si_pid);
959 err |= __put_user(s->si_uid, &d->si_uid);
960 break;
961 }
962 return err;
963}
964
965#define copy_siginfo_to_user copy_siginfo_to_user32
966
967int copy_siginfo_from_user32(siginfo_t *to, struct compat_siginfo __user *from)
968{
969 memset(to, 0, sizeof *to);
970
971 if (copy_from_user(to, from, 3*sizeof(int)) ||
972 copy_from_user(to->_sifields._pad,
973 from->_sifields._pad, SI_PAD_SIZE32))
974 return -EFAULT;
975
976 return 0;
977}
978#endif
979
980
981
982
983
984int handle_rt_signal32(struct ksignal *ksig, sigset_t *oldset,
985 struct pt_regs *regs)
986{
987 struct rt_sigframe __user *rt_sf;
988 struct mcontext __user *frame;
989 struct mcontext __user *tm_frame = NULL;
990 void __user *addr;
991 unsigned long newsp = 0;
992 int sigret;
993 unsigned long tramp;
994
995
996
997 rt_sf = get_sigframe(ksig, get_tm_stackpointer(regs), sizeof(*rt_sf), 1);
998 addr = rt_sf;
999 if (unlikely(rt_sf == NULL))
1000 goto badframe;
1001
1002
1003 if (copy_siginfo_to_user(&rt_sf->info, &ksig->info)
1004 || __put_user(0, &rt_sf->uc.uc_flags)
1005 || __save_altstack(&rt_sf->uc.uc_stack, regs->gpr[1])
1006 || __put_user(to_user_ptr(&rt_sf->uc.uc_mcontext),
1007 &rt_sf->uc.uc_regs)
1008 || put_sigset_t(&rt_sf->uc.uc_sigmask, oldset))
1009 goto badframe;
1010
1011
1012 frame = &rt_sf->uc.uc_mcontext;
1013 addr = frame;
1014 if (vdso32_rt_sigtramp && current->mm->context.vdso_base) {
1015 sigret = 0;
1016 tramp = current->mm->context.vdso_base + vdso32_rt_sigtramp;
1017 } else {
1018 sigret = __NR_rt_sigreturn;
1019 tramp = (unsigned long) frame->tramp;
1020 }
1021
1022#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
1023 tm_frame = &rt_sf->uc_transact.uc_mcontext;
1024 if (MSR_TM_ACTIVE(regs->msr)) {
1025 if (__put_user((unsigned long)&rt_sf->uc_transact,
1026 &rt_sf->uc.uc_link) ||
1027 __put_user((unsigned long)tm_frame,
1028 &rt_sf->uc_transact.uc_regs))
1029 goto badframe;
1030 if (save_tm_user_regs(regs, frame, tm_frame, sigret))
1031 goto badframe;
1032 }
1033 else
1034#endif
1035 {
1036 if (__put_user(0, &rt_sf->uc.uc_link))
1037 goto badframe;
1038 if (save_user_regs(regs, frame, tm_frame, sigret, 1))
1039 goto badframe;
1040 }
1041 regs->link = tramp;
1042
1043 current->thread.fp_state.fpscr = 0;
1044
1045
1046 newsp = ((unsigned long)rt_sf) - (__SIGNAL_FRAMESIZE + 16);
1047 addr = (void __user *)regs->gpr[1];
1048 if (put_user(regs->gpr[1], (u32 __user *)newsp))
1049 goto badframe;
1050
1051
1052 regs->gpr[1] = newsp;
1053 regs->gpr[3] = ksig->sig;
1054 regs->gpr[4] = (unsigned long) &rt_sf->info;
1055 regs->gpr[5] = (unsigned long) &rt_sf->uc;
1056 regs->gpr[6] = (unsigned long) rt_sf;
1057 regs->nip = (unsigned long) ksig->ka.sa.sa_handler;
1058
1059 regs->msr &= ~MSR_LE;
1060 regs->msr |= (MSR_KERNEL & MSR_LE);
1061 return 0;
1062
1063badframe:
1064 if (show_unhandled_signals)
1065 printk_ratelimited(KERN_INFO
1066 "%s[%d]: bad frame in handle_rt_signal32: "
1067 "%p nip %08lx lr %08lx\n",
1068 current->comm, current->pid,
1069 addr, regs->nip, regs->link);
1070
1071 return 1;
1072}
1073
1074static int do_setcontext(struct ucontext __user *ucp, struct pt_regs *regs, int sig)
1075{
1076 sigset_t set;
1077 struct mcontext __user *mcp;
1078
1079 if (get_sigset_t(&set, &ucp->uc_sigmask))
1080 return -EFAULT;
1081#ifdef CONFIG_PPC64
1082 {
1083 u32 cmcp;
1084
1085 if (__get_user(cmcp, &ucp->uc_regs))
1086 return -EFAULT;
1087 mcp = (struct mcontext __user *)(u64)cmcp;
1088
1089 }
1090#else
1091 if (__get_user(mcp, &ucp->uc_regs))
1092 return -EFAULT;
1093 if (!access_ok(VERIFY_READ, mcp, sizeof(*mcp)))
1094 return -EFAULT;
1095#endif
1096 set_current_blocked(&set);
1097 if (restore_user_regs(regs, mcp, sig))
1098 return -EFAULT;
1099
1100 return 0;
1101}
1102
1103#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
1104static int do_setcontext_tm(struct ucontext __user *ucp,
1105 struct ucontext __user *tm_ucp,
1106 struct pt_regs *regs)
1107{
1108 sigset_t set;
1109 struct mcontext __user *mcp;
1110 struct mcontext __user *tm_mcp;
1111 u32 cmcp;
1112 u32 tm_cmcp;
1113
1114 if (get_sigset_t(&set, &ucp->uc_sigmask))
1115 return -EFAULT;
1116
1117 if (__get_user(cmcp, &ucp->uc_regs) ||
1118 __get_user(tm_cmcp, &tm_ucp->uc_regs))
1119 return -EFAULT;
1120 mcp = (struct mcontext __user *)(u64)cmcp;
1121 tm_mcp = (struct mcontext __user *)(u64)tm_cmcp;
1122
1123
1124 set_current_blocked(&set);
1125 if (restore_tm_user_regs(regs, mcp, tm_mcp))
1126 return -EFAULT;
1127
1128 return 0;
1129}
1130#endif
1131
1132long sys_swapcontext(struct ucontext __user *old_ctx,
1133 struct ucontext __user *new_ctx,
1134 int ctx_size, int r6, int r7, int r8, struct pt_regs *regs)
1135{
1136 unsigned char tmp;
1137 int ctx_has_vsx_region = 0;
1138
1139#ifdef CONFIG_PPC64
1140 unsigned long new_msr = 0;
1141
1142 if (new_ctx) {
1143 struct mcontext __user *mcp;
1144 u32 cmcp;
1145
1146
1147
1148
1149
1150
1151 if (__get_user(cmcp, &new_ctx->uc_regs))
1152 return -EFAULT;
1153 mcp = (struct mcontext __user *)(u64)cmcp;
1154 if (__get_user(new_msr, &mcp->mc_gregs[PT_MSR]))
1155 return -EFAULT;
1156 }
1157
1158
1159
1160
1161 if (ctx_size < UCONTEXTSIZEWITHOUTVSX)
1162 return -EINVAL;
1163
1164
1165
1166
1167 if ((ctx_size < sizeof(struct ucontext)) &&
1168 (new_msr & MSR_VSX))
1169 return -EINVAL;
1170
1171 if (ctx_size >= sizeof(struct ucontext))
1172 ctx_has_vsx_region = 1;
1173#else
1174
1175
1176
1177 if (ctx_size < sizeof(struct ucontext))
1178 return -EINVAL;
1179#endif
1180 if (old_ctx != NULL) {
1181 struct mcontext __user *mctx;
1182
1183
1184
1185
1186
1187
1188
1189
1190 mctx = (struct mcontext __user *)
1191 ((unsigned long) &old_ctx->uc_mcontext & ~0xfUL);
1192 if (!access_ok(VERIFY_WRITE, old_ctx, ctx_size)
1193 || save_user_regs(regs, mctx, NULL, 0, ctx_has_vsx_region)
1194 || put_sigset_t(&old_ctx->uc_sigmask, ¤t->blocked)
1195 || __put_user(to_user_ptr(mctx), &old_ctx->uc_regs))
1196 return -EFAULT;
1197 }
1198 if (new_ctx == NULL)
1199 return 0;
1200 if (!access_ok(VERIFY_READ, new_ctx, ctx_size)
1201 || __get_user(tmp, (u8 __user *) new_ctx)
1202 || __get_user(tmp, (u8 __user *) new_ctx + ctx_size - 1))
1203 return -EFAULT;
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216 if (do_setcontext(new_ctx, regs, 0))
1217 do_exit(SIGSEGV);
1218
1219 set_thread_flag(TIF_RESTOREALL);
1220 return 0;
1221}
1222
1223long sys_rt_sigreturn(int r3, int r4, int r5, int r6, int r7, int r8,
1224 struct pt_regs *regs)
1225{
1226 struct rt_sigframe __user *rt_sf;
1227#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
1228 struct ucontext __user *uc_transact;
1229 unsigned long msr_hi;
1230 unsigned long tmp;
1231 int tm_restore = 0;
1232#endif
1233
1234 current->restart_block.fn = do_no_restart_syscall;
1235
1236 rt_sf = (struct rt_sigframe __user *)
1237 (regs->gpr[1] + __SIGNAL_FRAMESIZE + 16);
1238 if (!access_ok(VERIFY_READ, rt_sf, sizeof(*rt_sf)))
1239 goto bad;
1240#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
1241 if (__get_user(tmp, &rt_sf->uc.uc_link))
1242 goto bad;
1243 uc_transact = (struct ucontext __user *)(uintptr_t)tmp;
1244 if (uc_transact) {
1245 u32 cmcp;
1246 struct mcontext __user *mcp;
1247
1248 if (__get_user(cmcp, &uc_transact->uc_regs))
1249 return -EFAULT;
1250 mcp = (struct mcontext __user *)(u64)cmcp;
1251
1252
1253 if (__get_user(msr_hi, &mcp->mc_gregs[PT_MSR]))
1254 goto bad;
1255
1256 if (MSR_TM_ACTIVE(msr_hi<<32)) {
1257
1258
1259
1260 tm_restore = 1;
1261 if (do_setcontext_tm(&rt_sf->uc, uc_transact, regs))
1262 goto bad;
1263 }
1264 }
1265 if (!tm_restore)
1266
1267#endif
1268 if (do_setcontext(&rt_sf->uc, regs, 1))
1269 goto bad;
1270
1271
1272
1273
1274
1275
1276
1277
1278#ifdef CONFIG_PPC64
1279 if (compat_restore_altstack(&rt_sf->uc.uc_stack))
1280 goto bad;
1281#else
1282 if (restore_altstack(&rt_sf->uc.uc_stack))
1283 goto bad;
1284#endif
1285 set_thread_flag(TIF_RESTOREALL);
1286 return 0;
1287
1288 bad:
1289 if (show_unhandled_signals)
1290 printk_ratelimited(KERN_INFO
1291 "%s[%d]: bad frame in sys_rt_sigreturn: "
1292 "%p nip %08lx lr %08lx\n",
1293 current->comm, current->pid,
1294 rt_sf, regs->nip, regs->link);
1295
1296 force_sig(SIGSEGV, current);
1297 return 0;
1298}
1299
1300#ifdef CONFIG_PPC32
1301int sys_debug_setcontext(struct ucontext __user *ctx,
1302 int ndbg, struct sig_dbg_op __user *dbg,
1303 int r6, int r7, int r8,
1304 struct pt_regs *regs)
1305{
1306 struct sig_dbg_op op;
1307 int i;
1308 unsigned char tmp;
1309 unsigned long new_msr = regs->msr;
1310#ifdef CONFIG_PPC_ADV_DEBUG_REGS
1311 unsigned long new_dbcr0 = current->thread.debug.dbcr0;
1312#endif
1313
1314 for (i=0; i<ndbg; i++) {
1315 if (copy_from_user(&op, dbg + i, sizeof(op)))
1316 return -EFAULT;
1317 switch (op.dbg_type) {
1318 case SIG_DBG_SINGLE_STEPPING:
1319#ifdef CONFIG_PPC_ADV_DEBUG_REGS
1320 if (op.dbg_value) {
1321 new_msr |= MSR_DE;
1322 new_dbcr0 |= (DBCR0_IDM | DBCR0_IC);
1323 } else {
1324 new_dbcr0 &= ~DBCR0_IC;
1325 if (!DBCR_ACTIVE_EVENTS(new_dbcr0,
1326 current->thread.debug.dbcr1)) {
1327 new_msr &= ~MSR_DE;
1328 new_dbcr0 &= ~DBCR0_IDM;
1329 }
1330 }
1331#else
1332 if (op.dbg_value)
1333 new_msr |= MSR_SE;
1334 else
1335 new_msr &= ~MSR_SE;
1336#endif
1337 break;
1338 case SIG_DBG_BRANCH_TRACING:
1339#ifdef CONFIG_PPC_ADV_DEBUG_REGS
1340 return -EINVAL;
1341#else
1342 if (op.dbg_value)
1343 new_msr |= MSR_BE;
1344 else
1345 new_msr &= ~MSR_BE;
1346#endif
1347 break;
1348
1349 default:
1350 return -EINVAL;
1351 }
1352 }
1353
1354
1355
1356
1357
1358
1359 regs->msr = new_msr;
1360#ifdef CONFIG_PPC_ADV_DEBUG_REGS
1361 current->thread.debug.dbcr0 = new_dbcr0;
1362#endif
1363
1364 if (!access_ok(VERIFY_READ, ctx, sizeof(*ctx))
1365 || __get_user(tmp, (u8 __user *) ctx)
1366 || __get_user(tmp, (u8 __user *) (ctx + 1) - 1))
1367 return -EFAULT;
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380 if (do_setcontext(ctx, regs, 1)) {
1381 if (show_unhandled_signals)
1382 printk_ratelimited(KERN_INFO "%s[%d]: bad frame in "
1383 "sys_debug_setcontext: %p nip %08lx "
1384 "lr %08lx\n",
1385 current->comm, current->pid,
1386 ctx, regs->nip, regs->link);
1387
1388 force_sig(SIGSEGV, current);
1389 goto out;
1390 }
1391
1392
1393
1394
1395
1396
1397
1398
1399 restore_altstack(&ctx->uc_stack);
1400
1401 set_thread_flag(TIF_RESTOREALL);
1402 out:
1403 return 0;
1404}
1405#endif
1406
1407
1408
1409
1410int handle_signal32(struct ksignal *ksig, sigset_t *oldset, struct pt_regs *regs)
1411{
1412 struct sigcontext __user *sc;
1413 struct sigframe __user *frame;
1414 struct mcontext __user *tm_mctx = NULL;
1415 unsigned long newsp = 0;
1416 int sigret;
1417 unsigned long tramp;
1418
1419
1420 frame = get_sigframe(ksig, get_tm_stackpointer(regs), sizeof(*frame), 1);
1421 if (unlikely(frame == NULL))
1422 goto badframe;
1423 sc = (struct sigcontext __user *) &frame->sctx;
1424
1425#if _NSIG != 64
1426#error "Please adjust handle_signal()"
1427#endif
1428 if (__put_user(to_user_ptr(ksig->ka.sa.sa_handler), &sc->handler)
1429 || __put_user(oldset->sig[0], &sc->oldmask)
1430#ifdef CONFIG_PPC64
1431 || __put_user((oldset->sig[0] >> 32), &sc->_unused[3])
1432#else
1433 || __put_user(oldset->sig[1], &sc->_unused[3])
1434#endif
1435 || __put_user(to_user_ptr(&frame->mctx), &sc->regs)
1436 || __put_user(ksig->sig, &sc->signal))
1437 goto badframe;
1438
1439 if (vdso32_sigtramp && current->mm->context.vdso_base) {
1440 sigret = 0;
1441 tramp = current->mm->context.vdso_base + vdso32_sigtramp;
1442 } else {
1443 sigret = __NR_sigreturn;
1444 tramp = (unsigned long) frame->mctx.tramp;
1445 }
1446
1447#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
1448 tm_mctx = &frame->mctx_transact;
1449 if (MSR_TM_ACTIVE(regs->msr)) {
1450 if (save_tm_user_regs(regs, &frame->mctx, &frame->mctx_transact,
1451 sigret))
1452 goto badframe;
1453 }
1454 else
1455#endif
1456 {
1457 if (save_user_regs(regs, &frame->mctx, tm_mctx, sigret, 1))
1458 goto badframe;
1459 }
1460
1461 regs->link = tramp;
1462
1463 current->thread.fp_state.fpscr = 0;
1464
1465
1466 newsp = ((unsigned long)frame) - __SIGNAL_FRAMESIZE;
1467 if (put_user(regs->gpr[1], (u32 __user *)newsp))
1468 goto badframe;
1469
1470 regs->gpr[1] = newsp;
1471 regs->gpr[3] = ksig->sig;
1472 regs->gpr[4] = (unsigned long) sc;
1473 regs->nip = (unsigned long) (unsigned long)ksig->ka.sa.sa_handler;
1474
1475 regs->msr &= ~MSR_LE;
1476 return 0;
1477
1478badframe:
1479 if (show_unhandled_signals)
1480 printk_ratelimited(KERN_INFO
1481 "%s[%d]: bad frame in handle_signal32: "
1482 "%p nip %08lx lr %08lx\n",
1483 current->comm, current->pid,
1484 frame, regs->nip, regs->link);
1485
1486 return 1;
1487}
1488
1489
1490
1491
1492long sys_sigreturn(int r3, int r4, int r5, int r6, int r7, int r8,
1493 struct pt_regs *regs)
1494{
1495 struct sigframe __user *sf;
1496 struct sigcontext __user *sc;
1497 struct sigcontext sigctx;
1498 struct mcontext __user *sr;
1499 void __user *addr;
1500 sigset_t set;
1501#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
1502 struct mcontext __user *mcp, *tm_mcp;
1503 unsigned long msr_hi;
1504#endif
1505
1506
1507 current->restart_block.fn = do_no_restart_syscall;
1508
1509 sf = (struct sigframe __user *)(regs->gpr[1] + __SIGNAL_FRAMESIZE);
1510 sc = &sf->sctx;
1511 addr = sc;
1512 if (copy_from_user(&sigctx, sc, sizeof(sigctx)))
1513 goto badframe;
1514
1515#ifdef CONFIG_PPC64
1516
1517
1518
1519
1520 set.sig[0] = sigctx.oldmask + ((long)(sigctx._unused[3]) << 32);
1521#else
1522 set.sig[0] = sigctx.oldmask;
1523 set.sig[1] = sigctx._unused[3];
1524#endif
1525 set_current_blocked(&set);
1526
1527#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
1528 mcp = (struct mcontext __user *)&sf->mctx;
1529 tm_mcp = (struct mcontext __user *)&sf->mctx_transact;
1530 if (__get_user(msr_hi, &tm_mcp->mc_gregs[PT_MSR]))
1531 goto badframe;
1532 if (MSR_TM_ACTIVE(msr_hi<<32)) {
1533 if (!cpu_has_feature(CPU_FTR_TM))
1534 goto badframe;
1535 if (restore_tm_user_regs(regs, mcp, tm_mcp))
1536 goto badframe;
1537 } else
1538#endif
1539 {
1540 sr = (struct mcontext __user *)from_user_ptr(sigctx.regs);
1541 addr = sr;
1542 if (!access_ok(VERIFY_READ, sr, sizeof(*sr))
1543 || restore_user_regs(regs, sr, 1))
1544 goto badframe;
1545 }
1546
1547 set_thread_flag(TIF_RESTOREALL);
1548 return 0;
1549
1550badframe:
1551 if (show_unhandled_signals)
1552 printk_ratelimited(KERN_INFO
1553 "%s[%d]: bad frame in sys_sigreturn: "
1554 "%p nip %08lx lr %08lx\n",
1555 current->comm, current->pid,
1556 addr, regs->nip, regs->link);
1557
1558 force_sig(SIGSEGV, current);
1559 return 0;
1560}
1561