1 | // SPDX-License-Identifier: GPL-2.0-or-later |
2 | /* |
3 | * Signal handling for 32bit PPC and 32bit tasks on 64bit PPC |
4 | * |
5 | * PowerPC version |
6 | * Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org) |
7 | * Copyright (C) 2001 IBM |
8 | * Copyright (C) 1997,1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz) |
9 | * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu) |
10 | * |
11 | * Derived from "arch/i386/kernel/signal.c" |
12 | * Copyright (C) 1991, 1992 Linus Torvalds |
13 | * 1997-11-28 Modified for POSIX.1b signals by Richard Henderson |
14 | */ |
15 | |
16 | #include <linux/sched.h> |
17 | #include <linux/mm.h> |
18 | #include <linux/smp.h> |
19 | #include <linux/kernel.h> |
20 | #include <linux/signal.h> |
21 | #include <linux/errno.h> |
22 | #include <linux/elf.h> |
23 | #include <linux/ptrace.h> |
24 | #include <linux/pagemap.h> |
25 | #include <linux/ratelimit.h> |
26 | #include <linux/syscalls.h> |
27 | #ifdef CONFIG_PPC64 |
28 | #include <linux/compat.h> |
29 | #else |
30 | #include <linux/wait.h> |
31 | #include <linux/unistd.h> |
32 | #include <linux/stddef.h> |
33 | #include <linux/tty.h> |
34 | #include <linux/binfmts.h> |
35 | #endif |
36 | |
37 | #include <linux/uaccess.h> |
38 | #include <asm/cacheflush.h> |
39 | #include <asm/syscalls.h> |
40 | #include <asm/sigcontext.h> |
41 | #include <asm/vdso.h> |
42 | #include <asm/switch_to.h> |
43 | #include <asm/tm.h> |
44 | #include <asm/asm-prototypes.h> |
45 | #ifdef CONFIG_PPC64 |
46 | #include <asm/syscalls_32.h> |
47 | #include <asm/unistd.h> |
48 | #else |
49 | #include <asm/ucontext.h> |
50 | #endif |
51 | |
52 | #include "signal.h" |
53 | |
54 | |
55 | #ifdef CONFIG_PPC64 |
56 | #define old_sigaction old_sigaction32 |
57 | #define sigcontext sigcontext32 |
58 | #define mcontext mcontext32 |
59 | #define ucontext ucontext32 |
60 | |
61 | /* |
62 | * Userspace code may pass a ucontext which doesn't include VSX added |
63 | * at the end. We need to check for this case. |
64 | */ |
65 | #define UCONTEXTSIZEWITHOUTVSX \ |
66 | (sizeof(struct ucontext) - sizeof(elf_vsrreghalf_t32)) |
67 | |
68 | /* |
69 | * Returning 0 means we return to userspace via |
70 | * ret_from_except and thus restore all user |
71 | * registers from *regs. This is what we need |
72 | * to do when a signal has been delivered. |
73 | */ |
74 | |
75 | #define GP_REGS_SIZE min(sizeof(elf_gregset_t32), sizeof(struct pt_regs32)) |
76 | #undef __SIGNAL_FRAMESIZE |
77 | #define __SIGNAL_FRAMESIZE __SIGNAL_FRAMESIZE32 |
78 | #undef ELF_NVRREG |
79 | #define ELF_NVRREG ELF_NVRREG32 |
80 | |
81 | /* |
82 | * Functions for flipping sigsets (thanks to brain dead generic |
83 | * implementation that makes things simple for little endian only) |
84 | */ |
85 | #define unsafe_put_sigset_t unsafe_put_compat_sigset |
86 | #define unsafe_get_sigset_t unsafe_get_compat_sigset |
87 | |
88 | #define to_user_ptr(p) ptr_to_compat(p) |
89 | #define from_user_ptr(p) compat_ptr(p) |
90 | |
91 | static __always_inline int |
92 | __unsafe_save_general_regs(struct pt_regs *regs, struct mcontext __user *frame) |
93 | { |
94 | elf_greg_t64 *gregs = (elf_greg_t64 *)regs; |
95 | int val, i; |
96 | |
97 | for (i = 0; i <= PT_RESULT; i ++) { |
98 | /* Force usr to alway see softe as 1 (interrupts enabled) */ |
99 | if (i == PT_SOFTE) |
100 | val = 1; |
101 | else |
102 | val = gregs[i]; |
103 | |
104 | unsafe_put_user(val, &frame->mc_gregs[i], failed); |
105 | } |
106 | return 0; |
107 | |
108 | failed: |
109 | return 1; |
110 | } |
111 | |
112 | static __always_inline int |
113 | __unsafe_restore_general_regs(struct pt_regs *regs, struct mcontext __user *sr) |
114 | { |
115 | elf_greg_t64 *gregs = (elf_greg_t64 *)regs; |
116 | int i; |
117 | |
118 | for (i = 0; i <= PT_RESULT; i++) { |
119 | if ((i == PT_MSR) || (i == PT_SOFTE)) |
120 | continue; |
121 | unsafe_get_user(gregs[i], &sr->mc_gregs[i], failed); |
122 | } |
123 | return 0; |
124 | |
125 | failed: |
126 | return 1; |
127 | } |
128 | |
129 | #else /* CONFIG_PPC64 */ |
130 | |
131 | #define GP_REGS_SIZE min(sizeof(elf_gregset_t), sizeof(struct pt_regs)) |
132 | |
133 | #define unsafe_put_sigset_t(uset, set, label) do { \ |
134 | sigset_t __user *__us = uset ; \ |
135 | const sigset_t *__s = set; \ |
136 | \ |
137 | unsafe_copy_to_user(__us, __s, sizeof(*__us), label); \ |
138 | } while (0) |
139 | |
140 | #define unsafe_get_sigset_t unsafe_get_user_sigset |
141 | |
142 | #define to_user_ptr(p) ((unsigned long)(p)) |
143 | #define from_user_ptr(p) ((void __user *)(p)) |
144 | |
145 | static __always_inline int |
146 | __unsafe_save_general_regs(struct pt_regs *regs, struct mcontext __user *frame) |
147 | { |
148 | unsafe_copy_to_user(&frame->mc_gregs, regs, GP_REGS_SIZE, failed); |
149 | return 0; |
150 | |
151 | failed: |
152 | return 1; |
153 | } |
154 | |
155 | static __always_inline |
156 | int __unsafe_restore_general_regs(struct pt_regs *regs, struct mcontext __user *sr) |
157 | { |
158 | /* copy up to but not including MSR */ |
159 | unsafe_copy_from_user(regs, &sr->mc_gregs, PT_MSR * sizeof(elf_greg_t), failed); |
160 | |
161 | /* copy from orig_r3 (the word after the MSR) up to the end */ |
162 | unsafe_copy_from_user(®s->orig_gpr3, &sr->mc_gregs[PT_ORIG_R3], |
163 | GP_REGS_SIZE - PT_ORIG_R3 * sizeof(elf_greg_t), failed); |
164 | |
165 | return 0; |
166 | |
167 | failed: |
168 | return 1; |
169 | } |
170 | #endif |
171 | |
172 | #define unsafe_save_general_regs(regs, frame, label) do { \ |
173 | if (__unsafe_save_general_regs(regs, frame)) \ |
174 | goto label; \ |
175 | } while (0) |
176 | |
177 | #define unsafe_restore_general_regs(regs, frame, label) do { \ |
178 | if (__unsafe_restore_general_regs(regs, frame)) \ |
179 | goto label; \ |
180 | } while (0) |
181 | |
182 | /* |
183 | * When we have signals to deliver, we set up on the |
184 | * user stack, going down from the original stack pointer: |
185 | * an ABI gap of 56 words |
186 | * an mcontext struct |
187 | * a sigcontext struct |
188 | * a gap of __SIGNAL_FRAMESIZE bytes |
189 | * |
190 | * Each of these things must be a multiple of 16 bytes in size. The following |
191 | * structure represent all of this except the __SIGNAL_FRAMESIZE gap |
192 | * |
193 | */ |
194 | struct sigframe { |
195 | struct sigcontext sctx; /* the sigcontext */ |
196 | struct mcontext mctx; /* all the register values */ |
197 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
198 | struct sigcontext sctx_transact; |
199 | struct mcontext mctx_transact; |
200 | #endif |
201 | /* |
202 | * Programs using the rs6000/xcoff abi can save up to 19 gp |
203 | * regs and 18 fp regs below sp before decrementing it. |
204 | */ |
205 | int abigap[56]; |
206 | }; |
207 | |
208 | /* |
209 | * When we have rt signals to deliver, we set up on the |
210 | * user stack, going down from the original stack pointer: |
211 | * one rt_sigframe struct (siginfo + ucontext + ABI gap) |
212 | * a gap of __SIGNAL_FRAMESIZE+16 bytes |
213 | * (the +16 is to get the siginfo and ucontext in the same |
214 | * positions as in older kernels). |
215 | * |
216 | * Each of these things must be a multiple of 16 bytes in size. |
217 | * |
218 | */ |
219 | struct rt_sigframe { |
220 | #ifdef CONFIG_PPC64 |
221 | compat_siginfo_t info; |
222 | #else |
223 | struct siginfo info; |
224 | #endif |
225 | struct ucontext uc; |
226 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
227 | struct ucontext uc_transact; |
228 | #endif |
229 | /* |
230 | * Programs using the rs6000/xcoff abi can save up to 19 gp |
231 | * regs and 18 fp regs below sp before decrementing it. |
232 | */ |
233 | int abigap[56]; |
234 | }; |
235 | |
236 | unsigned long get_min_sigframe_size_32(void) |
237 | { |
238 | return max(sizeof(struct rt_sigframe) + __SIGNAL_FRAMESIZE + 16, |
239 | sizeof(struct sigframe) + __SIGNAL_FRAMESIZE); |
240 | } |
241 | |
242 | /* |
243 | * Save the current user registers on the user stack. |
244 | * We only save the altivec/spe registers if the process has used |
245 | * altivec/spe instructions at some point. |
246 | */ |
247 | static void prepare_save_user_regs(int ctx_has_vsx_region) |
248 | { |
249 | /* Make sure floating point registers are stored in regs */ |
250 | flush_fp_to_thread(current); |
251 | #ifdef CONFIG_ALTIVEC |
252 | if (current->thread.used_vr) |
253 | flush_altivec_to_thread(current); |
254 | if (cpu_has_feature(CPU_FTR_ALTIVEC)) |
255 | current->thread.vrsave = mfspr(SPRN_VRSAVE); |
256 | #endif |
257 | #ifdef CONFIG_VSX |
258 | if (current->thread.used_vsr && ctx_has_vsx_region) |
259 | flush_vsx_to_thread(current); |
260 | #endif |
261 | #ifdef CONFIG_SPE |
262 | if (current->thread.used_spe) |
263 | flush_spe_to_thread(current); |
264 | #endif |
265 | } |
266 | |
267 | static __always_inline int |
268 | __unsafe_save_user_regs(struct pt_regs *regs, struct mcontext __user *frame, |
269 | struct mcontext __user *tm_frame, int ctx_has_vsx_region) |
270 | { |
271 | unsigned long msr = regs->msr; |
272 | |
273 | /* save general registers */ |
274 | unsafe_save_general_regs(regs, frame, failed); |
275 | |
276 | #ifdef CONFIG_ALTIVEC |
277 | /* save altivec registers */ |
278 | if (current->thread.used_vr) { |
279 | unsafe_copy_to_user(&frame->mc_vregs, ¤t->thread.vr_state, |
280 | ELF_NVRREG * sizeof(vector128), failed); |
281 | /* set MSR_VEC in the saved MSR value to indicate that |
282 | frame->mc_vregs contains valid data */ |
283 | msr |= MSR_VEC; |
284 | } |
285 | /* else assert((regs->msr & MSR_VEC) == 0) */ |
286 | |
287 | /* We always copy to/from vrsave, it's 0 if we don't have or don't |
288 | * use altivec. Since VSCR only contains 32 bits saved in the least |
289 | * significant bits of a vector, we "cheat" and stuff VRSAVE in the |
290 | * most significant bits of that same vector. --BenH |
291 | * Note that the current VRSAVE value is in the SPR at this point. |
292 | */ |
293 | unsafe_put_user(current->thread.vrsave, (u32 __user *)&frame->mc_vregs[32], |
294 | failed); |
295 | #endif /* CONFIG_ALTIVEC */ |
296 | unsafe_copy_fpr_to_user(&frame->mc_fregs, current, failed); |
297 | |
298 | /* |
299 | * Clear the MSR VSX bit to indicate there is no valid state attached |
300 | * to this context, except in the specific case below where we set it. |
301 | */ |
302 | msr &= ~MSR_VSX; |
303 | #ifdef CONFIG_VSX |
304 | /* |
305 | * Copy VSR 0-31 upper half from thread_struct to local |
306 | * buffer, then write that to userspace. Also set MSR_VSX in |
307 | * the saved MSR value to indicate that frame->mc_vregs |
308 | * contains valid data |
309 | */ |
310 | if (current->thread.used_vsr && ctx_has_vsx_region) { |
311 | unsafe_copy_vsx_to_user(&frame->mc_vsregs, current, failed); |
312 | msr |= MSR_VSX; |
313 | } |
314 | #endif /* CONFIG_VSX */ |
315 | #ifdef CONFIG_SPE |
316 | /* save spe registers */ |
317 | if (current->thread.used_spe) { |
318 | unsafe_copy_to_user(&frame->mc_vregs, current->thread.evr, |
319 | ELF_NEVRREG * sizeof(u32), failed); |
320 | /* set MSR_SPE in the saved MSR value to indicate that |
321 | frame->mc_vregs contains valid data */ |
322 | msr |= MSR_SPE; |
323 | } |
324 | /* else assert((regs->msr & MSR_SPE) == 0) */ |
325 | |
326 | /* We always copy to/from spefscr */ |
327 | unsafe_put_user(current->thread.spefscr, |
328 | (u32 __user *)&frame->mc_vregs + ELF_NEVRREG, failed); |
329 | #endif /* CONFIG_SPE */ |
330 | |
331 | unsafe_put_user(msr, &frame->mc_gregs[PT_MSR], failed); |
332 | |
333 | /* We need to write 0 the MSR top 32 bits in the tm frame so that we |
334 | * can check it on the restore to see if TM is active |
335 | */ |
336 | if (tm_frame) |
337 | unsafe_put_user(0, &tm_frame->mc_gregs[PT_MSR], failed); |
338 | |
339 | return 0; |
340 | |
341 | failed: |
342 | return 1; |
343 | } |
344 | |
345 | #define unsafe_save_user_regs(regs, frame, tm_frame, has_vsx, label) do { \ |
346 | if (__unsafe_save_user_regs(regs, frame, tm_frame, has_vsx)) \ |
347 | goto label; \ |
348 | } while (0) |
349 | |
350 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
351 | /* |
352 | * Save the current user registers on the user stack. |
353 | * We only save the altivec/spe registers if the process has used |
354 | * altivec/spe instructions at some point. |
355 | * We also save the transactional registers to a second ucontext in the |
356 | * frame. |
357 | * |
358 | * See __unsafe_save_user_regs() and signal_64.c:setup_tm_sigcontexts(). |
359 | */ |
360 | static void prepare_save_tm_user_regs(void) |
361 | { |
362 | WARN_ON(tm_suspend_disabled); |
363 | |
364 | if (cpu_has_feature(CPU_FTR_ALTIVEC)) |
365 | current->thread.ckvrsave = mfspr(SPRN_VRSAVE); |
366 | } |
367 | |
368 | static __always_inline int |
369 | save_tm_user_regs_unsafe(struct pt_regs *regs, struct mcontext __user *frame, |
370 | struct mcontext __user *tm_frame, unsigned long msr) |
371 | { |
372 | /* Save both sets of general registers */ |
373 | unsafe_save_general_regs(¤t->thread.ckpt_regs, frame, failed); |
374 | unsafe_save_general_regs(regs, tm_frame, failed); |
375 | |
376 | /* Stash the top half of the 64bit MSR into the 32bit MSR word |
377 | * of the transactional mcontext. This way we have a backward-compatible |
378 | * MSR in the 'normal' (checkpointed) mcontext and additionally one can |
379 | * also look at what type of transaction (T or S) was active at the |
380 | * time of the signal. |
381 | */ |
382 | unsafe_put_user((msr >> 32), &tm_frame->mc_gregs[PT_MSR], failed); |
383 | |
384 | /* save altivec registers */ |
385 | if (current->thread.used_vr) { |
386 | unsafe_copy_to_user(&frame->mc_vregs, ¤t->thread.ckvr_state, |
387 | ELF_NVRREG * sizeof(vector128), failed); |
388 | if (msr & MSR_VEC) |
389 | unsafe_copy_to_user(&tm_frame->mc_vregs, |
390 | ¤t->thread.vr_state, |
391 | ELF_NVRREG * sizeof(vector128), failed); |
392 | else |
393 | unsafe_copy_to_user(&tm_frame->mc_vregs, |
394 | ¤t->thread.ckvr_state, |
395 | ELF_NVRREG * sizeof(vector128), failed); |
396 | |
397 | /* set MSR_VEC in the saved MSR value to indicate that |
398 | * frame->mc_vregs contains valid data |
399 | */ |
400 | msr |= MSR_VEC; |
401 | } |
402 | |
403 | /* We always copy to/from vrsave, it's 0 if we don't have or don't |
404 | * use altivec. Since VSCR only contains 32 bits saved in the least |
405 | * significant bits of a vector, we "cheat" and stuff VRSAVE in the |
406 | * most significant bits of that same vector. --BenH |
407 | */ |
408 | unsafe_put_user(current->thread.ckvrsave, |
409 | (u32 __user *)&frame->mc_vregs[32], failed); |
410 | if (msr & MSR_VEC) |
411 | unsafe_put_user(current->thread.vrsave, |
412 | (u32 __user *)&tm_frame->mc_vregs[32], failed); |
413 | else |
414 | unsafe_put_user(current->thread.ckvrsave, |
415 | (u32 __user *)&tm_frame->mc_vregs[32], failed); |
416 | |
417 | unsafe_copy_ckfpr_to_user(&frame->mc_fregs, current, failed); |
418 | if (msr & MSR_FP) |
419 | unsafe_copy_fpr_to_user(&tm_frame->mc_fregs, current, failed); |
420 | else |
421 | unsafe_copy_ckfpr_to_user(&tm_frame->mc_fregs, current, failed); |
422 | |
423 | /* |
424 | * Copy VSR 0-31 upper half from thread_struct to local |
425 | * buffer, then write that to userspace. Also set MSR_VSX in |
426 | * the saved MSR value to indicate that frame->mc_vregs |
427 | * contains valid data |
428 | */ |
429 | if (current->thread.used_vsr) { |
430 | unsafe_copy_ckvsx_to_user(&frame->mc_vsregs, current, failed); |
431 | if (msr & MSR_VSX) |
432 | unsafe_copy_vsx_to_user(&tm_frame->mc_vsregs, current, failed); |
433 | else |
434 | unsafe_copy_ckvsx_to_user(&tm_frame->mc_vsregs, current, failed); |
435 | |
436 | msr |= MSR_VSX; |
437 | } |
438 | |
439 | unsafe_put_user(msr, &frame->mc_gregs[PT_MSR], failed); |
440 | |
441 | return 0; |
442 | |
443 | failed: |
444 | return 1; |
445 | } |
446 | #else |
447 | static void prepare_save_tm_user_regs(void) { } |
448 | |
449 | static __always_inline int |
450 | save_tm_user_regs_unsafe(struct pt_regs *regs, struct mcontext __user *frame, |
451 | struct mcontext __user *tm_frame, unsigned long msr) |
452 | { |
453 | return 0; |
454 | } |
455 | #endif |
456 | |
457 | #define unsafe_save_tm_user_regs(regs, frame, tm_frame, msr, label) do { \ |
458 | if (save_tm_user_regs_unsafe(regs, frame, tm_frame, msr)) \ |
459 | goto label; \ |
460 | } while (0) |
461 | |
462 | /* |
463 | * Restore the current user register values from the user stack, |
464 | * (except for MSR). |
465 | */ |
466 | static long restore_user_regs(struct pt_regs *regs, |
467 | struct mcontext __user *sr, int sig) |
468 | { |
469 | unsigned int save_r2 = 0; |
470 | unsigned long msr; |
471 | #ifdef CONFIG_VSX |
472 | int i; |
473 | #endif |
474 | |
475 | if (!user_read_access_begin(sr, sizeof(*sr))) |
476 | return 1; |
477 | /* |
478 | * restore general registers but not including MSR or SOFTE. Also |
479 | * take care of keeping r2 (TLS) intact if not a signal |
480 | */ |
481 | if (!sig) |
482 | save_r2 = (unsigned int)regs->gpr[2]; |
483 | unsafe_restore_general_regs(regs, sr, failed); |
484 | set_trap_norestart(regs); |
485 | unsafe_get_user(msr, &sr->mc_gregs[PT_MSR], failed); |
486 | if (!sig) |
487 | regs->gpr[2] = (unsigned long) save_r2; |
488 | |
489 | /* if doing signal return, restore the previous little-endian mode */ |
490 | if (sig) |
491 | regs_set_return_msr(regs, (regs->msr & ~MSR_LE) | (msr & MSR_LE)); |
492 | |
493 | #ifdef CONFIG_ALTIVEC |
494 | /* |
495 | * Force the process to reload the altivec registers from |
496 | * current->thread when it next does altivec instructions |
497 | */ |
498 | regs_set_return_msr(regs, regs->msr & ~MSR_VEC); |
499 | if (msr & MSR_VEC) { |
500 | /* restore altivec registers from the stack */ |
501 | unsafe_copy_from_user(¤t->thread.vr_state, &sr->mc_vregs, |
502 | sizeof(sr->mc_vregs), failed); |
503 | current->thread.used_vr = true; |
504 | } else if (current->thread.used_vr) |
505 | memset(¤t->thread.vr_state, 0, |
506 | ELF_NVRREG * sizeof(vector128)); |
507 | |
508 | /* Always get VRSAVE back */ |
509 | unsafe_get_user(current->thread.vrsave, (u32 __user *)&sr->mc_vregs[32], failed); |
510 | if (cpu_has_feature(CPU_FTR_ALTIVEC)) |
511 | mtspr(SPRN_VRSAVE, current->thread.vrsave); |
512 | #endif /* CONFIG_ALTIVEC */ |
513 | unsafe_copy_fpr_from_user(current, &sr->mc_fregs, failed); |
514 | |
515 | #ifdef CONFIG_VSX |
516 | /* |
517 | * Force the process to reload the VSX registers from |
518 | * current->thread when it next does VSX instruction. |
519 | */ |
520 | regs_set_return_msr(regs, regs->msr & ~MSR_VSX); |
521 | if (msr & MSR_VSX) { |
522 | /* |
523 | * Restore altivec registers from the stack to a local |
524 | * buffer, then write this out to the thread_struct |
525 | */ |
526 | unsafe_copy_vsx_from_user(current, &sr->mc_vsregs, failed); |
527 | current->thread.used_vsr = true; |
528 | } else if (current->thread.used_vsr) |
529 | for (i = 0; i < 32 ; i++) |
530 | current->thread.fp_state.fpr[i][TS_VSRLOWOFFSET] = 0; |
531 | #endif /* CONFIG_VSX */ |
532 | /* |
533 | * force the process to reload the FP registers from |
534 | * current->thread when it next does FP instructions |
535 | */ |
536 | regs_set_return_msr(regs, regs->msr & ~(MSR_FP | MSR_FE0 | MSR_FE1)); |
537 | |
538 | #ifdef CONFIG_SPE |
539 | /* |
540 | * Force the process to reload the spe registers from |
541 | * current->thread when it next does spe instructions. |
542 | * Since this is user ABI, we must enforce the sizing. |
543 | */ |
544 | BUILD_BUG_ON(sizeof(current->thread.spe) != ELF_NEVRREG * sizeof(u32)); |
545 | regs_set_return_msr(regs, regs->msr & ~MSR_SPE); |
546 | if (msr & MSR_SPE) { |
547 | /* restore spe registers from the stack */ |
548 | unsafe_copy_from_user(¤t->thread.spe, &sr->mc_vregs, |
549 | sizeof(current->thread.spe), failed); |
550 | current->thread.used_spe = true; |
551 | } else if (current->thread.used_spe) |
552 | memset(¤t->thread.spe, 0, sizeof(current->thread.spe)); |
553 | |
554 | /* Always get SPEFSCR back */ |
555 | unsafe_get_user(current->thread.spefscr, (u32 __user *)&sr->mc_vregs + ELF_NEVRREG, failed); |
556 | #endif /* CONFIG_SPE */ |
557 | |
558 | user_read_access_end(); |
559 | return 0; |
560 | |
561 | failed: |
562 | user_read_access_end(); |
563 | return 1; |
564 | } |
565 | |
566 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
567 | /* |
568 | * Restore the current user register values from the user stack, except for |
569 | * MSR, and recheckpoint the original checkpointed register state for processes |
570 | * in transactions. |
571 | */ |
572 | static long restore_tm_user_regs(struct pt_regs *regs, |
573 | struct mcontext __user *sr, |
574 | struct mcontext __user *tm_sr) |
575 | { |
576 | unsigned long msr, msr_hi; |
577 | int i; |
578 | |
579 | if (tm_suspend_disabled) |
580 | return 1; |
581 | /* |
582 | * restore general registers but not including MSR or SOFTE. Also |
583 | * take care of keeping r2 (TLS) intact if not a signal. |
584 | * See comment in signal_64.c:restore_tm_sigcontexts(); |
585 | * TFHAR is restored from the checkpointed NIP; TEXASR and TFIAR |
586 | * were set by the signal delivery. |
587 | */ |
588 | if (!user_read_access_begin(sr, sizeof(*sr))) |
589 | return 1; |
590 | |
591 | unsafe_restore_general_regs(¤t->thread.ckpt_regs, sr, failed); |
592 | unsafe_get_user(current->thread.tm_tfhar, &sr->mc_gregs[PT_NIP], failed); |
593 | unsafe_get_user(msr, &sr->mc_gregs[PT_MSR], failed); |
594 | |
595 | /* Restore the previous little-endian mode */ |
596 | regs_set_return_msr(regs, (regs->msr & ~MSR_LE) | (msr & MSR_LE)); |
597 | |
598 | regs_set_return_msr(regs, regs->msr & ~MSR_VEC); |
599 | if (msr & MSR_VEC) { |
600 | /* restore altivec registers from the stack */ |
601 | unsafe_copy_from_user(¤t->thread.ckvr_state, &sr->mc_vregs, |
602 | sizeof(sr->mc_vregs), failed); |
603 | current->thread.used_vr = true; |
604 | } else if (current->thread.used_vr) { |
605 | memset(¤t->thread.vr_state, 0, |
606 | ELF_NVRREG * sizeof(vector128)); |
607 | memset(¤t->thread.ckvr_state, 0, |
608 | ELF_NVRREG * sizeof(vector128)); |
609 | } |
610 | |
611 | /* Always get VRSAVE back */ |
612 | unsafe_get_user(current->thread.ckvrsave, |
613 | (u32 __user *)&sr->mc_vregs[32], failed); |
614 | if (cpu_has_feature(CPU_FTR_ALTIVEC)) |
615 | mtspr(SPRN_VRSAVE, current->thread.ckvrsave); |
616 | |
617 | regs_set_return_msr(regs, regs->msr & ~(MSR_FP | MSR_FE0 | MSR_FE1)); |
618 | |
619 | unsafe_copy_fpr_from_user(current, &sr->mc_fregs, failed); |
620 | |
621 | regs_set_return_msr(regs, regs->msr & ~MSR_VSX); |
622 | if (msr & MSR_VSX) { |
623 | /* |
624 | * Restore altivec registers from the stack to a local |
625 | * buffer, then write this out to the thread_struct |
626 | */ |
627 | unsafe_copy_ckvsx_from_user(current, &sr->mc_vsregs, failed); |
628 | current->thread.used_vsr = true; |
629 | } else if (current->thread.used_vsr) |
630 | for (i = 0; i < 32 ; i++) { |
631 | current->thread.fp_state.fpr[i][TS_VSRLOWOFFSET] = 0; |
632 | current->thread.ckfp_state.fpr[i][TS_VSRLOWOFFSET] = 0; |
633 | } |
634 | |
635 | user_read_access_end(); |
636 | |
637 | if (!user_read_access_begin(tm_sr, sizeof(*tm_sr))) |
638 | return 1; |
639 | |
640 | unsafe_restore_general_regs(regs, tm_sr, failed); |
641 | |
642 | /* restore altivec registers from the stack */ |
643 | if (msr & MSR_VEC) |
644 | unsafe_copy_from_user(¤t->thread.vr_state, &tm_sr->mc_vregs, |
645 | sizeof(sr->mc_vregs), failed); |
646 | |
647 | /* Always get VRSAVE back */ |
648 | unsafe_get_user(current->thread.vrsave, |
649 | (u32 __user *)&tm_sr->mc_vregs[32], failed); |
650 | |
651 | unsafe_copy_ckfpr_from_user(current, &tm_sr->mc_fregs, failed); |
652 | |
653 | if (msr & MSR_VSX) { |
654 | /* |
655 | * Restore altivec registers from the stack to a local |
656 | * buffer, then write this out to the thread_struct |
657 | */ |
658 | unsafe_copy_vsx_from_user(current, &tm_sr->mc_vsregs, failed); |
659 | current->thread.used_vsr = true; |
660 | } |
661 | |
662 | /* Get the top half of the MSR from the user context */ |
663 | unsafe_get_user(msr_hi, &tm_sr->mc_gregs[PT_MSR], failed); |
664 | msr_hi <<= 32; |
665 | |
666 | user_read_access_end(); |
667 | |
668 | /* If TM bits are set to the reserved value, it's an invalid context */ |
669 | if (MSR_TM_RESV(msr_hi)) |
670 | return 1; |
671 | |
672 | /* |
673 | * Disabling preemption, since it is unsafe to be preempted |
674 | * with MSR[TS] set without recheckpointing. |
675 | */ |
676 | preempt_disable(); |
677 | |
678 | /* |
679 | * CAUTION: |
680 | * After regs->MSR[TS] being updated, make sure that get_user(), |
681 | * put_user() or similar functions are *not* called. These |
682 | * functions can generate page faults which will cause the process |
683 | * to be de-scheduled with MSR[TS] set but without calling |
684 | * tm_recheckpoint(). This can cause a bug. |
685 | * |
686 | * Pull in the MSR TM bits from the user context |
687 | */ |
688 | regs_set_return_msr(regs, (regs->msr & ~MSR_TS_MASK) | (msr_hi & MSR_TS_MASK)); |
689 | /* Now, recheckpoint. This loads up all of the checkpointed (older) |
690 | * registers, including FP and V[S]Rs. After recheckpointing, the |
691 | * transactional versions should be loaded. |
692 | */ |
693 | tm_enable(); |
694 | /* Make sure the transaction is marked as failed */ |
695 | current->thread.tm_texasr |= TEXASR_FS; |
696 | /* This loads the checkpointed FP/VEC state, if used */ |
697 | tm_recheckpoint(¤t->thread); |
698 | |
699 | /* This loads the speculative FP/VEC state, if used */ |
700 | msr_check_and_set(msr & (MSR_FP | MSR_VEC)); |
701 | if (msr & MSR_FP) { |
702 | load_fp_state(¤t->thread.fp_state); |
703 | regs_set_return_msr(regs, regs->msr | (MSR_FP | current->thread.fpexc_mode)); |
704 | } |
705 | if (msr & MSR_VEC) { |
706 | load_vr_state(¤t->thread.vr_state); |
707 | regs_set_return_msr(regs, regs->msr | MSR_VEC); |
708 | } |
709 | |
710 | preempt_enable(); |
711 | |
712 | return 0; |
713 | |
714 | failed: |
715 | user_read_access_end(); |
716 | return 1; |
717 | } |
718 | #else |
719 | static long restore_tm_user_regs(struct pt_regs *regs, struct mcontext __user *sr, |
720 | struct mcontext __user *tm_sr) |
721 | { |
722 | return 0; |
723 | } |
724 | #endif |
725 | |
726 | #ifdef CONFIG_PPC64 |
727 | |
728 | #define copy_siginfo_to_user copy_siginfo_to_user32 |
729 | |
730 | #endif /* CONFIG_PPC64 */ |
731 | |
732 | /* |
733 | * Set up a signal frame for a "real-time" signal handler |
734 | * (one which gets siginfo). |
735 | */ |
736 | int handle_rt_signal32(struct ksignal *ksig, sigset_t *oldset, |
737 | struct task_struct *tsk) |
738 | { |
739 | struct rt_sigframe __user *frame; |
740 | struct mcontext __user *mctx; |
741 | struct mcontext __user *tm_mctx = NULL; |
742 | unsigned long newsp = 0; |
743 | unsigned long tramp; |
744 | struct pt_regs *regs = tsk->thread.regs; |
745 | /* Save the thread's msr before get_tm_stackpointer() changes it */ |
746 | unsigned long msr = regs->msr; |
747 | |
748 | /* Set up Signal Frame */ |
749 | frame = get_sigframe(ksig, tsk, frame_size: sizeof(*frame), is_32: 1); |
750 | mctx = &frame->uc.uc_mcontext; |
751 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
752 | tm_mctx = &frame->uc_transact.uc_mcontext; |
753 | #endif |
754 | if (MSR_TM_ACTIVE(msr)) |
755 | prepare_save_tm_user_regs(); |
756 | else |
757 | prepare_save_user_regs(ctx_has_vsx_region: 1); |
758 | |
759 | if (!user_access_begin(frame, sizeof(*frame))) |
760 | goto badframe; |
761 | |
762 | /* Put the siginfo & fill in most of the ucontext */ |
763 | unsafe_put_user(0, &frame->uc.uc_flags, failed); |
764 | #ifdef CONFIG_PPC64 |
765 | unsafe_compat_save_altstack(&frame->uc.uc_stack, regs->gpr[1], failed); |
766 | #else |
767 | unsafe_save_altstack(&frame->uc.uc_stack, regs->gpr[1], failed); |
768 | #endif |
769 | unsafe_put_user(to_user_ptr(&frame->uc.uc_mcontext), &frame->uc.uc_regs, failed); |
770 | |
771 | if (MSR_TM_ACTIVE(msr)) { |
772 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
773 | unsafe_put_user((unsigned long)&frame->uc_transact, |
774 | &frame->uc.uc_link, failed); |
775 | unsafe_put_user((unsigned long)tm_mctx, |
776 | &frame->uc_transact.uc_regs, failed); |
777 | #endif |
778 | unsafe_save_tm_user_regs(regs, mctx, tm_mctx, msr, failed); |
779 | } else { |
780 | unsafe_put_user(0, &frame->uc.uc_link, failed); |
781 | unsafe_save_user_regs(regs, mctx, tm_mctx, 1, failed); |
782 | } |
783 | |
784 | /* Save user registers on the stack */ |
785 | if (tsk->mm->context.vdso) { |
786 | tramp = VDSO32_SYMBOL(tsk->mm->context.vdso, sigtramp_rt32); |
787 | } else { |
788 | tramp = (unsigned long)mctx->mc_pad; |
789 | unsafe_put_user(PPC_RAW_LI(_R0, __NR_rt_sigreturn), &mctx->mc_pad[0], failed); |
790 | unsafe_put_user(PPC_RAW_SC(), &mctx->mc_pad[1], failed); |
791 | asm("dcbst %y0; sync; icbi %y0; sync" :: "Z" (mctx->mc_pad[0])); |
792 | } |
793 | unsafe_put_sigset_t(&frame->uc.uc_sigmask, oldset, failed); |
794 | |
795 | user_access_end(); |
796 | |
797 | if (copy_siginfo_to_user(to: &frame->info, from: &ksig->info)) |
798 | goto badframe; |
799 | |
800 | regs->link = tramp; |
801 | |
802 | #ifdef CONFIG_PPC_FPU_REGS |
803 | tsk->thread.fp_state.fpscr = 0; /* turn off all fp exceptions */ |
804 | #endif |
805 | |
806 | /* create a stack frame for the caller of the handler */ |
807 | newsp = ((unsigned long)frame) - (__SIGNAL_FRAMESIZE + 16); |
808 | if (put_user(regs->gpr[1], (u32 __user *)newsp)) |
809 | goto badframe; |
810 | |
811 | /* Fill registers for signal handler */ |
812 | regs->gpr[1] = newsp; |
813 | regs->gpr[3] = ksig->sig; |
814 | regs->gpr[4] = (unsigned long)&frame->info; |
815 | regs->gpr[5] = (unsigned long)&frame->uc; |
816 | regs->gpr[6] = (unsigned long)frame; |
817 | regs_set_return_ip(regs, (unsigned long) ksig->ka.sa.sa_handler); |
818 | /* enter the signal handler in native-endian mode */ |
819 | regs_set_return_msr(regs, (regs->msr & ~MSR_LE) | (MSR_KERNEL & MSR_LE)); |
820 | |
821 | return 0; |
822 | |
823 | failed: |
824 | user_access_end(); |
825 | |
826 | badframe: |
827 | signal_fault(tsk, regs, where: "handle_rt_signal32" , ptr: frame); |
828 | |
829 | return 1; |
830 | } |
831 | |
832 | /* |
833 | * OK, we're invoking a handler |
834 | */ |
835 | int handle_signal32(struct ksignal *ksig, sigset_t *oldset, |
836 | struct task_struct *tsk) |
837 | { |
838 | struct sigcontext __user *sc; |
839 | struct sigframe __user *frame; |
840 | struct mcontext __user *mctx; |
841 | struct mcontext __user *tm_mctx = NULL; |
842 | unsigned long newsp = 0; |
843 | unsigned long tramp; |
844 | struct pt_regs *regs = tsk->thread.regs; |
845 | /* Save the thread's msr before get_tm_stackpointer() changes it */ |
846 | unsigned long msr = regs->msr; |
847 | |
848 | /* Set up Signal Frame */ |
849 | frame = get_sigframe(ksig, tsk, frame_size: sizeof(*frame), is_32: 1); |
850 | mctx = &frame->mctx; |
851 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
852 | tm_mctx = &frame->mctx_transact; |
853 | #endif |
854 | if (MSR_TM_ACTIVE(msr)) |
855 | prepare_save_tm_user_regs(); |
856 | else |
857 | prepare_save_user_regs(ctx_has_vsx_region: 1); |
858 | |
859 | if (!user_access_begin(frame, sizeof(*frame))) |
860 | goto badframe; |
861 | sc = (struct sigcontext __user *) &frame->sctx; |
862 | |
863 | #if _NSIG != 64 |
864 | #error "Please adjust handle_signal()" |
865 | #endif |
866 | unsafe_put_user(to_user_ptr(ksig->ka.sa.sa_handler), &sc->handler, failed); |
867 | unsafe_put_user(oldset->sig[0], &sc->oldmask, failed); |
868 | #ifdef CONFIG_PPC64 |
869 | unsafe_put_user((oldset->sig[0] >> 32), &sc->_unused[3], failed); |
870 | #else |
871 | unsafe_put_user(oldset->sig[1], &sc->_unused[3], failed); |
872 | #endif |
873 | unsafe_put_user(to_user_ptr(mctx), &sc->regs, failed); |
874 | unsafe_put_user(ksig->sig, &sc->signal, failed); |
875 | |
876 | if (MSR_TM_ACTIVE(msr)) |
877 | unsafe_save_tm_user_regs(regs, mctx, tm_mctx, msr, failed); |
878 | else |
879 | unsafe_save_user_regs(regs, mctx, tm_mctx, 1, failed); |
880 | |
881 | if (tsk->mm->context.vdso) { |
882 | tramp = VDSO32_SYMBOL(tsk->mm->context.vdso, sigtramp32); |
883 | } else { |
884 | tramp = (unsigned long)mctx->mc_pad; |
885 | unsafe_put_user(PPC_RAW_LI(_R0, __NR_sigreturn), &mctx->mc_pad[0], failed); |
886 | unsafe_put_user(PPC_RAW_SC(), &mctx->mc_pad[1], failed); |
887 | asm("dcbst %y0; sync; icbi %y0; sync" :: "Z" (mctx->mc_pad[0])); |
888 | } |
889 | user_access_end(); |
890 | |
891 | regs->link = tramp; |
892 | |
893 | #ifdef CONFIG_PPC_FPU_REGS |
894 | tsk->thread.fp_state.fpscr = 0; /* turn off all fp exceptions */ |
895 | #endif |
896 | |
897 | /* create a stack frame for the caller of the handler */ |
898 | newsp = ((unsigned long)frame) - __SIGNAL_FRAMESIZE; |
899 | if (put_user(regs->gpr[1], (u32 __user *)newsp)) |
900 | goto badframe; |
901 | |
902 | regs->gpr[1] = newsp; |
903 | regs->gpr[3] = ksig->sig; |
904 | regs->gpr[4] = (unsigned long) sc; |
905 | regs_set_return_ip(regs, (unsigned long) ksig->ka.sa.sa_handler); |
906 | /* enter the signal handler in native-endian mode */ |
907 | regs_set_return_msr(regs, (regs->msr & ~MSR_LE) | (MSR_KERNEL & MSR_LE)); |
908 | |
909 | return 0; |
910 | |
911 | failed: |
912 | user_access_end(); |
913 | |
914 | badframe: |
915 | signal_fault(tsk, regs, where: "handle_signal32" , ptr: frame); |
916 | |
917 | return 1; |
918 | } |
919 | |
920 | static int do_setcontext(struct ucontext __user *ucp, struct pt_regs *regs, int sig) |
921 | { |
922 | sigset_t set; |
923 | struct mcontext __user *mcp; |
924 | |
925 | if (!user_read_access_begin(ucp, sizeof(*ucp))) |
926 | return -EFAULT; |
927 | |
928 | unsafe_get_sigset_t(&set, &ucp->uc_sigmask, failed); |
929 | #ifdef CONFIG_PPC64 |
930 | { |
931 | u32 cmcp; |
932 | |
933 | unsafe_get_user(cmcp, &ucp->uc_regs, failed); |
934 | mcp = (struct mcontext __user *)(u64)cmcp; |
935 | } |
936 | #else |
937 | unsafe_get_user(mcp, &ucp->uc_regs, failed); |
938 | #endif |
939 | user_read_access_end(); |
940 | |
941 | set_current_blocked(&set); |
942 | if (restore_user_regs(regs, sr: mcp, sig)) |
943 | return -EFAULT; |
944 | |
945 | return 0; |
946 | |
947 | failed: |
948 | user_read_access_end(); |
949 | return -EFAULT; |
950 | } |
951 | |
952 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
953 | static int do_setcontext_tm(struct ucontext __user *ucp, |
954 | struct ucontext __user *tm_ucp, |
955 | struct pt_regs *regs) |
956 | { |
957 | sigset_t set; |
958 | struct mcontext __user *mcp; |
959 | struct mcontext __user *tm_mcp; |
960 | u32 cmcp; |
961 | u32 tm_cmcp; |
962 | |
963 | if (!user_read_access_begin(ucp, sizeof(*ucp))) |
964 | return -EFAULT; |
965 | |
966 | unsafe_get_sigset_t(&set, &ucp->uc_sigmask, failed); |
967 | unsafe_get_user(cmcp, &ucp->uc_regs, failed); |
968 | |
969 | user_read_access_end(); |
970 | |
971 | if (__get_user(tm_cmcp, &tm_ucp->uc_regs)) |
972 | return -EFAULT; |
973 | mcp = (struct mcontext __user *)(u64)cmcp; |
974 | tm_mcp = (struct mcontext __user *)(u64)tm_cmcp; |
975 | /* no need to check access_ok(mcp), since mcp < 4GB */ |
976 | |
977 | set_current_blocked(&set); |
978 | if (restore_tm_user_regs(regs, mcp, tm_mcp)) |
979 | return -EFAULT; |
980 | |
981 | return 0; |
982 | |
983 | failed: |
984 | user_read_access_end(); |
985 | return -EFAULT; |
986 | } |
987 | #endif |
988 | |
989 | #ifdef CONFIG_PPC64 |
990 | COMPAT_SYSCALL_DEFINE3(swapcontext, struct ucontext __user *, old_ctx, |
991 | struct ucontext __user *, new_ctx, int, ctx_size) |
992 | #else |
993 | SYSCALL_DEFINE3(swapcontext, struct ucontext __user *, old_ctx, |
994 | struct ucontext __user *, new_ctx, long, ctx_size) |
995 | #endif |
996 | { |
997 | struct pt_regs *regs = current_pt_regs(); |
998 | int ctx_has_vsx_region = 0; |
999 | |
1000 | #ifdef CONFIG_PPC64 |
1001 | unsigned long new_msr = 0; |
1002 | |
1003 | if (new_ctx) { |
1004 | struct mcontext __user *mcp; |
1005 | u32 cmcp; |
1006 | |
1007 | /* |
1008 | * Get pointer to the real mcontext. No need for |
1009 | * access_ok since we are dealing with compat |
1010 | * pointers. |
1011 | */ |
1012 | if (__get_user(cmcp, &new_ctx->uc_regs)) |
1013 | return -EFAULT; |
1014 | mcp = (struct mcontext __user *)(u64)cmcp; |
1015 | if (__get_user(new_msr, &mcp->mc_gregs[PT_MSR])) |
1016 | return -EFAULT; |
1017 | } |
1018 | /* |
1019 | * Check that the context is not smaller than the original |
1020 | * size (with VMX but without VSX) |
1021 | */ |
1022 | if (ctx_size < UCONTEXTSIZEWITHOUTVSX) |
1023 | return -EINVAL; |
1024 | /* |
1025 | * If the new context state sets the MSR VSX bits but |
1026 | * it doesn't provide VSX state. |
1027 | */ |
1028 | if ((ctx_size < sizeof(struct ucontext)) && |
1029 | (new_msr & MSR_VSX)) |
1030 | return -EINVAL; |
1031 | /* Does the context have enough room to store VSX data? */ |
1032 | if (ctx_size >= sizeof(struct ucontext)) |
1033 | ctx_has_vsx_region = 1; |
1034 | #else |
1035 | /* Context size is for future use. Right now, we only make sure |
1036 | * we are passed something we understand |
1037 | */ |
1038 | if (ctx_size < sizeof(struct ucontext)) |
1039 | return -EINVAL; |
1040 | #endif |
1041 | if (old_ctx != NULL) { |
1042 | struct mcontext __user *mctx; |
1043 | |
1044 | /* |
1045 | * old_ctx might not be 16-byte aligned, in which |
1046 | * case old_ctx->uc_mcontext won't be either. |
1047 | * Because we have the old_ctx->uc_pad2 field |
1048 | * before old_ctx->uc_mcontext, we need to round down |
1049 | * from &old_ctx->uc_mcontext to a 16-byte boundary. |
1050 | */ |
1051 | mctx = (struct mcontext __user *) |
1052 | ((unsigned long) &old_ctx->uc_mcontext & ~0xfUL); |
1053 | prepare_save_user_regs(ctx_has_vsx_region); |
1054 | if (!user_write_access_begin(old_ctx, ctx_size)) |
1055 | return -EFAULT; |
1056 | unsafe_save_user_regs(regs, mctx, NULL, ctx_has_vsx_region, failed); |
1057 | unsafe_put_sigset_t(&old_ctx->uc_sigmask, ¤t->blocked, failed); |
1058 | unsafe_put_user(to_user_ptr(mctx), &old_ctx->uc_regs, failed); |
1059 | user_write_access_end(); |
1060 | } |
1061 | if (new_ctx == NULL) |
1062 | return 0; |
1063 | if (!access_ok(new_ctx, ctx_size) || |
1064 | fault_in_readable(uaddr: (char __user *)new_ctx, size: ctx_size)) |
1065 | return -EFAULT; |
1066 | |
1067 | /* |
1068 | * If we get a fault copying the context into the kernel's |
1069 | * image of the user's registers, we can't just return -EFAULT |
1070 | * because the user's registers will be corrupted. For instance |
1071 | * the NIP value may have been updated but not some of the |
1072 | * other registers. Given that we have done the access_ok |
1073 | * and successfully read the first and last bytes of the region |
1074 | * above, this should only happen in an out-of-memory situation |
1075 | * or if another thread unmaps the region containing the context. |
1076 | * We kill the task with a SIGSEGV in this situation. |
1077 | */ |
1078 | if (do_setcontext(ucp: new_ctx, regs, sig: 0)) { |
1079 | force_exit_sig(SIGSEGV); |
1080 | return -EFAULT; |
1081 | } |
1082 | |
1083 | set_thread_flag(TIF_RESTOREALL); |
1084 | return 0; |
1085 | |
1086 | failed: |
1087 | user_write_access_end(); |
1088 | return -EFAULT; |
1089 | } |
1090 | |
1091 | #ifdef CONFIG_PPC64 |
1092 | COMPAT_SYSCALL_DEFINE0(rt_sigreturn) |
1093 | #else |
1094 | SYSCALL_DEFINE0(rt_sigreturn) |
1095 | #endif |
1096 | { |
1097 | struct rt_sigframe __user *rt_sf; |
1098 | struct pt_regs *regs = current_pt_regs(); |
1099 | int tm_restore = 0; |
1100 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
1101 | struct ucontext __user *uc_transact; |
1102 | unsigned long msr_hi; |
1103 | unsigned long tmp; |
1104 | #endif |
1105 | /* Always make any pending restarted system calls return -EINTR */ |
1106 | current->restart_block.fn = do_no_restart_syscall; |
1107 | |
1108 | rt_sf = (struct rt_sigframe __user *) |
1109 | (regs->gpr[1] + __SIGNAL_FRAMESIZE + 16); |
1110 | if (!access_ok(rt_sf, sizeof(*rt_sf))) |
1111 | goto bad; |
1112 | |
1113 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
1114 | /* |
1115 | * If there is a transactional state then throw it away. |
1116 | * The purpose of a sigreturn is to destroy all traces of the |
1117 | * signal frame, this includes any transactional state created |
1118 | * within in. We only check for suspended as we can never be |
1119 | * active in the kernel, we are active, there is nothing better to |
1120 | * do than go ahead and Bad Thing later. |
1121 | * The cause is not important as there will never be a |
1122 | * recheckpoint so it's not user visible. |
1123 | */ |
1124 | if (MSR_TM_SUSPENDED(mfmsr())) |
1125 | tm_reclaim_current(0); |
1126 | |
1127 | if (__get_user(tmp, &rt_sf->uc.uc_link)) |
1128 | goto bad; |
1129 | uc_transact = (struct ucontext __user *)(uintptr_t)tmp; |
1130 | if (uc_transact) { |
1131 | u32 cmcp; |
1132 | struct mcontext __user *mcp; |
1133 | |
1134 | if (__get_user(cmcp, &uc_transact->uc_regs)) |
1135 | return -EFAULT; |
1136 | mcp = (struct mcontext __user *)(u64)cmcp; |
1137 | /* The top 32 bits of the MSR are stashed in the transactional |
1138 | * ucontext. */ |
1139 | if (__get_user(msr_hi, &mcp->mc_gregs[PT_MSR])) |
1140 | goto bad; |
1141 | |
1142 | if (MSR_TM_ACTIVE(msr_hi<<32)) { |
1143 | /* Trying to start TM on non TM system */ |
1144 | if (!cpu_has_feature(CPU_FTR_TM)) |
1145 | goto bad; |
1146 | /* We only recheckpoint on return if we're |
1147 | * transaction. |
1148 | */ |
1149 | tm_restore = 1; |
1150 | if (do_setcontext_tm(&rt_sf->uc, uc_transact, regs)) |
1151 | goto bad; |
1152 | } |
1153 | } |
1154 | if (!tm_restore) { |
1155 | /* |
1156 | * Unset regs->msr because ucontext MSR TS is not |
1157 | * set, and recheckpoint was not called. This avoid |
1158 | * hitting a TM Bad thing at RFID |
1159 | */ |
1160 | regs_set_return_msr(regs, regs->msr & ~MSR_TS_MASK); |
1161 | } |
1162 | /* Fall through, for non-TM restore */ |
1163 | #endif |
1164 | if (!tm_restore) |
1165 | if (do_setcontext(ucp: &rt_sf->uc, regs, sig: 1)) |
1166 | goto bad; |
1167 | |
1168 | /* |
1169 | * It's not clear whether or why it is desirable to save the |
1170 | * sigaltstack setting on signal delivery and restore it on |
1171 | * signal return. But other architectures do this and we have |
1172 | * always done it up until now so it is probably better not to |
1173 | * change it. -- paulus |
1174 | */ |
1175 | #ifdef CONFIG_PPC64 |
1176 | if (compat_restore_altstack(&rt_sf->uc.uc_stack)) |
1177 | goto bad; |
1178 | #else |
1179 | if (restore_altstack(&rt_sf->uc.uc_stack)) |
1180 | goto bad; |
1181 | #endif |
1182 | set_thread_flag(TIF_RESTOREALL); |
1183 | return 0; |
1184 | |
1185 | bad: |
1186 | signal_fault(current, regs, where: "sys_rt_sigreturn" , ptr: rt_sf); |
1187 | |
1188 | force_sig(SIGSEGV); |
1189 | return 0; |
1190 | } |
1191 | |
1192 | #ifdef CONFIG_PPC32 |
1193 | SYSCALL_DEFINE3(debug_setcontext, struct ucontext __user *, ctx, |
1194 | int, ndbg, struct sig_dbg_op __user *, dbg) |
1195 | { |
1196 | struct pt_regs *regs = current_pt_regs(); |
1197 | struct sig_dbg_op op; |
1198 | int i; |
1199 | unsigned long new_msr = regs->msr; |
1200 | #ifdef CONFIG_PPC_ADV_DEBUG_REGS |
1201 | unsigned long new_dbcr0 = current->thread.debug.dbcr0; |
1202 | #endif |
1203 | |
1204 | for (i=0; i<ndbg; i++) { |
1205 | if (copy_from_user(&op, dbg + i, sizeof(op))) |
1206 | return -EFAULT; |
1207 | switch (op.dbg_type) { |
1208 | case SIG_DBG_SINGLE_STEPPING: |
1209 | #ifdef CONFIG_PPC_ADV_DEBUG_REGS |
1210 | if (op.dbg_value) { |
1211 | new_msr |= MSR_DE; |
1212 | new_dbcr0 |= (DBCR0_IDM | DBCR0_IC); |
1213 | } else { |
1214 | new_dbcr0 &= ~DBCR0_IC; |
1215 | if (!DBCR_ACTIVE_EVENTS(new_dbcr0, |
1216 | current->thread.debug.dbcr1)) { |
1217 | new_msr &= ~MSR_DE; |
1218 | new_dbcr0 &= ~DBCR0_IDM; |
1219 | } |
1220 | } |
1221 | #else |
1222 | if (op.dbg_value) |
1223 | new_msr |= MSR_SE; |
1224 | else |
1225 | new_msr &= ~MSR_SE; |
1226 | #endif |
1227 | break; |
1228 | case SIG_DBG_BRANCH_TRACING: |
1229 | #ifdef CONFIG_PPC_ADV_DEBUG_REGS |
1230 | return -EINVAL; |
1231 | #else |
1232 | if (op.dbg_value) |
1233 | new_msr |= MSR_BE; |
1234 | else |
1235 | new_msr &= ~MSR_BE; |
1236 | #endif |
1237 | break; |
1238 | |
1239 | default: |
1240 | return -EINVAL; |
1241 | } |
1242 | } |
1243 | |
1244 | /* We wait until here to actually install the values in the |
1245 | registers so if we fail in the above loop, it will not |
1246 | affect the contents of these registers. After this point, |
1247 | failure is a problem, anyway, and it's very unlikely unless |
1248 | the user is really doing something wrong. */ |
1249 | regs_set_return_msr(regs, new_msr); |
1250 | #ifdef CONFIG_PPC_ADV_DEBUG_REGS |
1251 | current->thread.debug.dbcr0 = new_dbcr0; |
1252 | #endif |
1253 | |
1254 | if (!access_ok(ctx, sizeof(*ctx)) || |
1255 | fault_in_readable((char __user *)ctx, sizeof(*ctx))) |
1256 | return -EFAULT; |
1257 | |
1258 | /* |
1259 | * If we get a fault copying the context into the kernel's |
1260 | * image of the user's registers, we can't just return -EFAULT |
1261 | * because the user's registers will be corrupted. For instance |
1262 | * the NIP value may have been updated but not some of the |
1263 | * other registers. Given that we have done the access_ok |
1264 | * and successfully read the first and last bytes of the region |
1265 | * above, this should only happen in an out-of-memory situation |
1266 | * or if another thread unmaps the region containing the context. |
1267 | * We kill the task with a SIGSEGV in this situation. |
1268 | */ |
1269 | if (do_setcontext(ctx, regs, 1)) { |
1270 | signal_fault(current, regs, "sys_debug_setcontext" , ctx); |
1271 | |
1272 | force_sig(SIGSEGV); |
1273 | goto out; |
1274 | } |
1275 | |
1276 | /* |
1277 | * It's not clear whether or why it is desirable to save the |
1278 | * sigaltstack setting on signal delivery and restore it on |
1279 | * signal return. But other architectures do this and we have |
1280 | * always done it up until now so it is probably better not to |
1281 | * change it. -- paulus |
1282 | */ |
1283 | restore_altstack(&ctx->uc_stack); |
1284 | |
1285 | set_thread_flag(TIF_RESTOREALL); |
1286 | out: |
1287 | return 0; |
1288 | } |
1289 | #endif |
1290 | |
1291 | /* |
1292 | * Do a signal return; undo the signal stack. |
1293 | */ |
1294 | #ifdef CONFIG_PPC64 |
1295 | COMPAT_SYSCALL_DEFINE0(sigreturn) |
1296 | #else |
1297 | SYSCALL_DEFINE0(sigreturn) |
1298 | #endif |
1299 | { |
1300 | struct pt_regs *regs = current_pt_regs(); |
1301 | struct sigframe __user *sf; |
1302 | struct sigcontext __user *sc; |
1303 | struct sigcontext sigctx; |
1304 | struct mcontext __user *sr; |
1305 | sigset_t set; |
1306 | struct mcontext __user *mcp; |
1307 | struct mcontext __user *tm_mcp = NULL; |
1308 | unsigned long long msr_hi = 0; |
1309 | |
1310 | /* Always make any pending restarted system calls return -EINTR */ |
1311 | current->restart_block.fn = do_no_restart_syscall; |
1312 | |
1313 | sf = (struct sigframe __user *)(regs->gpr[1] + __SIGNAL_FRAMESIZE); |
1314 | sc = &sf->sctx; |
1315 | if (copy_from_user(to: &sigctx, from: sc, n: sizeof(sigctx))) |
1316 | goto badframe; |
1317 | |
1318 | #ifdef CONFIG_PPC64 |
1319 | /* |
1320 | * Note that PPC32 puts the upper 32 bits of the sigmask in the |
1321 | * unused part of the signal stackframe |
1322 | */ |
1323 | set.sig[0] = sigctx.oldmask + ((long)(sigctx._unused[3]) << 32); |
1324 | #else |
1325 | set.sig[0] = sigctx.oldmask; |
1326 | set.sig[1] = sigctx._unused[3]; |
1327 | #endif |
1328 | set_current_blocked(&set); |
1329 | |
1330 | mcp = (struct mcontext __user *)&sf->mctx; |
1331 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
1332 | tm_mcp = (struct mcontext __user *)&sf->mctx_transact; |
1333 | if (__get_user(msr_hi, &tm_mcp->mc_gregs[PT_MSR])) |
1334 | goto badframe; |
1335 | #endif |
1336 | if (MSR_TM_ACTIVE(msr_hi<<32)) { |
1337 | if (!cpu_has_feature(CPU_FTR_TM)) |
1338 | goto badframe; |
1339 | if (restore_tm_user_regs(regs, sr: mcp, tm_sr: tm_mcp)) |
1340 | goto badframe; |
1341 | } else { |
1342 | sr = (struct mcontext __user *)from_user_ptr(sigctx.regs); |
1343 | if (restore_user_regs(regs, sr, sig: 1)) { |
1344 | signal_fault(current, regs, where: "sys_sigreturn" , ptr: sr); |
1345 | |
1346 | force_sig(SIGSEGV); |
1347 | return 0; |
1348 | } |
1349 | } |
1350 | |
1351 | set_thread_flag(TIF_RESTOREALL); |
1352 | return 0; |
1353 | |
1354 | badframe: |
1355 | signal_fault(current, regs, where: "sys_sigreturn" , ptr: sc); |
1356 | |
1357 | force_sig(SIGSEGV); |
1358 | return 0; |
1359 | } |
1360 | |