VServer 1.9.2 (patch-2.6.8.1-vs1.9.2.diff)
[linux-2.6.git] / arch / ppc / kernel / signal.c
1 /*
2  *  arch/ppc/kernel/signal.c
3  *
4  *  PowerPC version
5  *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
6  *
7  *  Derived from "arch/i386/kernel/signal.c"
8  *    Copyright (C) 1991, 1992 Linus Torvalds
9  *    1997-11-28  Modified for POSIX.1b signals by Richard Henderson
10  *
11  *  This program is free software; you can redistribute it and/or
12  *  modify it under the terms of the GNU General Public License
13  *  as published by the Free Software Foundation; either version
14  *  2 of the License, or (at your option) any later version.
15  */
16
17 #include <linux/sched.h>
18 #include <linux/mm.h>
19 #include <linux/smp.h>
20 #include <linux/smp_lock.h>
21 #include <linux/kernel.h>
22 #include <linux/signal.h>
23 #include <linux/errno.h>
24 #include <linux/wait.h>
25 #include <linux/ptrace.h>
26 #include <linux/unistd.h>
27 #include <linux/stddef.h>
28 #include <linux/elf.h>
29 #include <linux/tty.h>
30 #include <linux/binfmts.h>
31 #include <asm/ucontext.h>
32 #include <asm/uaccess.h>
33 #include <asm/pgtable.h>
34 #include <asm/cacheflush.h>
35
36 #undef DEBUG_SIG
37
38 #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
39
40 extern void sigreturn_exit(struct pt_regs *);
41
42 #define GP_REGS_SIZE    min(sizeof(elf_gregset_t), sizeof(struct pt_regs))
43
44 int do_signal(sigset_t *oldset, struct pt_regs *regs);
45
46 /*
47  * Atomically swap in the new signal mask, and wait for a signal.
48  */
49 int
50 sys_sigsuspend(old_sigset_t mask, int p2, int p3, int p4, int p6, int p7,
51                struct pt_regs *regs)
52 {
53         sigset_t saveset;
54
55         mask &= _BLOCKABLE;
56         spin_lock_irq(&current->sighand->siglock);
57         saveset = current->blocked;
58         siginitset(&current->blocked, mask);
59         recalc_sigpending();
60         spin_unlock_irq(&current->sighand->siglock);
61
62         regs->result = -EINTR;
63         regs->gpr[3] = EINTR;
64         regs->ccr |= 0x10000000;
65         while (1) {
66                 current->state = TASK_INTERRUPTIBLE;
67                 schedule();
68                 if (do_signal(&saveset, regs))
69                         sigreturn_exit(regs);
70         }
71 }
72
73 int
74 sys_rt_sigsuspend(sigset_t __user *unewset, size_t sigsetsize, int p3, int p4,
75                   int p6, int p7, struct pt_regs *regs)
76 {
77         sigset_t saveset, newset;
78
79         /* XXX: Don't preclude handling different sized sigset_t's.  */
80         if (sigsetsize != sizeof(sigset_t))
81                 return -EINVAL;
82
83         if (copy_from_user(&newset, unewset, sizeof(newset)))
84                 return -EFAULT;
85         sigdelsetmask(&newset, ~_BLOCKABLE);
86
87         spin_lock_irq(&current->sighand->siglock);
88         saveset = current->blocked;
89         current->blocked = newset;
90         recalc_sigpending();
91         spin_unlock_irq(&current->sighand->siglock);
92
93         regs->result = -EINTR;
94         regs->gpr[3] = EINTR;
95         regs->ccr |= 0x10000000;
96         while (1) {
97                 current->state = TASK_INTERRUPTIBLE;
98                 schedule();
99                 if (do_signal(&saveset, regs))
100                         sigreturn_exit(regs);
101         }
102 }
103
104
105 int
106 sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss, int r5,
107                 int r6, int r7, int r8, struct pt_regs *regs)
108 {
109         return do_sigaltstack(uss, uoss, regs->gpr[1]);
110 }
111
112 int
113 sys_sigaction(int sig, const struct old_sigaction __user *act,
114               struct old_sigaction __user *oact)
115 {
116         struct k_sigaction new_ka, old_ka;
117         int ret;
118
119         if (act) {
120                 old_sigset_t mask;
121                 if (verify_area(VERIFY_READ, act, sizeof(*act)) ||
122                     __get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
123                     __get_user(new_ka.sa.sa_restorer, &act->sa_restorer))
124                         return -EFAULT;
125                 __get_user(new_ka.sa.sa_flags, &act->sa_flags);
126                 __get_user(mask, &act->sa_mask);
127                 siginitset(&new_ka.sa.sa_mask, mask);
128         }
129
130         ret = do_sigaction(sig, (act? &new_ka: NULL), (oact? &old_ka: NULL));
131
132         if (!ret && oact) {
133                 if (verify_area(VERIFY_WRITE, oact, sizeof(*oact)) ||
134                     __put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
135                     __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer))
136                         return -EFAULT;
137                 __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
138                 __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
139         }
140
141         return ret;
142 }
143
144 /*
145  * When we have signals to deliver, we set up on the
146  * user stack, going down from the original stack pointer:
147  *      a sigregs struct
148  *      a sigcontext struct
149  *      a gap of __SIGNAL_FRAMESIZE bytes
150  *
151  * Each of these things must be a multiple of 16 bytes in size.
152  *
153  */
154 struct sigregs {
155         struct mcontext mctx;           /* all the register values */
156         /* Programs using the rs6000/xcoff abi can save up to 19 gp regs
157            and 18 fp regs below sp before decrementing it. */
158         int             abigap[56];
159 };
160
161 /* We use the mc_pad field for the signal return trampoline. */
162 #define tramp   mc_pad
163
164 /*
165  *  When we have rt signals to deliver, we set up on the
166  *  user stack, going down from the original stack pointer:
167  *      one rt_sigframe struct (siginfo + ucontext + ABI gap)
168  *      a gap of __SIGNAL_FRAMESIZE+16 bytes
169  *  (the +16 is to get the siginfo and ucontext in the same
170  *  positions as in older kernels).
171  *
172  *  Each of these things must be a multiple of 16 bytes in size.
173  *
174  */
175 struct rt_sigframe
176 {
177         struct siginfo info;
178         struct ucontext uc;
179         /* Programs using the rs6000/xcoff abi can save up to 19 gp regs
180            and 18 fp regs below sp before decrementing it. */
181         int             abigap[56];
182 };
183
184 /*
185  * Save the current user registers on the user stack.
186  * We only save the altivec/spe registers if the process has used
187  * altivec/spe instructions at some point.
188  */
189 static int
190 save_user_regs(struct pt_regs *regs, struct mcontext __user *frame, int sigret)
191 {
192         /* save general and floating-point registers */
193         CHECK_FULL_REGS(regs);
194         preempt_disable();
195         if (regs->msr & MSR_FP)
196                 giveup_fpu(current);
197 #ifdef CONFIG_ALTIVEC
198         if (current->thread.used_vr && (regs->msr & MSR_VEC))
199                 giveup_altivec(current);
200 #endif /* CONFIG_ALTIVEC */
201 #ifdef CONFIG_SPE
202         if (current->thread.used_spe && (regs->msr & MSR_SPE))
203                 giveup_spe(current);
204 #endif /* CONFIG_ALTIVEC */
205         preempt_enable();
206
207         if (__copy_to_user(&frame->mc_gregs, regs, GP_REGS_SIZE)
208             || __copy_to_user(&frame->mc_fregs, current->thread.fpr,
209                               ELF_NFPREG * sizeof(double)))
210                 return 1;
211
212         current->thread.fpscr = 0;      /* turn off all fp exceptions */
213
214 #ifdef CONFIG_ALTIVEC
215         /* save altivec registers */
216         if (current->thread.used_vr) {
217                 if (__copy_to_user(&frame->mc_vregs, current->thread.vr,
218                                    ELF_NVRREG * sizeof(vector128)))
219                         return 1;
220                 /* set MSR_VEC in the saved MSR value to indicate that
221                    frame->mc_vregs contains valid data */
222                 if (__put_user(regs->msr | MSR_VEC, &frame->mc_gregs[PT_MSR]))
223                         return 1;
224         }
225         /* else assert((regs->msr & MSR_VEC) == 0) */
226
227         /* We always copy to/from vrsave, it's 0 if we don't have or don't
228          * use altivec. Since VSCR only contains 32 bits saved in the least
229          * significant bits of a vector, we "cheat" and stuff VRSAVE in the
230          * most significant bits of that same vector. --BenH
231          */
232         if (__put_user(current->thread.vrsave, (u32 __user *)&frame->mc_vregs[32]))
233                 return 1;
234 #endif /* CONFIG_ALTIVEC */
235
236 #ifdef CONFIG_SPE
237         /* save spe registers */
238         if (current->thread.used_spe) {
239                 if (__copy_to_user(&frame->mc_vregs, current->thread.evr,
240                                    ELF_NEVRREG * sizeof(u32)))
241                         return 1;
242                 /* set MSR_SPE in the saved MSR value to indicate that
243                    frame->mc_vregs contains valid data */
244                 if (__put_user(regs->msr | MSR_SPE, &frame->mc_gregs[PT_MSR]))
245                         return 1;
246         }
247         /* else assert((regs->msr & MSR_SPE) == 0) */
248
249         /* We always copy to/from spefscr */
250         if (__put_user(current->thread.spefscr, (u32 *)&frame->mc_vregs + ELF_NEVRREG))
251                 return 1;
252 #endif /* CONFIG_SPE */
253
254         if (sigret) {
255                 /* Set up the sigreturn trampoline: li r0,sigret; sc */
256                 if (__put_user(0x38000000UL + sigret, &frame->tramp[0])
257                     || __put_user(0x44000002UL, &frame->tramp[1]))
258                         return 1;
259                 flush_icache_range((unsigned long) &frame->tramp[0],
260                                    (unsigned long) &frame->tramp[2]);
261         }
262
263         return 0;
264 }
265
266 /*
267  * Restore the current user register values from the user stack,
268  * (except for MSR).
269  */
270 static int
271 restore_user_regs(struct pt_regs *regs, struct mcontext __user *sr, int sig)
272 {
273         unsigned long save_r2;
274 #if defined(CONFIG_ALTIVEC) || defined(CONFIG_SPE)
275         unsigned long msr;
276 #endif
277
278         /* backup/restore the TLS as we don't want it to be modified */
279         if (!sig)
280                 save_r2 = regs->gpr[2];
281         /* copy up to but not including MSR */
282         if (__copy_from_user(regs, &sr->mc_gregs, PT_MSR * sizeof(elf_greg_t)))
283                 return 1;
284         /* copy from orig_r3 (the word after the MSR) up to the end */
285         if (__copy_from_user(&regs->orig_gpr3, &sr->mc_gregs[PT_ORIG_R3],
286                              GP_REGS_SIZE - PT_ORIG_R3 * sizeof(elf_greg_t)))
287                 return 1;
288         if (!sig)
289                 regs->gpr[2] = save_r2;
290
291         /* force the process to reload the FP registers from
292            current->thread when it next does FP instructions */
293         regs->msr &= ~MSR_FP;
294         if (__copy_from_user(current->thread.fpr, &sr->mc_fregs,
295                              sizeof(sr->mc_fregs)))
296                 return 1;
297
298 #ifdef CONFIG_ALTIVEC
299         /* force the process to reload the altivec registers from
300            current->thread when it next does altivec instructions */
301         regs->msr &= ~MSR_VEC;
302         if (!__get_user(msr, &sr->mc_gregs[PT_MSR]) && (msr & MSR_VEC) != 0) {
303                 /* restore altivec registers from the stack */
304                 if (__copy_from_user(current->thread.vr, &sr->mc_vregs,
305                                      sizeof(sr->mc_vregs)))
306                         return 1;
307         } else if (current->thread.used_vr)
308                 memset(&current->thread.vr, 0, ELF_NVRREG * sizeof(vector128));
309
310         /* Always get VRSAVE back */
311         if (__get_user(current->thread.vrsave, (u32 __user *)&sr->mc_vregs[32]))
312                 return 1;
313 #endif /* CONFIG_ALTIVEC */
314
315 #ifdef CONFIG_SPE
316         /* force the process to reload the spe registers from
317            current->thread when it next does spe instructions */
318         regs->msr &= ~MSR_SPE;
319         if (!__get_user(msr, &sr->mc_gregs[PT_MSR]) && (msr & MSR_SPE) != 0) {
320                 /* restore spe registers from the stack */
321                 if (__copy_from_user(current->thread.evr, &sr->mc_vregs,
322                                      sizeof(sr->mc_vregs)))
323                         return 1;
324         } else if (current->thread.used_spe)
325                 memset(&current->thread.evr, 0, ELF_NEVRREG * sizeof(u32));
326
327         /* Always get SPEFSCR back */
328         if (__get_user(current->thread.spefscr, (u32 *)&sr->mc_vregs + ELF_NEVRREG))
329                 return 1;
330 #endif /* CONFIG_SPE */
331
332         return 0;
333 }
334
335 /*
336  * Restore the user process's signal mask
337  */
338 static void
339 restore_sigmask(sigset_t *set)
340 {
341         sigdelsetmask(set, ~_BLOCKABLE);
342         spin_lock_irq(&current->sighand->siglock);
343         current->blocked = *set;
344         recalc_sigpending();
345         spin_unlock_irq(&current->sighand->siglock);
346 }
347
348 /*
349  * Set up a signal frame for a "real-time" signal handler
350  * (one which gets siginfo).
351  */
352 static void
353 handle_rt_signal(unsigned long sig, struct k_sigaction *ka,
354                  siginfo_t *info, sigset_t *oldset, struct pt_regs * regs,
355                  unsigned long newsp)
356 {
357         struct rt_sigframe __user *rt_sf;
358         struct mcontext __user *frame;
359         unsigned long origsp = newsp;
360
361         /* Set up Signal Frame */
362         /* Put a Real Time Context onto stack */
363         newsp -= sizeof(*rt_sf);
364         rt_sf = (struct rt_sigframe __user *) newsp;
365
366         /* create a stack frame for the caller of the handler */
367         newsp -= __SIGNAL_FRAMESIZE + 16;
368
369         if (verify_area(VERIFY_WRITE, (void __user *) newsp, origsp - newsp))
370                 goto badframe;
371
372         /* Put the siginfo & fill in most of the ucontext */
373         if (copy_siginfo_to_user(&rt_sf->info, info)
374             || __put_user(0, &rt_sf->uc.uc_flags)
375             || __put_user(0, &rt_sf->uc.uc_link)
376             || __put_user(current->sas_ss_sp, &rt_sf->uc.uc_stack.ss_sp)
377             || __put_user(sas_ss_flags(regs->gpr[1]),
378                           &rt_sf->uc.uc_stack.ss_flags)
379             || __put_user(current->sas_ss_size, &rt_sf->uc.uc_stack.ss_size)
380             || __put_user(&rt_sf->uc.uc_mcontext, &rt_sf->uc.uc_regs)
381             || __copy_to_user(&rt_sf->uc.uc_sigmask, oldset, sizeof(*oldset)))
382                 goto badframe;
383
384         /* Save user registers on the stack */
385         frame = &rt_sf->uc.uc_mcontext;
386         if (save_user_regs(regs, frame, __NR_rt_sigreturn))
387                 goto badframe;
388
389         if (put_user(regs->gpr[1], (unsigned long __user *)newsp))
390                 goto badframe;
391         regs->gpr[1] = newsp;
392         regs->gpr[3] = sig;
393         regs->gpr[4] = (unsigned long) &rt_sf->info;
394         regs->gpr[5] = (unsigned long) &rt_sf->uc;
395         regs->gpr[6] = (unsigned long) rt_sf;
396         regs->nip = (unsigned long) ka->sa.sa_handler;
397         regs->link = (unsigned long) frame->tramp;
398         regs->trap = 0;
399
400         return;
401
402 badframe:
403 #ifdef DEBUG_SIG
404         printk("badframe in handle_rt_signal, regs=%p frame=%p newsp=%lx\n",
405                regs, frame, newsp);
406 #endif
407         if (sig == SIGSEGV)
408                 ka->sa.sa_handler = SIG_DFL;
409         force_sig(SIGSEGV, current);
410 }
411
412 static int do_setcontext(struct ucontext __user *ucp, struct pt_regs *regs, int sig)
413 {
414         sigset_t set;
415         struct mcontext __user *mcp;
416
417         if (__copy_from_user(&set, &ucp->uc_sigmask, sizeof(set))
418             || __get_user(mcp, &ucp->uc_regs))
419                 return -EFAULT;
420         restore_sigmask(&set);
421         if (restore_user_regs(regs, mcp, sig))
422                 return -EFAULT;
423
424         return 0;
425 }
426
427 int sys_swapcontext(struct ucontext __user *old_ctx,
428                     struct ucontext __user *new_ctx,
429                     int ctx_size, int r6, int r7, int r8, struct pt_regs *regs)
430 {
431         unsigned char tmp;
432
433         /* Context size is for future use. Right now, we only make sure
434          * we are passed something we understand
435          */
436         if (ctx_size < sizeof(struct ucontext))
437                 return -EINVAL;
438
439         if (old_ctx != NULL) {
440                 if (verify_area(VERIFY_WRITE, old_ctx, sizeof(*old_ctx))
441                     || save_user_regs(regs, &old_ctx->uc_mcontext, 0)
442                     || __copy_to_user(&old_ctx->uc_sigmask,
443                                       &current->blocked, sizeof(sigset_t))
444                     || __put_user(&old_ctx->uc_mcontext, &old_ctx->uc_regs))
445                         return -EFAULT;
446         }
447         if (new_ctx == NULL)
448                 return 0;
449         if (verify_area(VERIFY_READ, new_ctx, sizeof(*new_ctx))
450             || __get_user(tmp, (u8 __user *) new_ctx)
451             || __get_user(tmp, (u8 __user *) (new_ctx + 1) - 1))
452                 return -EFAULT;
453
454         /*
455          * If we get a fault copying the context into the kernel's
456          * image of the user's registers, we can't just return -EFAULT
457          * because the user's registers will be corrupted.  For instance
458          * the NIP value may have been updated but not some of the
459          * other registers.  Given that we have done the verify_area
460          * and successfully read the first and last bytes of the region
461          * above, this should only happen in an out-of-memory situation
462          * or if another thread unmaps the region containing the context.
463          * We kill the task with a SIGSEGV in this situation.
464          */
465         if (do_setcontext(new_ctx, regs, 0))
466                 do_exit(SIGSEGV);
467         sigreturn_exit(regs);
468         /* doesn't actually return back to here */
469         return 0;
470 }
471
472 int sys_rt_sigreturn(int r3, int r4, int r5, int r6, int r7, int r8,
473                      struct pt_regs *regs)
474 {
475         struct rt_sigframe __user *rt_sf;
476
477         /* Always make any pending restarted system calls return -EINTR */
478         current_thread_info()->restart_block.fn = do_no_restart_syscall;
479
480         rt_sf = (struct rt_sigframe __user *)
481                 (regs->gpr[1] + __SIGNAL_FRAMESIZE + 16);
482         if (verify_area(VERIFY_READ, rt_sf, sizeof(struct rt_sigframe)))
483                 goto bad;
484         if (do_setcontext(&rt_sf->uc, regs, 1))
485                 goto bad;
486
487         /*
488          * It's not clear whether or why it is desirable to save the
489          * sigaltstack setting on signal delivery and restore it on
490          * signal return.  But other architectures do this and we have
491          * always done it up until now so it is probably better not to
492          * change it.  -- paulus
493          */
494         do_sigaltstack(&rt_sf->uc.uc_stack, NULL, regs->gpr[1]);
495
496         sigreturn_exit(regs);           /* doesn't return here */
497         return 0;
498
499  bad:
500         force_sig(SIGSEGV, current);
501         return 0;
502 }
503
504 /*
505  * OK, we're invoking a handler
506  */
507 static void
508 handle_signal(unsigned long sig, struct k_sigaction *ka,
509               siginfo_t *info, sigset_t *oldset, struct pt_regs * regs,
510               unsigned long newsp)
511 {
512         struct sigcontext __user *sc;
513         struct sigregs __user *frame;
514         unsigned long origsp = newsp;
515
516         /* Set up Signal Frame */
517         newsp -= sizeof(struct sigregs);
518         frame = (struct sigregs __user *) newsp;
519
520         /* Put a sigcontext on the stack */
521         newsp -= sizeof(*sc);
522         sc = (struct sigcontext __user *) newsp;
523
524         /* create a stack frame for the caller of the handler */
525         newsp -= __SIGNAL_FRAMESIZE;
526
527         if (verify_area(VERIFY_WRITE, (void __user *) newsp, origsp - newsp))
528                 goto badframe;
529
530 #if _NSIG != 64
531 #error "Please adjust handle_signal()"
532 #endif
533         if (__put_user((unsigned long) ka->sa.sa_handler, &sc->handler)
534             || __put_user(oldset->sig[0], &sc->oldmask)
535             || __put_user(oldset->sig[1], &sc->_unused[3])
536             || __put_user((struct pt_regs *)frame, &sc->regs)
537             || __put_user(sig, &sc->signal))
538                 goto badframe;
539
540         if (save_user_regs(regs, &frame->mctx, __NR_sigreturn))
541                 goto badframe;
542
543         if (put_user(regs->gpr[1], (unsigned long __user *)newsp))
544                 goto badframe;
545         regs->gpr[1] = newsp;
546         regs->gpr[3] = sig;
547         regs->gpr[4] = (unsigned long) sc;
548         regs->nip = (unsigned long) ka->sa.sa_handler;
549         regs->link = (unsigned long) frame->mctx.tramp;
550         regs->trap = 0;
551
552         return;
553
554 badframe:
555 #ifdef DEBUG_SIG
556         printk("badframe in handle_signal, regs=%p frame=%p newsp=%lx\n",
557                regs, frame, newsp);
558 #endif
559         if (sig == SIGSEGV)
560                 ka->sa.sa_handler = SIG_DFL;
561         force_sig(SIGSEGV, current);
562 }
563
564 /*
565  * Do a signal return; undo the signal stack.
566  */
567 int sys_sigreturn(int r3, int r4, int r5, int r6, int r7, int r8,
568                   struct pt_regs *regs)
569 {
570         struct sigcontext __user *sc;
571         struct sigcontext sigctx;
572         struct mcontext __user *sr;
573         sigset_t set;
574
575         /* Always make any pending restarted system calls return -EINTR */
576         current_thread_info()->restart_block.fn = do_no_restart_syscall;
577
578         sc = (struct sigcontext __user *)(regs->gpr[1] + __SIGNAL_FRAMESIZE);
579         if (copy_from_user(&sigctx, sc, sizeof(sigctx)))
580                 goto badframe;
581
582         set.sig[0] = sigctx.oldmask;
583         set.sig[1] = sigctx._unused[3];
584         restore_sigmask(&set);
585
586         sr = (struct mcontext __user *) sigctx.regs;
587         if (verify_area(VERIFY_READ, sr, sizeof(*sr))
588             || restore_user_regs(regs, sr, 1))
589                 goto badframe;
590
591         sigreturn_exit(regs);           /* doesn't return */
592         return 0;
593
594 badframe:
595         force_sig(SIGSEGV, current);
596         return 0;
597 }
598
599 /*
600  * Note that 'init' is a special process: it doesn't get signals it doesn't
601  * want to handle. Thus you cannot kill init even with a SIGKILL even by
602  * mistake.
603  */
604 int do_signal(sigset_t *oldset, struct pt_regs *regs)
605 {
606         siginfo_t info;
607         struct k_sigaction *ka;
608         unsigned long frame, newsp;
609         int signr, ret;
610
611         if (!oldset)
612                 oldset = &current->blocked;
613
614         newsp = frame = 0;
615
616         signr = get_signal_to_deliver(&info, regs, NULL);
617
618         ka = (signr == 0)? NULL: &current->sighand->action[signr-1];
619
620         if (TRAP(regs) == 0x0C00                /* System Call! */
621             && regs->ccr & 0x10000000           /* error signalled */
622             && ((ret = regs->gpr[3]) == ERESTARTSYS
623                 || ret == ERESTARTNOHAND || ret == ERESTARTNOINTR
624                 || ret == ERESTART_RESTARTBLOCK)) {
625
626                 if (signr > 0
627                     && (ret == ERESTARTNOHAND || ret == ERESTART_RESTARTBLOCK
628                         || (ret == ERESTARTSYS
629                             && !(ka->sa.sa_flags & SA_RESTART)))) {
630                         /* make the system call return an EINTR error */
631                         regs->result = -EINTR;
632                         regs->gpr[3] = EINTR;
633                         /* note that the cr0.SO bit is already set */
634                 } else {
635                         regs->nip -= 4; /* Back up & retry system call */
636                         regs->result = 0;
637                         regs->trap = 0;
638                         if (ret == ERESTART_RESTARTBLOCK)
639                                 regs->gpr[0] = __NR_restart_syscall;
640                         else
641                                 regs->gpr[3] = regs->orig_gpr3;
642                 }
643         }
644
645         if (signr == 0)
646                 return 0;               /* no signals delivered */
647
648         if ((ka->sa.sa_flags & SA_ONSTACK) && current->sas_ss_size
649             && !on_sig_stack(regs->gpr[1]))
650                 newsp = current->sas_ss_sp + current->sas_ss_size;
651         else
652                 newsp = regs->gpr[1];
653         newsp &= ~0xfUL;
654
655         /* Whee!  Actually deliver the signal.  */
656         if (ka->sa.sa_flags & SA_SIGINFO)
657                 handle_rt_signal(signr, ka, &info, oldset, regs, newsp);
658         else
659                 handle_signal(signr, ka, &info, oldset, regs, newsp);
660
661         if (ka->sa.sa_flags & SA_ONESHOT)
662                 ka->sa.sa_handler = SIG_DFL;
663
664         if (!(ka->sa.sa_flags & SA_NODEFER)) {
665                 spin_lock_irq(&current->sighand->siglock);
666                 sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
667                 sigaddset(&current->blocked, signr);
668                 recalc_sigpending();
669                 spin_unlock_irq(&current->sighand->siglock);
670         }
671
672         return 1;
673 }
674