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/freezer.h>
22#include <linux/ptrace.h>
23#include <linux/unistd.h>
24#include <linux/stddef.h>
25#include <linux/tracehook.h>
26#include <asm/ucontext.h>
27#include <asm/uaccess.h>
28#include <asm/pgtable.h>
29#include <asm/cacheflush.h>
30#include <asm/fpu.h>
31
32#define REG_RET 9
33#define REG_ARG1 2
34#define REG_ARG2 3
35#define REG_ARG3 4
36#define REG_SP 15
37#define REG_PR 18
38#define REF_REG_RET regs->regs[REG_RET]
39#define REF_REG_SP regs->regs[REG_SP]
40#define DEREF_REG_PR regs->regs[REG_PR]
41
42#define DEBUG_SIG 0
43
44#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
45
46static int
47handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
48 sigset_t *oldset, struct pt_regs * regs);
49
50static inline void
51handle_syscall_restart(struct pt_regs *regs, struct sigaction *sa)
52{
53
54 if (regs->syscall_nr < 0)
55 return;
56
57
58 switch (regs->regs[REG_RET]) {
59 case -ERESTART_RESTARTBLOCK:
60 case -ERESTARTNOHAND:
61 no_system_call_restart:
62 regs->regs[REG_RET] = -EINTR;
63 break;
64
65 case -ERESTARTSYS:
66 if (!(sa->sa_flags & SA_RESTART))
67 goto no_system_call_restart;
68
69 case -ERESTARTNOINTR:
70
71 regs->regs[REG_RET] = regs->syscall_nr;
72 regs->pc -= 4;
73 break;
74 }
75}
76
77
78
79
80
81
82
83
84
85
86static int do_signal(struct pt_regs *regs, sigset_t *oldset)
87{
88 siginfo_t info;
89 int signr;
90 struct k_sigaction ka;
91
92
93
94
95
96
97
98 if (!user_mode(regs))
99 return 1;
100
101 if (try_to_freeze())
102 goto no_signal;
103
104 if (current_thread_info()->status & TS_RESTORE_SIGMASK)
105 oldset = ¤t->saved_sigmask;
106 else if (!oldset)
107 oldset = ¤t->blocked;
108
109 signr = get_signal_to_deliver(&info, &ka, regs, 0);
110 if (signr > 0) {
111 handle_syscall_restart(regs, &ka.sa);
112
113
114 if (handle_signal(signr, &info, &ka, oldset, regs) == 0) {
115
116
117
118
119
120 current_thread_info()->status &= ~TS_RESTORE_SIGMASK;
121
122 tracehook_signal_handler(signr, &info, &ka, regs,
123 test_thread_flag(TIF_SINGLESTEP));
124 return 1;
125 }
126 }
127
128no_signal:
129
130 if (regs->syscall_nr >= 0) {
131
132 switch (regs->regs[REG_RET]) {
133 case -ERESTARTNOHAND:
134 case -ERESTARTSYS:
135 case -ERESTARTNOINTR:
136
137 regs->regs[REG_RET] = regs->syscall_nr;
138 regs->pc -= 4;
139 break;
140
141 case -ERESTART_RESTARTBLOCK:
142 regs->regs[REG_RET] = __NR_restart_syscall;
143 regs->pc -= 4;
144 break;
145 }
146 }
147
148
149 if (current_thread_info()->status & TS_RESTORE_SIGMASK) {
150 current_thread_info()->status &= ~TS_RESTORE_SIGMASK;
151 sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL);
152 }
153
154 return 0;
155}
156
157
158
159
160asmlinkage int
161sys_sigsuspend(old_sigset_t mask,
162 unsigned long r3, unsigned long r4, unsigned long r5,
163 unsigned long r6, unsigned long r7,
164 struct pt_regs * regs)
165{
166 sigset_t saveset;
167
168 mask &= _BLOCKABLE;
169 spin_lock_irq(¤t->sighand->siglock);
170 saveset = current->blocked;
171 siginitset(¤t->blocked, mask);
172 recalc_sigpending();
173 spin_unlock_irq(¤t->sighand->siglock);
174
175 REF_REG_RET = -EINTR;
176 while (1) {
177 current->state = TASK_INTERRUPTIBLE;
178 schedule();
179 set_restore_sigmask();
180 regs->pc += 4;
181 if (do_signal(regs, &saveset)) {
182
183
184 regs->pc -= 4;
185 return -EINTR;
186 }
187 }
188}
189
190asmlinkage int
191sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize,
192 unsigned long r4, unsigned long r5, unsigned long r6,
193 unsigned long r7,
194 struct pt_regs * regs)
195{
196 sigset_t saveset, newset;
197
198
199 if (sigsetsize != sizeof(sigset_t))
200 return -EINVAL;
201
202 if (copy_from_user(&newset, unewset, sizeof(newset)))
203 return -EFAULT;
204 sigdelsetmask(&newset, ~_BLOCKABLE);
205 spin_lock_irq(¤t->sighand->siglock);
206 saveset = current->blocked;
207 current->blocked = newset;
208 recalc_sigpending();
209 spin_unlock_irq(¤t->sighand->siglock);
210
211 REF_REG_RET = -EINTR;
212 while (1) {
213 current->state = TASK_INTERRUPTIBLE;
214 schedule();
215 regs->pc += 4;
216 if (do_signal(regs, &saveset)) {
217
218
219 regs->pc -= 4;
220 return -EINTR;
221 }
222 }
223}
224
225asmlinkage int
226sys_sigaction(int sig, const struct old_sigaction __user *act,
227 struct old_sigaction __user *oact)
228{
229 struct k_sigaction new_ka, old_ka;
230 int ret;
231
232 if (act) {
233 old_sigset_t mask;
234 if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
235 __get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
236 __get_user(new_ka.sa.sa_restorer, &act->sa_restorer))
237 return -EFAULT;
238 __get_user(new_ka.sa.sa_flags, &act->sa_flags);
239 __get_user(mask, &act->sa_mask);
240 siginitset(&new_ka.sa.sa_mask, mask);
241 }
242
243 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
244
245 if (!ret && oact) {
246 if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
247 __put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
248 __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer))
249 return -EFAULT;
250 __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
251 __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
252 }
253
254 return ret;
255}
256
257asmlinkage int
258sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss,
259 unsigned long r4, unsigned long r5, unsigned long r6,
260 unsigned long r7,
261 struct pt_regs * regs)
262{
263 return do_sigaltstack(uss, uoss, REF_REG_SP);
264}
265
266
267
268
269struct sigframe {
270 struct sigcontext sc;
271 unsigned long extramask[_NSIG_WORDS-1];
272 long long retcode[2];
273};
274
275struct rt_sigframe {
276 struct siginfo __user *pinfo;
277 void *puc;
278 struct siginfo info;
279 struct ucontext uc;
280 long long retcode[2];
281};
282
283#ifdef CONFIG_SH_FPU
284static inline int
285restore_sigcontext_fpu(struct pt_regs *regs, struct sigcontext __user *sc)
286{
287 int err = 0;
288 int fpvalid;
289
290 err |= __get_user (fpvalid, &sc->sc_fpvalid);
291 conditional_used_math(fpvalid);
292 if (! fpvalid)
293 return err;
294
295 if (current == last_task_used_math) {
296 last_task_used_math = NULL;
297 regs->sr |= SR_FD;
298 }
299
300 err |= __copy_from_user(¤t->thread.xstate->hardfpu, &sc->sc_fpregs[0],
301 (sizeof(long long) * 32) + (sizeof(int) * 1));
302
303 return err;
304}
305
306static inline int
307setup_sigcontext_fpu(struct pt_regs *regs, struct sigcontext __user *sc)
308{
309 int err = 0;
310 int fpvalid;
311
312 fpvalid = !!used_math();
313 err |= __put_user(fpvalid, &sc->sc_fpvalid);
314 if (! fpvalid)
315 return err;
316
317 if (current == last_task_used_math) {
318 enable_fpu();
319 save_fpu(current);
320 disable_fpu();
321 last_task_used_math = NULL;
322 regs->sr |= SR_FD;
323 }
324
325 err |= __copy_to_user(&sc->sc_fpregs[0], ¤t->thread.xstate->hardfpu,
326 (sizeof(long long) * 32) + (sizeof(int) * 1));
327 clear_used_math();
328
329 return err;
330}
331#else
332static inline int
333restore_sigcontext_fpu(struct pt_regs *regs, struct sigcontext __user *sc)
334{
335 return 0;
336}
337static inline int
338setup_sigcontext_fpu(struct pt_regs *regs, struct sigcontext __user *sc)
339{
340 return 0;
341}
342#endif
343
344static int
345restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, long long *r2_p)
346{
347 unsigned int err = 0;
348 unsigned long long current_sr, new_sr;
349#define SR_MASK 0xffff8cfd
350
351#define COPY(x) err |= __get_user(regs->x, &sc->sc_##x)
352
353 COPY(regs[0]); COPY(regs[1]); COPY(regs[2]); COPY(regs[3]);
354 COPY(regs[4]); COPY(regs[5]); COPY(regs[6]); COPY(regs[7]);
355 COPY(regs[8]); COPY(regs[9]); COPY(regs[10]); COPY(regs[11]);
356 COPY(regs[12]); COPY(regs[13]); COPY(regs[14]); COPY(regs[15]);
357 COPY(regs[16]); COPY(regs[17]); COPY(regs[18]); COPY(regs[19]);
358 COPY(regs[20]); COPY(regs[21]); COPY(regs[22]); COPY(regs[23]);
359 COPY(regs[24]); COPY(regs[25]); COPY(regs[26]); COPY(regs[27]);
360 COPY(regs[28]); COPY(regs[29]); COPY(regs[30]); COPY(regs[31]);
361 COPY(regs[32]); COPY(regs[33]); COPY(regs[34]); COPY(regs[35]);
362 COPY(regs[36]); COPY(regs[37]); COPY(regs[38]); COPY(regs[39]);
363 COPY(regs[40]); COPY(regs[41]); COPY(regs[42]); COPY(regs[43]);
364 COPY(regs[44]); COPY(regs[45]); COPY(regs[46]); COPY(regs[47]);
365 COPY(regs[48]); COPY(regs[49]); COPY(regs[50]); COPY(regs[51]);
366 COPY(regs[52]); COPY(regs[53]); COPY(regs[54]); COPY(regs[55]);
367 COPY(regs[56]); COPY(regs[57]); COPY(regs[58]); COPY(regs[59]);
368 COPY(regs[60]); COPY(regs[61]); COPY(regs[62]);
369 COPY(tregs[0]); COPY(tregs[1]); COPY(tregs[2]); COPY(tregs[3]);
370 COPY(tregs[4]); COPY(tregs[5]); COPY(tregs[6]); COPY(tregs[7]);
371
372
373
374
375 current_sr = regs->sr;
376 err |= __get_user(new_sr, &sc->sc_sr);
377 regs->sr &= SR_MASK;
378 regs->sr |= (new_sr & ~SR_MASK);
379
380 COPY(pc);
381
382#undef COPY
383
384
385
386 err |= restore_sigcontext_fpu(regs, sc);
387
388 regs->syscall_nr = -1;
389 err |= __get_user(*r2_p, &sc->sc_regs[REG_RET]);
390 return err;
391}
392
393asmlinkage int sys_sigreturn(unsigned long r2, unsigned long r3,
394 unsigned long r4, unsigned long r5,
395 unsigned long r6, unsigned long r7,
396 struct pt_regs * regs)
397{
398 struct sigframe __user *frame = (struct sigframe __user *) (long) REF_REG_SP;
399 sigset_t set;
400 long long ret;
401
402
403 current_thread_info()->restart_block.fn = do_no_restart_syscall;
404
405 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
406 goto badframe;
407
408 if (__get_user(set.sig[0], &frame->sc.oldmask)
409 || (_NSIG_WORDS > 1
410 && __copy_from_user(&set.sig[1], &frame->extramask,
411 sizeof(frame->extramask))))
412 goto badframe;
413
414 sigdelsetmask(&set, ~_BLOCKABLE);
415
416 spin_lock_irq(¤t->sighand->siglock);
417 current->blocked = set;
418 recalc_sigpending();
419 spin_unlock_irq(¤t->sighand->siglock);
420
421 if (restore_sigcontext(regs, &frame->sc, &ret))
422 goto badframe;
423 regs->pc -= 4;
424
425 return (int) ret;
426
427badframe:
428 force_sig(SIGSEGV, current);
429 return 0;
430}
431
432asmlinkage int sys_rt_sigreturn(unsigned long r2, unsigned long r3,
433 unsigned long r4, unsigned long r5,
434 unsigned long r6, unsigned long r7,
435 struct pt_regs * regs)
436{
437 struct rt_sigframe __user *frame = (struct rt_sigframe __user *) (long) REF_REG_SP;
438 sigset_t set;
439 stack_t __user st;
440 long long ret;
441
442
443 current_thread_info()->restart_block.fn = do_no_restart_syscall;
444
445 if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
446 goto badframe;
447
448 if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
449 goto badframe;
450
451 sigdelsetmask(&set, ~_BLOCKABLE);
452 spin_lock_irq(¤t->sighand->siglock);
453 current->blocked = set;
454 recalc_sigpending();
455 spin_unlock_irq(¤t->sighand->siglock);
456
457 if (restore_sigcontext(regs, &frame->uc.uc_mcontext, &ret))
458 goto badframe;
459 regs->pc -= 4;
460
461 if (__copy_from_user(&st, &frame->uc.uc_stack, sizeof(st)))
462 goto badframe;
463
464
465 do_sigaltstack(&st, NULL, REF_REG_SP);
466
467 return (int) ret;
468
469badframe:
470 force_sig(SIGSEGV, current);
471 return 0;
472}
473
474
475
476
477static int
478setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
479 unsigned long mask)
480{
481 int err = 0;
482
483
484 err |= setup_sigcontext_fpu(regs, sc);
485
486#define COPY(x) err |= __put_user(regs->x, &sc->sc_##x)
487
488 COPY(regs[0]); COPY(regs[1]); COPY(regs[2]); COPY(regs[3]);
489 COPY(regs[4]); COPY(regs[5]); COPY(regs[6]); COPY(regs[7]);
490 COPY(regs[8]); COPY(regs[9]); COPY(regs[10]); COPY(regs[11]);
491 COPY(regs[12]); COPY(regs[13]); COPY(regs[14]); COPY(regs[15]);
492 COPY(regs[16]); COPY(regs[17]); COPY(regs[18]); COPY(regs[19]);
493 COPY(regs[20]); COPY(regs[21]); COPY(regs[22]); COPY(regs[23]);
494 COPY(regs[24]); COPY(regs[25]); COPY(regs[26]); COPY(regs[27]);
495 COPY(regs[28]); COPY(regs[29]); COPY(regs[30]); COPY(regs[31]);
496 COPY(regs[32]); COPY(regs[33]); COPY(regs[34]); COPY(regs[35]);
497 COPY(regs[36]); COPY(regs[37]); COPY(regs[38]); COPY(regs[39]);
498 COPY(regs[40]); COPY(regs[41]); COPY(regs[42]); COPY(regs[43]);
499 COPY(regs[44]); COPY(regs[45]); COPY(regs[46]); COPY(regs[47]);
500 COPY(regs[48]); COPY(regs[49]); COPY(regs[50]); COPY(regs[51]);
501 COPY(regs[52]); COPY(regs[53]); COPY(regs[54]); COPY(regs[55]);
502 COPY(regs[56]); COPY(regs[57]); COPY(regs[58]); COPY(regs[59]);
503 COPY(regs[60]); COPY(regs[61]); COPY(regs[62]);
504 COPY(tregs[0]); COPY(tregs[1]); COPY(tregs[2]); COPY(tregs[3]);
505 COPY(tregs[4]); COPY(tregs[5]); COPY(tregs[6]); COPY(tregs[7]);
506 COPY(sr); COPY(pc);
507
508#undef COPY
509
510 err |= __put_user(mask, &sc->oldmask);
511
512 return err;
513}
514
515
516
517
518static inline void __user *
519get_sigframe(struct k_sigaction *ka, unsigned long sp, size_t frame_size)
520{
521 if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && ! sas_ss_flags(sp))
522 sp = current->sas_ss_sp + current->sas_ss_size;
523
524 return (void __user *)((sp - frame_size) & -8ul);
525}
526
527void sa_default_restorer(void);
528void sa_default_rt_restorer(void);
529
530static int setup_frame(int sig, struct k_sigaction *ka,
531 sigset_t *set, struct pt_regs *regs)
532{
533 struct sigframe __user *frame;
534 int err = 0;
535 int signal;
536
537 frame = get_sigframe(ka, regs->regs[REG_SP], sizeof(*frame));
538
539 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
540 goto give_sigsegv;
541
542 signal = current_thread_info()->exec_domain
543 && current_thread_info()->exec_domain->signal_invmap
544 && sig < 32
545 ? current_thread_info()->exec_domain->signal_invmap[sig]
546 : sig;
547
548 err |= setup_sigcontext(&frame->sc, regs, set->sig[0]);
549
550
551 if (err)
552 goto give_sigsegv;
553
554 if (_NSIG_WORDS > 1) {
555 err |= __copy_to_user(frame->extramask, &set->sig[1],
556 sizeof(frame->extramask)); }
557
558
559 if (err)
560 goto give_sigsegv;
561
562
563
564 if (ka->sa.sa_flags & SA_RESTORER) {
565
566
567
568 DEREF_REG_PR = neff_sign_extend((unsigned long)
569 ka->sa.sa_restorer | 0x1);
570 } else {
571
572
573
574
575
576
577
578
579
580
581
582 DEREF_REG_PR = neff_sign_extend((unsigned long)
583 frame->retcode | 0x01);
584
585 if (__copy_to_user(frame->retcode,
586 (void *)((unsigned long)sa_default_restorer & (~1)), 16) != 0)
587 goto give_sigsegv;
588
589
590 flush_cache_sigtramp(DEREF_REG_PR-1);
591 }
592
593
594
595
596
597 regs->regs[REG_SP] = neff_sign_extend((unsigned long)frame);
598 regs->regs[REG_ARG1] = signal;
599
600
601
602
603
604
605
606
607
608
609 regs->regs[REG_ARG2] = (unsigned long long)(unsigned long)(signed long)&frame->sc;
610 regs->regs[REG_ARG3] = (unsigned long long)(unsigned long)(signed long)&frame->sc;
611
612 regs->pc = neff_sign_extend((unsigned long)ka->sa.sa_handler);
613
614 set_fs(USER_DS);
615
616
617 pr_debug("SIG deliver (#%d,%s:%d): sp=%p pc=%08Lx%08Lx link=%08Lx%08Lx\n",
618 signal, current->comm, current->pid, frame,
619 regs->pc >> 32, regs->pc & 0xffffffff,
620 DEREF_REG_PR >> 32, DEREF_REG_PR & 0xffffffff);
621
622 return 0;
623
624give_sigsegv:
625 force_sigsegv(sig, current);
626 return -EFAULT;
627}
628
629static int setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
630 sigset_t *set, struct pt_regs *regs)
631{
632 struct rt_sigframe __user *frame;
633 int err = 0;
634 int signal;
635
636 frame = get_sigframe(ka, regs->regs[REG_SP], sizeof(*frame));
637
638 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
639 goto give_sigsegv;
640
641 signal = current_thread_info()->exec_domain
642 && current_thread_info()->exec_domain->signal_invmap
643 && sig < 32
644 ? current_thread_info()->exec_domain->signal_invmap[sig]
645 : sig;
646
647 err |= __put_user(&frame->info, &frame->pinfo);
648 err |= __put_user(&frame->uc, &frame->puc);
649 err |= copy_siginfo_to_user(&frame->info, info);
650
651
652 if (err)
653 goto give_sigsegv;
654
655
656 err |= __put_user(0, &frame->uc.uc_flags);
657 err |= __put_user(0, &frame->uc.uc_link);
658 err |= __put_user((void *)current->sas_ss_sp,
659 &frame->uc.uc_stack.ss_sp);
660 err |= __put_user(sas_ss_flags(regs->regs[REG_SP]),
661 &frame->uc.uc_stack.ss_flags);
662 err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
663 err |= setup_sigcontext(&frame->uc.uc_mcontext,
664 regs, set->sig[0]);
665 err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
666
667
668 if (err)
669 goto give_sigsegv;
670
671
672
673 if (ka->sa.sa_flags & SA_RESTORER) {
674
675
676
677 DEREF_REG_PR = neff_sign_extend((unsigned long)
678 ka->sa.sa_restorer | 0x1);
679 } else {
680
681
682
683
684
685
686
687
688
689
690
691 DEREF_REG_PR = neff_sign_extend((unsigned long)
692 frame->retcode | 0x01);
693
694 if (__copy_to_user(frame->retcode,
695 (void *)((unsigned long)sa_default_rt_restorer & (~1)), 16) != 0)
696 goto give_sigsegv;
697
698
699 flush_icache_range(DEREF_REG_PR-1, DEREF_REG_PR-1+15);
700 }
701
702
703
704
705
706 regs->regs[REG_SP] = neff_sign_extend((unsigned long)frame);
707 regs->regs[REG_ARG1] = signal;
708 regs->regs[REG_ARG2] = (unsigned long long)(unsigned long)(signed long)&frame->info;
709 regs->regs[REG_ARG3] = (unsigned long long)(unsigned long)(signed long)&frame->uc.uc_mcontext;
710 regs->pc = neff_sign_extend((unsigned long)ka->sa.sa_handler);
711
712 set_fs(USER_DS);
713
714 pr_debug("SIG deliver (#%d,%s:%d): sp=%p pc=%08Lx%08Lx link=%08Lx%08Lx\n",
715 signal, current->comm, current->pid, frame,
716 regs->pc >> 32, regs->pc & 0xffffffff,
717 DEREF_REG_PR >> 32, DEREF_REG_PR & 0xffffffff);
718
719 return 0;
720
721give_sigsegv:
722 force_sigsegv(sig, current);
723 return -EFAULT;
724}
725
726
727
728
729static int
730handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
731 sigset_t *oldset, struct pt_regs * regs)
732{
733 int ret;
734
735
736 if (ka->sa.sa_flags & SA_SIGINFO)
737 ret = setup_rt_frame(sig, ka, info, oldset, regs);
738 else
739 ret = setup_frame(sig, ka, oldset, regs);
740
741 if (ka->sa.sa_flags & SA_ONESHOT)
742 ka->sa.sa_handler = SIG_DFL;
743
744 if (ret == 0) {
745 spin_lock_irq(¤t->sighand->siglock);
746 sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
747 if (!(ka->sa.sa_flags & SA_NODEFER))
748 sigaddset(¤t->blocked,sig);
749 recalc_sigpending();
750 spin_unlock_irq(¤t->sighand->siglock);
751 }
752
753 return ret;
754}
755
756asmlinkage void do_notify_resume(struct pt_regs *regs, unsigned long thread_info_flags)
757{
758 if (thread_info_flags & _TIF_SIGPENDING)
759 do_signal(regs, 0);
760
761 if (thread_info_flags & _TIF_NOTIFY_RESUME) {
762 clear_thread_flag(TIF_NOTIFY_RESUME);
763 tracehook_notify_resume(regs);
764 if (current->replacement_session_keyring)
765 key_replace_session_keyring();
766 }
767}
768