upgrade to linux 2.6.10-1.12_FC2
[linux-2.6.git] / arch / mips / kernel / signal.c
1 /*
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
4  * for more details.
5  *
6  * Copyright (C) 1991, 1992  Linus Torvalds
7  * Copyright (C) 1994 - 2000  Ralf Baechle
8  * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
9  */
10 #include <linux/config.h>
11 #include <linux/sched.h>
12 #include <linux/mm.h>
13 #include <linux/personality.h>
14 #include <linux/smp.h>
15 #include <linux/smp_lock.h>
16 #include <linux/kernel.h>
17 #include <linux/signal.h>
18 #include <linux/errno.h>
19 #include <linux/wait.h>
20 #include <linux/ptrace.h>
21 #include <linux/suspend.h>
22 #include <linux/unistd.h>
23 #include <linux/compiler.h>
24
25 #include <asm/asm.h>
26 #include <linux/bitops.h>
27 #include <asm/cacheflush.h>
28 #include <asm/fpu.h>
29 #include <asm/sim.h>
30 #include <asm/uaccess.h>
31 #include <asm/ucontext.h>
32
33 #define DEBUG_SIG 0
34
35 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
36
37 extern asmlinkage int do_signal(sigset_t *oldset, struct pt_regs *regs);
38
39 /*
40  * Atomically swap in the new signal mask, and wait for a signal.
41  */
42
43 #ifdef CONFIG_TRAD_SIGNALS
44 save_static_function(sys_sigsuspend);
45 __attribute_used__ noinline static int
46 _sys_sigsuspend(nabi_no_regargs struct pt_regs regs)
47 {
48         sigset_t *uset, saveset, newset;
49
50         uset = (sigset_t *) regs.regs[4];
51         if (copy_from_user(&newset, uset, sizeof(sigset_t)))
52                 return -EFAULT;
53         sigdelsetmask(&newset, ~_BLOCKABLE);
54
55         spin_lock_irq(&current->sighand->siglock);
56         saveset = current->blocked;
57         current->blocked = newset;
58         recalc_sigpending();
59         spin_unlock_irq(&current->sighand->siglock);
60
61         regs.regs[2] = EINTR;
62         regs.regs[7] = 1;
63         while (1) {
64                 current->state = TASK_INTERRUPTIBLE;
65                 schedule();
66                 if (do_signal(&saveset, &regs))
67                         return -EINTR;
68         }
69 }
70 #endif
71
72 save_static_function(sys_rt_sigsuspend);
73 __attribute_used__ noinline static int
74 _sys_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)
75 {
76         sigset_t *unewset, saveset, newset;
77         size_t sigsetsize;
78
79         /* XXX Don't preclude handling different sized sigset_t's.  */
80         sigsetsize = regs.regs[5];
81         if (sigsetsize != sizeof(sigset_t))
82                 return -EINVAL;
83
84         unewset = (sigset_t *) regs.regs[4];
85         if (copy_from_user(&newset, unewset, sizeof(newset)))
86                 return -EFAULT;
87         sigdelsetmask(&newset, ~_BLOCKABLE);
88
89         spin_lock_irq(&current->sighand->siglock);
90         saveset = current->blocked;
91         current->blocked = newset;
92         recalc_sigpending();
93         spin_unlock_irq(&current->sighand->siglock);
94
95         regs.regs[2] = EINTR;
96         regs.regs[7] = 1;
97         while (1) {
98                 current->state = TASK_INTERRUPTIBLE;
99                 schedule();
100                 if (do_signal(&saveset, &regs))
101                         return -EINTR;
102         }
103 }
104
105 #ifdef CONFIG_TRAD_SIGNALS
106 asmlinkage int sys_sigaction(int sig, const struct sigaction *act,
107         struct sigaction *oact)
108 {
109         struct k_sigaction new_ka, old_ka;
110         int ret;
111         int err = 0;
112
113         if (act) {
114                 old_sigset_t mask;
115
116                 if (!access_ok(VERIFY_READ, act, sizeof(*act)))
117                         return -EFAULT;
118                 err |= __get_user(new_ka.sa.sa_handler, &act->sa_handler);
119                 err |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
120                 err |= __get_user(mask, &act->sa_mask.sig[0]);
121                 if (err)
122                         return -EFAULT;
123
124                 siginitset(&new_ka.sa.sa_mask, mask);
125         }
126
127         ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
128
129         if (!ret && oact) {
130                 if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)))
131                         return -EFAULT;
132                 err |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
133                 err |= __put_user(old_ka.sa.sa_handler, &oact->sa_handler);
134                 err |= __put_user(old_ka.sa.sa_mask.sig[0], oact->sa_mask.sig);
135                 err |= __put_user(0, &oact->sa_mask.sig[1]);
136                 err |= __put_user(0, &oact->sa_mask.sig[2]);
137                 err |= __put_user(0, &oact->sa_mask.sig[3]);
138                 if (err)
139                         return -EFAULT;
140         }
141
142         return ret;
143 }
144 #endif
145
146 asmlinkage int sys_sigaltstack(nabi_no_regargs struct pt_regs regs)
147 {
148         const stack_t *uss = (const stack_t *) regs.regs[4];
149         stack_t *uoss = (stack_t *) regs.regs[5];
150         unsigned long usp = regs.regs[29];
151
152         return do_sigaltstack(uss, uoss, usp);
153 }
154
155 asmlinkage int restore_sigcontext(struct pt_regs *regs, struct sigcontext *sc)
156 {
157         int err = 0;
158
159         /* Always make any pending restarted system calls return -EINTR */
160         current_thread_info()->restart_block.fn = do_no_restart_syscall;
161
162         err |= __get_user(regs->cp0_epc, &sc->sc_pc);
163         err |= __get_user(regs->hi, &sc->sc_mdhi);
164         err |= __get_user(regs->lo, &sc->sc_mdlo);
165
166 #define restore_gp_reg(i) do {                                          \
167         err |= __get_user(regs->regs[i], &sc->sc_regs[i]);              \
168 } while(0)
169         restore_gp_reg( 1); restore_gp_reg( 2); restore_gp_reg( 3);
170         restore_gp_reg( 4); restore_gp_reg( 5); restore_gp_reg( 6);
171         restore_gp_reg( 7); restore_gp_reg( 8); restore_gp_reg( 9);
172         restore_gp_reg(10); restore_gp_reg(11); restore_gp_reg(12);
173         restore_gp_reg(13); restore_gp_reg(14); restore_gp_reg(15);
174         restore_gp_reg(16); restore_gp_reg(17); restore_gp_reg(18);
175         restore_gp_reg(19); restore_gp_reg(20); restore_gp_reg(21);
176         restore_gp_reg(22); restore_gp_reg(23); restore_gp_reg(24);
177         restore_gp_reg(25); restore_gp_reg(26); restore_gp_reg(27);
178         restore_gp_reg(28); restore_gp_reg(29); restore_gp_reg(30);
179         restore_gp_reg(31);
180 #undef restore_gp_reg
181
182         err |= __get_user(current->used_math, &sc->sc_used_math);
183
184         preempt_disable();
185
186         if (current->used_math) {
187                 /* restore fpu context if we have used it before */
188                 own_fpu();
189                 err |= restore_fp_context(sc);
190         } else {
191                 /* signal handler may have used FPU.  Give it up. */
192                 lose_fpu();
193         }
194
195         preempt_enable();
196
197         return err;
198 }
199
200 #if PLAT_TRAMPOLINE_STUFF_LINE
201 #define __tramp __attribute__((aligned(PLAT_TRAMPOLINE_STUFF_LINE)))
202 #else
203 #define __tramp
204 #endif
205
206 #ifdef CONFIG_TRAD_SIGNALS
207 struct sigframe {
208         u32 sf_ass[4];                  /* argument save space for o32 */
209         u32 sf_code[2] __tramp;         /* signal trampoline */
210         struct sigcontext sf_sc __tramp;
211         sigset_t sf_mask;
212 };
213 #endif
214
215 struct rt_sigframe {
216         u32 rs_ass[4];                  /* argument save space for o32 */
217         u32 rs_code[2] __tramp;         /* signal trampoline */
218         struct siginfo rs_info __tramp;
219         struct ucontext rs_uc;
220 };
221
222 #ifdef CONFIG_TRAD_SIGNALS
223 asmlinkage void sys_sigreturn(struct pt_regs regs)
224 {
225         struct sigframe *frame;
226         sigset_t blocked;
227
228         frame = (struct sigframe *) regs.regs[29];
229         if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
230                 goto badframe;
231         if (__copy_from_user(&blocked, &frame->sf_mask, sizeof(blocked)))
232                 goto badframe;
233
234         sigdelsetmask(&blocked, ~_BLOCKABLE);
235         spin_lock_irq(&current->sighand->siglock);
236         current->blocked = blocked;
237         recalc_sigpending();
238         spin_unlock_irq(&current->sighand->siglock);
239
240         if (restore_sigcontext(&regs, &frame->sf_sc))
241                 goto badframe;
242
243         /*
244          * Don't let your children do this ...
245          */
246         if (current_thread_info()->flags & TIF_SYSCALL_TRACE)
247                 do_syscall_trace(&regs, 1);
248         __asm__ __volatile__(
249                 "move\t$29, %0\n\t"
250                 "j\tsyscall_exit"
251                 :/* no outputs */
252                 :"r" (&regs));
253         /* Unreached */
254
255 badframe:
256         force_sig(SIGSEGV, current);
257 }
258 #endif
259
260 asmlinkage void sys_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
261 {
262         struct rt_sigframe *frame;
263         sigset_t set;
264         stack_t st;
265
266         frame = (struct rt_sigframe *) regs.regs[29];
267         if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
268                 goto badframe;
269         if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set)))
270                 goto badframe;
271
272         sigdelsetmask(&set, ~_BLOCKABLE);
273         spin_lock_irq(&current->sighand->siglock);
274         current->blocked = set;
275         recalc_sigpending();
276         spin_unlock_irq(&current->sighand->siglock);
277
278         if (restore_sigcontext(&regs, &frame->rs_uc.uc_mcontext))
279                 goto badframe;
280
281         if (__copy_from_user(&st, &frame->rs_uc.uc_stack, sizeof(st)))
282                 goto badframe;
283         /* It is more difficult to avoid calling this function than to
284            call it and ignore errors.  */
285         do_sigaltstack(&st, NULL, regs.regs[29]);
286
287         /*
288          * Don't let your children do this ...
289          */
290         __asm__ __volatile__(
291                 "move\t$29, %0\n\t"
292                 "j\tsyscall_exit"
293                 :/* no outputs */
294                 :"r" (&regs));
295         /* Unreached */
296
297 badframe:
298         force_sig(SIGSEGV, current);
299 }
300
301 inline int setup_sigcontext(struct pt_regs *regs, struct sigcontext *sc)
302 {
303         int err = 0;
304
305         err |= __put_user(regs->cp0_epc, &sc->sc_pc);
306         err |= __put_user(regs->cp0_status, &sc->sc_status);
307
308 #define save_gp_reg(i) do {                                             \
309         err |= __put_user(regs->regs[i], &sc->sc_regs[i]);              \
310 } while(0)
311         __put_user(0, &sc->sc_regs[0]); save_gp_reg(1); save_gp_reg(2);
312         save_gp_reg(3); save_gp_reg(4); save_gp_reg(5); save_gp_reg(6);
313         save_gp_reg(7); save_gp_reg(8); save_gp_reg(9); save_gp_reg(10);
314         save_gp_reg(11); save_gp_reg(12); save_gp_reg(13); save_gp_reg(14);
315         save_gp_reg(15); save_gp_reg(16); save_gp_reg(17); save_gp_reg(18);
316         save_gp_reg(19); save_gp_reg(20); save_gp_reg(21); save_gp_reg(22);
317         save_gp_reg(23); save_gp_reg(24); save_gp_reg(25); save_gp_reg(26);
318         save_gp_reg(27); save_gp_reg(28); save_gp_reg(29); save_gp_reg(30);
319         save_gp_reg(31);
320 #undef save_gp_reg
321
322         err |= __put_user(regs->hi, &sc->sc_mdhi);
323         err |= __put_user(regs->lo, &sc->sc_mdlo);
324         err |= __put_user(regs->cp0_cause, &sc->sc_cause);
325         err |= __put_user(regs->cp0_badvaddr, &sc->sc_badvaddr);
326
327         err |= __put_user(current->used_math, &sc->sc_used_math);
328
329         if (!current->used_math)
330                 goto out;
331
332         /*
333          * Save FPU state to signal context.  Signal handler will "inherit"
334          * current FPU state.
335          */
336         preempt_disable();
337
338         if (!is_fpu_owner()) {
339                 own_fpu();
340                 restore_fp(current);
341         }
342         err |= save_fp_context(sc);
343
344         preempt_enable();
345
346 out:
347         return err;
348 }
349
350 /*
351  * Determine which stack to use..
352  */
353 static inline void *get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
354         size_t frame_size)
355 {
356         unsigned long sp, almask;
357
358         /* Default to using normal stack */
359         sp = regs->regs[29];
360
361         /*
362          * FPU emulator may have it's own trampoline active just
363          * above the user stack, 16-bytes before the next lowest
364          * 16 byte boundary.  Try to avoid trashing it.
365          */
366         sp -= 32;
367
368         /* This is the X/Open sanctioned signal stack switching.  */
369         if ((ka->sa.sa_flags & SA_ONSTACK) && (sas_ss_flags (sp) == 0))
370                 sp = current->sas_ss_sp + current->sas_ss_size;
371
372         if (PLAT_TRAMPOLINE_STUFF_LINE)
373                 almask = ~(PLAT_TRAMPOLINE_STUFF_LINE - 1);
374         else
375                 almask = ALMASK;
376
377         return (void *)((sp - frame_size) & ~(PLAT_TRAMPOLINE_STUFF_LINE - 1));
378 }
379
380 #ifdef CONFIG_TRAD_SIGNALS
381 static void inline setup_frame(struct k_sigaction * ka, struct pt_regs *regs,
382         int signr, sigset_t *set)
383 {
384         struct sigframe *frame;
385         int err = 0;
386
387         frame = get_sigframe(ka, regs, sizeof(*frame));
388         if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
389                 goto give_sigsegv;
390
391         /*
392          * Set up the return code ...
393          *
394          *         li      v0, __NR_sigreturn
395          *         syscall
396          */
397         if (PLAT_TRAMPOLINE_STUFF_LINE)
398                 __builtin_memset(frame->sf_code, '0',
399                                  PLAT_TRAMPOLINE_STUFF_LINE);
400         err |= __put_user(0x24020000 + __NR_sigreturn, frame->sf_code + 0);
401         err |= __put_user(0x0000000c                 , frame->sf_code + 1);
402         flush_cache_sigtramp((unsigned long) frame->sf_code);
403
404         err |= setup_sigcontext(regs, &frame->sf_sc);
405         err |= __copy_to_user(&frame->sf_mask, set, sizeof(*set));
406         if (err)
407                 goto give_sigsegv;
408
409         /*
410          * Arguments to signal handler:
411          *
412          *   a0 = signal number
413          *   a1 = 0 (should be cause)
414          *   a2 = pointer to struct sigcontext
415          *
416          * $25 and c0_epc point to the signal handler, $29 points to the
417          * struct sigframe.
418          */
419         regs->regs[ 4] = signr;
420         regs->regs[ 5] = 0;
421         regs->regs[ 6] = (unsigned long) &frame->sf_sc;
422         regs->regs[29] = (unsigned long) frame;
423         regs->regs[31] = (unsigned long) frame->sf_code;
424         regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
425
426 #if DEBUG_SIG
427         printk("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%p\n",
428                current->comm, current->pid,
429                frame, regs->cp0_epc, frame->regs[31]);
430 #endif
431         return;
432
433 give_sigsegv:
434         force_sigsegv(signr, current);
435 }
436 #endif
437
438 static void inline setup_rt_frame(struct k_sigaction * ka, struct pt_regs *regs,
439         int signr, sigset_t *set, siginfo_t *info)
440 {
441         struct rt_sigframe *frame;
442         int err = 0;
443
444         frame = get_sigframe(ka, regs, sizeof(*frame));
445         if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
446                 goto give_sigsegv;
447
448         /*
449          * Set up the return code ...
450          *
451          *         li      v0, __NR_rt_sigreturn
452          *         syscall
453          */
454         if (PLAT_TRAMPOLINE_STUFF_LINE)
455                 __builtin_memset(frame->rs_code, '0',
456                                  PLAT_TRAMPOLINE_STUFF_LINE);
457         err |= __put_user(0x24020000 + __NR_rt_sigreturn, frame->rs_code + 0);
458         err |= __put_user(0x0000000c                    , frame->rs_code + 1);
459         flush_cache_sigtramp((unsigned long) frame->rs_code);
460
461         /* Create siginfo.  */
462         err |= copy_siginfo_to_user(&frame->rs_info, info);
463
464         /* Create the ucontext.  */
465         err |= __put_user(0, &frame->rs_uc.uc_flags);
466         err |= __put_user(0, &frame->rs_uc.uc_link);
467         err |= __put_user((void *)current->sas_ss_sp,
468                           &frame->rs_uc.uc_stack.ss_sp);
469         err |= __put_user(sas_ss_flags(regs->regs[29]),
470                           &frame->rs_uc.uc_stack.ss_flags);
471         err |= __put_user(current->sas_ss_size,
472                           &frame->rs_uc.uc_stack.ss_size);
473         err |= setup_sigcontext(regs, &frame->rs_uc.uc_mcontext);
474         err |= __copy_to_user(&frame->rs_uc.uc_sigmask, set, sizeof(*set));
475
476         if (err)
477                 goto give_sigsegv;
478
479         /*
480          * Arguments to signal handler:
481          *
482          *   a0 = signal number
483          *   a1 = 0 (should be cause)
484          *   a2 = pointer to ucontext
485          *
486          * $25 and c0_epc point to the signal handler, $29 points to
487          * the struct rt_sigframe.
488          */
489         regs->regs[ 4] = signr;
490         regs->regs[ 5] = (unsigned long) &frame->rs_info;
491         regs->regs[ 6] = (unsigned long) &frame->rs_uc;
492         regs->regs[29] = (unsigned long) frame;
493         regs->regs[31] = (unsigned long) frame->rs_code;
494         regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
495
496 #if DEBUG_SIG
497         printk("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%p\n",
498                current->comm, current->pid,
499                frame, regs->cp0_epc, regs->regs[31]);
500 #endif
501         return;
502
503 give_sigsegv:
504         force_sigsegv(signr, current);
505 }
506
507 extern void setup_rt_frame_n32(struct k_sigaction * ka,
508         struct pt_regs *regs, int signr, sigset_t *set, siginfo_t *info);
509
510 static inline void handle_signal(unsigned long sig, siginfo_t *info,
511         struct k_sigaction *ka, sigset_t *oldset, struct pt_regs *regs)
512 {
513         switch(regs->regs[0]) {
514         case ERESTART_RESTARTBLOCK:
515         case ERESTARTNOHAND:
516                 regs->regs[2] = EINTR;
517                 break;
518         case ERESTARTSYS:
519                 if(!(ka->sa.sa_flags & SA_RESTART)) {
520                         regs->regs[2] = EINTR;
521                         break;
522                 }
523         /* fallthrough */
524         case ERESTARTNOINTR:            /* Userland will reload $v0.  */
525                 regs->regs[7] = regs->regs[26];
526                 regs->cp0_epc -= 8;
527         }
528
529         regs->regs[0] = 0;              /* Don't deal with this again.  */
530
531 #ifdef CONFIG_TRAD_SIGNALS
532         if (ka->sa.sa_flags & SA_SIGINFO) {
533 #else
534         if (1) {
535 #endif
536 #ifdef CONFIG_MIPS32_N32
537                 if ((current->thread.mflags & MF_ABI_MASK) == MF_N32)
538                         setup_rt_frame_n32 (ka, regs, sig, oldset, info);
539                 else
540 #endif
541                         setup_rt_frame(ka, regs, sig, oldset, info);
542         }
543 #ifdef CONFIG_TRAD_SIGNALS
544         else
545                 setup_frame(ka, regs, sig, oldset);
546 #endif
547
548         if (!(ka->sa.sa_flags & SA_NODEFER)) {
549                 spin_lock_irq(&current->sighand->siglock);
550                 sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
551                 sigaddset(&current->blocked,sig);
552                 recalc_sigpending();
553                 spin_unlock_irq(&current->sighand->siglock);
554         }
555 }
556
557 extern int do_signal32(sigset_t *oldset, struct pt_regs *regs);
558 extern int do_irix_signal(sigset_t *oldset, struct pt_regs *regs);
559
560 asmlinkage int do_signal(sigset_t *oldset, struct pt_regs *regs)
561 {
562         struct k_sigaction ka;
563         siginfo_t info;
564         int signr;
565
566 #ifdef CONFIG_BINFMT_ELF32
567         if ((current->thread.mflags & MF_ABI_MASK) == MF_O32) {
568                 return do_signal32(oldset, regs);
569         }
570 #endif
571
572         /*
573          * We want the common case to go fast, which is why we may in certain
574          * cases get here from kernel mode. Just return without doing anything
575          * if so.
576          */
577         if (!user_mode(regs))
578                 return 1;
579
580         if (current->flags & PF_FREEZE) {
581                 refrigerator(0);
582                 goto no_signal;
583         }
584
585         if (!oldset)
586                 oldset = &current->blocked;
587
588         signr = get_signal_to_deliver(&info, &ka, regs, NULL);
589         if (signr > 0) {
590                 handle_signal(signr, &info, &ka, oldset, regs);
591                 return 1;
592         }
593
594 no_signal:
595         /*
596          * Who's code doesn't conform to the restartable syscall convention
597          * dies here!!!  The li instruction, a single machine instruction,
598          * must directly be followed by the syscall instruction.
599          */
600         if (regs->regs[0]) {
601                 if (regs->regs[2] == ERESTARTNOHAND ||
602                     regs->regs[2] == ERESTARTSYS ||
603                     regs->regs[2] == ERESTARTNOINTR) {
604                         regs->regs[7] = regs->regs[26];
605                         regs->cp0_epc -= 8;
606                 }
607                 if (regs->regs[2] == ERESTART_RESTARTBLOCK) {
608                         regs->regs[2] = __NR_restart_syscall;
609                         regs->regs[7] = regs->regs[26];
610                         regs->cp0_epc -= 4;
611                 }
612         }
613         return 0;
614 }
615
616 extern int do_irix_signal(sigset_t *oldset, struct pt_regs *regs);
617
618 /*
619  * notification of userspace execution resumption
620  * - triggered by current->work.notify_resume
621  */
622 asmlinkage void do_notify_resume(struct pt_regs *regs, sigset_t *oldset,
623         __u32 thread_info_flags)
624 {
625         /* deal with pending signal delivery */
626         if (thread_info_flags & _TIF_SIGPENDING) {
627 #ifdef CONFIG_BINFMT_ELF32
628                 if (likely((current->thread.mflags & MF_ABI_MASK) == MF_O32)) {
629                         do_signal32(oldset, regs);
630                         return;
631                 }
632 #endif
633 #ifdef CONFIG_BINFMT_IRIX
634                 if (unlikely(current->personality != PER_LINUX)) {
635                         do_irix_signal(oldset, regs);
636                         return;
637                 }
638 #endif
639                 do_signal(oldset, regs);
640         }
641 }