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