2 * This file is subject to the terms and conditions of the GNU General Public
3 * License. See the file "COPYING" in the main directory of this archive
6 * arch/sh64/kernel/signal.c
8 * Copyright (C) 2000, 2001 Paolo Alberelli
9 * Copyright (C) 2003 Paul Mundt
10 * Copyright (C) 2004 Richard Curnow
12 * Started from sh version.
15 #include <linux/rwsem.h>
16 #include <linux/sched.h>
18 #include <linux/smp.h>
19 #include <linux/kernel.h>
20 #include <linux/signal.h>
21 #include <linux/errno.h>
22 #include <linux/wait.h>
23 #include <linux/personality.h>
24 #include <linux/freezer.h>
25 #include <linux/ptrace.h>
26 #include <linux/unistd.h>
27 #include <linux/stddef.h>
28 #include <asm/ucontext.h>
29 #include <asm/uaccess.h>
30 #include <asm/pgtable.h>
39 #define REF_REG_RET regs->regs[REG_RET]
40 #define REF_REG_SP regs->regs[REG_SP]
41 #define DEREF_REG_PR regs->regs[REG_PR]
45 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
47 asmlinkage
int do_signal(struct pt_regs
*regs
, sigset_t
*oldset
);
50 * Atomically swap in the new signal mask, and wait for a signal.
54 sys_sigsuspend(old_sigset_t mask
,
55 unsigned long r3
, unsigned long r4
, unsigned long r5
,
56 unsigned long r6
, unsigned long r7
,
57 struct pt_regs
* regs
)
62 spin_lock_irq(¤t
->sighand
->siglock
);
63 saveset
= current
->blocked
;
64 siginitset(¤t
->blocked
, mask
);
66 spin_unlock_irq(¤t
->sighand
->siglock
);
70 current
->state
= TASK_INTERRUPTIBLE
;
72 regs
->pc
+= 4; /* because sys_sigreturn decrements the pc */
73 if (do_signal(regs
, &saveset
)) {
74 /* pc now points at signal handler. Need to decrement
75 it because entry.S will increment it. */
83 sys_rt_sigsuspend(sigset_t
*unewset
, size_t sigsetsize
,
84 unsigned long r4
, unsigned long r5
, unsigned long r6
,
86 struct pt_regs
* regs
)
88 sigset_t saveset
, newset
;
90 /* XXX: Don't preclude handling different sized sigset_t's. */
91 if (sigsetsize
!= sizeof(sigset_t
))
94 if (copy_from_user(&newset
, unewset
, sizeof(newset
)))
96 sigdelsetmask(&newset
, ~_BLOCKABLE
);
97 spin_lock_irq(¤t
->sighand
->siglock
);
98 saveset
= current
->blocked
;
99 current
->blocked
= newset
;
101 spin_unlock_irq(¤t
->sighand
->siglock
);
103 REF_REG_RET
= -EINTR
;
105 current
->state
= TASK_INTERRUPTIBLE
;
107 regs
->pc
+= 4; /* because sys_sigreturn decrements the pc */
108 if (do_signal(regs
, &saveset
)) {
109 /* pc now points at signal handler. Need to decrement
110 it because entry.S will increment it. */
118 sys_sigaction(int sig
, const struct old_sigaction __user
*act
,
119 struct old_sigaction __user
*oact
)
121 struct k_sigaction new_ka
, old_ka
;
126 if (!access_ok(VERIFY_READ
, act
, sizeof(*act
)) ||
127 __get_user(new_ka
.sa
.sa_handler
, &act
->sa_handler
) ||
128 __get_user(new_ka
.sa
.sa_restorer
, &act
->sa_restorer
))
130 __get_user(new_ka
.sa
.sa_flags
, &act
->sa_flags
);
131 __get_user(mask
, &act
->sa_mask
);
132 siginitset(&new_ka
.sa
.sa_mask
, mask
);
135 ret
= do_sigaction(sig
, act
? &new_ka
: NULL
, oact
? &old_ka
: NULL
);
138 if (!access_ok(VERIFY_WRITE
, oact
, sizeof(*oact
)) ||
139 __put_user(old_ka
.sa
.sa_handler
, &oact
->sa_handler
) ||
140 __put_user(old_ka
.sa
.sa_restorer
, &oact
->sa_restorer
))
142 __put_user(old_ka
.sa
.sa_flags
, &oact
->sa_flags
);
143 __put_user(old_ka
.sa
.sa_mask
.sig
[0], &oact
->sa_mask
);
150 sys_sigaltstack(const stack_t __user
*uss
, stack_t __user
*uoss
,
151 unsigned long r4
, unsigned long r5
, unsigned long r6
,
153 struct pt_regs
* regs
)
155 return do_sigaltstack(uss
, uoss
, REF_REG_SP
);
160 * Do a signal return; undo the signal stack.
165 struct sigcontext sc
;
166 unsigned long extramask
[_NSIG_WORDS
-1];
167 long long retcode
[2];
172 struct siginfo __user
*pinfo
;
176 long long retcode
[2];
181 restore_sigcontext_fpu(struct pt_regs
*regs
, struct sigcontext __user
*sc
)
186 err
|= __get_user (fpvalid
, &sc
->sc_fpvalid
);
187 conditional_used_math(fpvalid
);
191 if (current
== last_task_used_math
) {
192 last_task_used_math
= NULL
;
196 err
|= __copy_from_user(¤t
->thread
.fpu
.hard
, &sc
->sc_fpregs
[0],
197 (sizeof(long long) * 32) + (sizeof(int) * 1));
203 setup_sigcontext_fpu(struct pt_regs
*regs
, struct sigcontext __user
*sc
)
208 fpvalid
= !!used_math();
209 err
|= __put_user(fpvalid
, &sc
->sc_fpvalid
);
213 if (current
== last_task_used_math
) {
215 fpsave(¤t
->thread
.fpu
.hard
);
217 last_task_used_math
= NULL
;
221 err
|= __copy_to_user(&sc
->sc_fpregs
[0], ¤t
->thread
.fpu
.hard
,
222 (sizeof(long long) * 32) + (sizeof(int) * 1));
229 restore_sigcontext_fpu(struct pt_regs
*regs
, struct sigcontext __user
*sc
)
232 setup_sigcontext_fpu(struct pt_regs
*regs
, struct sigcontext __user
*sc
)
237 restore_sigcontext(struct pt_regs
*regs
, struct sigcontext __user
*sc
, long long *r2_p
)
239 unsigned int err
= 0;
240 unsigned long long current_sr
, new_sr
;
241 #define SR_MASK 0xffff8cfd
243 #define COPY(x) err |= __get_user(regs->x, &sc->sc_##x)
245 COPY(regs
[0]); COPY(regs
[1]); COPY(regs
[2]); COPY(regs
[3]);
246 COPY(regs
[4]); COPY(regs
[5]); COPY(regs
[6]); COPY(regs
[7]);
247 COPY(regs
[8]); COPY(regs
[9]); COPY(regs
[10]); COPY(regs
[11]);
248 COPY(regs
[12]); COPY(regs
[13]); COPY(regs
[14]); COPY(regs
[15]);
249 COPY(regs
[16]); COPY(regs
[17]); COPY(regs
[18]); COPY(regs
[19]);
250 COPY(regs
[20]); COPY(regs
[21]); COPY(regs
[22]); COPY(regs
[23]);
251 COPY(regs
[24]); COPY(regs
[25]); COPY(regs
[26]); COPY(regs
[27]);
252 COPY(regs
[28]); COPY(regs
[29]); COPY(regs
[30]); COPY(regs
[31]);
253 COPY(regs
[32]); COPY(regs
[33]); COPY(regs
[34]); COPY(regs
[35]);
254 COPY(regs
[36]); COPY(regs
[37]); COPY(regs
[38]); COPY(regs
[39]);
255 COPY(regs
[40]); COPY(regs
[41]); COPY(regs
[42]); COPY(regs
[43]);
256 COPY(regs
[44]); COPY(regs
[45]); COPY(regs
[46]); COPY(regs
[47]);
257 COPY(regs
[48]); COPY(regs
[49]); COPY(regs
[50]); COPY(regs
[51]);
258 COPY(regs
[52]); COPY(regs
[53]); COPY(regs
[54]); COPY(regs
[55]);
259 COPY(regs
[56]); COPY(regs
[57]); COPY(regs
[58]); COPY(regs
[59]);
260 COPY(regs
[60]); COPY(regs
[61]); COPY(regs
[62]);
261 COPY(tregs
[0]); COPY(tregs
[1]); COPY(tregs
[2]); COPY(tregs
[3]);
262 COPY(tregs
[4]); COPY(tregs
[5]); COPY(tregs
[6]); COPY(tregs
[7]);
264 /* Prevent the signal handler manipulating SR in a way that can
265 crash the kernel. i.e. only allow S, Q, M, PR, SZ, FR to be
267 current_sr
= regs
->sr
;
268 err
|= __get_user(new_sr
, &sc
->sc_sr
);
270 regs
->sr
|= (new_sr
& ~SR_MASK
);
276 /* Must do this last in case it sets regs->sr.fd (i.e. after rest of sr
277 * has been restored above.) */
278 err
|= restore_sigcontext_fpu(regs
, sc
);
280 regs
->syscall_nr
= -1; /* disable syscall checks */
281 err
|= __get_user(*r2_p
, &sc
->sc_regs
[REG_RET
]);
285 asmlinkage
int sys_sigreturn(unsigned long r2
, unsigned long r3
,
286 unsigned long r4
, unsigned long r5
,
287 unsigned long r6
, unsigned long r7
,
288 struct pt_regs
* regs
)
290 struct sigframe __user
*frame
= (struct sigframe __user
*) (long) REF_REG_SP
;
294 if (!access_ok(VERIFY_READ
, frame
, sizeof(*frame
)))
297 if (__get_user(set
.sig
[0], &frame
->sc
.oldmask
)
299 && __copy_from_user(&set
.sig
[1], &frame
->extramask
,
300 sizeof(frame
->extramask
))))
303 sigdelsetmask(&set
, ~_BLOCKABLE
);
305 spin_lock_irq(¤t
->sighand
->siglock
);
306 current
->blocked
= set
;
308 spin_unlock_irq(¤t
->sighand
->siglock
);
310 if (restore_sigcontext(regs
, &frame
->sc
, &ret
))
317 force_sig(SIGSEGV
, current
);
321 asmlinkage
int sys_rt_sigreturn(unsigned long r2
, unsigned long r3
,
322 unsigned long r4
, unsigned long r5
,
323 unsigned long r6
, unsigned long r7
,
324 struct pt_regs
* regs
)
326 struct rt_sigframe __user
*frame
= (struct rt_sigframe __user
*) (long) REF_REG_SP
;
331 if (!access_ok(VERIFY_READ
, frame
, sizeof(*frame
)))
334 if (__copy_from_user(&set
, &frame
->uc
.uc_sigmask
, sizeof(set
)))
337 sigdelsetmask(&set
, ~_BLOCKABLE
);
338 spin_lock_irq(¤t
->sighand
->siglock
);
339 current
->blocked
= set
;
341 spin_unlock_irq(¤t
->sighand
->siglock
);
343 if (restore_sigcontext(regs
, &frame
->uc
.uc_mcontext
, &ret
))
347 if (__copy_from_user(&st
, &frame
->uc
.uc_stack
, sizeof(st
)))
349 /* It is more difficult to avoid calling this function than to
350 call it and ignore errors. */
351 do_sigaltstack(&st
, NULL
, REF_REG_SP
);
356 force_sig(SIGSEGV
, current
);
361 * Set up a signal frame.
365 setup_sigcontext(struct sigcontext __user
*sc
, struct pt_regs
*regs
,
370 /* Do this first, otherwise is this sets sr->fd, that value isn't preserved. */
371 err
|= setup_sigcontext_fpu(regs
, sc
);
373 #define COPY(x) err |= __put_user(regs->x, &sc->sc_##x)
375 COPY(regs
[0]); COPY(regs
[1]); COPY(regs
[2]); COPY(regs
[3]);
376 COPY(regs
[4]); COPY(regs
[5]); COPY(regs
[6]); COPY(regs
[7]);
377 COPY(regs
[8]); COPY(regs
[9]); COPY(regs
[10]); COPY(regs
[11]);
378 COPY(regs
[12]); COPY(regs
[13]); COPY(regs
[14]); COPY(regs
[15]);
379 COPY(regs
[16]); COPY(regs
[17]); COPY(regs
[18]); COPY(regs
[19]);
380 COPY(regs
[20]); COPY(regs
[21]); COPY(regs
[22]); COPY(regs
[23]);
381 COPY(regs
[24]); COPY(regs
[25]); COPY(regs
[26]); COPY(regs
[27]);
382 COPY(regs
[28]); COPY(regs
[29]); COPY(regs
[30]); COPY(regs
[31]);
383 COPY(regs
[32]); COPY(regs
[33]); COPY(regs
[34]); COPY(regs
[35]);
384 COPY(regs
[36]); COPY(regs
[37]); COPY(regs
[38]); COPY(regs
[39]);
385 COPY(regs
[40]); COPY(regs
[41]); COPY(regs
[42]); COPY(regs
[43]);
386 COPY(regs
[44]); COPY(regs
[45]); COPY(regs
[46]); COPY(regs
[47]);
387 COPY(regs
[48]); COPY(regs
[49]); COPY(regs
[50]); COPY(regs
[51]);
388 COPY(regs
[52]); COPY(regs
[53]); COPY(regs
[54]); COPY(regs
[55]);
389 COPY(regs
[56]); COPY(regs
[57]); COPY(regs
[58]); COPY(regs
[59]);
390 COPY(regs
[60]); COPY(regs
[61]); COPY(regs
[62]);
391 COPY(tregs
[0]); COPY(tregs
[1]); COPY(tregs
[2]); COPY(tregs
[3]);
392 COPY(tregs
[4]); COPY(tregs
[5]); COPY(tregs
[6]); COPY(tregs
[7]);
397 err
|= __put_user(mask
, &sc
->oldmask
);
403 * Determine which stack to use..
405 static inline void __user
*
406 get_sigframe(struct k_sigaction
*ka
, unsigned long sp
, size_t frame_size
)
408 if ((ka
->sa
.sa_flags
& SA_ONSTACK
) != 0 && ! sas_ss_flags(sp
))
409 sp
= current
->sas_ss_sp
+ current
->sas_ss_size
;
411 return (void __user
*)((sp
- frame_size
) & -8ul);
414 void sa_default_restorer(void); /* See comments below */
415 void sa_default_rt_restorer(void); /* See comments below */
417 static void setup_frame(int sig
, struct k_sigaction
*ka
,
418 sigset_t
*set
, struct pt_regs
*regs
)
420 struct sigframe __user
*frame
;
424 frame
= get_sigframe(ka
, regs
->regs
[REG_SP
], sizeof(*frame
));
426 if (!access_ok(VERIFY_WRITE
, frame
, sizeof(*frame
)))
429 signal
= current_thread_info()->exec_domain
430 && current_thread_info()->exec_domain
->signal_invmap
432 ? current_thread_info()->exec_domain
->signal_invmap
[sig
]
435 err
|= setup_sigcontext(&frame
->sc
, regs
, set
->sig
[0]);
437 /* Give up earlier as i386, in case */
441 if (_NSIG_WORDS
> 1) {
442 err
|= __copy_to_user(frame
->extramask
, &set
->sig
[1],
443 sizeof(frame
->extramask
)); }
445 /* Give up earlier as i386, in case */
449 /* Set up to return from userspace. If provided, use a stub
450 already in userspace. */
451 if (ka
->sa
.sa_flags
& SA_RESTORER
) {
452 DEREF_REG_PR
= (unsigned long) ka
->sa
.sa_restorer
| 0x1;
455 * On SH5 all edited pointers are subject to NEFF
457 DEREF_REG_PR
= (DEREF_REG_PR
& NEFF_SIGN
) ?
458 (DEREF_REG_PR
| NEFF_MASK
) : DEREF_REG_PR
;
461 * Different approach on SH5.
462 * . Endianness independent asm code gets placed in entry.S .
463 * This is limited to four ASM instructions corresponding
464 * to two long longs in size.
465 * . err checking is done on the else branch only
466 * . flush_icache_range() is called upon __put_user() only
467 * . all edited pointers are subject to NEFF
468 * . being code, linker turns ShMedia bit on, always
469 * dereference index -1.
471 DEREF_REG_PR
= (unsigned long) frame
->retcode
| 0x01;
472 DEREF_REG_PR
= (DEREF_REG_PR
& NEFF_SIGN
) ?
473 (DEREF_REG_PR
| NEFF_MASK
) : DEREF_REG_PR
;
475 if (__copy_to_user(frame
->retcode
,
476 (unsigned long long)sa_default_restorer
& (~1), 16) != 0)
479 /* Cohere the trampoline with the I-cache. */
480 flush_cache_sigtramp(DEREF_REG_PR
-1, DEREF_REG_PR
-1+16);
484 * Set up registers for signal handler.
485 * All edited pointers are subject to NEFF.
487 regs
->regs
[REG_SP
] = (unsigned long) frame
;
488 regs
->regs
[REG_SP
] = (regs
->regs
[REG_SP
] & NEFF_SIGN
) ?
489 (regs
->regs
[REG_SP
] | NEFF_MASK
) : regs
->regs
[REG_SP
];
490 regs
->regs
[REG_ARG1
] = signal
; /* Arg for signal handler */
493 The glibc profiling support for SH-5 needs to be passed a sigcontext
494 so it can retrieve the PC. At some point during 2003 the glibc
495 support was changed to receive the sigcontext through the 2nd
496 argument, but there are still versions of libc.so in use that use
497 the 3rd argument. Until libc.so is stabilised, pass the sigcontext
498 through both 2nd and 3rd arguments.
501 regs
->regs
[REG_ARG2
] = (unsigned long long)(unsigned long)(signed long)&frame
->sc
;
502 regs
->regs
[REG_ARG3
] = (unsigned long long)(unsigned long)(signed long)&frame
->sc
;
504 regs
->pc
= (unsigned long) ka
->sa
.sa_handler
;
505 regs
->pc
= (regs
->pc
& NEFF_SIGN
) ? (regs
->pc
| NEFF_MASK
) : regs
->pc
;
511 printk("SIG deliver (#%d,%s:%d): sp=%p pc=%08Lx%08Lx link=%08Lx%08Lx\n",
513 current
->comm
, current
->pid
, frame
,
514 regs
->pc
>> 32, regs
->pc
& 0xffffffff,
515 DEREF_REG_PR
>> 32, DEREF_REG_PR
& 0xffffffff);
521 force_sigsegv(sig
, current
);
524 static void setup_rt_frame(int sig
, struct k_sigaction
*ka
, siginfo_t
*info
,
525 sigset_t
*set
, struct pt_regs
*regs
)
527 struct rt_sigframe __user
*frame
;
531 frame
= get_sigframe(ka
, regs
->regs
[REG_SP
], sizeof(*frame
));
533 if (!access_ok(VERIFY_WRITE
, frame
, sizeof(*frame
)))
536 signal
= current_thread_info()->exec_domain
537 && current_thread_info()->exec_domain
->signal_invmap
539 ? current_thread_info()->exec_domain
->signal_invmap
[sig
]
542 err
|= __put_user(&frame
->info
, &frame
->pinfo
);
543 err
|= __put_user(&frame
->uc
, &frame
->puc
);
544 err
|= copy_siginfo_to_user(&frame
->info
, info
);
546 /* Give up earlier as i386, in case */
550 /* Create the ucontext. */
551 err
|= __put_user(0, &frame
->uc
.uc_flags
);
552 err
|= __put_user(0, &frame
->uc
.uc_link
);
553 err
|= __put_user((void *)current
->sas_ss_sp
,
554 &frame
->uc
.uc_stack
.ss_sp
);
555 err
|= __put_user(sas_ss_flags(regs
->regs
[REG_SP
]),
556 &frame
->uc
.uc_stack
.ss_flags
);
557 err
|= __put_user(current
->sas_ss_size
, &frame
->uc
.uc_stack
.ss_size
);
558 err
|= setup_sigcontext(&frame
->uc
.uc_mcontext
,
560 err
|= __copy_to_user(&frame
->uc
.uc_sigmask
, set
, sizeof(*set
));
562 /* Give up earlier as i386, in case */
566 /* Set up to return from userspace. If provided, use a stub
567 already in userspace. */
568 if (ka
->sa
.sa_flags
& SA_RESTORER
) {
569 DEREF_REG_PR
= (unsigned long) ka
->sa
.sa_restorer
| 0x1;
572 * On SH5 all edited pointers are subject to NEFF
574 DEREF_REG_PR
= (DEREF_REG_PR
& NEFF_SIGN
) ?
575 (DEREF_REG_PR
| NEFF_MASK
) : DEREF_REG_PR
;
578 * Different approach on SH5.
579 * . Endianness independent asm code gets placed in entry.S .
580 * This is limited to four ASM instructions corresponding
581 * to two long longs in size.
582 * . err checking is done on the else branch only
583 * . flush_icache_range() is called upon __put_user() only
584 * . all edited pointers are subject to NEFF
585 * . being code, linker turns ShMedia bit on, always
586 * dereference index -1.
589 DEREF_REG_PR
= (unsigned long) frame
->retcode
| 0x01;
590 DEREF_REG_PR
= (DEREF_REG_PR
& NEFF_SIGN
) ?
591 (DEREF_REG_PR
| NEFF_MASK
) : DEREF_REG_PR
;
593 if (__copy_to_user(frame
->retcode
,
594 (unsigned long long)sa_default_rt_restorer
& (~1), 16) != 0)
597 flush_icache_range(DEREF_REG_PR
-1, DEREF_REG_PR
-1+15);
601 * Set up registers for signal handler.
602 * All edited pointers are subject to NEFF.
604 regs
->regs
[REG_SP
] = (unsigned long) frame
;
605 regs
->regs
[REG_SP
] = (regs
->regs
[REG_SP
] & NEFF_SIGN
) ?
606 (regs
->regs
[REG_SP
] | NEFF_MASK
) : regs
->regs
[REG_SP
];
607 regs
->regs
[REG_ARG1
] = signal
; /* Arg for signal handler */
608 regs
->regs
[REG_ARG2
] = (unsigned long long)(unsigned long)(signed long)&frame
->info
;
609 regs
->regs
[REG_ARG3
] = (unsigned long long)(unsigned long)(signed long)&frame
->uc
.uc_mcontext
;
610 regs
->pc
= (unsigned long) ka
->sa
.sa_handler
;
611 regs
->pc
= (regs
->pc
& NEFF_SIGN
) ? (regs
->pc
| NEFF_MASK
) : regs
->pc
;
617 printk("SIG deliver (#%d,%s:%d): sp=%p pc=%08Lx%08Lx link=%08Lx%08Lx\n",
619 current
->comm
, current
->pid
, frame
,
620 regs
->pc
>> 32, regs
->pc
& 0xffffffff,
621 DEREF_REG_PR
>> 32, DEREF_REG_PR
& 0xffffffff);
627 force_sigsegv(sig
, current
);
631 * OK, we're invoking a handler
635 handle_signal(unsigned long sig
, siginfo_t
*info
, struct k_sigaction
*ka
,
636 sigset_t
*oldset
, struct pt_regs
* regs
)
638 /* Are we from a system call? */
639 if (regs
->syscall_nr
>= 0) {
640 /* If so, check system call restarting.. */
641 switch (regs
->regs
[REG_RET
]) {
642 case -ERESTART_RESTARTBLOCK
:
643 case -ERESTARTNOHAND
:
644 regs
->regs
[REG_RET
] = -EINTR
;
648 if (!(ka
->sa
.sa_flags
& SA_RESTART
)) {
649 regs
->regs
[REG_RET
] = -EINTR
;
653 case -ERESTARTNOINTR
:
654 /* Decode syscall # */
655 regs
->regs
[REG_RET
] = regs
->syscall_nr
;
660 /* Set up the stack frame */
661 if (ka
->sa
.sa_flags
& SA_SIGINFO
)
662 setup_rt_frame(sig
, ka
, info
, oldset
, regs
);
664 setup_frame(sig
, ka
, oldset
, regs
);
666 spin_lock_irq(¤t
->sighand
->siglock
);
667 sigorsets(¤t
->blocked
,¤t
->blocked
,&ka
->sa
.sa_mask
);
668 if (!(ka
->sa
.sa_flags
& SA_NODEFER
))
669 sigaddset(¤t
->blocked
,sig
);
671 spin_unlock_irq(¤t
->sighand
->siglock
);
675 * Note that 'init' is a special process: it doesn't get signals it doesn't
676 * want to handle. Thus you cannot kill init even with a SIGKILL even by
679 * Note that we go through the signals twice: once to check the signals that
680 * the kernel can handle, and then we build all the user-level signal handling
681 * stack-frames in one go after that.
683 int do_signal(struct pt_regs
*regs
, sigset_t
*oldset
)
687 struct k_sigaction ka
;
690 * We want the common case to go fast, which
691 * is why we may in certain cases get here from
692 * kernel mode. Just return without doing anything
695 if (!user_mode(regs
))
701 if (test_thread_flag(TIF_RESTORE_SIGMASK
))
702 oldset
= ¤t
->saved_sigmask
;
704 oldset
= ¤t
->blocked
;
706 signr
= get_signal_to_deliver(&info
, &ka
, regs
, 0);
709 /* Whee! Actually deliver the signal. */
710 handle_signal(signr
, &info
, &ka
, oldset
, regs
);
713 * If a signal was successfully delivered, the saved sigmask
714 * is in its frame, and we can clear the TIF_RESTORE_SIGMASK
717 if (test_thread_flag(TIF_RESTORE_SIGMASK
))
718 clear_thread_flag(TIF_RESTORE_SIGMASK
);
724 /* Did we come from a system call? */
725 if (regs
->syscall_nr
>= 0) {
726 /* Restart the system call - no handlers present */
727 switch (regs
->regs
[REG_RET
]) {
728 case -ERESTARTNOHAND
:
730 case -ERESTARTNOINTR
:
731 /* Decode Syscall # */
732 regs
->regs
[REG_RET
] = regs
->syscall_nr
;
736 case -ERESTART_RESTARTBLOCK
:
737 regs
->regs
[REG_RET
] = __NR_restart_syscall
;
743 /* No signal to deliver -- put the saved sigmask back */
744 if (test_thread_flag(TIF_RESTORE_SIGMASK
)) {
745 clear_thread_flag(TIF_RESTORE_SIGMASK
);
746 sigprocmask(SIG_SETMASK
, ¤t
->saved_sigmask
, NULL
);