1
2
3
4
5
6
7
8
9
10
11
12#include <linux/rwsem.h>
13#include <linux/sched.h>
14#include <linux/mm.h>
15#include <linux/smp.h>
16#include <linux/kernel.h>
17#include <linux/signal.h>
18#include <linux/errno.h>
19#include <linux/wait.h>
20#include <linux/personality.h>
21#include <linux/ptrace.h>
22#include <linux/unistd.h>
23#include <linux/stddef.h>
24#include <linux/tracehook.h>
25#include <asm/ucontext.h>
26#include <linux/uaccess.h>
27#include <asm/pgtable.h>
28#include <asm/cacheflush.h>
29#include <asm/fpu.h>
30
31#define REG_RET 9
32#define REG_ARG1 2
33#define REG_ARG2 3
34#define REG_ARG3 4
35#define REG_SP 15
36#define REG_PR 18
37#define REF_REG_RET regs->regs[REG_RET]
38#define REF_REG_SP regs->regs[REG_SP]
39#define DEREF_REG_PR regs->regs[REG_PR]
40
41#define DEBUG_SIG 0
42
43static void
44handle_signal(struct ksignal *ksig, struct pt_regs *regs);
45
46static inline void
47handle_syscall_restart(struct pt_regs *regs, struct sigaction *sa)
48{
49
50 if (regs->syscall_nr < 0)
51 return;
52
53
54 switch (regs->regs[REG_RET]) {
55 case -ERESTART_RESTARTBLOCK:
56 case -ERESTARTNOHAND:
57 no_system_call_restart:
58 regs->regs[REG_RET] = -EINTR;
59 break;
60
61 case -ERESTARTSYS:
62 if (!(sa->sa_flags & SA_RESTART))
63 goto no_system_call_restart;
64
65 case -ERESTARTNOINTR:
66
67 regs->regs[REG_RET] = regs->syscall_nr;
68 regs->pc -= 4;
69 break;
70 }
71}
72
73
74
75
76
77
78
79
80
81
82static void do_signal(struct pt_regs *regs)
83{
84 struct ksignal ksig;
85
86
87
88
89
90
91
92 if (!user_mode(regs))
93 return;
94
95 if (get_signal(&ksig)) {
96 handle_syscall_restart(regs, &ksig.ka.sa);
97
98
99 handle_signal(&ksig, regs);
100 return;
101 }
102
103
104 if (regs->syscall_nr >= 0) {
105
106 switch (regs->regs[REG_RET]) {
107 case -ERESTARTNOHAND:
108 case -ERESTARTSYS:
109 case -ERESTARTNOINTR:
110
111 regs->regs[REG_RET] = regs->syscall_nr;
112 regs->pc -= 4;
113 break;
114
115 case -ERESTART_RESTARTBLOCK:
116 regs->regs[REG_RET] = __NR_restart_syscall;
117 regs->pc -= 4;
118 break;
119 }
120 }
121
122
123 restore_saved_sigmask();
124}
125
126
127
128
129struct sigframe {
130 struct sigcontext sc;
131 unsigned long extramask[_NSIG_WORDS-1];
132 long long retcode[2];
133};
134
135struct rt_sigframe {
136 struct siginfo __user *pinfo;
137 void *puc;
138 struct siginfo info;
139 struct ucontext uc;
140 long long retcode[2];
141};
142
143#ifdef CONFIG_SH_FPU
144static inline int
145restore_sigcontext_fpu(struct pt_regs *regs, struct sigcontext __user *sc)
146{
147 int err = 0;
148 int fpvalid;
149
150 err |= __get_user (fpvalid, &sc->sc_fpvalid);
151 conditional_used_math(fpvalid);
152 if (! fpvalid)
153 return err;
154
155 if (current == last_task_used_math) {
156 last_task_used_math = NULL;
157 regs->sr |= SR_FD;
158 }
159
160 err |= __copy_from_user(¤t->thread.xstate->hardfpu, &sc->sc_fpregs[0],
161 (sizeof(long long) * 32) + (sizeof(int) * 1));
162
163 return err;
164}
165
166static inline int
167setup_sigcontext_fpu(struct pt_regs *regs, struct sigcontext __user *sc)
168{
169 int err = 0;
170 int fpvalid;
171
172 fpvalid = !!used_math();
173 err |= __put_user(fpvalid, &sc->sc_fpvalid);
174 if (! fpvalid)
175 return err;
176
177 if (current == last_task_used_math) {
178 enable_fpu();
179 save_fpu(current);
180 disable_fpu();
181 last_task_used_math = NULL;
182 regs->sr |= SR_FD;
183 }
184
185 err |= __copy_to_user(&sc->sc_fpregs[0], ¤t->thread.xstate->hardfpu,
186 (sizeof(long long) * 32) + (sizeof(int) * 1));
187 clear_used_math();
188
189 return err;
190}
191#else
192static inline int
193restore_sigcontext_fpu(struct pt_regs *regs, struct sigcontext __user *sc)
194{
195 return 0;
196}
197static inline int
198setup_sigcontext_fpu(struct pt_regs *regs, struct sigcontext __user *sc)
199{
200 return 0;
201}
202#endif
203
204static int
205restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, long long *r2_p)
206{
207 unsigned int err = 0;
208 unsigned long long current_sr, new_sr;
209#define SR_MASK 0xffff8cfd
210
211#define COPY(x) err |= __get_user(regs->x, &sc->sc_##x)
212
213 COPY(regs[0]); COPY(regs[1]); COPY(regs[2]); COPY(regs[3]);
214 COPY(regs[4]); COPY(regs[5]); COPY(regs[6]); COPY(regs[7]);
215 COPY(regs[8]); COPY(regs[9]); COPY(regs[10]); COPY(regs[11]);
216 COPY(regs[12]); COPY(regs[13]); COPY(regs[14]); COPY(regs[15]);
217 COPY(regs[16]); COPY(regs[17]); COPY(regs[18]); COPY(regs[19]);
218 COPY(regs[20]); COPY(regs[21]); COPY(regs[22]); COPY(regs[23]);
219 COPY(regs[24]); COPY(regs[25]); COPY(regs[26]); COPY(regs[27]);
220 COPY(regs[28]); COPY(regs[29]); COPY(regs[30]); COPY(regs[31]);
221 COPY(regs[32]); COPY(regs[33]); COPY(regs[34]); COPY(regs[35]);
222 COPY(regs[36]); COPY(regs[37]); COPY(regs[38]); COPY(regs[39]);
223 COPY(regs[40]); COPY(regs[41]); COPY(regs[42]); COPY(regs[43]);
224 COPY(regs[44]); COPY(regs[45]); COPY(regs[46]); COPY(regs[47]);
225 COPY(regs[48]); COPY(regs[49]); COPY(regs[50]); COPY(regs[51]);
226 COPY(regs[52]); COPY(regs[53]); COPY(regs[54]); COPY(regs[55]);
227 COPY(regs[56]); COPY(regs[57]); COPY(regs[58]); COPY(regs[59]);
228 COPY(regs[60]); COPY(regs[61]); COPY(regs[62]);
229 COPY(tregs[0]); COPY(tregs[1]); COPY(tregs[2]); COPY(tregs[3]);
230 COPY(tregs[4]); COPY(tregs[5]); COPY(tregs[6]); COPY(tregs[7]);
231
232
233
234
235 current_sr = regs->sr;
236 err |= __get_user(new_sr, &sc->sc_sr);
237 regs->sr &= SR_MASK;
238 regs->sr |= (new_sr & ~SR_MASK);
239
240 COPY(pc);
241
242#undef COPY
243
244
245
246 err |= restore_sigcontext_fpu(regs, sc);
247
248 regs->syscall_nr = -1;
249 err |= __get_user(*r2_p, &sc->sc_regs[REG_RET]);
250 return err;
251}
252
253asmlinkage int sys_sigreturn(unsigned long r2, unsigned long r3,
254 unsigned long r4, unsigned long r5,
255 unsigned long r6, unsigned long r7,
256 struct pt_regs * regs)
257{
258 struct sigframe __user *frame = (struct sigframe __user *) (long) REF_REG_SP;
259 sigset_t set;
260 long long ret;
261
262
263 current->restart_block.fn = do_no_restart_syscall;
264
265 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
266 goto badframe;
267
268 if (__get_user(set.sig[0], &frame->sc.oldmask)
269 || (_NSIG_WORDS > 1
270 && __copy_from_user(&set.sig[1], &frame->extramask,
271 sizeof(frame->extramask))))
272 goto badframe;
273
274 set_current_blocked(&set);
275
276 if (restore_sigcontext(regs, &frame->sc, &ret))
277 goto badframe;
278 regs->pc -= 4;
279
280 return (int) ret;
281
282badframe:
283 force_sig(SIGSEGV, current);
284 return 0;
285}
286
287asmlinkage int sys_rt_sigreturn(unsigned long r2, unsigned long r3,
288 unsigned long r4, unsigned long r5,
289 unsigned long r6, unsigned long r7,
290 struct pt_regs * regs)
291{
292 struct rt_sigframe __user *frame = (struct rt_sigframe __user *) (long) REF_REG_SP;
293 sigset_t set;
294 long long ret;
295
296
297 current->restart_block.fn = do_no_restart_syscall;
298
299 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
300 goto badframe;
301
302 if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
303 goto badframe;
304
305 set_current_blocked(&set);
306
307 if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ret))
308 goto badframe;
309 regs->pc -= 4;
310
311 if (restore_altstack(&frame->uc.uc_stack))
312 goto badframe;
313
314 return (int) ret;
315
316badframe:
317 force_sig(SIGSEGV, current);
318 return 0;
319}
320
321
322
323
324static int
325setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
326 unsigned long mask)
327{
328 int err = 0;
329
330
331 err |= setup_sigcontext_fpu(regs, sc);
332
333#define COPY(x) err |= __put_user(regs->x, &sc->sc_##x)
334
335 COPY(regs[0]); COPY(regs[1]); COPY(regs[2]); COPY(regs[3]);
336 COPY(regs[4]); COPY(regs[5]); COPY(regs[6]); COPY(regs[7]);
337 COPY(regs[8]); COPY(regs[9]); COPY(regs[10]); COPY(regs[11]);
338 COPY(regs[12]); COPY(regs[13]); COPY(regs[14]); COPY(regs[15]);
339 COPY(regs[16]); COPY(regs[17]); COPY(regs[18]); COPY(regs[19]);
340 COPY(regs[20]); COPY(regs[21]); COPY(regs[22]); COPY(regs[23]);
341 COPY(regs[24]); COPY(regs[25]); COPY(regs[26]); COPY(regs[27]);
342 COPY(regs[28]); COPY(regs[29]); COPY(regs[30]); COPY(regs[31]);
343 COPY(regs[32]); COPY(regs[33]); COPY(regs[34]); COPY(regs[35]);
344 COPY(regs[36]); COPY(regs[37]); COPY(regs[38]); COPY(regs[39]);
345 COPY(regs[40]); COPY(regs[41]); COPY(regs[42]); COPY(regs[43]);
346 COPY(regs[44]); COPY(regs[45]); COPY(regs[46]); COPY(regs[47]);
347 COPY(regs[48]); COPY(regs[49]); COPY(regs[50]); COPY(regs[51]);
348 COPY(regs[52]); COPY(regs[53]); COPY(regs[54]); COPY(regs[55]);
349 COPY(regs[56]); COPY(regs[57]); COPY(regs[58]); COPY(regs[59]);
350 COPY(regs[60]); COPY(regs[61]); COPY(regs[62]);
351 COPY(tregs[0]); COPY(tregs[1]); COPY(tregs[2]); COPY(tregs[3]);
352 COPY(tregs[4]); COPY(tregs[5]); COPY(tregs[6]); COPY(tregs[7]);
353 COPY(sr); COPY(pc);
354
355#undef COPY
356
357 err |= __put_user(mask, &sc->oldmask);
358
359 return err;
360}
361
362
363
364
365static inline void __user *
366get_sigframe(struct k_sigaction *ka, unsigned long sp, size_t frame_size)
367{
368 if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && ! sas_ss_flags(sp))
369 sp = current->sas_ss_sp + current->sas_ss_size;
370
371 return (void __user *)((sp - frame_size) & -8ul);
372}
373
374void sa_default_restorer(void);
375void sa_default_rt_restorer(void);
376
377static int setup_frame(struct ksignal *ksig, sigset_t *set, struct pt_regs *regs)
378{
379 struct sigframe __user *frame;
380 int err = 0, sig = ksig->sig;
381 int signal;
382
383 frame = get_sigframe(&ksig->ka, regs->regs[REG_SP], sizeof(*frame));
384
385 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
386 return -EFAULT;
387
388 err |= setup_sigcontext(&frame->sc, regs, set->sig[0]);
389
390
391 if (err)
392 return -EFAULT;
393
394 if (_NSIG_WORDS > 1) {
395 err |= __copy_to_user(frame->extramask, &set->sig[1],
396 sizeof(frame->extramask)); }
397
398
399 if (err)
400 return -EFAULT;
401
402
403
404 if (ksig->ka.sa.sa_flags & SA_RESTORER) {
405
406
407
408 DEREF_REG_PR = neff_sign_extend((unsigned long)
409 ksig->ka->sa.sa_restorer | 0x1);
410 } else {
411
412
413
414
415
416
417
418
419
420
421
422 DEREF_REG_PR = neff_sign_extend((unsigned long)
423 frame->retcode | 0x01);
424
425 if (__copy_to_user(frame->retcode,
426 (void *)((unsigned long)sa_default_restorer & (~1)), 16) != 0)
427 return -EFAULT;
428
429
430 flush_cache_sigtramp(DEREF_REG_PR-1);
431 }
432
433
434
435
436
437 regs->regs[REG_SP] = neff_sign_extend((unsigned long)frame);
438 regs->regs[REG_ARG1] = sig;
439
440
441
442
443
444
445
446
447
448
449 regs->regs[REG_ARG2] = (unsigned long long)(unsigned long)(signed long)&frame->sc;
450 regs->regs[REG_ARG3] = (unsigned long long)(unsigned long)(signed long)&frame->sc;
451
452 regs->pc = neff_sign_extend((unsigned long)ksig->ka.sa.sa_handler);
453
454
455 pr_debug("SIG deliver (#%d,%s:%d): sp=%p pc=%08Lx%08Lx link=%08Lx%08Lx\n",
456 sig, current->comm, current->pid, frame,
457 regs->pc >> 32, regs->pc & 0xffffffff,
458 DEREF_REG_PR >> 32, DEREF_REG_PR & 0xffffffff);
459
460 return 0;
461}
462
463static int setup_rt_frame(struct ksignal *kig, sigset_t *set,
464 struct pt_regs *regs)
465{
466 struct rt_sigframe __user *frame;
467 int err = 0, sig = ksig->sig;
468
469 frame = get_sigframe(&ksig->ka, regs->regs[REG_SP], sizeof(*frame));
470
471 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
472 return -EFAULT;
473
474 err |= __put_user(&frame->info, &frame->pinfo);
475 err |= __put_user(&frame->uc, &frame->puc);
476 err |= copy_siginfo_to_user(&frame->info, &ksig->info);
477
478
479 if (err)
480 return -EFAULT;
481
482
483 err |= __put_user(0, &frame->uc.uc_flags);
484 err |= __put_user(0, &frame->uc.uc_link);
485 err |= __save_altstack(&frame->uc.uc_stack, regs->regs[REG_SP]);
486 err |= setup_sigcontext(&frame->uc.uc_mcontext,
487 regs, set->sig[0]);
488 err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
489
490
491 if (err)
492 return -EFAULT;
493
494
495
496 if (ksig->ka.sa.sa_flags & SA_RESTORER) {
497
498
499
500 DEREF_REG_PR = neff_sign_extend((unsigned long)
501 ksig->ka.sa.sa_restorer | 0x1);
502 } else {
503
504
505
506
507
508
509
510
511
512
513
514 DEREF_REG_PR = neff_sign_extend((unsigned long)
515 frame->retcode | 0x01);
516
517 if (__copy_to_user(frame->retcode,
518 (void *)((unsigned long)sa_default_rt_restorer & (~1)), 16) != 0)
519 return -EFAULT;
520
521
522 flush_icache_range(DEREF_REG_PR-1, DEREF_REG_PR-1+15);
523 }
524
525
526
527
528
529 regs->regs[REG_SP] = neff_sign_extend((unsigned long)frame);
530 regs->regs[REG_ARG1] = sig;
531 regs->regs[REG_ARG2] = (unsigned long long)(unsigned long)(signed long)&frame->info;
532 regs->regs[REG_ARG3] = (unsigned long long)(unsigned long)(signed long)&frame->uc.uc_mcontext;
533 regs->pc = neff_sign_extend((unsigned long)ksig->ka.sa.sa_handler);
534
535 pr_debug("SIG deliver (#%d,%s:%d): sp=%p pc=%08Lx%08Lx link=%08Lx%08Lx\n",
536 sig, current->comm, current->pid, frame,
537 regs->pc >> 32, regs->pc & 0xffffffff,
538 DEREF_REG_PR >> 32, DEREF_REG_PR & 0xffffffff);
539
540 return 0;
541}
542
543
544
545
546static void
547handle_signal(struct ksignal *ksig, struct pt_regs *regs)
548{
549 sigset_t *oldset = sigmask_to_save();
550 int ret;
551
552
553 if (ksig->ka.sa.sa_flags & SA_SIGINFO)
554 ret = setup_rt_frame(ksig, oldset, regs);
555 else
556 ret = setup_frame(ksig, oldset, regs);
557
558 signal_setup_done(ret, ksig, test_thread_flag(TIF_SINGLESTEP));
559}
560
561asmlinkage void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags)
562{
563 if (thread_info_flags & _TIF_SIGPENDING)
564 do_signal(regs);
565
566 if (thread_info_flags & _TIF_NOTIFY_RESUME) {
567 clear_thread_flag(TIF_NOTIFY_RESUME);
568 tracehook_notify_resume(regs);
569 }
570}
571