2 * linux/arch/cris/kernel/signal.c
4 * Based on arch/i386/kernel/signal.c by
5 * Copyright (C) 1991, 1992 Linus Torvalds
6 * 1997-11-28 Modified for POSIX.1b signals by Richard Henderson *
8 * Ideas also taken from arch/arm.
10 * Copyright (C) 2000, 2001 Axis Communications AB
12 * Authors: Bjorn Wesen (bjornw@axis.com)
16 #include <linux/sched.h>
18 #include <linux/smp.h>
19 #include <linux/smp_lock.h>
20 #include <linux/kernel.h>
21 #include <linux/signal.h>
22 #include <linux/errno.h>
23 #include <linux/wait.h>
24 #include <linux/ptrace.h>
25 #include <linux/unistd.h>
26 #include <linux/stddef.h>
28 #include <asm/processor.h>
29 #include <asm/ucontext.h>
30 #include <asm/uaccess.h>
34 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
36 /* a syscall in Linux/CRIS is a break 13 instruction which is 2 bytes */
37 /* manipulate regs so that upon return, it will be re-executed */
39 /* We rely on that pc points to the instruction after "break 13", so the
40 * library must never do strange things like putting it in a delay slot.
42 #define RESTART_CRIS_SYS(regs) regs->r10 = regs->orig_r10; regs->irp -= 2;
44 int do_signal(int canrestart, sigset_t *oldset, struct pt_regs *regs);
47 * Atomically swap in the new signal mask, and wait for a signal. Define
48 * dummy arguments to be able to reach the regs argument. (Note that this
49 * arrangement relies on old_sigset_t occupying one register.)
52 sys_sigsuspend(old_sigset_t mask, long r11, long r12, long r13, long mof,
53 long srp, struct pt_regs *regs)
58 spin_lock_irq(¤t->sighand->siglock);
59 saveset = current->blocked;
60 siginitset(¤t->blocked, mask);
62 spin_unlock_irq(¤t->sighand->siglock);
66 current->state = TASK_INTERRUPTIBLE;
68 if (do_signal(0, &saveset, regs))
69 /* We will get here twice: once to call the signal
70 handler, then again to return from the
71 sigsuspend system call. When calling the
72 signal handler, R10 holds the signal number as
73 set through do_signal. The sigsuspend call
74 will return with the restored value set above;
80 /* Define dummy arguments to be able to reach the regs argument. (Note that
81 * this arrangement relies on size_t occupying one register.)
84 sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize, long r12, long r13,
85 long mof, long srp, struct pt_regs *regs)
87 sigset_t saveset, newset;
89 /* XXX: Don't preclude handling different sized sigset_t's. */
90 if (sigsetsize != sizeof(sigset_t))
93 if (copy_from_user(&newset, unewset, sizeof(newset)))
95 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);
105 current->state = TASK_INTERRUPTIBLE;
107 if (do_signal(0, &saveset, regs))
108 /* We will get here twice: once to call the signal
109 handler, then again to return from the
110 sigsuspend system call. When calling the
111 signal handler, R10 holds the signal number as
112 set through do_signal. The sigsuspend call
113 will return with the restored value set above;
120 sys_sigaction(int sig, const struct old_sigaction __user *act,
121 struct old_sigaction *oact)
123 struct k_sigaction new_ka, old_ka;
128 if (verify_area(VERIFY_READ, act, sizeof(*act)) ||
129 __get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
130 __get_user(new_ka.sa.sa_restorer, &act->sa_restorer))
132 __get_user(new_ka.sa.sa_flags, &act->sa_flags);
133 __get_user(mask, &act->sa_mask);
134 siginitset(&new_ka.sa.sa_mask, mask);
137 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
140 if (verify_area(VERIFY_WRITE, oact, sizeof(*oact)) ||
141 __put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
142 __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer))
144 __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
145 __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
152 sys_sigaltstack(const stack_t *uss, stack_t __user *uoss)
154 return do_sigaltstack(uss, uoss, rdusp());
159 * Do a signal return; undo the signal stack.
163 struct sigcontext sc;
164 unsigned long extramask[_NSIG_WORDS-1];
165 unsigned char retcode[8]; /* trampoline code */
169 struct siginfo *pinfo;
173 unsigned char retcode[8]; /* trampoline code */
178 restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
180 unsigned int err = 0;
181 unsigned long old_usp;
183 /* Always make any pending restarted system calls return -EINTR */
184 current_thread_info()->restart_block.fn = do_no_restart_syscall;
186 /* restore the regs from &sc->regs (same as sc, since regs is first)
187 * (sc is already checked for VERIFY_READ since the sigframe was
188 * checked in sys_sigreturn previously)
191 if (__copy_from_user(regs, sc, sizeof(struct pt_regs)))
194 /* make sure the U-flag is set so user-mode cannot fool us */
196 regs->dccr |= 1 << 8;
198 /* restore the old USP as it was before we stacked the sc etc.
199 * (we cannot just pop the sigcontext since we aligned the sp and
200 * stuff after pushing it)
203 err |= __get_user(old_usp, &sc->usp);
207 /* TODO: the other ports use regs->orig_XX to disable syscall checks
208 * after this completes, but we don't use that mechanism. maybe we can
218 /* Define dummy arguments to be able to reach the regs argument. */
220 asmlinkage int sys_sigreturn(long r10, long r11, long r12, long r13, long mof,
221 long srp, struct pt_regs *regs)
223 struct sigframe __user *frame = (struct sigframe *)rdusp();
227 * Since we stacked the signal on a dword boundary,
228 * then frame should be dword aligned here. If it's
229 * not, then the user is trying to mess with us.
231 if (((long)frame) & 3)
234 if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
236 if (__get_user(set.sig[0], &frame->sc.oldmask)
238 && __copy_from_user(&set.sig[1], frame->extramask,
239 sizeof(frame->extramask))))
242 sigdelsetmask(&set, ~_BLOCKABLE);
243 spin_lock_irq(¤t->sighand->siglock);
244 current->blocked = set;
246 spin_unlock_irq(¤t->sighand->siglock);
248 if (restore_sigcontext(regs, &frame->sc))
251 /* TODO: SIGTRAP when single-stepping as in arm ? */
256 force_sig(SIGSEGV, current);
260 /* Define dummy arguments to be able to reach the regs argument. */
262 asmlinkage int sys_rt_sigreturn(long r10, long r11, long r12, long r13,
263 long mof, long srp, struct pt_regs *regs)
265 struct rt_sigframe __user *frame = (struct rt_sigframe *)rdusp();
270 * Since we stacked the signal on a dword boundary,
271 * then frame should be dword aligned here. If it's
272 * not, then the user is trying to mess with us.
274 if (((long)frame) & 3)
277 if (verify_area(VERIFY_READ, frame, sizeof(*frame)))
279 if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
282 sigdelsetmask(&set, ~_BLOCKABLE);
283 spin_lock_irq(¤t->sighand->siglock);
284 current->blocked = set;
286 spin_unlock_irq(¤t->sighand->siglock);
288 if (restore_sigcontext(regs, &frame->uc.uc_mcontext))
291 if (__copy_from_user(&st, &frame->uc.uc_stack, sizeof(st)))
293 /* It is more difficult to avoid calling this function than to
294 call it and ignore errors. */
295 do_sigaltstack(&st, NULL, rdusp());
300 force_sig(SIGSEGV, current);
305 * Set up a signal frame.
309 setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, unsigned long mask)
312 unsigned long usp = rdusp();
314 /* copy the regs. they are first in sc so we can use sc directly */
316 err |= __copy_to_user(sc, regs, sizeof(struct pt_regs));
318 /* Set the frametype to CRIS_FRAME_NORMAL for the execution of
319 the signal handler. The frametype will be restored to its previous
320 value in restore_sigcontext. */
321 regs->frametype = CRIS_FRAME_NORMAL;
323 /* then some other stuff */
325 err |= __put_user(mask, &sc->oldmask);
327 err |= __put_user(usp, &sc->usp);
332 /* figure out where we want to put the new signal frame - usually on the stack */
334 static inline void __user *
335 get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
337 unsigned long sp = rdusp();
339 /* This is the X/Open sanctioned signal stack switching. */
340 if (ka->sa.sa_flags & SA_ONSTACK) {
341 if (! on_sig_stack(sp))
342 sp = current->sas_ss_sp + current->sas_ss_size;
345 /* make sure the frame is dword-aligned */
349 return (void __user*)(sp - frame_size);
352 /* grab and setup a signal frame.
354 * basically we stack a lot of state info, and arrange for the
355 * user-mode program to return to the kernel using either a
356 * trampoline which performs the syscall sigreturn, or a provided
357 * user-mode trampoline.
360 static void setup_frame(int sig, struct k_sigaction *ka,
361 sigset_t *set, struct pt_regs * regs)
363 struct sigframe __user *frame;
364 unsigned long return_ip;
367 frame = get_sigframe(ka, regs, sizeof(*frame));
369 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
372 err |= setup_sigcontext(&frame->sc, regs, set->sig[0]);
376 if (_NSIG_WORDS > 1) {
377 err |= __copy_to_user(frame->extramask, &set->sig[1],
378 sizeof(frame->extramask));
383 /* Set up to return from userspace. If provided, use a stub
384 already in userspace. */
385 if (ka->sa.sa_flags & SA_RESTORER) {
386 return_ip = (unsigned long)ka->sa.sa_restorer;
388 /* trampoline - the desired return ip is the retcode itself */
389 return_ip = (unsigned long)&frame->retcode;
390 /* This is movu.w __NR_sigreturn, r9; break 13; */
391 err |= __put_user(0x9c5f, (short *)(frame->retcode+0));
392 err |= __put_user(__NR_sigreturn, (short *)(frame->retcode+2));
393 err |= __put_user(0xe93d, (short *)(frame->retcode+4));
399 /* Set up registers for signal handler */
401 regs->irp = (unsigned long) ka->sa.sa_handler; /* what we enter NOW */
402 regs->srp = return_ip; /* what we enter LATER */
403 regs->r10 = sig; /* first argument is signo */
405 /* actually move the usp to reflect the stacked frame */
407 wrusp((unsigned long)frame);
413 ka->sa.sa_handler = SIG_DFL;
414 force_sig(SIGSEGV, current);
417 static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
418 sigset_t *set, struct pt_regs * regs)
420 struct rt_sigframe __user *frame;
421 unsigned long return_ip;
424 frame = get_sigframe(ka, regs, sizeof(*frame));
426 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
429 err |= __put_user(&frame->info, &frame->pinfo);
430 err |= __put_user(&frame->uc, &frame->puc);
431 err |= copy_siginfo_to_user(&frame->info, info);
435 /* Clear all the bits of the ucontext we don't use. */
436 err |= __clear_user(&frame->uc, offsetof(struct ucontext, uc_mcontext));
438 err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, set->sig[0]);
440 err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
445 /* Set up to return from userspace. If provided, use a stub
446 already in userspace. */
447 if (ka->sa.sa_flags & SA_RESTORER) {
448 return_ip = (unsigned long)ka->sa.sa_restorer;
450 /* trampoline - the desired return ip is the retcode itself */
451 return_ip = (unsigned long)&frame->retcode;
452 /* This is movu.w __NR_rt_sigreturn, r9; break 13; */
453 err |= __put_user(0x9c5f, (short *)(frame->retcode+0));
454 err |= __put_user(__NR_rt_sigreturn, (short *)(frame->retcode+2));
455 err |= __put_user(0xe93d, (short *)(frame->retcode+4));
461 /* TODO what is the current->exec_domain stuff and invmap ? */
463 /* Set up registers for signal handler */
465 regs->irp = (unsigned long) ka->sa.sa_handler; /* what we enter NOW */
466 regs->srp = return_ip; /* what we enter LATER */
467 regs->r10 = sig; /* first argument is signo */
468 regs->r11 = (unsigned long) &frame->info; /* second argument is (siginfo_t *) */
469 regs->r12 = 0; /* third argument is unused */
471 /* actually move the usp to reflect the stacked frame */
473 wrusp((unsigned long)frame);
479 ka->sa.sa_handler = SIG_DFL;
480 force_sig(SIGSEGV, current);
484 * OK, we're invoking a handler
488 handle_signal(int canrestart, unsigned long sig,
489 siginfo_t *info, sigset_t *oldset, struct pt_regs * regs)
491 struct k_sigaction *ka = ¤t->sighand->action[sig-1];
493 /* Are we from a system call? */
495 /* If so, check system call restarting.. */
497 case -ERESTART_RESTARTBLOCK:
498 case -ERESTARTNOHAND:
499 /* ERESTARTNOHAND means that the syscall should only be
500 restarted if there was no handler for the signal, and since
501 we only get here if there is a handler, we don't restart */
506 /* ERESTARTSYS means to restart the syscall if there is no
507 handler or the handler was registered with SA_RESTART */
508 if (!(ka->sa.sa_flags & SA_RESTART)) {
513 case -ERESTARTNOINTR:
514 /* ERESTARTNOINTR means that the syscall should be called again
515 after the signal handler returns. */
516 RESTART_CRIS_SYS(regs);
520 /* Set up the stack frame */
521 if (ka->sa.sa_flags & SA_SIGINFO)
522 setup_rt_frame(sig, ka, info, oldset, regs);
524 setup_frame(sig, ka, oldset, regs);
526 if (ka->sa.sa_flags & SA_ONESHOT)
527 ka->sa.sa_handler = SIG_DFL;
529 if (!(ka->sa.sa_flags & SA_NODEFER)) {
530 spin_lock_irq(¤t->sighand->siglock);
531 sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask);
532 sigaddset(¤t->blocked,sig);
534 spin_unlock_irq(¤t->sighand->siglock);
539 * Note that 'init' is a special process: it doesn't get signals it doesn't
540 * want to handle. Thus you cannot kill init even with a SIGKILL even by
543 * Also note that the regs structure given here as an argument, is the latest
544 * pushed pt_regs. It may or may not be the same as the first pushed registers
545 * when the initial usermode->kernelmode transition took place. Therefore
546 * we can use user_mode(regs) to see if we came directly from kernel or user
550 int do_signal(int canrestart, sigset_t *oldset, struct pt_regs *regs)
556 * We want the common case to go fast, which
557 * is why we may in certain cases get here from
558 * kernel mode. Just return without doing anything
561 if (!user_mode(regs))
565 oldset = ¤t->blocked;
567 signr = get_signal_to_deliver(&info, regs, NULL);
569 /* Whee! Actually deliver the signal. */
570 handle_signal(canrestart, signr, &info, oldset, regs);
574 /* Did we come from a system call? */
576 /* Restart the system call - no handlers present */
577 if (regs->r10 == -ERESTARTNOHAND ||
578 regs->r10 == -ERESTARTSYS ||
579 regs->r10 == -ERESTARTNOINTR) {
580 RESTART_CRIS_SYS(regs);
582 if (regs->r10 == -ERESTART_RESTARTBLOCK){
583 regs->r10 = __NR_restart_syscall;