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