]> git.karo-electronics.de Git - karo-tx-linux.git/blob - arch/parisc/kernel/signal.c
Merge branch 'ux500/hickup' of git://git.kernel.org/pub/scm/linux/kernel/git/arm...
[karo-tx-linux.git] / arch / parisc / kernel / signal.c
1 /*
2  *  linux/arch/parisc/kernel/signal.c: Architecture-specific signal
3  *  handling support.
4  *
5  *  Copyright (C) 2000 David Huggins-Daines <dhd@debian.org>
6  *  Copyright (C) 2000 Linuxcare, Inc.
7  *
8  *  Based on the ia64, i386, and alpha versions.
9  *
10  *  Like the IA-64, we are a recent enough port (we are *starting*
11  *  with glibc2.2) that we do not need to support the old non-realtime
12  *  Linux signals.  Therefore we don't.  HP/UX signals will go in
13  *  arch/parisc/hpux/signal.c when we figure out how to do them.
14  */
15
16 #include <linux/sched.h>
17 #include <linux/mm.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/ptrace.h>
24 #include <linux/tracehook.h>
25 #include <linux/unistd.h>
26 #include <linux/stddef.h>
27 #include <linux/compat.h>
28 #include <linux/elf.h>
29 #include <asm/ucontext.h>
30 #include <asm/rt_sigframe.h>
31 #include <asm/uaccess.h>
32 #include <asm/pgalloc.h>
33 #include <asm/cacheflush.h>
34 #include <asm/asm-offsets.h>
35
36 #ifdef CONFIG_COMPAT
37 #include "signal32.h"
38 #endif
39
40 #define DEBUG_SIG 0 
41 #define DEBUG_SIG_LEVEL 2
42
43 #if DEBUG_SIG
44 #define DBG(LEVEL, ...) \
45         ((DEBUG_SIG_LEVEL >= LEVEL) \
46         ? printk(__VA_ARGS__) : (void) 0)
47 #else
48 #define DBG(LEVEL, ...)
49 #endif
50         
51 /* gcc will complain if a pointer is cast to an integer of different
52  * size.  If you really need to do this (and we do for an ELF32 user
53  * application in an ELF64 kernel) then you have to do a cast to an
54  * integer of the same size first.  The A() macro accomplishes
55  * this. */
56 #define A(__x)  ((unsigned long)(__x))
57
58 /*
59  * Atomically swap in the new signal mask, and wait for a signal.
60  */
61 #ifdef CONFIG_64BIT
62 #include "sys32.h"
63 #endif
64
65 /*
66  * Do a signal return - restore sigcontext.
67  */
68
69 /* Trampoline for calling rt_sigreturn() */
70 #define INSN_LDI_R25_0   0x34190000 /* ldi  0,%r25 (in_syscall=0) */
71 #define INSN_LDI_R25_1   0x34190002 /* ldi  1,%r25 (in_syscall=1) */
72 #define INSN_LDI_R20     0x3414015a /* ldi  __NR_rt_sigreturn,%r20 */
73 #define INSN_BLE_SR2_R0  0xe4008200 /* be,l 0x100(%sr2,%r0),%sr0,%r31 */
74 #define INSN_NOP         0x08000240 /* nop */
75 /* For debugging */
76 #define INSN_DIE_HORRIBLY 0x68000ccc /* stw %r0,0x666(%sr0,%r0) */
77
78 static long
79 restore_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs)
80 {
81         long err = 0;
82
83         err |= __copy_from_user(regs->gr, sc->sc_gr, sizeof(regs->gr));
84         err |= __copy_from_user(regs->fr, sc->sc_fr, sizeof(regs->fr));
85         err |= __copy_from_user(regs->iaoq, sc->sc_iaoq, sizeof(regs->iaoq));
86         err |= __copy_from_user(regs->iasq, sc->sc_iasq, sizeof(regs->iasq));
87         err |= __get_user(regs->sar, &sc->sc_sar);
88         DBG(2,"restore_sigcontext: iaoq is 0x%#lx / 0x%#lx\n", 
89                         regs->iaoq[0],regs->iaoq[1]);
90         DBG(2,"restore_sigcontext: r28 is %ld\n", regs->gr[28]);
91         return err;
92 }
93
94 void
95 sys_rt_sigreturn(struct pt_regs *regs, int in_syscall)
96 {
97         struct rt_sigframe __user *frame;
98         sigset_t set;
99         unsigned long usp = (regs->gr[30] & ~(0x01UL));
100         unsigned long sigframe_size = PARISC_RT_SIGFRAME_SIZE;
101 #ifdef CONFIG_64BIT
102         compat_sigset_t compat_set;
103         struct compat_rt_sigframe __user * compat_frame;
104         
105         if (is_compat_task())
106                 sigframe_size = PARISC_RT_SIGFRAME_SIZE32;
107 #endif
108
109         current_thread_info()->restart_block.fn = do_no_restart_syscall;
110
111         /* Unwind the user stack to get the rt_sigframe structure. */
112         frame = (struct rt_sigframe __user *)
113                 (usp - sigframe_size);
114         DBG(2,"sys_rt_sigreturn: frame is %p\n", frame);
115
116 #ifdef CONFIG_64BIT
117         compat_frame = (struct compat_rt_sigframe __user *)frame;
118         
119         if (is_compat_task()) {
120                 DBG(2,"sys_rt_sigreturn: ELF32 process.\n");
121                 if (__copy_from_user(&compat_set, &compat_frame->uc.uc_sigmask, sizeof(compat_set)))
122                         goto give_sigsegv;
123                 sigset_32to64(&set,&compat_set);
124         } else
125 #endif
126         {
127                 if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
128                         goto give_sigsegv;
129         }
130                 
131         set_current_blocked(&set);
132
133         /* Good thing we saved the old gr[30], eh? */
134 #ifdef CONFIG_64BIT
135         if (is_compat_task()) {
136                 DBG(1,"sys_rt_sigreturn: compat_frame->uc.uc_mcontext 0x%p\n",
137                                 &compat_frame->uc.uc_mcontext);
138 // FIXME: Load upper half from register file
139                 if (restore_sigcontext32(&compat_frame->uc.uc_mcontext, 
140                                         &compat_frame->regs, regs))
141                         goto give_sigsegv;
142                 DBG(1,"sys_rt_sigreturn: usp %#08lx stack 0x%p\n", 
143                                 usp, &compat_frame->uc.uc_stack);
144                 if (do_sigaltstack32(&compat_frame->uc.uc_stack, NULL, usp) == -EFAULT)
145                         goto give_sigsegv;
146         } else
147 #endif
148         {
149                 DBG(1,"sys_rt_sigreturn: frame->uc.uc_mcontext 0x%p\n",
150                                 &frame->uc.uc_mcontext);
151                 if (restore_sigcontext(&frame->uc.uc_mcontext, regs))
152                         goto give_sigsegv;
153                 DBG(1,"sys_rt_sigreturn: usp %#08lx stack 0x%p\n", 
154                                 usp, &frame->uc.uc_stack);
155                 if (do_sigaltstack(&frame->uc.uc_stack, NULL, usp) == -EFAULT)
156                         goto give_sigsegv;
157         }
158                 
159
160
161         /* If we are on the syscall path IAOQ will not be restored, and
162          * if we are on the interrupt path we must not corrupt gr31.
163          */
164         if (in_syscall)
165                 regs->gr[31] = regs->iaoq[0];
166 #if DEBUG_SIG
167         DBG(1,"sys_rt_sigreturn: returning to %#lx, DUMPING REGS:\n", regs->iaoq[0]);
168         show_regs(regs);
169 #endif
170         return;
171
172 give_sigsegv:
173         DBG(1,"sys_rt_sigreturn: Sending SIGSEGV\n");
174         force_sig(SIGSEGV, current);
175         return;
176 }
177
178 /*
179  * Set up a signal frame.
180  */
181
182 static inline void __user *
183 get_sigframe(struct k_sigaction *ka, unsigned long sp, size_t frame_size)
184 {
185         /*FIXME: ELF32 vs. ELF64 has different frame_size, but since we
186           don't use the parameter it doesn't matter */
187
188         DBG(1,"get_sigframe: ka = %#lx, sp = %#lx, frame_size = %#lx\n",
189                         (unsigned long)ka, sp, frame_size);
190         
191         if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && ! sas_ss_flags(sp))
192                 sp = current->sas_ss_sp; /* Stacks grow up! */
193
194         DBG(1,"get_sigframe: Returning sp = %#lx\n", (unsigned long)sp);
195         return (void __user *) sp; /* Stacks grow up.  Fun. */
196 }
197
198 static long
199 setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, int in_syscall)
200                  
201 {
202         unsigned long flags = 0;
203         long err = 0;
204
205         if (on_sig_stack((unsigned long) sc))
206                 flags |= PARISC_SC_FLAG_ONSTACK;
207         if (in_syscall) {
208                 flags |= PARISC_SC_FLAG_IN_SYSCALL;
209                 /* regs->iaoq is undefined in the syscall return path */
210                 err |= __put_user(regs->gr[31], &sc->sc_iaoq[0]);
211                 err |= __put_user(regs->gr[31]+4, &sc->sc_iaoq[1]);
212                 err |= __put_user(regs->sr[3], &sc->sc_iasq[0]);
213                 err |= __put_user(regs->sr[3], &sc->sc_iasq[1]);
214                 DBG(1,"setup_sigcontext: iaoq %#lx / %#lx (in syscall)\n",
215                         regs->gr[31], regs->gr[31]+4);
216         } else {
217                 err |= __copy_to_user(sc->sc_iaoq, regs->iaoq, sizeof(regs->iaoq));
218                 err |= __copy_to_user(sc->sc_iasq, regs->iasq, sizeof(regs->iasq));
219                 DBG(1,"setup_sigcontext: iaoq %#lx / %#lx (not in syscall)\n", 
220                         regs->iaoq[0], regs->iaoq[1]);
221         }
222
223         err |= __put_user(flags, &sc->sc_flags);
224         err |= __copy_to_user(sc->sc_gr, regs->gr, sizeof(regs->gr));
225         err |= __copy_to_user(sc->sc_fr, regs->fr, sizeof(regs->fr));
226         err |= __put_user(regs->sar, &sc->sc_sar);
227         DBG(1,"setup_sigcontext: r28 is %ld\n", regs->gr[28]);
228
229         return err;
230 }
231
232 static long
233 setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
234                sigset_t *set, struct pt_regs *regs, int in_syscall)
235 {
236         struct rt_sigframe __user *frame;
237         unsigned long rp, usp;
238         unsigned long haddr, sigframe_size;
239         int err = 0;
240 #ifdef CONFIG_64BIT
241         compat_int_t compat_val;
242         struct compat_rt_sigframe __user * compat_frame;
243         compat_sigset_t compat_set;
244 #endif
245         
246         usp = (regs->gr[30] & ~(0x01UL));
247         /*FIXME: frame_size parameter is unused, remove it. */
248         frame = get_sigframe(ka, usp, sizeof(*frame));
249
250         DBG(1,"SETUP_RT_FRAME: START\n");
251         DBG(1,"setup_rt_frame: frame %p info %p\n", frame, info);
252
253         
254 #ifdef CONFIG_64BIT
255
256         compat_frame = (struct compat_rt_sigframe __user *)frame;
257         
258         if (is_compat_task()) {
259                 DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &compat_frame->info);
260                 err |= copy_siginfo_to_user32(&compat_frame->info, info);
261                 DBG(1,"SETUP_RT_FRAME: 1\n");
262                 compat_val = (compat_int_t)current->sas_ss_sp;
263                 err |= __put_user(compat_val, &compat_frame->uc.uc_stack.ss_sp);
264                 DBG(1,"SETUP_RT_FRAME: 2\n");
265                 compat_val = (compat_int_t)current->sas_ss_size;
266                 err |= __put_user(compat_val, &compat_frame->uc.uc_stack.ss_size);
267                 DBG(1,"SETUP_RT_FRAME: 3\n");
268                 compat_val = sas_ss_flags(regs->gr[30]);                
269                 err |= __put_user(compat_val, &compat_frame->uc.uc_stack.ss_flags);             
270                 DBG(1,"setup_rt_frame: frame->uc = 0x%p\n", &compat_frame->uc);
271                 DBG(1,"setup_rt_frame: frame->uc.uc_mcontext = 0x%p\n", &compat_frame->uc.uc_mcontext);
272                 err |= setup_sigcontext32(&compat_frame->uc.uc_mcontext, 
273                                         &compat_frame->regs, regs, in_syscall);
274                 sigset_64to32(&compat_set,set);
275                 err |= __copy_to_user(&compat_frame->uc.uc_sigmask, &compat_set, sizeof(compat_set));
276         } else
277 #endif
278         {       
279                 DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &frame->info);
280                 err |= copy_siginfo_to_user(&frame->info, info);
281                 err |= __put_user(current->sas_ss_sp, &frame->uc.uc_stack.ss_sp);
282                 err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
283                 err |= __put_user(sas_ss_flags(regs->gr[30]),
284                                   &frame->uc.uc_stack.ss_flags);
285                 DBG(1,"setup_rt_frame: frame->uc = 0x%p\n", &frame->uc);
286                 DBG(1,"setup_rt_frame: frame->uc.uc_mcontext = 0x%p\n", &frame->uc.uc_mcontext);
287                 err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, in_syscall);
288                 /* FIXME: Should probably be converted as well for the compat case */
289                 err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
290         }
291         
292         if (err)
293                 goto give_sigsegv;
294
295         /* Set up to return from userspace.  If provided, use a stub
296            already in userspace. The first words of tramp are used to
297            save the previous sigrestartblock trampoline that might be
298            on the stack. We start the sigreturn trampoline at 
299            SIGRESTARTBLOCK_TRAMP+X. */
300         err |= __put_user(in_syscall ? INSN_LDI_R25_1 : INSN_LDI_R25_0,
301                         &frame->tramp[SIGRESTARTBLOCK_TRAMP+0]);
302         err |= __put_user(INSN_LDI_R20, 
303                         &frame->tramp[SIGRESTARTBLOCK_TRAMP+1]);
304         err |= __put_user(INSN_BLE_SR2_R0, 
305                         &frame->tramp[SIGRESTARTBLOCK_TRAMP+2]);
306         err |= __put_user(INSN_NOP, &frame->tramp[SIGRESTARTBLOCK_TRAMP+3]);
307
308 #if DEBUG_SIG
309         /* Assert that we're flushing in the correct space... */
310         {
311                 int sid;
312                 asm ("mfsp %%sr3,%0" : "=r" (sid));
313                 DBG(1,"setup_rt_frame: Flushing 64 bytes at space %#x offset %p\n",
314                        sid, frame->tramp);
315         }
316 #endif
317
318         flush_user_dcache_range((unsigned long) &frame->tramp[0],
319                            (unsigned long) &frame->tramp[TRAMP_SIZE]);
320         flush_user_icache_range((unsigned long) &frame->tramp[0],
321                            (unsigned long) &frame->tramp[TRAMP_SIZE]);
322
323         /* TRAMP Words 0-4, Length 5 = SIGRESTARTBLOCK_TRAMP
324          * TRAMP Words 5-9, Length 4 = SIGRETURN_TRAMP
325          * So the SIGRETURN_TRAMP is at the end of SIGRESTARTBLOCK_TRAMP
326          */
327         rp = (unsigned long) &frame->tramp[SIGRESTARTBLOCK_TRAMP];
328
329         if (err)
330                 goto give_sigsegv;
331
332         haddr = A(ka->sa.sa_handler);
333         /* The sa_handler may be a pointer to a function descriptor */
334 #ifdef CONFIG_64BIT
335         if (is_compat_task()) {
336 #endif
337                 if (haddr & PA_PLABEL_FDESC) {
338                         Elf32_Fdesc fdesc;
339                         Elf32_Fdesc __user *ufdesc = (Elf32_Fdesc __user *)A(haddr & ~3);
340
341                         err = __copy_from_user(&fdesc, ufdesc, sizeof(fdesc));
342
343                         if (err)
344                                 goto give_sigsegv;
345
346                         haddr = fdesc.addr;
347                         regs->gr[19] = fdesc.gp;
348                 }
349 #ifdef CONFIG_64BIT
350         } else {
351                 Elf64_Fdesc fdesc;
352                 Elf64_Fdesc __user *ufdesc = (Elf64_Fdesc __user *)A(haddr & ~3);
353                 
354                 err = __copy_from_user(&fdesc, ufdesc, sizeof(fdesc));
355                 
356                 if (err)
357                         goto give_sigsegv;
358                 
359                 haddr = fdesc.addr;
360                 regs->gr[19] = fdesc.gp;
361                 DBG(1,"setup_rt_frame: 64 bit signal, exe=%#lx, r19=%#lx, in_syscall=%d\n",
362                      haddr, regs->gr[19], in_syscall);
363         }
364 #endif
365
366         /* The syscall return path will create IAOQ values from r31.
367          */
368         sigframe_size = PARISC_RT_SIGFRAME_SIZE;
369 #ifdef CONFIG_64BIT
370         if (is_compat_task())
371                 sigframe_size = PARISC_RT_SIGFRAME_SIZE32;
372 #endif
373         if (in_syscall) {
374                 regs->gr[31] = haddr;
375 #ifdef CONFIG_64BIT
376                 if (!test_thread_flag(TIF_32BIT))
377                         sigframe_size |= 1;
378 #endif
379         } else {
380                 unsigned long psw = USER_PSW;
381 #ifdef CONFIG_64BIT
382                 if (!test_thread_flag(TIF_32BIT))
383                         psw |= PSW_W;
384 #endif
385
386                 /* If we are singlestepping, arrange a trap to be delivered
387                    when we return to userspace. Note the semantics -- we
388                    should trap before the first insn in the handler is
389                    executed. Ref:
390                         http://sources.redhat.com/ml/gdb/2004-11/msg00245.html
391                  */
392                 if (pa_psw(current)->r) {
393                         pa_psw(current)->r = 0;
394                         psw |= PSW_R;
395                         mtctl(-1, 0);
396                 }
397
398                 regs->gr[0] = psw;
399                 regs->iaoq[0] = haddr | 3;
400                 regs->iaoq[1] = regs->iaoq[0] + 4;
401         }
402
403         regs->gr[2]  = rp;                /* userland return pointer */
404         regs->gr[26] = sig;               /* signal number */
405         
406 #ifdef CONFIG_64BIT
407         if (is_compat_task()) {
408                 regs->gr[25] = A(&compat_frame->info); /* siginfo pointer */
409                 regs->gr[24] = A(&compat_frame->uc);   /* ucontext pointer */
410         } else
411 #endif
412         {               
413                 regs->gr[25] = A(&frame->info); /* siginfo pointer */
414                 regs->gr[24] = A(&frame->uc);   /* ucontext pointer */
415         }
416         
417         DBG(1,"setup_rt_frame: making sigreturn frame: %#lx + %#lx = %#lx\n",
418                regs->gr[30], sigframe_size,
419                regs->gr[30] + sigframe_size);
420         /* Raise the user stack pointer to make a proper call frame. */
421         regs->gr[30] = (A(frame) + sigframe_size);
422
423
424         DBG(1,"setup_rt_frame: sig deliver (%s,%d) frame=0x%p sp=%#lx iaoq=%#lx/%#lx rp=%#lx\n",
425                current->comm, current->pid, frame, regs->gr[30],
426                regs->iaoq[0], regs->iaoq[1], rp);
427
428         return 1;
429
430 give_sigsegv:
431         DBG(1,"setup_rt_frame: sending SIGSEGV\n");
432         force_sigsegv(sig, current);
433         return 0;
434 }
435
436 /*
437  * OK, we're invoking a handler.
438  */     
439
440 static long
441 handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
442                 struct pt_regs *regs, int in_syscall)
443 {
444         sigset_t *oldset = sigmask_to_save();
445         DBG(1,"handle_signal: sig=%ld, ka=%p, info=%p, oldset=%p, regs=%p\n",
446                sig, ka, info, oldset, regs);
447         
448         /* Set up the stack frame */
449         if (!setup_rt_frame(sig, ka, info, oldset, regs, in_syscall))
450                 return 0;
451
452         signal_delivered(sig, info, ka, regs, 
453                 test_thread_flag(TIF_SINGLESTEP) ||
454                 test_thread_flag(TIF_BLOCKSTEP));
455
456         DBG(1,KERN_DEBUG "do_signal: Exit (success), regs->gr[28] = %ld\n",
457                 regs->gr[28]);
458
459         return 1;
460 }
461
462 static inline void
463 syscall_restart(struct pt_regs *regs, struct k_sigaction *ka)
464 {
465         /* Check the return code */
466         switch (regs->gr[28]) {
467         case -ERESTART_RESTARTBLOCK:
468         case -ERESTARTNOHAND:
469                 DBG(1,"ERESTARTNOHAND: returning -EINTR\n");
470                 regs->gr[28] = -EINTR;
471                 break;
472
473         case -ERESTARTSYS:
474                 if (!(ka->sa.sa_flags & SA_RESTART)) {
475                         DBG(1,"ERESTARTSYS: putting -EINTR\n");
476                         regs->gr[28] = -EINTR;
477                         break;
478                 }
479                 /* fallthrough */
480         case -ERESTARTNOINTR:
481                 /* A syscall is just a branch, so all
482                  * we have to do is fiddle the return pointer.
483                  */
484                 regs->gr[31] -= 8; /* delayed branching */
485                 /* Preserve original r28. */
486                 regs->gr[28] = regs->orig_r28;
487                 break;
488         }
489 }
490
491 static inline void
492 insert_restart_trampoline(struct pt_regs *regs)
493 {
494         switch(regs->gr[28]) {
495         case -ERESTART_RESTARTBLOCK: {
496                 /* Restart the system call - no handlers present */
497                 unsigned int *usp = (unsigned int *)regs->gr[30];
498
499                 /* Setup a trampoline to restart the syscall
500                  * with __NR_restart_syscall
501                  *
502                  *  0: <return address (orig r31)>
503                  *  4: <2nd half for 64-bit>
504                  *  8: ldw 0(%sp), %r31
505                  * 12: be 0x100(%sr2, %r0)
506                  * 16: ldi __NR_restart_syscall, %r20
507                  */
508 #ifdef CONFIG_64BIT
509                 put_user(regs->gr[31] >> 32, &usp[0]);
510                 put_user(regs->gr[31] & 0xffffffff, &usp[1]);
511                 put_user(0x0fc010df, &usp[2]);
512 #else
513                 put_user(regs->gr[31], &usp[0]);
514                 put_user(0x0fc0109f, &usp[2]);
515 #endif
516                 put_user(0xe0008200, &usp[3]);
517                 put_user(0x34140000, &usp[4]);
518
519                 /* Stack is 64-byte aligned, and we only need
520                  * to flush 1 cache line.
521                  * Flushing one cacheline is cheap.
522                  * "sync" on bigger (> 4 way) boxes is not.
523                  */
524                 flush_user_dcache_range(regs->gr[30], regs->gr[30] + 4);
525                 flush_user_icache_range(regs->gr[30], regs->gr[30] + 4);
526
527                 regs->gr[31] = regs->gr[30] + 8;
528                 /* Preserve original r28. */
529                 regs->gr[28] = regs->orig_r28;
530
531                 return;
532         }
533         case -ERESTARTNOHAND:
534         case -ERESTARTSYS:
535         case -ERESTARTNOINTR: {
536                 /* Hooray for delayed branching.  We don't
537                  * have to restore %r20 (the system call
538                  * number) because it gets loaded in the delay
539                  * slot of the branch external instruction.
540                  */
541                 regs->gr[31] -= 8;
542                 /* Preserve original r28. */
543                 regs->gr[28] = regs->orig_r28;
544
545                 return;
546         }
547         default:
548                 break;
549         }
550 }
551
552 /*
553  * Note that 'init' is a special process: it doesn't get signals it doesn't
554  * want to handle. Thus you cannot kill init even with a SIGKILL even by
555  * mistake.
556  *
557  * We need to be able to restore the syscall arguments (r21-r26) to
558  * restart syscalls.  Thus, the syscall path should save them in the
559  * pt_regs structure (it's okay to do so since they are caller-save
560  * registers).  As noted below, the syscall number gets restored for
561  * us due to the magic of delayed branching.
562  */
563 asmlinkage void
564 do_signal(struct pt_regs *regs, long in_syscall)
565 {
566         siginfo_t info;
567         struct k_sigaction ka;
568         int signr;
569
570         DBG(1,"\ndo_signal: regs=0x%p, sr7 %#lx, in_syscall=%d\n",
571                regs, regs->sr[7], in_syscall);
572
573         /* Everyone else checks to see if they are in kernel mode at
574            this point and exits if that's the case.  I'm not sure why
575            we would be called in that case, but for some reason we
576            are. */
577
578         /* May need to force signal if handle_signal failed to deliver */
579         while (1) {
580                 signr = get_signal_to_deliver(&info, &ka, regs, NULL);
581                 DBG(3,"do_signal: signr = %d, regs->gr[28] = %ld\n", signr, regs->gr[28]); 
582         
583                 if (signr <= 0)
584                   break;
585                 
586                 /* Restart a system call if necessary. */
587                 if (in_syscall)
588                         syscall_restart(regs, &ka);
589
590                 /* Whee!  Actually deliver the signal.  If the
591                    delivery failed, we need to continue to iterate in
592                    this loop so we can deliver the SIGSEGV... */
593                 if (handle_signal(signr, &info, &ka, regs, in_syscall))
594                         return;
595         }
596         /* end of while(1) looping forever if we can't force a signal */
597
598         /* Did we come from a system call? */
599         if (in_syscall)
600                 insert_restart_trampoline(regs);
601         
602         DBG(1,"do_signal: Exit (not delivered), regs->gr[28] = %ld\n", 
603                 regs->gr[28]);
604
605         restore_saved_sigmask();
606 }
607
608 void do_notify_resume(struct pt_regs *regs, long in_syscall)
609 {
610         if (test_thread_flag(TIF_SIGPENDING))
611                 do_signal(regs, in_syscall);
612
613         if (test_thread_flag(TIF_NOTIFY_RESUME)) {
614                 clear_thread_flag(TIF_NOTIFY_RESUME);
615                 tracehook_notify_resume(regs);
616         }
617 }