1
2
3
4
5
6
7
8
9
10
11
12
13#include <linux/sched.h>
14#include <linux/sched/task_stack.h>
15#include <linux/mm.h>
16#include <linux/smp.h>
17#include <linux/kernel.h>
18#include <linux/signal.h>
19#include <linux/entry-common.h>
20#include <linux/errno.h>
21#include <linux/wait.h>
22#include <linux/ptrace.h>
23#include <linux/unistd.h>
24#include <linux/stddef.h>
25#include <linux/tty.h>
26#include <linux/personality.h>
27#include <linux/binfmts.h>
28#include <linux/tracehook.h>
29#include <linux/syscalls.h>
30#include <linux/compat.h>
31#include <asm/ucontext.h>
32#include <linux/uaccess.h>
33#include <asm/lowcore.h>
34#include <asm/switch_to.h>
35#include "entry.h"
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64struct sigframe
65{
66 __u8 callee_used_stack[__SIGNAL_FRAMESIZE];
67 struct sigcontext sc;
68 _sigregs sregs;
69 int signo;
70 _sigregs_ext sregs_ext;
71 __u16 svc_insn;
72};
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99struct rt_sigframe
100{
101 __u8 callee_used_stack[__SIGNAL_FRAMESIZE];
102 __u16 svc_insn;
103 struct siginfo info;
104 struct ucontext_extended uc;
105};
106
107
108static void store_sigregs(void)
109{
110 save_access_regs(current->thread.acrs);
111 save_fpu_regs();
112}
113
114
115static void load_sigregs(void)
116{
117 restore_access_regs(current->thread.acrs);
118}
119
120
121static int save_sigregs(struct pt_regs *regs, _sigregs __user *sregs)
122{
123 _sigregs user_sregs;
124
125
126
127 user_sregs.regs.psw.mask = PSW_USER_BITS |
128 (regs->psw.mask & (PSW_MASK_USER | PSW_MASK_RI));
129 user_sregs.regs.psw.addr = regs->psw.addr;
130 memcpy(&user_sregs.regs.gprs, ®s->gprs, sizeof(sregs->regs.gprs));
131 memcpy(&user_sregs.regs.acrs, current->thread.acrs,
132 sizeof(user_sregs.regs.acrs));
133 fpregs_store(&user_sregs.fpregs, ¤t->thread.fpu);
134 if (__copy_to_user(sregs, &user_sregs, sizeof(_sigregs)))
135 return -EFAULT;
136 return 0;
137}
138
139static int restore_sigregs(struct pt_regs *regs, _sigregs __user *sregs)
140{
141 _sigregs user_sregs;
142
143
144 current->restart_block.fn = do_no_restart_syscall;
145
146 if (__copy_from_user(&user_sregs, sregs, sizeof(user_sregs)))
147 return -EFAULT;
148
149 if (!is_ri_task(current) && (user_sregs.regs.psw.mask & PSW_MASK_RI))
150 return -EINVAL;
151
152
153 if (test_fp_ctl(user_sregs.fpregs.fpc))
154 return -EINVAL;
155
156
157 regs->psw.mask = (regs->psw.mask & ~(PSW_MASK_USER | PSW_MASK_RI)) |
158 (user_sregs.regs.psw.mask & (PSW_MASK_USER | PSW_MASK_RI));
159
160 if ((regs->psw.mask & PSW_MASK_ASC) == PSW_ASC_HOME)
161 regs->psw.mask = PSW_ASC_PRIMARY |
162 (regs->psw.mask & ~PSW_MASK_ASC);
163
164 if (regs->psw.mask & PSW_MASK_EA)
165 regs->psw.mask |= PSW_MASK_BA;
166 regs->psw.addr = user_sregs.regs.psw.addr;
167 memcpy(®s->gprs, &user_sregs.regs.gprs, sizeof(sregs->regs.gprs));
168 memcpy(¤t->thread.acrs, &user_sregs.regs.acrs,
169 sizeof(current->thread.acrs));
170
171 fpregs_load(&user_sregs.fpregs, ¤t->thread.fpu);
172
173 clear_pt_regs_flag(regs, PIF_SYSCALL);
174 clear_pt_regs_flag(regs, PIF_SYSCALL_RESTART);
175 return 0;
176}
177
178
179static int save_sigregs_ext(struct pt_regs *regs,
180 _sigregs_ext __user *sregs_ext)
181{
182 __u64 vxrs[__NUM_VXRS_LOW];
183 int i;
184
185
186 if (MACHINE_HAS_VX) {
187 for (i = 0; i < __NUM_VXRS_LOW; i++)
188 vxrs[i] = *((__u64 *)(current->thread.fpu.vxrs + i) + 1);
189 if (__copy_to_user(&sregs_ext->vxrs_low, vxrs,
190 sizeof(sregs_ext->vxrs_low)) ||
191 __copy_to_user(&sregs_ext->vxrs_high,
192 current->thread.fpu.vxrs + __NUM_VXRS_LOW,
193 sizeof(sregs_ext->vxrs_high)))
194 return -EFAULT;
195 }
196 return 0;
197}
198
199static int restore_sigregs_ext(struct pt_regs *regs,
200 _sigregs_ext __user *sregs_ext)
201{
202 __u64 vxrs[__NUM_VXRS_LOW];
203 int i;
204
205
206 if (MACHINE_HAS_VX) {
207 if (__copy_from_user(vxrs, &sregs_ext->vxrs_low,
208 sizeof(sregs_ext->vxrs_low)) ||
209 __copy_from_user(current->thread.fpu.vxrs + __NUM_VXRS_LOW,
210 &sregs_ext->vxrs_high,
211 sizeof(sregs_ext->vxrs_high)))
212 return -EFAULT;
213 for (i = 0; i < __NUM_VXRS_LOW; i++)
214 *((__u64 *)(current->thread.fpu.vxrs + i) + 1) = vxrs[i];
215 }
216 return 0;
217}
218
219SYSCALL_DEFINE0(sigreturn)
220{
221 struct pt_regs *regs = task_pt_regs(current);
222 struct sigframe __user *frame =
223 (struct sigframe __user *) regs->gprs[15];
224 sigset_t set;
225
226 if (__copy_from_user(&set.sig, &frame->sc.oldmask, _SIGMASK_COPY_SIZE))
227 goto badframe;
228 set_current_blocked(&set);
229 save_fpu_regs();
230 if (restore_sigregs(regs, &frame->sregs))
231 goto badframe;
232 if (restore_sigregs_ext(regs, &frame->sregs_ext))
233 goto badframe;
234 load_sigregs();
235 return regs->gprs[2];
236badframe:
237 force_sig(SIGSEGV);
238 return 0;
239}
240
241SYSCALL_DEFINE0(rt_sigreturn)
242{
243 struct pt_regs *regs = task_pt_regs(current);
244 struct rt_sigframe __user *frame =
245 (struct rt_sigframe __user *)regs->gprs[15];
246 sigset_t set;
247
248 if (__copy_from_user(&set.sig, &frame->uc.uc_sigmask, sizeof(set)))
249 goto badframe;
250 set_current_blocked(&set);
251 if (restore_altstack(&frame->uc.uc_stack))
252 goto badframe;
253 save_fpu_regs();
254 if (restore_sigregs(regs, &frame->uc.uc_mcontext))
255 goto badframe;
256 if (restore_sigregs_ext(regs, &frame->uc.uc_mcontext_ext))
257 goto badframe;
258 load_sigregs();
259 return regs->gprs[2];
260badframe:
261 force_sig(SIGSEGV);
262 return 0;
263}
264
265
266
267
268static inline void __user *
269get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
270{
271 unsigned long sp;
272
273
274 sp = regs->gprs[15];
275
276
277 if (on_sig_stack(sp) && !on_sig_stack((sp - frame_size) & -8UL))
278 return (void __user *) -1UL;
279
280
281 if (ka->sa.sa_flags & SA_ONSTACK) {
282 if (! sas_ss_flags(sp))
283 sp = current->sas_ss_sp + current->sas_ss_size;
284 }
285
286 return (void __user *)((sp - frame_size) & -8ul);
287}
288
289static int setup_frame(int sig, struct k_sigaction *ka,
290 sigset_t *set, struct pt_regs * regs)
291{
292 struct sigframe __user *frame;
293 struct sigcontext sc;
294 unsigned long restorer;
295 size_t frame_size;
296
297
298
299
300
301
302
303 frame_size = sizeof(*frame) - sizeof(frame->sregs_ext);
304 if (MACHINE_HAS_VX)
305 frame_size += sizeof(frame->sregs_ext);
306 frame = get_sigframe(ka, regs, frame_size);
307 if (frame == (void __user *) -1UL)
308 return -EFAULT;
309
310
311 if (__put_user(regs->gprs[15], (addr_t __user *) frame))
312 return -EFAULT;
313
314
315 memcpy(&sc.oldmask, &set->sig, _SIGMASK_COPY_SIZE);
316 sc.sregs = (_sigregs __user __force *) &frame->sregs;
317 if (__copy_to_user(&frame->sc, &sc, sizeof(frame->sc)))
318 return -EFAULT;
319
320
321 store_sigregs();
322
323
324 if (save_sigregs(regs, &frame->sregs))
325 return -EFAULT;
326
327
328 if (__put_user(regs->gprs[2], (int __user *) &frame->signo))
329 return -EFAULT;
330
331
332 if (save_sigregs_ext(regs, &frame->sregs_ext))
333 return -EFAULT;
334
335
336
337 if (ka->sa.sa_flags & SA_RESTORER) {
338 restorer = (unsigned long) ka->sa.sa_restorer;
339 } else {
340
341 __u16 __user *svc = (void __user *) frame + frame_size - 2;
342 if (__put_user(S390_SYSCALL_OPCODE | __NR_sigreturn, svc))
343 return -EFAULT;
344 restorer = (unsigned long) svc;
345 }
346
347
348 regs->gprs[14] = restorer;
349 regs->gprs[15] = (unsigned long) frame;
350
351 regs->psw.mask = PSW_MASK_EA | PSW_MASK_BA |
352 (PSW_USER_BITS & PSW_MASK_ASC) |
353 (regs->psw.mask & ~PSW_MASK_ASC);
354 regs->psw.addr = (unsigned long) ka->sa.sa_handler;
355
356 regs->gprs[2] = sig;
357 regs->gprs[3] = (unsigned long) &frame->sc;
358
359
360
361 if (sig == SIGSEGV || sig == SIGBUS || sig == SIGILL ||
362 sig == SIGTRAP || sig == SIGFPE) {
363
364 regs->gprs[4] = regs->int_code & 127;
365 regs->gprs[5] = regs->int_parm_long;
366 regs->gprs[6] = current->thread.last_break;
367 }
368 return 0;
369}
370
371static int setup_rt_frame(struct ksignal *ksig, sigset_t *set,
372 struct pt_regs *regs)
373{
374 struct rt_sigframe __user *frame;
375 unsigned long uc_flags, restorer;
376 size_t frame_size;
377
378 frame_size = sizeof(struct rt_sigframe) - sizeof(_sigregs_ext);
379
380
381
382
383
384
385 uc_flags = 0;
386 if (MACHINE_HAS_VX) {
387 frame_size += sizeof(_sigregs_ext);
388 uc_flags |= UC_VXRS;
389 }
390 frame = get_sigframe(&ksig->ka, regs, frame_size);
391 if (frame == (void __user *) -1UL)
392 return -EFAULT;
393
394
395 if (__put_user(regs->gprs[15], (addr_t __user *) frame))
396 return -EFAULT;
397
398
399
400 if (ksig->ka.sa.sa_flags & SA_RESTORER) {
401 restorer = (unsigned long) ksig->ka.sa.sa_restorer;
402 } else {
403 __u16 __user *svc = &frame->svc_insn;
404 if (__put_user(S390_SYSCALL_OPCODE | __NR_rt_sigreturn, svc))
405 return -EFAULT;
406 restorer = (unsigned long) svc;
407 }
408
409
410 if (copy_siginfo_to_user(&frame->info, &ksig->info))
411 return -EFAULT;
412
413
414 store_sigregs();
415
416
417 if (__put_user(uc_flags, &frame->uc.uc_flags) ||
418 __put_user(NULL, &frame->uc.uc_link) ||
419 __save_altstack(&frame->uc.uc_stack, regs->gprs[15]) ||
420 save_sigregs(regs, &frame->uc.uc_mcontext) ||
421 __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set)) ||
422 save_sigregs_ext(regs, &frame->uc.uc_mcontext_ext))
423 return -EFAULT;
424
425
426 regs->gprs[14] = restorer;
427 regs->gprs[15] = (unsigned long) frame;
428
429 regs->psw.mask = PSW_MASK_EA | PSW_MASK_BA |
430 (PSW_USER_BITS & PSW_MASK_ASC) |
431 (regs->psw.mask & ~PSW_MASK_ASC);
432 regs->psw.addr = (unsigned long) ksig->ka.sa.sa_handler;
433
434 regs->gprs[2] = ksig->sig;
435 regs->gprs[3] = (unsigned long) &frame->info;
436 regs->gprs[4] = (unsigned long) &frame->uc;
437 regs->gprs[5] = current->thread.last_break;
438 return 0;
439}
440
441static void handle_signal(struct ksignal *ksig, sigset_t *oldset,
442 struct pt_regs *regs)
443{
444 int ret;
445
446
447 if (ksig->ka.sa.sa_flags & SA_SIGINFO)
448 ret = setup_rt_frame(ksig, oldset, regs);
449 else
450 ret = setup_frame(ksig->sig, &ksig->ka, oldset, regs);
451
452 signal_setup_done(ret, ksig, test_thread_flag(TIF_SINGLE_STEP));
453}
454
455
456
457
458
459
460
461
462
463
464
465void arch_do_signal_or_restart(struct pt_regs *regs, bool has_signal)
466{
467 struct ksignal ksig;
468 sigset_t *oldset = sigmask_to_save();
469
470
471
472
473
474
475 current->thread.system_call =
476 test_pt_regs_flag(regs, PIF_SYSCALL) ? regs->int_code : 0;
477
478 if (has_signal && get_signal(&ksig)) {
479
480 if (current->thread.system_call) {
481 regs->int_code = current->thread.system_call;
482
483 switch (regs->gprs[2]) {
484 case -ERESTART_RESTARTBLOCK:
485 case -ERESTARTNOHAND:
486 regs->gprs[2] = -EINTR;
487 break;
488 case -ERESTARTSYS:
489 if (!(ksig.ka.sa.sa_flags & SA_RESTART)) {
490 regs->gprs[2] = -EINTR;
491 break;
492 }
493 fallthrough;
494 case -ERESTARTNOINTR:
495 regs->gprs[2] = regs->orig_gpr2;
496 regs->psw.addr =
497 __rewind_psw(regs->psw,
498 regs->int_code >> 16);
499 break;
500 }
501 }
502
503 clear_pt_regs_flag(regs, PIF_SYSCALL);
504 clear_pt_regs_flag(regs, PIF_SYSCALL_RESTART);
505 rseq_signal_deliver(&ksig, regs);
506 if (is_compat_task())
507 handle_signal32(&ksig, oldset, regs);
508 else
509 handle_signal(&ksig, oldset, regs);
510 return;
511 }
512
513
514 clear_pt_regs_flag(regs, PIF_SYSCALL);
515 clear_pt_regs_flag(regs, PIF_SYSCALL_RESTART);
516 if (current->thread.system_call) {
517 regs->int_code = current->thread.system_call;
518 switch (regs->gprs[2]) {
519 case -ERESTART_RESTARTBLOCK:
520
521 regs->int_code = __NR_restart_syscall;
522 fallthrough;
523 case -ERESTARTNOHAND:
524 case -ERESTARTSYS:
525 case -ERESTARTNOINTR:
526
527 regs->gprs[2] = regs->orig_gpr2;
528 set_pt_regs_flag(regs, PIF_SYSCALL_RESTART);
529 if (test_thread_flag(TIF_SINGLE_STEP))
530 clear_thread_flag(TIF_PER_TRAP);
531 break;
532 }
533 }
534
535
536
537
538 restore_saved_sigmask();
539}
540
541void do_notify_resume(struct pt_regs *regs)
542{
543 tracehook_notify_resume(regs);
544 rseq_handle_notify_resume(NULL, regs);
545}
546