linux-old/arch/ppc/kernel/signal.c
<<
>>
Prefs
   1/*
   2 *  linux/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 <asm/ucontext.h>
  30#include <asm/uaccess.h>
  31#include <asm/pgtable.h>
  32
  33#define DEBUG_SIG 0
  34
  35#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
  36
  37#ifndef MIN
  38#define MIN(a,b) (((a) < (b)) ? (a) : (b))
  39#endif
  40
  41#define GP_REGS_SIZE    MIN(sizeof(elf_gregset_t), sizeof(struct pt_regs))
  42
  43extern void syscall_direct_return(struct pt_regs *regs);
  44
  45int do_signal(sigset_t *oldset, struct pt_regs *regs);
  46
  47int copy_siginfo_to_user(siginfo_t *to, siginfo_t *from)
  48{
  49        if (!access_ok (VERIFY_WRITE, to, sizeof(siginfo_t)))
  50                return -EFAULT;
  51        if (from->si_code < 0)
  52                return __copy_to_user(to, from, sizeof(siginfo_t));
  53        else {
  54                int err;
  55
  56                /* If you change siginfo_t structure, please be sure
  57                   this code is fixed accordingly.
  58                   It should never copy any pad contained in the structure
  59                   to avoid security leaks, but must copy the generic
  60                   3 ints plus the relevant union member.  */
  61                err = __put_user(from->si_signo, &to->si_signo);
  62                err |= __put_user(from->si_errno, &to->si_errno);
  63                err |= __put_user((short)from->si_code, &to->si_code);
  64                /* First 32bits of unions are always present.  */
  65                err |= __put_user(from->si_pid, &to->si_pid);
  66                switch (from->si_code >> 16) {
  67                case __SI_FAULT >> 16:
  68                        break;
  69                case __SI_CHLD >> 16:
  70                        err |= __put_user(from->si_utime, &to->si_utime);
  71                        err |= __put_user(from->si_stime, &to->si_stime);
  72                        err |= __put_user(from->si_status, &to->si_status);
  73                default:
  74                        err |= __put_user(from->si_uid, &to->si_uid);
  75                        break;
  76                /* case __SI_RT: This is not generated by the kernel as of now.  */
  77                }
  78                return err;
  79        }
  80}
  81
  82/*
  83 * Atomically swap in the new signal mask, and wait for a signal.
  84 */
  85int
  86sys_sigsuspend(old_sigset_t mask, int p2, int p3, int p4, int p6, int p7,
  87               struct pt_regs *regs)
  88{
  89        sigset_t saveset;
  90
  91        mask &= _BLOCKABLE;
  92        spin_lock_irq(&current->sigmask_lock);
  93        saveset = current->blocked;
  94        siginitset(&current->blocked, mask);
  95        recalc_sigpending(current);
  96        spin_unlock_irq(&current->sigmask_lock);
  97
  98        regs->result = -EINTR;
  99        regs->gpr[3] = EINTR;
 100        regs->ccr |= 0x10000000;
 101        while (1) {
 102                current->state = TASK_INTERRUPTIBLE;
 103                schedule();
 104                if (do_signal(&saveset, regs))
 105                        /*
 106                         * If a signal handler needs to be called,
 107                         * do_signal() has set R3 to the signal number (the
 108                         * first argument of the signal handler), so don't
 109                         * overwrite that with EINTR !
 110                         * In the other cases, do_signal() doesn't touch
 111                         * R3, so it's still set to -EINTR (see above).
 112                         */
 113                        return regs->gpr[3];
 114        }
 115}
 116
 117int
 118sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize, int p3, int p4, int p6,
 119                  int p7, struct pt_regs *regs)
 120{
 121        sigset_t saveset, newset;
 122
 123        /* XXX: Don't preclude handling different sized sigset_t's.  */
 124        if (sigsetsize != sizeof(sigset_t))
 125                return -EINVAL;
 126
 127        if (copy_from_user(&newset, unewset, sizeof(newset)))
 128                return -EFAULT;
 129        sigdelsetmask(&newset, ~_BLOCKABLE);
 130
 131        spin_lock_irq(&current->sigmask_lock);
 132        saveset = current->blocked;
 133        current->blocked = newset;
 134        recalc_sigpending(current);
 135        spin_unlock_irq(&current->sigmask_lock);
 136
 137        regs->result = -EINTR;
 138        regs->gpr[3] = EINTR;
 139        regs->ccr |= 0x10000000;
 140        while (1) {
 141                current->state = TASK_INTERRUPTIBLE;
 142                schedule();
 143                if (do_signal(&saveset, regs))
 144                        return regs->gpr[3];
 145        }
 146}
 147
 148
 149int
 150sys_sigaltstack(const stack_t *uss, stack_t *uoss, int r5, int r6,
 151                int r7, int r8, struct pt_regs *regs)
 152{
 153        return do_sigaltstack(uss, uoss, regs->gpr[1]);
 154}
 155
 156int
 157sys_sigaction(int sig, const struct old_sigaction *act,
 158              struct old_sigaction *oact)
 159{
 160        struct k_sigaction new_ka, old_ka;
 161        int ret;
 162
 163        if (act) {
 164                old_sigset_t mask;
 165                if (verify_area(VERIFY_READ, act, sizeof(*act)) ||
 166                    __get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
 167                    __get_user(new_ka.sa.sa_restorer, &act->sa_restorer))
 168                        return -EFAULT;
 169                __get_user(new_ka.sa.sa_flags, &act->sa_flags);
 170                __get_user(mask, &act->sa_mask);
 171                siginitset(&new_ka.sa.sa_mask, mask);
 172        }
 173
 174        ret = do_sigaction(sig, (act? &new_ka: NULL), (oact? &old_ka: NULL));
 175
 176        if (!ret && oact) {
 177                if (verify_area(VERIFY_WRITE, oact, sizeof(*oact)) ||
 178                    __put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
 179                    __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer))
 180                        return -EFAULT;
 181                __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
 182                __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
 183        }
 184
 185        return ret;
 186}
 187
 188/*
 189 * When we have signals to deliver, we set up on the
 190 * user stack, going down from the original stack pointer:
 191 *      a sigregs struct
 192 *      a sigcontext struct
 193 *      a gap of __SIGNAL_FRAMESIZE bytes
 194 *
 195 * Each of these things must be a multiple of 16 bytes in size.
 196 *
 197 */
 198struct sigregs {
 199        struct mcontext mctx;           /* all the register values */
 200        /* Programs using the rs6000/xcoff abi can save up to 19 gp regs
 201           and 18 fp regs below sp before decrementing it. */
 202        int             abigap[56];
 203};
 204
 205/* We use the mc_pad field for the signal return trampoline. */
 206#define tramp   mc_pad
 207
 208/*
 209 *  When we have rt signals to deliver, we set up on the
 210 *  user stack, going down from the original stack pointer:
 211 *      one rt_sigframe struct (siginfo + ucontext + ABI gap)
 212 *      a gap of __SIGNAL_FRAMESIZE+16 bytes
 213 *  (the +16 is to get the siginfo and ucontext in the same
 214 *  positions as in older kernels).
 215 *
 216 *  Each of these things must be a multiple of 16 bytes in size.
 217 *
 218 */
 219struct rt_sigframe
 220{
 221        struct siginfo info;
 222        struct ucontext uc;
 223        /* Programs using the rs6000/xcoff abi can save up to 19 gp regs
 224           and 18 fp regs below sp before decrementing it. */
 225        int             abigap[56];
 226};
 227
 228/*
 229 * Save the current user registers on the user stack.
 230 * We only save the altivec registers if the process has used
 231 * altivec instructions at some point.
 232 */
 233static int
 234save_user_regs(struct pt_regs *regs, struct mcontext *frame, int sigret)
 235{
 236        /* save general and floating-point registers */
 237        if (regs->msr & MSR_FP)
 238                giveup_fpu(current);
 239        if (__copy_to_user(&frame->mc_gregs, regs, GP_REGS_SIZE)
 240            || __copy_to_user(&frame->mc_fregs, current->thread.fpr,
 241                              ELF_NFPREG * sizeof(double)))
 242                return 1;
 243
 244        current->thread.fpscr = 0;      /* turn off all fp exceptions */
 245
 246#ifdef CONFIG_ALTIVEC
 247        /* save altivec registers */
 248        if (current->thread.used_vr) {
 249                if (regs->msr & MSR_VEC)
 250                        giveup_altivec(current);
 251                if (__copy_to_user(&frame->mc_vregs, current->thread.vr,
 252                                   ELF_NVRREG * sizeof(vector128)))
 253                        return 1;
 254                /* set MSR_VEC in the saved MSR value to indicate that
 255                   frame->mc_vregs contains valid data */
 256                if (__put_user(regs->msr | MSR_VEC, &frame->mc_gregs[PT_MSR]))
 257                        return 1;
 258        }
 259        /* else assert((regs->msr & MSR_VEC) == 0) */
 260
 261        /* We always copy to/from vrsave, it's 0 if we don't have or don't
 262         * use altivec. Since VSCR only contains 32 bits saved in the least
 263         * significant bits of a vector, we "cheat" and stuff VRSAVE in the
 264         * most significant bits of that same vector. --BenH
 265         */
 266        if (__put_user(current->thread.vrsave, (u32 *)&frame->mc_vregs[32]))
 267                return 1;
 268#endif /* CONFIG_ALTIVEC */
 269
 270        if (sigret) {
 271                /* Set up the sigreturn trampoline: li r0,sigret; sc */
 272                if (__put_user(0x38000000UL + sigret, &frame->tramp[0])
 273                    || __put_user(0x44000002UL, &frame->tramp[1]))
 274                        return 1;
 275                flush_icache_range((unsigned long) &frame->tramp[0],
 276                                   (unsigned long) &frame->tramp[2]);
 277        }
 278
 279        return 0;
 280}
 281
 282/*
 283 * Restore the current user register values from the user stack,
 284 * (except for MSR).
 285 */
 286static int
 287restore_user_regs(struct pt_regs *regs, struct mcontext *sr)
 288{
 289#ifdef CONFIG_ALTIVEC
 290        unsigned long msr;
 291#endif
 292
 293        /* copy up to but not including MSR */
 294        if (__copy_from_user(regs, &sr->mc_gregs, PT_MSR * sizeof(elf_greg_t)))
 295                return 1;
 296        /* copy from orig_r3 (the word after the MSR) up to the end */
 297        if (__copy_from_user(&regs->orig_gpr3, &sr->mc_gregs[PT_ORIG_R3],
 298                             GP_REGS_SIZE - PT_ORIG_R3 * sizeof(elf_greg_t)))
 299                return 1;
 300
 301        /* force the process to reload the FP registers from
 302           current->thread when it next does FP instructions */
 303        regs->msr &= ~MSR_FP;
 304        if (__copy_from_user(current->thread.fpr, &sr->mc_fregs,
 305                             sizeof(sr->mc_fregs)))
 306                return 1;
 307
 308#ifdef CONFIG_ALTIVEC
 309        /* force the process to reload the altivec registers from
 310           current->thread when it next does altivec instructions */
 311        regs->msr &= ~MSR_VEC;
 312        if (!__get_user(msr, &sr->mc_gregs[PT_MSR]) && (msr & MSR_VEC) != 0) {
 313                /* restore altivec registers from the stack */
 314                if (__copy_from_user(current->thread.vr, &sr->mc_vregs,
 315                                     sizeof(sr->mc_vregs)))
 316                        return 1;
 317        } else if (current->thread.used_vr)
 318                memset(&current->thread.vr, 0, ELF_NVRREG * sizeof(vector128));
 319
 320        /* Always get VRSAVE back */
 321        if (__get_user(current->thread.vrsave, (u32 *)&sr->mc_vregs[32]))
 322                return 1;
 323#endif /* CONFIG_ALTIVEC */
 324
 325        return 0;
 326}
 327
 328/*
 329 * Restore the user process's signal mask
 330 */
 331static void
 332restore_sigmask(sigset_t *set)
 333{
 334        sigdelsetmask(set, ~_BLOCKABLE);
 335        spin_lock_irq(&current->sigmask_lock);
 336        current->blocked = *set;
 337        recalc_sigpending(current);
 338        spin_unlock_irq(&current->sigmask_lock);
 339}
 340
 341/*
 342 * Set up a signal frame for a "real-time" signal handler
 343 * (one which gets siginfo).
 344 */
 345static void
 346handle_rt_signal(unsigned long sig, struct k_sigaction *ka,
 347                 siginfo_t *info, sigset_t *oldset, struct pt_regs * regs,
 348                 unsigned long newsp)
 349{
 350        struct rt_sigframe *rt_sf;
 351        struct mcontext *frame;
 352        unsigned long origsp = newsp;
 353
 354        /* Set up Signal Frame */
 355        /* Put a Real Time Context onto stack */
 356        newsp -= sizeof(*rt_sf);
 357        rt_sf = (struct rt_sigframe *) newsp;
 358
 359        /* create a stack frame for the caller of the handler */
 360        newsp -= __SIGNAL_FRAMESIZE + 16;
 361
 362        if (verify_area(VERIFY_WRITE, (void *) newsp, origsp - newsp))
 363                goto badframe;
 364
 365        /* Put the siginfo & fill in most of the ucontext */
 366        if (__copy_to_user(&rt_sf->info, info, sizeof(*info))
 367            || __put_user(0, &rt_sf->uc.uc_flags)
 368            || __put_user(0, &rt_sf->uc.uc_link)
 369            || __put_user(current->sas_ss_sp, &rt_sf->uc.uc_stack.ss_sp)
 370            || __put_user(sas_ss_flags(regs->gpr[1]), 
 371                          &rt_sf->uc.uc_stack.ss_flags)
 372            || __put_user(current->sas_ss_size, &rt_sf->uc.uc_stack.ss_size)
 373            || __put_user(&rt_sf->uc.uc_mcontext, &rt_sf->uc.uc_regs)
 374            || __copy_to_user(&rt_sf->uc.uc_sigmask, oldset, sizeof(*oldset)))
 375                goto badframe;
 376
 377        /* Save user registers on the stack */
 378        frame = &rt_sf->uc.uc_mcontext;
 379        if (save_user_regs(regs, frame, 0x6666))
 380                goto badframe;
 381
 382        if (put_user(regs->gpr[1], (unsigned long *)newsp))
 383                goto badframe;
 384        regs->gpr[1] = newsp;
 385        regs->gpr[3] = sig;
 386        regs->gpr[4] = (unsigned long) &rt_sf->info;
 387        regs->gpr[5] = (unsigned long) &rt_sf->uc;
 388        regs->gpr[6] = (unsigned long) rt_sf;
 389        regs->nip = (unsigned long) ka->sa.sa_handler;
 390        regs->link = (unsigned long) frame->tramp;
 391
 392        return;
 393
 394badframe:
 395#if DEBUG_SIG
 396        printk("badframe in handle_rt_signal, regs=%p frame=%p newsp=%lx\n",
 397               regs, frame, newsp);
 398#endif
 399        if (sig == SIGSEGV)
 400                ka->sa.sa_handler = SIG_DFL;
 401        force_sig(SIGSEGV, current);
 402}
 403
 404static int do_setcontext(struct ucontext *ucp, struct pt_regs *regs)
 405{
 406        sigset_t set;
 407        struct mcontext *mcp;
 408
 409        if (__copy_from_user(&set, &ucp->uc_sigmask, sizeof(set))
 410            || __get_user(mcp, &ucp->uc_regs))
 411                return -EFAULT;
 412        restore_sigmask(&set);
 413        if (restore_user_regs(regs, mcp))
 414                return -EFAULT;
 415
 416        return 0;
 417}
 418
 419int sys_swapcontext(struct ucontext *old_ctx, struct ucontext *new_ctx,
 420                    int r5, int r6, int r7, int r8, struct pt_regs *regs)
 421{
 422        unsigned char tmp;
 423
 424        if (old_ctx != NULL) {
 425                if (verify_area(VERIFY_WRITE, old_ctx, sizeof(*old_ctx))
 426                    || save_user_regs(regs, &old_ctx->uc_mcontext, 0)
 427                    || __copy_to_user(&old_ctx->uc_sigmask,
 428                                      &current->blocked, sizeof(sigset_t))
 429                    || __put_user(&old_ctx->uc_mcontext, &old_ctx->uc_regs))
 430                        return -EFAULT;
 431        }
 432        if (new_ctx == NULL)
 433                return 0;
 434        if (verify_area(VERIFY_READ, new_ctx, sizeof(*new_ctx))
 435            || __get_user(tmp, (u8 *) new_ctx)
 436            || __get_user(tmp, (u8 *) (new_ctx + 1) - 1))
 437                return -EFAULT;
 438
 439        /*
 440         * If we get a fault copying the context into the kernel's
 441         * image of the user's registers, we can't just return -EFAULT
 442         * because the user's registers will be corrupted.  For instance
 443         * the NIP value may have been updated but not some of the
 444         * other registers.  Given that we have done the verify_area
 445         * and successfully read the first and last bytes of the region
 446         * above, this should only happen in an out-of-memory situation
 447         * or if another thread unmaps the region containing the context.
 448         * We kill the task with a SIGSEGV in this situation.
 449         */
 450        if (do_setcontext(new_ctx, regs))
 451                do_exit(SIGSEGV);
 452        syscall_direct_return(regs);
 453        /* doesn't actually return back to here */
 454        return 0;
 455}
 456
 457int sys_rt_sigreturn(struct pt_regs *regs)
 458{
 459        struct rt_sigframe *rt_sf;
 460        stack_t st;
 461
 462        rt_sf = (struct rt_sigframe *)(regs->gpr[1] + __SIGNAL_FRAMESIZE + 16);
 463        if (verify_area(VERIFY_READ, rt_sf, sizeof(struct rt_sigframe)))
 464                goto bad;
 465        if (do_setcontext(&rt_sf->uc, regs))
 466                goto bad;
 467
 468        /*
 469         * It's not clear whether or why it is desirable to save the
 470         * sigaltstack setting on signal delivery and restore it on
 471         * signal return.  But other architectures do this and we have
 472         * always done it up until now so it is probably better not to
 473         * change it.  -- paulus
 474         */
 475        if (__copy_from_user(&st, &rt_sf->uc.uc_stack, sizeof(st)))
 476                goto bad;
 477        do_sigaltstack(&st, NULL, regs->gpr[1]);
 478
 479        return regs->result;
 480
 481 bad:
 482        force_sig(SIGSEGV, current);
 483        return 0;
 484}
 485
 486/*
 487 * OK, we're invoking a handler
 488 */
 489static void
 490handle_signal(unsigned long sig, struct k_sigaction *ka,
 491              siginfo_t *info, sigset_t *oldset, struct pt_regs * regs,
 492              unsigned long newsp)
 493{
 494        struct sigcontext *sc;
 495        struct sigregs *frame;
 496        unsigned long origsp = newsp;
 497
 498        /* Set up Signal Frame */
 499        newsp -= sizeof(struct sigregs);
 500        frame = (struct sigregs *) newsp;
 501
 502        /* Put a sigcontext on the stack */
 503        newsp -= sizeof(*sc);
 504        sc = (struct sigcontext *) newsp;
 505
 506        /* create a stack frame for the caller of the handler */
 507        newsp -= __SIGNAL_FRAMESIZE;
 508
 509        if (verify_area(VERIFY_WRITE, (void *) newsp, origsp - newsp))
 510                goto badframe;
 511
 512#if _NSIG != 64
 513#error "Please adjust handle_signal()"
 514#endif
 515        if (__put_user((unsigned long) ka->sa.sa_handler, &sc->handler)
 516            || __put_user(oldset->sig[0], &sc->oldmask)
 517            || __put_user(oldset->sig[1], &sc->_unused[3])
 518            || __put_user((struct pt_regs *)frame, &sc->regs)
 519            || __put_user(sig, &sc->signal))
 520                goto badframe;
 521
 522        if (save_user_regs(regs, &frame->mctx, 0x7777))
 523                goto badframe;
 524
 525        if (put_user(regs->gpr[1], (unsigned long *)newsp))
 526                goto badframe;
 527        regs->gpr[1] = newsp;
 528        regs->gpr[3] = sig;
 529        regs->gpr[4] = (unsigned long) sc;
 530        regs->nip = (unsigned long) ka->sa.sa_handler;
 531        regs->link = (unsigned long) frame->mctx.tramp;
 532
 533        return;
 534
 535badframe:
 536#if DEBUG_SIG
 537        printk("badframe in handle_signal, regs=%p frame=%lx newsp=%lx\n",
 538               regs, frame, *newspp);
 539#endif
 540        if (sig == SIGSEGV)
 541                ka->sa.sa_handler = SIG_DFL;
 542        force_sig(SIGSEGV, current);
 543}
 544
 545/*
 546 * Do a signal return; undo the signal stack.
 547 */
 548int sys_sigreturn(struct pt_regs *regs)
 549{
 550        struct sigcontext *sc, sigctx;
 551        struct mcontext *sr;
 552        int ret;
 553        sigset_t set;
 554
 555        sc = (struct sigcontext *)(regs->gpr[1] + __SIGNAL_FRAMESIZE);
 556        if (copy_from_user(&sigctx, sc, sizeof(sigctx)))
 557                goto badframe;
 558
 559        set.sig[0] = sigctx.oldmask;
 560        set.sig[1] = sigctx._unused[3];
 561        restore_sigmask(&set);
 562
 563        sr = (struct mcontext *) sigctx.regs;
 564        if (verify_area(VERIFY_READ, sr, sizeof(*sr))
 565            || restore_user_regs(regs, sr))
 566                goto badframe;
 567
 568        ret = regs->result;
 569
 570        return ret;
 571
 572badframe:
 573        force_sig(SIGSEGV, current);
 574        return 0;
 575}       
 576
 577static int get_signal_to_deliver(struct siginfo *infop, struct pt_regs *regs)
 578{
 579        struct k_sigaction *ka;
 580        int signr;
 581
 582        for (;;) {
 583                spin_lock_irq(&current->sigmask_lock);
 584                signr = dequeue_signal(&current->blocked, infop);
 585                spin_unlock_irq(&current->sigmask_lock);
 586
 587                if (!signr)
 588                        return 0;
 589
 590                if ((current->ptrace & PT_PTRACED) && signr != SIGKILL) {
 591                        /* Let the debugger run.  */
 592                        current->exit_code = signr;
 593                        current->state = TASK_STOPPED;
 594                        notify_parent(current, SIGCHLD);
 595                        schedule();
 596
 597                        /* We're back.  Did the debugger cancel the sig?  */
 598                        if (!(signr = current->exit_code))
 599                                continue;
 600                        current->exit_code = 0;
 601
 602                        /* The debugger continued.  Ignore SIGSTOP.  */
 603                        if (signr == SIGSTOP)
 604                                continue;
 605
 606                        /* Update the siginfo structure.  Is this good?  */
 607                        if (signr != infop->si_signo) {
 608                                infop->si_signo = signr;
 609                                infop->si_errno = 0;
 610                                infop->si_code = SI_USER;
 611                                infop->si_pid = current->p_pptr->pid;
 612                                infop->si_uid = current->p_pptr->uid;
 613                        }
 614
 615                        /* If the (new) signal is now blocked, requeue it.  */
 616                        if (sigismember(&current->blocked, signr)) {
 617                                send_sig_info(signr, infop, current);
 618                                continue;
 619                        }
 620                }
 621
 622                ka = &current->sig->action[signr-1];
 623                if (ka->sa.sa_handler == SIG_IGN) {
 624                        if (signr != SIGCHLD)
 625                                continue;
 626                        /* Check for SIGCHLD: it's special.  */
 627                        while (sys_wait4(-1, NULL, WNOHANG, NULL) > 0)
 628                                /* nothing */;
 629                        continue;
 630                }
 631
 632                if (ka->sa.sa_handler == SIG_DFL) {
 633                        int exit_code = signr;
 634
 635                        /* Init gets no signals it doesn't want.  */
 636                        if (current->pid == 1)
 637                                continue;
 638
 639                        switch (signr) {
 640                        case SIGCONT: case SIGCHLD: case SIGWINCH: case SIGURG:
 641                                continue;
 642
 643                        case SIGTSTP: case SIGTTIN: case SIGTTOU:
 644                                if (is_orphaned_pgrp(current->pgrp))
 645                                        continue;
 646                                /* FALLTHRU */
 647
 648                        case SIGSTOP:
 649                                current->state = TASK_STOPPED;
 650                                current->exit_code = signr;
 651                                if (!(current->p_pptr->sig->action[SIGCHLD-1].sa.sa_flags & SA_NOCLDSTOP))
 652                                        notify_parent(current, SIGCHLD);
 653                                schedule();
 654                                continue;
 655
 656                        case SIGQUIT: case SIGILL: case SIGTRAP:
 657                        case SIGABRT: case SIGFPE: case SIGSEGV:
 658                        case SIGBUS: case SIGSYS: case SIGXCPU: case SIGXFSZ:
 659                                if (do_coredump(signr, regs))
 660                                        exit_code |= 0x80;
 661                                /* FALLTHRU */
 662
 663                        default:
 664                                sig_exit(signr, exit_code, infop);
 665                                /* NOTREACHED */
 666                        }
 667                }
 668                return signr;
 669        }
 670}
 671
 672/*
 673 * Note that 'init' is a special process: it doesn't get signals it doesn't
 674 * want to handle. Thus you cannot kill init even with a SIGKILL even by
 675 * mistake.
 676 */
 677int do_signal(sigset_t *oldset, struct pt_regs *regs)
 678{
 679        siginfo_t info;
 680        struct k_sigaction *ka;
 681        unsigned long frame, newsp;
 682        int signr;
 683
 684        if (!oldset)
 685                oldset = &current->blocked;
 686
 687        newsp = frame = 0;
 688
 689        signr = get_signal_to_deliver(&info, regs);
 690
 691        ka = (signr == 0)? NULL: &current->sig->action[signr-1];
 692
 693        if (regs->trap == 0xc00) {              /* system call */
 694                switch ((int) regs->result) {
 695                case -ERESTARTSYS:
 696                        if (signr == 0 || (ka->sa.sa_flags & SA_RESTART))
 697                                goto retry;
 698                        /* fall through */
 699                case -ERESTARTNOHAND:
 700                        if (signr > 0) {
 701                                /* make the system call return an EINTR */
 702                                regs->result = -EINTR;
 703                                break;
 704                        }
 705                        /* fall through */
 706                case -ERESTARTNOINTR:
 707                retry:
 708                        /* Back up & retry system call */
 709                        regs->gpr[3] = regs->orig_gpr3;
 710                        regs->nip -= 4;
 711                        regs->result = 0;
 712                        break;
 713                }
 714        }
 715
 716        if (signr == 0)
 717                return 0;               /* no signals delivered */
 718
 719        if ((ka->sa.sa_flags & SA_ONSTACK) && current->sas_ss_size
 720            && !on_sig_stack(regs->gpr[1]))
 721                newsp = current->sas_ss_sp + current->sas_ss_size;
 722        else
 723                newsp = regs->gpr[1];
 724        newsp &= ~0xfUL;
 725
 726        /* Whee!  Actually deliver the signal.  */
 727        if (ka->sa.sa_flags & SA_SIGINFO)
 728                handle_rt_signal(signr, ka, &info, oldset, regs, newsp);
 729        else
 730                handle_signal(signr, ka, &info, oldset, regs, newsp);
 731
 732        if (ka->sa.sa_flags & SA_ONESHOT)
 733                ka->sa.sa_handler = SIG_DFL;
 734
 735        if (!(ka->sa.sa_flags & SA_NODEFER)) {
 736                spin_lock_irq(&current->sigmask_lock);
 737                sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
 738                sigaddset(&current->blocked, signr);
 739                recalc_sigpending(current);
 740                spin_unlock_irq(&current->sigmask_lock);
 741        }
 742
 743        return 1;
 744}
 745
 746
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.