2 * arch/sh/kernel/signal_64.c
4 * Copyright (C) 2000, 2001 Paolo Alberelli
5 * Copyright (C) 2003 - 2008 Paul Mundt
6 * Copyright (C) 2004 Richard Curnow
8 * This file is subject to the terms and conditions of the GNU General Public
9 * License. See the file "COPYING" in the main directory of this archive
12 #include <linux/rwsem.h>
13 #include <linux/sched.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>
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]
44 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
47 handle_signal(unsigned long sig
, siginfo_t
*info
, struct k_sigaction
*ka
,
48 sigset_t
*oldset
, struct pt_regs
* regs
);
51 handle_syscall_restart(struct pt_regs
*regs
, struct sigaction
*sa
)
53 /* If we're not from a syscall, bail out */
54 if (regs
->syscall_nr
< 0)
57 /* check for system call restart.. */
58 switch (regs
->regs
[REG_RET
]) {
59 case -ERESTART_RESTARTBLOCK
:
61 no_system_call_restart
:
62 regs
->regs
[REG_RET
] = -EINTR
;
66 if (!(sa
->sa_flags
& SA_RESTART
))
67 goto no_system_call_restart
;
70 /* Decode syscall # */
71 regs
->regs
[REG_RET
] = regs
->syscall_nr
;
78 * Note that 'init' is a special process: it doesn't get signals it doesn't
79 * want to handle. Thus you cannot kill init even with a SIGKILL even by
82 * Note that we go through the signals twice: once to check the signals that
83 * the kernel can handle, and then we build all the user-level signal handling
84 * stack-frames in one go after that.
86 static int do_signal(struct pt_regs
*regs
, sigset_t
*oldset
)
90 struct k_sigaction ka
;
93 * We want the common case to go fast, which
94 * is why we may in certain cases get here from
95 * kernel mode. Just return without doing anything
104 if (current_thread_info()->status
& TS_RESTORE_SIGMASK
)
105 oldset
= ¤t
->saved_sigmask
;
107 oldset
= ¤t
->blocked
;
109 signr
= get_signal_to_deliver(&info
, &ka
, regs
, 0);
111 handle_syscall_restart(regs
, &ka
.sa
);
113 /* Whee! Actually deliver the signal. */
114 if (handle_signal(signr
, &info
, &ka
, oldset
, regs
) == 0) {
116 * If a signal was successfully delivered, the
117 * saved sigmask is in its frame, and we can
118 * clear the TS_RESTORE_SIGMASK flag.
120 current_thread_info()->status
&= ~TS_RESTORE_SIGMASK
;
122 tracehook_signal_handler(signr
, &info
, &ka
, regs
,
123 test_thread_flag(TIF_SINGLESTEP
));
129 /* Did we come from a system call? */
130 if (regs
->syscall_nr
>= 0) {
131 /* Restart the system call - no handlers present */
132 switch (regs
->regs
[REG_RET
]) {
133 case -ERESTARTNOHAND
:
135 case -ERESTARTNOINTR
:
136 /* Decode Syscall # */
137 regs
->regs
[REG_RET
] = regs
->syscall_nr
;
141 case -ERESTART_RESTARTBLOCK
:
142 regs
->regs
[REG_RET
] = __NR_restart_syscall
;
148 /* No signal to deliver -- put the saved sigmask back */
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
);
158 * Atomically swap in the new signal mask, and wait for a signal.
161 sys_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
)
166 sigset_t saveset
, blocked
;
168 saveset
= current
->blocked
;
171 siginitset(&blocked
, mask
);
172 set_current_blocked(&blocked
);
174 REF_REG_RET
= -EINTR
;
176 current
->state
= TASK_INTERRUPTIBLE
;
178 set_restore_sigmask();
179 regs
->pc
+= 4; /* because sys_sigreturn decrements the pc */
180 if (do_signal(regs
, &saveset
)) {
181 /* pc now points at signal handler. Need to decrement
182 it because entry.S will increment it. */
190 sys_rt_sigsuspend(sigset_t
*unewset
, size_t sigsetsize
,
191 unsigned long r4
, unsigned long r5
, unsigned long r6
,
193 struct pt_regs
* regs
)
195 sigset_t saveset
, newset
;
197 /* XXX: Don't preclude handling different sized sigset_t's. */
198 if (sigsetsize
!= sizeof(sigset_t
))
201 if (copy_from_user(&newset
, unewset
, sizeof(newset
)))
203 sigdelsetmask(&newset
, ~_BLOCKABLE
);
204 saveset
= current
->blocked
;
205 set_current_blocked(&newset
);
207 REF_REG_RET
= -EINTR
;
209 current
->state
= TASK_INTERRUPTIBLE
;
211 regs
->pc
+= 4; /* because sys_sigreturn decrements the pc */
212 if (do_signal(regs
, &saveset
)) {
213 /* pc now points at signal handler. Need to decrement
214 it because entry.S will increment it. */
222 sys_sigaction(int sig
, const struct old_sigaction __user
*act
,
223 struct old_sigaction __user
*oact
)
225 struct k_sigaction new_ka
, old_ka
;
230 if (!access_ok(VERIFY_READ
, act
, sizeof(*act
)) ||
231 __get_user(new_ka
.sa
.sa_handler
, &act
->sa_handler
) ||
232 __get_user(new_ka
.sa
.sa_restorer
, &act
->sa_restorer
))
234 __get_user(new_ka
.sa
.sa_flags
, &act
->sa_flags
);
235 __get_user(mask
, &act
->sa_mask
);
236 siginitset(&new_ka
.sa
.sa_mask
, mask
);
239 ret
= do_sigaction(sig
, act
? &new_ka
: NULL
, oact
? &old_ka
: NULL
);
242 if (!access_ok(VERIFY_WRITE
, oact
, sizeof(*oact
)) ||
243 __put_user(old_ka
.sa
.sa_handler
, &oact
->sa_handler
) ||
244 __put_user(old_ka
.sa
.sa_restorer
, &oact
->sa_restorer
))
246 __put_user(old_ka
.sa
.sa_flags
, &oact
->sa_flags
);
247 __put_user(old_ka
.sa
.sa_mask
.sig
[0], &oact
->sa_mask
);
254 sys_sigaltstack(const stack_t __user
*uss
, stack_t __user
*uoss
,
255 unsigned long r4
, unsigned long r5
, unsigned long r6
,
257 struct pt_regs
* regs
)
259 return do_sigaltstack(uss
, uoss
, REF_REG_SP
);
263 * Do a signal return; undo the signal stack.
266 struct sigcontext sc
;
267 unsigned long extramask
[_NSIG_WORDS
-1];
268 long long retcode
[2];
272 struct siginfo __user
*pinfo
;
276 long long retcode
[2];
281 restore_sigcontext_fpu(struct pt_regs
*regs
, struct sigcontext __user
*sc
)
286 err
|= __get_user (fpvalid
, &sc
->sc_fpvalid
);
287 conditional_used_math(fpvalid
);
291 if (current
== last_task_used_math
) {
292 last_task_used_math
= NULL
;
296 err
|= __copy_from_user(¤t
->thread
.xstate
->hardfpu
, &sc
->sc_fpregs
[0],
297 (sizeof(long long) * 32) + (sizeof(int) * 1));
303 setup_sigcontext_fpu(struct pt_regs
*regs
, struct sigcontext __user
*sc
)
308 fpvalid
= !!used_math();
309 err
|= __put_user(fpvalid
, &sc
->sc_fpvalid
);
313 if (current
== last_task_used_math
) {
317 last_task_used_math
= NULL
;
321 err
|= __copy_to_user(&sc
->sc_fpregs
[0], ¤t
->thread
.xstate
->hardfpu
,
322 (sizeof(long long) * 32) + (sizeof(int) * 1));
329 restore_sigcontext_fpu(struct pt_regs
*regs
, struct sigcontext __user
*sc
)
334 setup_sigcontext_fpu(struct pt_regs
*regs
, struct sigcontext __user
*sc
)
341 restore_sigcontext(struct pt_regs
*regs
, struct sigcontext __user
*sc
, long long *r2_p
)
343 unsigned int err
= 0;
344 unsigned long long current_sr
, new_sr
;
345 #define SR_MASK 0xffff8cfd
347 #define COPY(x) err |= __get_user(regs->x, &sc->sc_##x)
349 COPY(regs
[0]); COPY(regs
[1]); COPY(regs
[2]); COPY(regs
[3]);
350 COPY(regs
[4]); COPY(regs
[5]); COPY(regs
[6]); COPY(regs
[7]);
351 COPY(regs
[8]); COPY(regs
[9]); COPY(regs
[10]); COPY(regs
[11]);
352 COPY(regs
[12]); COPY(regs
[13]); COPY(regs
[14]); COPY(regs
[15]);
353 COPY(regs
[16]); COPY(regs
[17]); COPY(regs
[18]); COPY(regs
[19]);
354 COPY(regs
[20]); COPY(regs
[21]); COPY(regs
[22]); COPY(regs
[23]);
355 COPY(regs
[24]); COPY(regs
[25]); COPY(regs
[26]); COPY(regs
[27]);
356 COPY(regs
[28]); COPY(regs
[29]); COPY(regs
[30]); COPY(regs
[31]);
357 COPY(regs
[32]); COPY(regs
[33]); COPY(regs
[34]); COPY(regs
[35]);
358 COPY(regs
[36]); COPY(regs
[37]); COPY(regs
[38]); COPY(regs
[39]);
359 COPY(regs
[40]); COPY(regs
[41]); COPY(regs
[42]); COPY(regs
[43]);
360 COPY(regs
[44]); COPY(regs
[45]); COPY(regs
[46]); COPY(regs
[47]);
361 COPY(regs
[48]); COPY(regs
[49]); COPY(regs
[50]); COPY(regs
[51]);
362 COPY(regs
[52]); COPY(regs
[53]); COPY(regs
[54]); COPY(regs
[55]);
363 COPY(regs
[56]); COPY(regs
[57]); COPY(regs
[58]); COPY(regs
[59]);
364 COPY(regs
[60]); COPY(regs
[61]); COPY(regs
[62]);
365 COPY(tregs
[0]); COPY(tregs
[1]); COPY(tregs
[2]); COPY(tregs
[3]);
366 COPY(tregs
[4]); COPY(tregs
[5]); COPY(tregs
[6]); COPY(tregs
[7]);
368 /* Prevent the signal handler manipulating SR in a way that can
369 crash the kernel. i.e. only allow S, Q, M, PR, SZ, FR to be
371 current_sr
= regs
->sr
;
372 err
|= __get_user(new_sr
, &sc
->sc_sr
);
374 regs
->sr
|= (new_sr
& ~SR_MASK
);
380 /* Must do this last in case it sets regs->sr.fd (i.e. after rest of sr
381 * has been restored above.) */
382 err
|= restore_sigcontext_fpu(regs
, sc
);
384 regs
->syscall_nr
= -1; /* disable syscall checks */
385 err
|= __get_user(*r2_p
, &sc
->sc_regs
[REG_RET
]);
389 asmlinkage
int sys_sigreturn(unsigned long r2
, unsigned long r3
,
390 unsigned long r4
, unsigned long r5
,
391 unsigned long r6
, unsigned long r7
,
392 struct pt_regs
* regs
)
394 struct sigframe __user
*frame
= (struct sigframe __user
*) (long) REF_REG_SP
;
398 /* Always make any pending restarted system calls return -EINTR */
399 current_thread_info()->restart_block
.fn
= do_no_restart_syscall
;
401 if (!access_ok(VERIFY_READ
, frame
, sizeof(*frame
)))
404 if (__get_user(set
.sig
[0], &frame
->sc
.oldmask
)
406 && __copy_from_user(&set
.sig
[1], &frame
->extramask
,
407 sizeof(frame
->extramask
))))
410 sigdelsetmask(&set
, ~_BLOCKABLE
);
411 set_current_blocked(&set
);
413 if (restore_sigcontext(regs
, &frame
->sc
, &ret
))
420 force_sig(SIGSEGV
, current
);
424 asmlinkage
int sys_rt_sigreturn(unsigned long r2
, unsigned long r3
,
425 unsigned long r4
, unsigned long r5
,
426 unsigned long r6
, unsigned long r7
,
427 struct pt_regs
* regs
)
429 struct rt_sigframe __user
*frame
= (struct rt_sigframe __user
*) (long) REF_REG_SP
;
434 /* Always make any pending restarted system calls return -EINTR */
435 current_thread_info()->restart_block
.fn
= do_no_restart_syscall
;
437 if (!access_ok(VERIFY_READ
, frame
, sizeof(*frame
)))
440 if (__copy_from_user(&set
, &frame
->uc
.uc_sigmask
, sizeof(set
)))
443 sigdelsetmask(&set
, ~_BLOCKABLE
);
444 set_current_blocked(&set
);
446 if (restore_sigcontext(regs
, &frame
->uc
.uc_mcontext
, &ret
))
450 if (__copy_from_user(&st
, &frame
->uc
.uc_stack
, sizeof(st
)))
452 /* It is more difficult to avoid calling this function than to
453 call it and ignore errors. */
454 do_sigaltstack(&st
, NULL
, REF_REG_SP
);
459 force_sig(SIGSEGV
, current
);
464 * Set up a signal frame.
467 setup_sigcontext(struct sigcontext __user
*sc
, struct pt_regs
*regs
,
472 /* Do this first, otherwise is this sets sr->fd, that value isn't preserved. */
473 err
|= setup_sigcontext_fpu(regs
, sc
);
475 #define COPY(x) err |= __put_user(regs->x, &sc->sc_##x)
477 COPY(regs
[0]); COPY(regs
[1]); COPY(regs
[2]); COPY(regs
[3]);
478 COPY(regs
[4]); COPY(regs
[5]); COPY(regs
[6]); COPY(regs
[7]);
479 COPY(regs
[8]); COPY(regs
[9]); COPY(regs
[10]); COPY(regs
[11]);
480 COPY(regs
[12]); COPY(regs
[13]); COPY(regs
[14]); COPY(regs
[15]);
481 COPY(regs
[16]); COPY(regs
[17]); COPY(regs
[18]); COPY(regs
[19]);
482 COPY(regs
[20]); COPY(regs
[21]); COPY(regs
[22]); COPY(regs
[23]);
483 COPY(regs
[24]); COPY(regs
[25]); COPY(regs
[26]); COPY(regs
[27]);
484 COPY(regs
[28]); COPY(regs
[29]); COPY(regs
[30]); COPY(regs
[31]);
485 COPY(regs
[32]); COPY(regs
[33]); COPY(regs
[34]); COPY(regs
[35]);
486 COPY(regs
[36]); COPY(regs
[37]); COPY(regs
[38]); COPY(regs
[39]);
487 COPY(regs
[40]); COPY(regs
[41]); COPY(regs
[42]); COPY(regs
[43]);
488 COPY(regs
[44]); COPY(regs
[45]); COPY(regs
[46]); COPY(regs
[47]);
489 COPY(regs
[48]); COPY(regs
[49]); COPY(regs
[50]); COPY(regs
[51]);
490 COPY(regs
[52]); COPY(regs
[53]); COPY(regs
[54]); COPY(regs
[55]);
491 COPY(regs
[56]); COPY(regs
[57]); COPY(regs
[58]); COPY(regs
[59]);
492 COPY(regs
[60]); COPY(regs
[61]); COPY(regs
[62]);
493 COPY(tregs
[0]); COPY(tregs
[1]); COPY(tregs
[2]); COPY(tregs
[3]);
494 COPY(tregs
[4]); COPY(tregs
[5]); COPY(tregs
[6]); COPY(tregs
[7]);
499 err
|= __put_user(mask
, &sc
->oldmask
);
505 * Determine which stack to use..
507 static inline void __user
*
508 get_sigframe(struct k_sigaction
*ka
, unsigned long sp
, size_t frame_size
)
510 if ((ka
->sa
.sa_flags
& SA_ONSTACK
) != 0 && ! sas_ss_flags(sp
))
511 sp
= current
->sas_ss_sp
+ current
->sas_ss_size
;
513 return (void __user
*)((sp
- frame_size
) & -8ul);
516 void sa_default_restorer(void); /* See comments below */
517 void sa_default_rt_restorer(void); /* See comments below */
519 static int setup_frame(int sig
, struct k_sigaction
*ka
,
520 sigset_t
*set
, struct pt_regs
*regs
)
522 struct sigframe __user
*frame
;
526 frame
= get_sigframe(ka
, regs
->regs
[REG_SP
], sizeof(*frame
));
528 if (!access_ok(VERIFY_WRITE
, frame
, sizeof(*frame
)))
531 signal
= current_thread_info()->exec_domain
532 && current_thread_info()->exec_domain
->signal_invmap
534 ? current_thread_info()->exec_domain
->signal_invmap
[sig
]
537 err
|= setup_sigcontext(&frame
->sc
, regs
, set
->sig
[0]);
539 /* Give up earlier as i386, in case */
543 if (_NSIG_WORDS
> 1) {
544 err
|= __copy_to_user(frame
->extramask
, &set
->sig
[1],
545 sizeof(frame
->extramask
)); }
547 /* Give up earlier as i386, in case */
551 /* Set up to return from userspace. If provided, use a stub
552 already in userspace. */
553 if (ka
->sa
.sa_flags
& SA_RESTORER
) {
555 * On SH5 all edited pointers are subject to NEFF
557 DEREF_REG_PR
= neff_sign_extend((unsigned long)
558 ka
->sa
.sa_restorer
| 0x1);
561 * Different approach on SH5.
562 * . Endianness independent asm code gets placed in entry.S .
563 * This is limited to four ASM instructions corresponding
564 * to two long longs in size.
565 * . err checking is done on the else branch only
566 * . flush_icache_range() is called upon __put_user() only
567 * . all edited pointers are subject to NEFF
568 * . being code, linker turns ShMedia bit on, always
569 * dereference index -1.
571 DEREF_REG_PR
= neff_sign_extend((unsigned long)
572 frame
->retcode
| 0x01);
574 if (__copy_to_user(frame
->retcode
,
575 (void *)((unsigned long)sa_default_restorer
& (~1)), 16) != 0)
578 /* Cohere the trampoline with the I-cache. */
579 flush_cache_sigtramp(DEREF_REG_PR
-1);
583 * Set up registers for signal handler.
584 * All edited pointers are subject to NEFF.
586 regs
->regs
[REG_SP
] = neff_sign_extend((unsigned long)frame
);
587 regs
->regs
[REG_ARG1
] = signal
; /* Arg for signal handler */
590 The glibc profiling support for SH-5 needs to be passed a sigcontext
591 so it can retrieve the PC. At some point during 2003 the glibc
592 support was changed to receive the sigcontext through the 2nd
593 argument, but there are still versions of libc.so in use that use
594 the 3rd argument. Until libc.so is stabilised, pass the sigcontext
595 through both 2nd and 3rd arguments.
598 regs
->regs
[REG_ARG2
] = (unsigned long long)(unsigned long)(signed long)&frame
->sc
;
599 regs
->regs
[REG_ARG3
] = (unsigned long long)(unsigned long)(signed long)&frame
->sc
;
601 regs
->pc
= neff_sign_extend((unsigned long)ka
->sa
.sa_handler
);
606 pr_debug("SIG deliver (#%d,%s:%d): sp=%p pc=%08Lx%08Lx link=%08Lx%08Lx\n",
607 signal
, current
->comm
, current
->pid
, frame
,
608 regs
->pc
>> 32, regs
->pc
& 0xffffffff,
609 DEREF_REG_PR
>> 32, DEREF_REG_PR
& 0xffffffff);
614 force_sigsegv(sig
, current
);
618 static int setup_rt_frame(int sig
, struct k_sigaction
*ka
, siginfo_t
*info
,
619 sigset_t
*set
, struct pt_regs
*regs
)
621 struct rt_sigframe __user
*frame
;
625 frame
= get_sigframe(ka
, regs
->regs
[REG_SP
], sizeof(*frame
));
627 if (!access_ok(VERIFY_WRITE
, frame
, sizeof(*frame
)))
630 signal
= current_thread_info()->exec_domain
631 && current_thread_info()->exec_domain
->signal_invmap
633 ? current_thread_info()->exec_domain
->signal_invmap
[sig
]
636 err
|= __put_user(&frame
->info
, &frame
->pinfo
);
637 err
|= __put_user(&frame
->uc
, &frame
->puc
);
638 err
|= copy_siginfo_to_user(&frame
->info
, info
);
640 /* Give up earlier as i386, in case */
644 /* Create the ucontext. */
645 err
|= __put_user(0, &frame
->uc
.uc_flags
);
646 err
|= __put_user(0, &frame
->uc
.uc_link
);
647 err
|= __put_user((void *)current
->sas_ss_sp
,
648 &frame
->uc
.uc_stack
.ss_sp
);
649 err
|= __put_user(sas_ss_flags(regs
->regs
[REG_SP
]),
650 &frame
->uc
.uc_stack
.ss_flags
);
651 err
|= __put_user(current
->sas_ss_size
, &frame
->uc
.uc_stack
.ss_size
);
652 err
|= setup_sigcontext(&frame
->uc
.uc_mcontext
,
654 err
|= __copy_to_user(&frame
->uc
.uc_sigmask
, set
, sizeof(*set
));
656 /* Give up earlier as i386, in case */
660 /* Set up to return from userspace. If provided, use a stub
661 already in userspace. */
662 if (ka
->sa
.sa_flags
& SA_RESTORER
) {
664 * On SH5 all edited pointers are subject to NEFF
666 DEREF_REG_PR
= neff_sign_extend((unsigned long)
667 ka
->sa
.sa_restorer
| 0x1);
670 * Different approach on SH5.
671 * . Endianness independent asm code gets placed in entry.S .
672 * This is limited to four ASM instructions corresponding
673 * to two long longs in size.
674 * . err checking is done on the else branch only
675 * . flush_icache_range() is called upon __put_user() only
676 * . all edited pointers are subject to NEFF
677 * . being code, linker turns ShMedia bit on, always
678 * dereference index -1.
680 DEREF_REG_PR
= neff_sign_extend((unsigned long)
681 frame
->retcode
| 0x01);
683 if (__copy_to_user(frame
->retcode
,
684 (void *)((unsigned long)sa_default_rt_restorer
& (~1)), 16) != 0)
687 /* Cohere the trampoline with the I-cache. */
688 flush_icache_range(DEREF_REG_PR
-1, DEREF_REG_PR
-1+15);
692 * Set up registers for signal handler.
693 * All edited pointers are subject to NEFF.
695 regs
->regs
[REG_SP
] = neff_sign_extend((unsigned long)frame
);
696 regs
->regs
[REG_ARG1
] = signal
; /* Arg for signal handler */
697 regs
->regs
[REG_ARG2
] = (unsigned long long)(unsigned long)(signed long)&frame
->info
;
698 regs
->regs
[REG_ARG3
] = (unsigned long long)(unsigned long)(signed long)&frame
->uc
.uc_mcontext
;
699 regs
->pc
= neff_sign_extend((unsigned long)ka
->sa
.sa_handler
);
703 pr_debug("SIG deliver (#%d,%s:%d): sp=%p pc=%08Lx%08Lx link=%08Lx%08Lx\n",
704 signal
, current
->comm
, current
->pid
, frame
,
705 regs
->pc
>> 32, regs
->pc
& 0xffffffff,
706 DEREF_REG_PR
>> 32, DEREF_REG_PR
& 0xffffffff);
711 force_sigsegv(sig
, current
);
716 * OK, we're invoking a handler
719 handle_signal(unsigned long sig
, siginfo_t
*info
, struct k_sigaction
*ka
,
720 sigset_t
*oldset
, struct pt_regs
* regs
)
724 /* Set up the stack frame */
725 if (ka
->sa
.sa_flags
& SA_SIGINFO
)
726 ret
= setup_rt_frame(sig
, ka
, info
, oldset
, regs
);
728 ret
= setup_frame(sig
, ka
, oldset
, regs
);
731 block_sigmask(ka
, sig
);
736 asmlinkage
void do_notify_resume(struct pt_regs
*regs
, unsigned long thread_info_flags
)
738 if (thread_info_flags
& _TIF_SIGPENDING
)
741 if (thread_info_flags
& _TIF_NOTIFY_RESUME
) {
742 clear_thread_flag(TIF_NOTIFY_RESUME
);
743 tracehook_notify_resume(regs
);
744 if (current
->replacement_session_keyring
)
745 key_replace_session_keyring();