- pre3:
[davej-history.git] / arch / ia64 / kernel / signal.c
blob12f312672e1226171c50422cb46540e1afdc084e
1 /*
2 * Architecture-specific signal handling support.
4 * Copyright (C) 1999-2000 Hewlett-Packard Co
5 * Copyright (C) 1999-2000 David Mosberger-Tang <davidm@hpl.hp.com>
7 * Derived from i386 and Alpha versions.
8 */
10 #include <linux/config.h>
11 #include <linux/errno.h>
12 #include <linux/kernel.h>
13 #include <linux/mm.h>
14 #include <linux/ptrace.h>
15 #include <linux/sched.h>
16 #include <linux/signal.h>
17 #include <linux/smp.h>
18 #include <linux/smp_lock.h>
19 #include <linux/stddef.h>
20 #include <linux/unistd.h>
21 #include <linux/wait.h>
23 #include <asm/ia32.h>
24 #include <asm/uaccess.h>
25 #include <asm/rse.h>
26 #include <asm/sigcontext.h>
28 #define DEBUG_SIG 0
29 #define STACK_ALIGN 16 /* minimal alignment for stack pointer */
30 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
32 #if _NSIG_WORDS > 1
33 # define PUT_SIGSET(k,u) __copy_to_user((u)->sig, (k)->sig, sizeof(sigset_t))
34 # define GET_SIGSET(k,u) __copy_from_user((k)->sig, (u)->sig, sizeof(sigset_t))
35 #else
36 # define PUT_SIGSET(k,u) __put_user((k)->sig[0], &(u)->sig[0])
37 # define GET_SIGSET(k,u) __get_user((k)->sig[0], &(u)->sig[0])
38 #endif
40 struct sigscratch {
41 #ifdef CONFIG_IA64_NEW_UNWIND
42 unsigned long scratch_unat; /* ar.unat for the general registers saved in pt */
43 unsigned long pad;
44 #else
45 struct switch_stack sw;
46 #endif
47 struct pt_regs pt;
50 struct sigframe {
51 struct siginfo info;
52 struct sigcontext sc;
55 extern long sys_wait4 (int, int *, int, struct rusage *);
56 extern long ia64_do_signal (sigset_t *, struct sigscratch *, long); /* forward decl */
58 long
59 ia64_rt_sigsuspend (sigset_t *uset, size_t sigsetsize, struct sigscratch *scr)
61 sigset_t oldset, set;
63 /* XXX: Don't preclude handling different sized sigset_t's. */
64 if (sigsetsize != sizeof(sigset_t))
65 return -EINVAL;
66 if (GET_SIGSET(&set, uset))
67 return -EFAULT;
69 sigdelsetmask(&set, ~_BLOCKABLE);
71 spin_lock_irq(&current->sigmask_lock);
73 oldset = current->blocked;
74 current->blocked = set;
75 recalc_sigpending(current);
77 spin_unlock_irq(&current->sigmask_lock);
80 * The return below usually returns to the signal handler. We need to
81 * pre-set the correct error code here to ensure that the right values
82 * get saved in sigcontext by ia64_do_signal.
84 #ifdef CONFIG_IA32_SUPPORT
85 if (IS_IA32_PROCESS(&scr->pt)) {
86 scr->pt.r8 = -EINTR;
87 } else
88 #endif
90 scr->pt.r8 = EINTR;
91 scr->pt.r10 = -1;
93 while (1) {
94 set_current_state(TASK_INTERRUPTIBLE);
95 schedule();
96 if (ia64_do_signal(&oldset, scr, 1))
97 return -EINTR;
101 asmlinkage long
102 sys_sigaltstack (const stack_t *uss, stack_t *uoss, long arg2, long arg3, long arg4,
103 long arg5, long arg6, long arg7, long stack)
105 struct pt_regs *pt = (struct pt_regs *) &stack;
107 return do_sigaltstack(uss, uoss, pt->r12);
110 static long
111 restore_sigcontext (struct sigcontext *sc, struct sigscratch *scr)
113 unsigned long ip, flags, nat, um, cfm;
114 long err;
116 /* restore scratch that always needs gets updated during signal delivery: */
117 err = __get_user(flags, &sc->sc_flags);
119 err |= __get_user(nat, &sc->sc_nat);
120 err |= __get_user(ip, &sc->sc_ip); /* instruction pointer */
121 err |= __get_user(cfm, &sc->sc_cfm);
122 err |= __get_user(um, &sc->sc_um); /* user mask */
123 err |= __get_user(scr->pt.ar_rsc, &sc->sc_ar_rsc);
124 err |= __get_user(scr->pt.ar_ccv, &sc->sc_ar_ccv);
125 err |= __get_user(scr->pt.ar_unat, &sc->sc_ar_unat);
126 err |= __get_user(scr->pt.ar_fpsr, &sc->sc_ar_fpsr);
127 err |= __get_user(scr->pt.ar_pfs, &sc->sc_ar_pfs);
128 err |= __get_user(scr->pt.pr, &sc->sc_pr); /* predicates */
129 err |= __get_user(scr->pt.b0, &sc->sc_br[0]); /* b0 (rp) */
130 err |= __get_user(scr->pt.b6, &sc->sc_br[6]); /* b6 */
131 err |= __get_user(scr->pt.b7, &sc->sc_br[7]); /* b7 */
132 err |= __copy_from_user(&scr->pt.r1, &sc->sc_gr[1], 3*8); /* r1-r3 */
133 err |= __copy_from_user(&scr->pt.r8, &sc->sc_gr[8], 4*8); /* r8-r11 */
134 err |= __copy_from_user(&scr->pt.r12, &sc->sc_gr[12], 4*8); /* r12-r15 */
135 err |= __copy_from_user(&scr->pt.r16, &sc->sc_gr[16], 16*8); /* r16-r31 */
137 scr->pt.cr_ifs = cfm | (1UL << 63);
139 /* establish new instruction pointer: */
140 scr->pt.cr_iip = ip & ~0x3UL;
141 ia64_psr(&scr->pt)->ri = ip & 0x3;
142 scr->pt.cr_ipsr = (scr->pt.cr_ipsr & ~IA64_PSR_UM) | (um & IA64_PSR_UM);
144 #ifdef CONFIG_IA64_NEW_UNWIND
145 scr->scratch_unat = ia64_put_scratch_nat_bits(&scr->pt, nat);
146 #else
147 ia64_put_nat_bits(&scr->pt, &scr->sw, nat); /* restore the original scratch NaT bits */
148 #endif
150 if (flags & IA64_SC_FLAG_FPH_VALID) {
151 struct task_struct *fpu_owner = ia64_get_fpu_owner();
153 __copy_from_user(current->thread.fph, &sc->sc_fr[32], 96*16);
154 if (fpu_owner == current) {
155 __ia64_load_fpu(current->thread.fph);
158 return err;
162 copy_siginfo_to_user (siginfo_t *to, siginfo_t *from)
164 if (!access_ok (VERIFY_WRITE, to, sizeof(siginfo_t)))
165 return -EFAULT;
166 if (from->si_code < 0)
167 return __copy_to_user(to, from, sizeof(siginfo_t));
168 else {
169 int err;
172 * If you change siginfo_t structure, please be sure
173 * this code is fixed accordingly. It should never
174 * copy any pad contained in the structure to avoid
175 * security leaks, but must copy the generic 3 ints
176 * plus the relevant union member.
178 err = __put_user(from->si_signo, &to->si_signo);
179 err |= __put_user(from->si_errno, &to->si_errno);
180 err |= __put_user((short)from->si_code, &to->si_code);
181 switch (from->si_code >> 16) {
182 case __SI_FAULT >> 16:
183 err |= __put_user(from->si_isr, &to->si_isr);
184 case __SI_POLL >> 16:
185 err |= __put_user(from->si_addr, &to->si_addr);
186 err |= __put_user(from->si_imm, &to->si_imm);
187 break;
188 case __SI_CHLD >> 16:
189 err |= __put_user(from->si_utime, &to->si_utime);
190 err |= __put_user(from->si_stime, &to->si_stime);
191 err |= __put_user(from->si_status, &to->si_status);
192 default:
193 err |= __put_user(from->si_uid, &to->si_uid);
194 err |= __put_user(from->si_pid, &to->si_pid);
195 break;
196 /* case __SI_RT: This is not generated by the kernel as of now. */
198 return err;
202 long
203 ia64_rt_sigreturn (struct sigscratch *scr)
205 extern char ia64_strace_leave_kernel, ia64_leave_kernel;
206 struct sigcontext *sc;
207 struct siginfo si;
208 sigset_t set;
209 long retval;
211 sc = &((struct sigframe *) (scr->pt.r12 + 16))->sc;
214 * When we return to the previously executing context, r8 and
215 * r10 have already been setup the way we want them. Indeed,
216 * if the signal wasn't delivered while in a system call, we
217 * must not touch r8 or r10 as otherwise user-level stat could
218 * be corrupted.
220 retval = (long) &ia64_leave_kernel;
221 if (current->ptrace & PT_TRACESYS)
223 * strace expects to be notified after sigreturn
224 * returns even though the context to which we return
225 * may not be in the middle of a syscall. Thus, the
226 * return-value that strace displays for sigreturn is
227 * meaningless.
229 retval = (long) &ia64_strace_leave_kernel;
231 if (!access_ok(VERIFY_READ, sc, sizeof(*sc)))
232 goto give_sigsegv;
234 if (GET_SIGSET(&set, &sc->sc_mask))
235 goto give_sigsegv;
237 sigdelsetmask(&set, ~_BLOCKABLE);
238 spin_lock_irq(&current->sigmask_lock);
239 current->blocked = set;
240 recalc_sigpending(current);
241 spin_unlock_irq(&current->sigmask_lock);
243 if (restore_sigcontext(sc, scr))
244 goto give_sigsegv;
246 #if DEBUG_SIG
247 printk("SIG return (%s:%d): sp=%lx ip=%lx\n",
248 current->comm, current->pid, scr->pt.r12, scr->pt.cr_iip);
249 #endif
251 * It is more difficult to avoid calling this function than to
252 * call it and ignore errors.
254 do_sigaltstack(&sc->sc_stack, 0, scr->pt.r12);
255 return retval;
257 give_sigsegv:
258 si.si_signo = SIGSEGV;
259 si.si_errno = 0;
260 si.si_code = SI_KERNEL;
261 si.si_pid = current->pid;
262 si.si_uid = current->uid;
263 si.si_addr = sc;
264 force_sig_info(SIGSEGV, &si, current);
265 return retval;
269 * This does just the minimum required setup of sigcontext.
270 * Specifically, it only installs data that is either not knowable at
271 * the user-level or that gets modified before execution in the
272 * trampoline starts. Everything else is done at the user-level.
274 static long
275 setup_sigcontext (struct sigcontext *sc, sigset_t *mask, struct sigscratch *scr)
277 struct task_struct *fpu_owner = ia64_get_fpu_owner();
278 unsigned long flags = 0, ifs, nat;
279 long err;
281 ifs = scr->pt.cr_ifs;
283 if (on_sig_stack((unsigned long) sc))
284 flags |= IA64_SC_FLAG_ONSTACK;
285 if ((ifs & (1UL << 63)) == 0) {
286 /* if cr_ifs isn't valid, we got here through a syscall */
287 flags |= IA64_SC_FLAG_IN_SYSCALL;
289 if ((fpu_owner == current) || (current->thread.flags & IA64_THREAD_FPH_VALID)) {
290 flags |= IA64_SC_FLAG_FPH_VALID;
291 if (fpu_owner == current) {
292 __ia64_save_fpu(current->thread.fph);
294 __copy_to_user(&sc->sc_fr[32], current->thread.fph, 96*16);
298 * Note: sw->ar_unat is UNDEFINED unless the process is being
299 * PTRACED. However, this is OK because the NaT bits of the
300 * preserved registers (r4-r7) are never being looked at by
301 * the signal handler (registers r4-r7 are used instead).
303 #ifdef CONFIG_IA64_NEW_UNWIND
304 nat = ia64_get_scratch_nat_bits(&scr->pt, scr->scratch_unat);
305 #else
306 nat = ia64_get_nat_bits(&scr->pt, &scr->sw);
307 #endif
309 err = __put_user(flags, &sc->sc_flags);
311 err |= __put_user(nat, &sc->sc_nat);
312 err |= PUT_SIGSET(mask, &sc->sc_mask);
313 err |= __put_user(scr->pt.cr_ipsr & IA64_PSR_UM, &sc->sc_um);
314 err |= __put_user(scr->pt.ar_rsc, &sc->sc_ar_rsc);
315 err |= __put_user(scr->pt.ar_ccv, &sc->sc_ar_ccv);
316 err |= __put_user(scr->pt.ar_unat, &sc->sc_ar_unat); /* ar.unat */
317 err |= __put_user(scr->pt.ar_fpsr, &sc->sc_ar_fpsr); /* ar.fpsr */
318 err |= __put_user(scr->pt.ar_pfs, &sc->sc_ar_pfs);
319 err |= __put_user(scr->pt.pr, &sc->sc_pr); /* predicates */
320 err |= __put_user(scr->pt.b0, &sc->sc_br[0]); /* b0 (rp) */
321 err |= __put_user(scr->pt.b6, &sc->sc_br[6]); /* b6 */
322 err |= __put_user(scr->pt.b7, &sc->sc_br[7]); /* b7 */
324 err |= __copy_to_user(&sc->sc_gr[1], &scr->pt.r1, 3*8); /* r1-r3 */
325 err |= __copy_to_user(&sc->sc_gr[8], &scr->pt.r8, 4*8); /* r8-r11 */
326 err |= __copy_to_user(&sc->sc_gr[12], &scr->pt.r12, 4*8); /* r12-r15 */
327 err |= __copy_to_user(&sc->sc_gr[16], &scr->pt.r16, 16*8); /* r16-r31 */
329 err |= __put_user(scr->pt.cr_iip + ia64_psr(&scr->pt)->ri, &sc->sc_ip);
330 return err;
333 static long
334 setup_frame (int sig, struct k_sigaction *ka, siginfo_t *info, sigset_t *set,
335 struct sigscratch *scr)
337 extern char ia64_sigtramp[], __start_gate_section[];
338 unsigned long tramp_addr, new_rbs = 0;
339 struct sigframe *frame;
340 struct siginfo si;
341 long err;
343 frame = (void *) scr->pt.r12;
344 tramp_addr = GATE_ADDR + (ia64_sigtramp - __start_gate_section);
345 if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && !on_sig_stack((unsigned long) frame)) {
346 new_rbs = (current->sas_ss_sp + sizeof(long) - 1) & ~(sizeof(long) - 1);
347 frame = (void *) ((current->sas_ss_sp + current->sas_ss_size)
348 & ~(STACK_ALIGN - 1));
350 frame = (void *) frame - ((sizeof(*frame) + STACK_ALIGN - 1) & ~(STACK_ALIGN - 1));
352 if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
353 goto give_sigsegv;
355 err = copy_siginfo_to_user(&frame->info, info);
357 err |= __put_user(current->sas_ss_sp, &frame->sc.sc_stack.ss_sp);
358 err |= __put_user(current->sas_ss_size, &frame->sc.sc_stack.ss_size);
359 err |= __put_user(sas_ss_flags(scr->pt.r12), &frame->sc.sc_stack.ss_flags);
360 err |= setup_sigcontext(&frame->sc, set, scr);
362 if (err)
363 goto give_sigsegv;
365 scr->pt.r12 = (unsigned long) frame - 16; /* new stack pointer */
366 scr->pt.r2 = sig; /* signal number */
367 scr->pt.r3 = (unsigned long) ka->sa.sa_handler; /* addr. of handler's proc desc */
368 scr->pt.r15 = new_rbs;
369 scr->pt.ar_fpsr = FPSR_DEFAULT; /* reset fpsr for signal handler */
370 scr->pt.cr_iip = tramp_addr;
371 ia64_psr(&scr->pt)->ri = 0; /* start executing in first slot */
373 #ifdef CONFIG_IA64_NEW_UNWIND
375 * Note: this affects only the NaT bits of the scratch regs
376 * (the ones saved in pt_regs), which is exactly what we want.
378 scr->scratch_unat = 0; /* ensure NaT bits of at least r2, r3, r12, and r15 are clear */
379 #else
381 * Note: this affects only the NaT bits of the scratch regs
382 * (the ones saved in pt_regs), which is exactly what we want.
383 * The NaT bits for the preserved regs (r4-r7) are in
384 * sw->ar_unat iff this process is being PTRACED.
386 scr->sw.caller_unat = 0; /* ensure NaT bits of at least r2, r3, r12, and r15 are clear */
387 #endif
389 #if DEBUG_SIG
390 printk("SIG deliver (%s:%d): sig=%d sp=%lx ip=%lx handler=%lx\n",
391 current->comm, current->pid, sig, scr->pt.r12, scr->pt.cr_iip, scr->pt.r3);
392 #endif
393 return 1;
395 give_sigsegv:
396 if (sig == SIGSEGV)
397 ka->sa.sa_handler = SIG_DFL;
398 si.si_signo = SIGSEGV;
399 si.si_errno = 0;
400 si.si_code = SI_KERNEL;
401 si.si_pid = current->pid;
402 si.si_uid = current->uid;
403 si.si_addr = frame;
404 force_sig_info(SIGSEGV, &si, current);
405 return 0;
408 static long
409 handle_signal (unsigned long sig, struct k_sigaction *ka, siginfo_t *info, sigset_t *oldset,
410 struct sigscratch *scr)
412 #ifdef CONFIG_IA32_SUPPORT
413 if (IS_IA32_PROCESS(&scr->pt)) {
414 /* send signal to IA-32 process */
415 if (!ia32_setup_frame1(sig, ka, info, oldset, &scr->pt))
416 return 0;
417 } else
418 #endif
419 /* send signal to IA-64 process */
420 if (!setup_frame(sig, ka, info, oldset, scr))
421 return 0;
423 if (ka->sa.sa_flags & SA_ONESHOT)
424 ka->sa.sa_handler = SIG_DFL;
426 if (!(ka->sa.sa_flags & SA_NODEFER)) {
427 spin_lock_irq(&current->sigmask_lock);
428 sigorsets(&current->blocked, &current->blocked, &ka->sa.sa_mask);
429 sigaddset(&current->blocked, sig);
430 recalc_sigpending(current);
431 spin_unlock_irq(&current->sigmask_lock);
433 return 1;
437 * Note that `init' is a special process: it doesn't get signals it
438 * doesn't want to handle. Thus you cannot kill init even with a
439 * SIGKILL even by mistake.
441 * Note that we go through the signals twice: once to check the
442 * signals that the kernel can handle, and then we build all the
443 * user-level signal handling stack-frames in one go after that.
445 long
446 ia64_do_signal (sigset_t *oldset, struct sigscratch *scr, long in_syscall)
448 struct k_sigaction *ka;
449 siginfo_t info;
450 long restart = in_syscall;
451 long errno = scr->pt.r8;
454 * In the ia64_leave_kernel code path, we want the common case
455 * to go fast, which is why we may in certain cases get here
456 * from kernel mode. Just return without doing anything if so.
458 if (!user_mode(&scr->pt))
459 return 0;
461 if (!oldset)
462 oldset = &current->blocked;
464 #ifdef CONFIG_IA32_SUPPORT
465 if (IS_IA32_PROCESS(&scr->pt)) {
466 if (in_syscall) {
467 if (errno >= 0)
468 restart = 0;
469 else
470 errno = -errno;
472 } else
473 #endif
474 if (scr->pt.r10 != -1) {
476 * A system calls has to be restarted only if one of
477 * the error codes ERESTARTNOHAND, ERESTARTSYS, or
478 * ERESTARTNOINTR is returned. If r10 isn't -1 then
479 * r8 doesn't hold an error code and we don't need to
480 * restart the syscall, so we set in_syscall to zero.
482 restart = 0;
485 for (;;) {
486 unsigned long signr;
488 spin_lock_irq(&current->sigmask_lock);
489 signr = dequeue_signal(&current->blocked, &info);
490 spin_unlock_irq(&current->sigmask_lock);
492 if (!signr)
493 break;
495 if ((current->ptrace & PT_PTRACED) && signr != SIGKILL) {
496 /* Let the debugger run. */
497 current->exit_code = signr;
498 current->thread.siginfo = &info;
499 set_current_state(TASK_STOPPED);
500 notify_parent(current, SIGCHLD);
501 schedule();
502 signr = current->exit_code;
503 current->thread.siginfo = 0;
505 /* We're back. Did the debugger cancel the sig? */
506 if (!signr)
507 continue;
508 current->exit_code = 0;
510 /* The debugger continued. Ignore SIGSTOP. */
511 if (signr == SIGSTOP)
512 continue;
514 /* Update the siginfo structure. Is this good? */
515 if (signr != info.si_signo) {
516 info.si_signo = signr;
517 info.si_errno = 0;
518 info.si_code = SI_USER;
519 info.si_pid = current->p_pptr->pid;
520 info.si_uid = current->p_pptr->uid;
523 /* If the (new) signal is now blocked, requeue it. */
524 if (sigismember(&current->blocked, signr)) {
525 send_sig_info(signr, &info, current);
526 continue;
530 ka = &current->sig->action[signr - 1];
531 if (ka->sa.sa_handler == SIG_IGN) {
532 if (signr != SIGCHLD)
533 continue;
534 /* Check for SIGCHLD: it's special. */
535 while (sys_wait4(-1, NULL, WNOHANG, NULL) > 0)
536 /* nothing */;
537 continue;
540 if (ka->sa.sa_handler == SIG_DFL) {
541 int exit_code = signr;
543 /* Init gets no signals it doesn't want. */
544 if (current->pid == 1)
545 continue;
547 switch (signr) {
548 case SIGCONT: case SIGCHLD: case SIGWINCH:
549 continue;
551 case SIGTSTP: case SIGTTIN: case SIGTTOU:
552 if (is_orphaned_pgrp(current->pgrp))
553 continue;
554 /* FALLTHRU */
556 case SIGSTOP:
557 set_current_state(TASK_STOPPED);
558 current->exit_code = signr;
559 if (!(current->p_pptr->sig->action[SIGCHLD-1].sa.sa_flags
560 & SA_NOCLDSTOP))
561 notify_parent(current, SIGCHLD);
562 schedule();
563 continue;
565 case SIGQUIT: case SIGILL: case SIGTRAP:
566 case SIGABRT: case SIGFPE: case SIGSEGV:
567 case SIGBUS: case SIGSYS: case SIGXCPU: case SIGXFSZ:
568 if (do_coredump(signr, &scr->pt))
569 exit_code |= 0x80;
570 /* FALLTHRU */
572 default:
573 sigaddset(&current->pending.signal, signr);
574 recalc_sigpending(current);
575 current->flags |= PF_SIGNALED;
576 do_exit(exit_code);
577 /* NOTREACHED */
581 if (restart) {
582 switch (errno) {
583 case ERESTARTSYS:
584 if ((ka->sa.sa_flags & SA_RESTART) == 0) {
585 case ERESTARTNOHAND:
586 #ifdef CONFIG_IA32_SUPPORT
587 if (IS_IA32_PROCESS(&scr->pt))
588 scr->pt.r8 = -EINTR;
589 else
590 #endif
591 scr->pt.r8 = EINTR;
592 /* note: scr->pt.r10 is already -1 */
593 break;
595 case ERESTARTNOINTR:
596 #ifdef CONFIG_IA32_SUPPORT
597 if (IS_IA32_PROCESS(&scr->pt)) {
598 scr->pt.r8 = scr->pt.r1;
599 scr->pt.cr_iip -= 2;
600 } else
601 #endif
602 ia64_decrement_ip(&scr->pt);
606 /* Whee! Actually deliver the signal. If the
607 delivery failed, we need to continue to iterate in
608 this loop so we can deliver the SIGSEGV... */
609 if (handle_signal(signr, ka, &info, oldset, scr))
610 return 1;
613 /* Did we come from a system call? */
614 if (restart) {
615 /* Restart the system call - no handlers present */
616 if (errno == ERESTARTNOHAND || errno == ERESTARTSYS || errno == ERESTARTNOINTR) {
617 #ifdef CONFIG_IA32_SUPPORT
618 if (IS_IA32_PROCESS(&scr->pt)) {
619 scr->pt.r8 = scr->pt.r1;
620 scr->pt.cr_iip -= 2;
621 } else
622 #endif
624 * Note: the syscall number is in r15 which is
625 * saved in pt_regs so all we need to do here
626 * is adjust ip so that the "break"
627 * instruction gets re-executed.
629 ia64_decrement_ip(&scr->pt);
632 return 0;