linux/arch/parisc/kernel/signal.c
<<
>>
Prefs
   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
  78static long
  79restore_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
  94void
  95sys_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        regs->orig_r28 = 1; /* no restarts for sigreturn */
 117
 118#ifdef CONFIG_64BIT
 119        compat_frame = (struct compat_rt_sigframe __user *)frame;
 120        
 121        if (is_compat_task()) {
 122                DBG(2,"sys_rt_sigreturn: ELF32 process.\n");
 123                if (__copy_from_user(&compat_set, &compat_frame->uc.uc_sigmask, sizeof(compat_set)))
 124                        goto give_sigsegv;
 125                sigset_32to64(&set,&compat_set);
 126        } else
 127#endif
 128        {
 129                if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
 130                        goto give_sigsegv;
 131        }
 132                
 133        set_current_blocked(&set);
 134
 135        /* Good thing we saved the old gr[30], eh? */
 136#ifdef CONFIG_64BIT
 137        if (is_compat_task()) {
 138                DBG(1,"sys_rt_sigreturn: compat_frame->uc.uc_mcontext 0x%p\n",
 139                                &compat_frame->uc.uc_mcontext);
 140// FIXME: Load upper half from register file
 141                if (restore_sigcontext32(&compat_frame->uc.uc_mcontext, 
 142                                        &compat_frame->regs, regs))
 143                        goto give_sigsegv;
 144                DBG(1,"sys_rt_sigreturn: usp %#08lx stack 0x%p\n", 
 145                                usp, &compat_frame->uc.uc_stack);
 146                if (compat_restore_altstack(&compat_frame->uc.uc_stack))
 147                        goto give_sigsegv;
 148        } else
 149#endif
 150        {
 151                DBG(1,"sys_rt_sigreturn: frame->uc.uc_mcontext 0x%p\n",
 152                                &frame->uc.uc_mcontext);
 153                if (restore_sigcontext(&frame->uc.uc_mcontext, regs))
 154                        goto give_sigsegv;
 155                DBG(1,"sys_rt_sigreturn: usp %#08lx stack 0x%p\n", 
 156                                usp, &frame->uc.uc_stack);
 157                if (restore_altstack(&frame->uc.uc_stack))
 158                        goto give_sigsegv;
 159        }
 160                
 161
 162
 163        /* If we are on the syscall path IAOQ will not be restored, and
 164         * if we are on the interrupt path we must not corrupt gr31.
 165         */
 166        if (in_syscall)
 167                regs->gr[31] = regs->iaoq[0];
 168#if DEBUG_SIG
 169        DBG(1,"sys_rt_sigreturn: returning to %#lx, DUMPING REGS:\n", regs->iaoq[0]);
 170        show_regs(regs);
 171#endif
 172        return;
 173
 174give_sigsegv:
 175        DBG(1,"sys_rt_sigreturn: Sending SIGSEGV\n");
 176        force_sig(SIGSEGV, current);
 177        return;
 178}
 179
 180/*
 181 * Set up a signal frame.
 182 */
 183
 184static inline void __user *
 185get_sigframe(struct k_sigaction *ka, unsigned long sp, size_t frame_size)
 186{
 187        /*FIXME: ELF32 vs. ELF64 has different frame_size, but since we
 188          don't use the parameter it doesn't matter */
 189
 190        DBG(1,"get_sigframe: ka = %#lx, sp = %#lx, frame_size = %#lx\n",
 191                        (unsigned long)ka, sp, frame_size);
 192        
 193        /* Align alternate stack and reserve 64 bytes for the signal
 194           handler's frame marker.  */
 195        if ((ka->sa.sa_flags & SA_ONSTACK) != 0 && ! sas_ss_flags(sp))
 196                sp = (current->sas_ss_sp + 0x7f) & ~0x3f; /* Stacks grow up! */
 197
 198        DBG(1,"get_sigframe: Returning sp = %#lx\n", (unsigned long)sp);
 199        return (void __user *) sp; /* Stacks grow up.  Fun. */
 200}
 201
 202static long
 203setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs, int in_syscall)
 204                 
 205{
 206        unsigned long flags = 0;
 207        long err = 0;
 208
 209        if (on_sig_stack((unsigned long) sc))
 210                flags |= PARISC_SC_FLAG_ONSTACK;
 211        if (in_syscall) {
 212                flags |= PARISC_SC_FLAG_IN_SYSCALL;
 213                /* regs->iaoq is undefined in the syscall return path */
 214                err |= __put_user(regs->gr[31], &sc->sc_iaoq[0]);
 215                err |= __put_user(regs->gr[31]+4, &sc->sc_iaoq[1]);
 216                err |= __put_user(regs->sr[3], &sc->sc_iasq[0]);
 217                err |= __put_user(regs->sr[3], &sc->sc_iasq[1]);
 218                DBG(1,"setup_sigcontext: iaoq %#lx / %#lx (in syscall)\n",
 219                        regs->gr[31], regs->gr[31]+4);
 220        } else {
 221                err |= __copy_to_user(sc->sc_iaoq, regs->iaoq, sizeof(regs->iaoq));
 222                err |= __copy_to_user(sc->sc_iasq, regs->iasq, sizeof(regs->iasq));
 223                DBG(1,"setup_sigcontext: iaoq %#lx / %#lx (not in syscall)\n", 
 224                        regs->iaoq[0], regs->iaoq[1]);
 225        }
 226
 227        err |= __put_user(flags, &sc->sc_flags);
 228        err |= __copy_to_user(sc->sc_gr, regs->gr, sizeof(regs->gr));
 229        err |= __copy_to_user(sc->sc_fr, regs->fr, sizeof(regs->fr));
 230        err |= __put_user(regs->sar, &sc->sc_sar);
 231        DBG(1,"setup_sigcontext: r28 is %ld\n", regs->gr[28]);
 232
 233        return err;
 234}
 235
 236static long
 237setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
 238               sigset_t *set, struct pt_regs *regs, int in_syscall)
 239{
 240        struct rt_sigframe __user *frame;
 241        unsigned long rp, usp;
 242        unsigned long haddr, sigframe_size;
 243        int err = 0;
 244#ifdef CONFIG_64BIT
 245        struct compat_rt_sigframe __user * compat_frame;
 246        compat_sigset_t compat_set;
 247#endif
 248        
 249        usp = (regs->gr[30] & ~(0x01UL));
 250        /*FIXME: frame_size parameter is unused, remove it. */
 251        frame = get_sigframe(ka, usp, sizeof(*frame));
 252
 253        DBG(1,"SETUP_RT_FRAME: START\n");
 254        DBG(1,"setup_rt_frame: frame %p info %p\n", frame, info);
 255
 256        
 257#ifdef CONFIG_64BIT
 258
 259        compat_frame = (struct compat_rt_sigframe __user *)frame;
 260        
 261        if (is_compat_task()) {
 262                DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &compat_frame->info);
 263                err |= copy_siginfo_to_user32(&compat_frame->info, info);
 264                err |= __compat_save_altstack( &compat_frame->uc.uc_stack, regs->gr[30]);
 265                DBG(1,"setup_rt_frame: frame->uc = 0x%p\n", &compat_frame->uc);
 266                DBG(1,"setup_rt_frame: frame->uc.uc_mcontext = 0x%p\n", &compat_frame->uc.uc_mcontext);
 267                err |= setup_sigcontext32(&compat_frame->uc.uc_mcontext, 
 268                                        &compat_frame->regs, regs, in_syscall);
 269                sigset_64to32(&compat_set,set);
 270                err |= __copy_to_user(&compat_frame->uc.uc_sigmask, &compat_set, sizeof(compat_set));
 271        } else
 272#endif
 273        {       
 274                DBG(1,"setup_rt_frame: frame->info = 0x%p\n", &frame->info);
 275                err |= copy_siginfo_to_user(&frame->info, info);
 276                err |= __save_altstack(&frame->uc.uc_stack, regs->gr[30]);
 277                DBG(1,"setup_rt_frame: frame->uc = 0x%p\n", &frame->uc);
 278                DBG(1,"setup_rt_frame: frame->uc.uc_mcontext = 0x%p\n", &frame->uc.uc_mcontext);
 279                err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, in_syscall);
 280                /* FIXME: Should probably be converted as well for the compat case */
 281                err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
 282        }
 283        
 284        if (err)
 285                goto give_sigsegv;
 286
 287        /* Set up to return from userspace.  If provided, use a stub
 288           already in userspace. The first words of tramp are used to
 289           save the previous sigrestartblock trampoline that might be
 290           on the stack. We start the sigreturn trampoline at 
 291           SIGRESTARTBLOCK_TRAMP+X. */
 292        err |= __put_user(in_syscall ? INSN_LDI_R25_1 : INSN_LDI_R25_0,
 293                        &frame->tramp[SIGRESTARTBLOCK_TRAMP+0]);
 294        err |= __put_user(INSN_LDI_R20, 
 295                        &frame->tramp[SIGRESTARTBLOCK_TRAMP+1]);
 296        err |= __put_user(INSN_BLE_SR2_R0, 
 297                        &frame->tramp[SIGRESTARTBLOCK_TRAMP+2]);
 298        err |= __put_user(INSN_NOP, &frame->tramp[SIGRESTARTBLOCK_TRAMP+3]);
 299
 300#if DEBUG_SIG
 301        /* Assert that we're flushing in the correct space... */
 302        {
 303                unsigned long sid;
 304                asm ("mfsp %%sr3,%0" : "=r" (sid));
 305                DBG(1,"setup_rt_frame: Flushing 64 bytes at space %#x offset %p\n",
 306                       sid, frame->tramp);
 307        }
 308#endif
 309
 310        flush_user_dcache_range((unsigned long) &frame->tramp[0],
 311                           (unsigned long) &frame->tramp[TRAMP_SIZE]);
 312        flush_user_icache_range((unsigned long) &frame->tramp[0],
 313                           (unsigned long) &frame->tramp[TRAMP_SIZE]);
 314
 315        /* TRAMP Words 0-4, Length 5 = SIGRESTARTBLOCK_TRAMP
 316         * TRAMP Words 5-9, Length 4 = SIGRETURN_TRAMP
 317         * So the SIGRETURN_TRAMP is at the end of SIGRESTARTBLOCK_TRAMP
 318         */
 319        rp = (unsigned long) &frame->tramp[SIGRESTARTBLOCK_TRAMP];
 320
 321        if (err)
 322                goto give_sigsegv;
 323
 324        haddr = A(ka->sa.sa_handler);
 325        /* The sa_handler may be a pointer to a function descriptor */
 326#ifdef CONFIG_64BIT
 327        if (is_compat_task()) {
 328#endif
 329                if (haddr & PA_PLABEL_FDESC) {
 330                        Elf32_Fdesc fdesc;
 331                        Elf32_Fdesc __user *ufdesc = (Elf32_Fdesc __user *)A(haddr & ~3);
 332
 333                        err = __copy_from_user(&fdesc, ufdesc, sizeof(fdesc));
 334
 335                        if (err)
 336                                goto give_sigsegv;
 337
 338                        haddr = fdesc.addr;
 339                        regs->gr[19] = fdesc.gp;
 340                }
 341#ifdef CONFIG_64BIT
 342        } else {
 343                Elf64_Fdesc fdesc;
 344                Elf64_Fdesc __user *ufdesc = (Elf64_Fdesc __user *)A(haddr & ~3);
 345                
 346                err = __copy_from_user(&fdesc, ufdesc, sizeof(fdesc));
 347                
 348                if (err)
 349                        goto give_sigsegv;
 350                
 351                haddr = fdesc.addr;
 352                regs->gr[19] = fdesc.gp;
 353                DBG(1,"setup_rt_frame: 64 bit signal, exe=%#lx, r19=%#lx, in_syscall=%d\n",
 354                     haddr, regs->gr[19], in_syscall);
 355        }
 356#endif
 357
 358        /* The syscall return path will create IAOQ values from r31.
 359         */
 360        sigframe_size = PARISC_RT_SIGFRAME_SIZE;
 361#ifdef CONFIG_64BIT
 362        if (is_compat_task())
 363                sigframe_size = PARISC_RT_SIGFRAME_SIZE32;
 364#endif
 365        if (in_syscall) {
 366                regs->gr[31] = haddr;
 367#ifdef CONFIG_64BIT
 368                if (!test_thread_flag(TIF_32BIT))
 369                        sigframe_size |= 1;
 370#endif
 371        } else {
 372                unsigned long psw = USER_PSW;
 373#ifdef CONFIG_64BIT
 374                if (!test_thread_flag(TIF_32BIT))
 375                        psw |= PSW_W;
 376#endif
 377
 378                /* If we are singlestepping, arrange a trap to be delivered
 379                   when we return to userspace. Note the semantics -- we
 380                   should trap before the first insn in the handler is
 381                   executed. Ref:
 382                        http://sources.redhat.com/ml/gdb/2004-11/msg00245.html
 383                 */
 384                if (pa_psw(current)->r) {
 385                        pa_psw(current)->r = 0;
 386                        psw |= PSW_R;
 387                        mtctl(-1, 0);
 388                }
 389
 390                regs->gr[0] = psw;
 391                regs->iaoq[0] = haddr | 3;
 392                regs->iaoq[1] = regs->iaoq[0] + 4;
 393        }
 394
 395        regs->gr[2]  = rp;                /* userland return pointer */
 396        regs->gr[26] = sig;               /* signal number */
 397        
 398#ifdef CONFIG_64BIT
 399        if (is_compat_task()) {
 400                regs->gr[25] = A(&compat_frame->info); /* siginfo pointer */
 401                regs->gr[24] = A(&compat_frame->uc);   /* ucontext pointer */
 402        } else
 403#endif
 404        {               
 405                regs->gr[25] = A(&frame->info); /* siginfo pointer */
 406                regs->gr[24] = A(&frame->uc);   /* ucontext pointer */
 407        }
 408        
 409        DBG(1,"setup_rt_frame: making sigreturn frame: %#lx + %#lx = %#lx\n",
 410               regs->gr[30], sigframe_size,
 411               regs->gr[30] + sigframe_size);
 412        /* Raise the user stack pointer to make a proper call frame. */
 413        regs->gr[30] = (A(frame) + sigframe_size);
 414
 415
 416        DBG(1,"setup_rt_frame: sig deliver (%s,%d) frame=0x%p sp=%#lx iaoq=%#lx/%#lx rp=%#lx\n",
 417               current->comm, current->pid, frame, regs->gr[30],
 418               regs->iaoq[0], regs->iaoq[1], rp);
 419
 420        return 1;
 421
 422give_sigsegv:
 423        DBG(1,"setup_rt_frame: sending SIGSEGV\n");
 424        force_sigsegv(sig, current);
 425        return 0;
 426}
 427
 428/*
 429 * OK, we're invoking a handler.
 430 */     
 431
 432static void
 433handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka,
 434                struct pt_regs *regs, int in_syscall)
 435{
 436        sigset_t *oldset = sigmask_to_save();
 437        DBG(1,"handle_signal: sig=%ld, ka=%p, info=%p, oldset=%p, regs=%p\n",
 438               sig, ka, info, oldset, regs);
 439        
 440        /* Set up the stack frame */
 441        if (!setup_rt_frame(sig, ka, info, oldset, regs, in_syscall))
 442                return;
 443
 444        signal_delivered(sig, info, ka, regs, 
 445                test_thread_flag(TIF_SINGLESTEP) ||
 446                test_thread_flag(TIF_BLOCKSTEP));
 447
 448        DBG(1,KERN_DEBUG "do_signal: Exit (success), regs->gr[28] = %ld\n",
 449                regs->gr[28]);
 450}
 451
 452static inline void
 453syscall_restart(struct pt_regs *regs, struct k_sigaction *ka)
 454{
 455        if (regs->orig_r28)
 456                return;
 457        regs->orig_r28 = 1; /* no more restarts */
 458        /* Check the return code */
 459        switch (regs->gr[28]) {
 460        case -ERESTART_RESTARTBLOCK:
 461        case -ERESTARTNOHAND:
 462                DBG(1,"ERESTARTNOHAND: returning -EINTR\n");
 463                regs->gr[28] = -EINTR;
 464                break;
 465
 466        case -ERESTARTSYS:
 467                if (!(ka->sa.sa_flags & SA_RESTART)) {
 468                        DBG(1,"ERESTARTSYS: putting -EINTR\n");
 469                        regs->gr[28] = -EINTR;
 470                        break;
 471                }
 472                /* fallthrough */
 473        case -ERESTARTNOINTR:
 474                /* A syscall is just a branch, so all
 475                 * we have to do is fiddle the return pointer.
 476                 */
 477                regs->gr[31] -= 8; /* delayed branching */
 478                break;
 479        }
 480}
 481
 482static inline void
 483insert_restart_trampoline(struct pt_regs *regs)
 484{
 485        if (regs->orig_r28)
 486                return;
 487        regs->orig_r28 = 1; /* no more restarts */
 488        switch(regs->gr[28]) {
 489        case -ERESTART_RESTARTBLOCK: {
 490                /* Restart the system call - no handlers present */
 491                unsigned int *usp = (unsigned int *)regs->gr[30];
 492
 493                /* Setup a trampoline to restart the syscall
 494                 * with __NR_restart_syscall
 495                 *
 496                 *  0: <return address (orig r31)>
 497                 *  4: <2nd half for 64-bit>
 498                 *  8: ldw 0(%sp), %r31
 499                 * 12: be 0x100(%sr2, %r0)
 500                 * 16: ldi __NR_restart_syscall, %r20
 501                 */
 502#ifdef CONFIG_64BIT
 503                put_user(regs->gr[31] >> 32, &usp[0]);
 504                put_user(regs->gr[31] & 0xffffffff, &usp[1]);
 505                put_user(0x0fc010df, &usp[2]);
 506#else
 507                put_user(regs->gr[31], &usp[0]);
 508                put_user(0x0fc0109f, &usp[2]);
 509#endif
 510                put_user(0xe0008200, &usp[3]);
 511                put_user(0x34140000, &usp[4]);
 512
 513                /* Stack is 64-byte aligned, and we only need
 514                 * to flush 1 cache line.
 515                 * Flushing one cacheline is cheap.
 516                 * "sync" on bigger (> 4 way) boxes is not.
 517                 */
 518                flush_user_dcache_range(regs->gr[30], regs->gr[30] + 4);
 519                flush_user_icache_range(regs->gr[30], regs->gr[30] + 4);
 520
 521                regs->gr[31] = regs->gr[30] + 8;
 522                return;
 523        }
 524        case -ERESTARTNOHAND:
 525        case -ERESTARTSYS:
 526        case -ERESTARTNOINTR: {
 527                /* Hooray for delayed branching.  We don't
 528                 * have to restore %r20 (the system call
 529                 * number) because it gets loaded in the delay
 530                 * slot of the branch external instruction.
 531                 */
 532                regs->gr[31] -= 8;
 533                return;
 534        }
 535        default:
 536                break;
 537        }
 538}
 539
 540/*
 541 * Note that 'init' is a special process: it doesn't get signals it doesn't
 542 * want to handle. Thus you cannot kill init even with a SIGKILL even by
 543 * mistake.
 544 *
 545 * We need to be able to restore the syscall arguments (r21-r26) to
 546 * restart syscalls.  Thus, the syscall path should save them in the
 547 * pt_regs structure (it's okay to do so since they are caller-save
 548 * registers).  As noted below, the syscall number gets restored for
 549 * us due to the magic of delayed branching.
 550 */
 551asmlinkage void
 552do_signal(struct pt_regs *regs, long in_syscall)
 553{
 554        siginfo_t info;
 555        struct k_sigaction ka;
 556        int signr;
 557
 558        DBG(1,"\ndo_signal: regs=0x%p, sr7 %#lx, in_syscall=%d\n",
 559               regs, regs->sr[7], in_syscall);
 560
 561        signr = get_signal_to_deliver(&info, &ka, regs, NULL);
 562        DBG(3,"do_signal: signr = %d, regs->gr[28] = %ld\n", signr, regs->gr[28]); 
 563        
 564        if (signr > 0) {
 565                /* Restart a system call if necessary. */
 566                if (in_syscall)
 567                        syscall_restart(regs, &ka);
 568
 569                handle_signal(signr, &info, &ka, regs, in_syscall);
 570                return;
 571        }
 572
 573        /* Did we come from a system call? */
 574        if (in_syscall)
 575                insert_restart_trampoline(regs);
 576        
 577        DBG(1,"do_signal: Exit (not delivered), regs->gr[28] = %ld\n", 
 578                regs->gr[28]);
 579
 580        restore_saved_sigmask();
 581}
 582
 583void do_notify_resume(struct pt_regs *regs, long in_syscall)
 584{
 585        if (test_thread_flag(TIF_SIGPENDING))
 586                do_signal(regs, in_syscall);
 587
 588        if (test_thread_flag(TIF_NOTIFY_RESUME)) {
 589                clear_thread_flag(TIF_NOTIFY_RESUME);
 590                tracehook_notify_resume(regs);
 591        }
 592}
 593