linux/arch/arm/kernel/signal.c
<<
>>
Prefs
   1/*
   2 *  linux/arch/arm/kernel/signal.c
   3 *
   4 *  Copyright (C) 1995-2009 Russell King
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License version 2 as
   8 * published by the Free Software Foundation.
   9 */
  10#include <linux/errno.h>
  11#include <linux/signal.h>
  12#include <linux/personality.h>
  13#include <linux/freezer.h>
  14#include <linux/uaccess.h>
  15#include <linux/tracehook.h>
  16
  17#include <asm/elf.h>
  18#include <asm/cacheflush.h>
  19#include <asm/ucontext.h>
  20#include <asm/unistd.h>
  21#include <asm/vfp.h>
  22
  23#include "signal.h"
  24
  25#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
  26
  27/*
  28 * For ARM syscalls, we encode the syscall number into the instruction.
  29 */
  30#define SWI_SYS_SIGRETURN       (0xef000000|(__NR_sigreturn)|(__NR_OABI_SYSCALL_BASE))
  31#define SWI_SYS_RT_SIGRETURN    (0xef000000|(__NR_rt_sigreturn)|(__NR_OABI_SYSCALL_BASE))
  32#define SWI_SYS_RESTART         (0xef000000|__NR_restart_syscall|__NR_OABI_SYSCALL_BASE)
  33
  34/*
  35 * With EABI, the syscall number has to be loaded into r7.
  36 */
  37#define MOV_R7_NR_SIGRETURN     (0xe3a07000 | (__NR_sigreturn - __NR_SYSCALL_BASE))
  38#define MOV_R7_NR_RT_SIGRETURN  (0xe3a07000 | (__NR_rt_sigreturn - __NR_SYSCALL_BASE))
  39
  40/*
  41 * For Thumb syscalls, we pass the syscall number via r7.  We therefore
  42 * need two 16-bit instructions.
  43 */
  44#define SWI_THUMB_SIGRETURN     (0xdf00 << 16 | 0x2700 | (__NR_sigreturn - __NR_SYSCALL_BASE))
  45#define SWI_THUMB_RT_SIGRETURN  (0xdf00 << 16 | 0x2700 | (__NR_rt_sigreturn - __NR_SYSCALL_BASE))
  46
  47const unsigned long sigreturn_codes[7] = {
  48        MOV_R7_NR_SIGRETURN,    SWI_SYS_SIGRETURN,    SWI_THUMB_SIGRETURN,
  49        MOV_R7_NR_RT_SIGRETURN, SWI_SYS_RT_SIGRETURN, SWI_THUMB_RT_SIGRETURN,
  50};
  51
  52/*
  53 * Either we support OABI only, or we have EABI with the OABI
  54 * compat layer enabled.  In the later case we don't know if
  55 * user space is EABI or not, and if not we must not clobber r7.
  56 * Always using the OABI syscall solves that issue and works for
  57 * all those cases.
  58 */
  59const unsigned long syscall_restart_code[2] = {
  60        SWI_SYS_RESTART,        /* swi  __NR_restart_syscall */
  61        0xe49df004,             /* ldr  pc, [sp], #4 */
  62};
  63
  64/*
  65 * atomically swap in the new signal mask, and wait for a signal.
  66 */
  67asmlinkage int sys_sigsuspend(int restart, unsigned long oldmask, old_sigset_t mask)
  68{
  69        mask &= _BLOCKABLE;
  70        spin_lock_irq(&current->sighand->siglock);
  71        current->saved_sigmask = current->blocked;
  72        siginitset(&current->blocked, mask);
  73        recalc_sigpending();
  74        spin_unlock_irq(&current->sighand->siglock);
  75
  76        current->state = TASK_INTERRUPTIBLE;
  77        schedule();
  78        set_restore_sigmask();
  79        return -ERESTARTNOHAND;
  80}
  81
  82asmlinkage int 
  83sys_sigaction(int sig, const struct old_sigaction __user *act,
  84              struct old_sigaction __user *oact)
  85{
  86        struct k_sigaction new_ka, old_ka;
  87        int ret;
  88
  89        if (act) {
  90                old_sigset_t mask;
  91                if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
  92                    __get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
  93                    __get_user(new_ka.sa.sa_restorer, &act->sa_restorer))
  94                        return -EFAULT;
  95                __get_user(new_ka.sa.sa_flags, &act->sa_flags);
  96                __get_user(mask, &act->sa_mask);
  97                siginitset(&new_ka.sa.sa_mask, mask);
  98        }
  99
 100        ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
 101
 102        if (!ret && oact) {
 103                if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
 104                    __put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
 105                    __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer))
 106                        return -EFAULT;
 107                __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
 108                __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
 109        }
 110
 111        return ret;
 112}
 113
 114#ifdef CONFIG_CRUNCH
 115static int preserve_crunch_context(struct crunch_sigframe __user *frame)
 116{
 117        char kbuf[sizeof(*frame) + 8];
 118        struct crunch_sigframe *kframe;
 119
 120        /* the crunch context must be 64 bit aligned */
 121        kframe = (struct crunch_sigframe *)((unsigned long)(kbuf + 8) & ~7);
 122        kframe->magic = CRUNCH_MAGIC;
 123        kframe->size = CRUNCH_STORAGE_SIZE;
 124        crunch_task_copy(current_thread_info(), &kframe->storage);
 125        return __copy_to_user(frame, kframe, sizeof(*frame));
 126}
 127
 128static int restore_crunch_context(struct crunch_sigframe __user *frame)
 129{
 130        char kbuf[sizeof(*frame) + 8];
 131        struct crunch_sigframe *kframe;
 132
 133        /* the crunch context must be 64 bit aligned */
 134        kframe = (struct crunch_sigframe *)((unsigned long)(kbuf + 8) & ~7);
 135        if (__copy_from_user(kframe, frame, sizeof(*frame)))
 136                return -1;
 137        if (kframe->magic != CRUNCH_MAGIC ||
 138            kframe->size != CRUNCH_STORAGE_SIZE)
 139                return -1;
 140        crunch_task_restore(current_thread_info(), &kframe->storage);
 141        return 0;
 142}
 143#endif
 144
 145#ifdef CONFIG_IWMMXT
 146
 147static int preserve_iwmmxt_context(struct iwmmxt_sigframe *frame)
 148{
 149        char kbuf[sizeof(*frame) + 8];
 150        struct iwmmxt_sigframe *kframe;
 151
 152        /* the iWMMXt context must be 64 bit aligned */
 153        kframe = (struct iwmmxt_sigframe *)((unsigned long)(kbuf + 8) & ~7);
 154        kframe->magic = IWMMXT_MAGIC;
 155        kframe->size = IWMMXT_STORAGE_SIZE;
 156        iwmmxt_task_copy(current_thread_info(), &kframe->storage);
 157        return __copy_to_user(frame, kframe, sizeof(*frame));
 158}
 159
 160static int restore_iwmmxt_context(struct iwmmxt_sigframe *frame)
 161{
 162        char kbuf[sizeof(*frame) + 8];
 163        struct iwmmxt_sigframe *kframe;
 164
 165        /* the iWMMXt context must be 64 bit aligned */
 166        kframe = (struct iwmmxt_sigframe *)((unsigned long)(kbuf + 8) & ~7);
 167        if (__copy_from_user(kframe, frame, sizeof(*frame)))
 168                return -1;
 169        if (kframe->magic != IWMMXT_MAGIC ||
 170            kframe->size != IWMMXT_STORAGE_SIZE)
 171                return -1;
 172        iwmmxt_task_restore(current_thread_info(), &kframe->storage);
 173        return 0;
 174}
 175
 176#endif
 177
 178#ifdef CONFIG_VFP
 179
 180static int preserve_vfp_context(struct vfp_sigframe __user *frame)
 181{
 182        struct thread_info *thread = current_thread_info();
 183        struct vfp_hard_struct *h = &thread->vfpstate.hard;
 184        const unsigned long magic = VFP_MAGIC;
 185        const unsigned long size = VFP_STORAGE_SIZE;
 186        int err = 0;
 187
 188        vfp_sync_hwstate(thread);
 189        __put_user_error(magic, &frame->magic, err);
 190        __put_user_error(size, &frame->size, err);
 191
 192        /*
 193         * Copy the floating point registers. There can be unused
 194         * registers see asm/hwcap.h for details.
 195         */
 196        err |= __copy_to_user(&frame->ufp.fpregs, &h->fpregs,
 197                              sizeof(h->fpregs));
 198        /*
 199         * Copy the status and control register.
 200         */
 201        __put_user_error(h->fpscr, &frame->ufp.fpscr, err);
 202
 203        /*
 204         * Copy the exception registers.
 205         */
 206        __put_user_error(h->fpexc, &frame->ufp_exc.fpexc, err);
 207        __put_user_error(h->fpinst, &frame->ufp_exc.fpinst, err);
 208        __put_user_error(h->fpinst2, &frame->ufp_exc.fpinst2, err);
 209
 210        return err ? -EFAULT : 0;
 211}
 212
 213static int restore_vfp_context(struct vfp_sigframe __user *frame)
 214{
 215        struct thread_info *thread = current_thread_info();
 216        struct vfp_hard_struct *h = &thread->vfpstate.hard;
 217        unsigned long magic;
 218        unsigned long size;
 219        unsigned long fpexc;
 220        int err = 0;
 221
 222        __get_user_error(magic, &frame->magic, err);
 223        __get_user_error(size, &frame->size, err);
 224
 225        if (err)
 226                return -EFAULT;
 227        if (magic != VFP_MAGIC || size != VFP_STORAGE_SIZE)
 228                return -EINVAL;
 229
 230        vfp_flush_hwstate(thread);
 231
 232        /*
 233         * Copy the floating point registers. There can be unused
 234         * registers see asm/hwcap.h for details.
 235         */
 236        err |= __copy_from_user(&h->fpregs, &frame->ufp.fpregs,
 237                                sizeof(h->fpregs));
 238        /*
 239         * Copy the status and control register.
 240         */
 241        __get_user_error(h->fpscr, &frame->ufp.fpscr, err);
 242
 243        /*
 244         * Sanitise and restore the exception registers.
 245         */
 246        __get_user_error(fpexc, &frame->ufp_exc.fpexc, err);
 247        /* Ensure the VFP is enabled. */
 248        fpexc |= FPEXC_EN;
 249        /* Ensure FPINST2 is invalid and the exception flag is cleared. */
 250        fpexc &= ~(FPEXC_EX | FPEXC_FP2V);
 251        h->fpexc = fpexc;
 252
 253        __get_user_error(h->fpinst, &frame->ufp_exc.fpinst, err);
 254        __get_user_error(h->fpinst2, &frame->ufp_exc.fpinst2, err);
 255
 256        return err ? -EFAULT : 0;
 257}
 258
 259#endif
 260
 261/*
 262 * Do a signal return; undo the signal stack.  These are aligned to 64-bit.
 263 */
 264struct sigframe {
 265        struct ucontext uc;
 266        unsigned long retcode[2];
 267};
 268
 269struct rt_sigframe {
 270        struct siginfo info;
 271        struct sigframe sig;
 272};
 273
 274static int restore_sigframe(struct pt_regs *regs, struct sigframe __user *sf)
 275{
 276        struct aux_sigframe __user *aux;
 277        sigset_t set;
 278        int err;
 279
 280        err = __copy_from_user(&set, &sf->uc.uc_sigmask, sizeof(set));
 281        if (err == 0) {
 282                sigdelsetmask(&set, ~_BLOCKABLE);
 283                spin_lock_irq(&current->sighand->siglock);
 284                current->blocked = set;
 285                recalc_sigpending();
 286                spin_unlock_irq(&current->sighand->siglock);
 287        }
 288
 289        __get_user_error(regs->ARM_r0, &sf->uc.uc_mcontext.arm_r0, err);
 290        __get_user_error(regs->ARM_r1, &sf->uc.uc_mcontext.arm_r1, err);
 291        __get_user_error(regs->ARM_r2, &sf->uc.uc_mcontext.arm_r2, err);
 292        __get_user_error(regs->ARM_r3, &sf->uc.uc_mcontext.arm_r3, err);
 293        __get_user_error(regs->ARM_r4, &sf->uc.uc_mcontext.arm_r4, err);
 294        __get_user_error(regs->ARM_r5, &sf->uc.uc_mcontext.arm_r5, err);
 295        __get_user_error(regs->ARM_r6, &sf->uc.uc_mcontext.arm_r6, err);
 296        __get_user_error(regs->ARM_r7, &sf->uc.uc_mcontext.arm_r7, err);
 297        __get_user_error(regs->ARM_r8, &sf->uc.uc_mcontext.arm_r8, err);
 298        __get_user_error(regs->ARM_r9, &sf->uc.uc_mcontext.arm_r9, err);
 299        __get_user_error(regs->ARM_r10, &sf->uc.uc_mcontext.arm_r10, err);
 300        __get_user_error(regs->ARM_fp, &sf->uc.uc_mcontext.arm_fp, err);
 301        __get_user_error(regs->ARM_ip, &sf->uc.uc_mcontext.arm_ip, err);
 302        __get_user_error(regs->ARM_sp, &sf->uc.uc_mcontext.arm_sp, err);
 303        __get_user_error(regs->ARM_lr, &sf->uc.uc_mcontext.arm_lr, err);
 304        __get_user_error(regs->ARM_pc, &sf->uc.uc_mcontext.arm_pc, err);
 305        __get_user_error(regs->ARM_cpsr, &sf->uc.uc_mcontext.arm_cpsr, err);
 306
 307        err |= !valid_user_regs(regs);
 308
 309        aux = (struct aux_sigframe __user *) sf->uc.uc_regspace;
 310#ifdef CONFIG_CRUNCH
 311        if (err == 0)
 312                err |= restore_crunch_context(&aux->crunch);
 313#endif
 314#ifdef CONFIG_IWMMXT
 315        if (err == 0 && test_thread_flag(TIF_USING_IWMMXT))
 316                err |= restore_iwmmxt_context(&aux->iwmmxt);
 317#endif
 318#ifdef CONFIG_VFP
 319        if (err == 0)
 320                err |= restore_vfp_context(&aux->vfp);
 321#endif
 322
 323        return err;
 324}
 325
 326asmlinkage int sys_sigreturn(struct pt_regs *regs)
 327{
 328        struct sigframe __user *frame;
 329
 330        /* Always make any pending restarted system calls return -EINTR */
 331        current_thread_info()->restart_block.fn = do_no_restart_syscall;
 332
 333        /*
 334         * Since we stacked the signal on a 64-bit boundary,
 335         * then 'sp' should be word aligned here.  If it's
 336         * not, then the user is trying to mess with us.
 337         */
 338        if (regs->ARM_sp & 7)
 339                goto badframe;
 340
 341        frame = (struct sigframe __user *)regs->ARM_sp;
 342
 343        if (!access_ok(VERIFY_READ, frame, sizeof (*frame)))
 344                goto badframe;
 345
 346        if (restore_sigframe(regs, frame))
 347                goto badframe;
 348
 349        return regs->ARM_r0;
 350
 351badframe:
 352        force_sig(SIGSEGV, current);
 353        return 0;
 354}
 355
 356asmlinkage int sys_rt_sigreturn(struct pt_regs *regs)
 357{
 358        struct rt_sigframe __user *frame;
 359
 360        /* Always make any pending restarted system calls return -EINTR */
 361        current_thread_info()->restart_block.fn = do_no_restart_syscall;
 362
 363        /*
 364         * Since we stacked the signal on a 64-bit boundary,
 365         * then 'sp' should be word aligned here.  If it's
 366         * not, then the user is trying to mess with us.
 367         */
 368        if (regs->ARM_sp & 7)
 369                goto badframe;
 370
 371        frame = (struct rt_sigframe __user *)regs->ARM_sp;
 372
 373        if (!access_ok(VERIFY_READ, frame, sizeof (*frame)))
 374                goto badframe;
 375
 376        if (restore_sigframe(regs, &frame->sig))
 377                goto badframe;
 378
 379        if (do_sigaltstack(&frame->sig.uc.uc_stack, NULL, regs->ARM_sp) == -EFAULT)
 380                goto badframe;
 381
 382        return regs->ARM_r0;
 383
 384badframe:
 385        force_sig(SIGSEGV, current);
 386        return 0;
 387}
 388
 389static int
 390setup_sigframe(struct sigframe __user *sf, struct pt_regs *regs, sigset_t *set)
 391{
 392        struct aux_sigframe __user *aux;
 393        int err = 0;
 394
 395        __put_user_error(regs->ARM_r0, &sf->uc.uc_mcontext.arm_r0, err);
 396        __put_user_error(regs->ARM_r1, &sf->uc.uc_mcontext.arm_r1, err);
 397        __put_user_error(regs->ARM_r2, &sf->uc.uc_mcontext.arm_r2, err);
 398        __put_user_error(regs->ARM_r3, &sf->uc.uc_mcontext.arm_r3, err);
 399        __put_user_error(regs->ARM_r4, &sf->uc.uc_mcontext.arm_r4, err);
 400        __put_user_error(regs->ARM_r5, &sf->uc.uc_mcontext.arm_r5, err);
 401        __put_user_error(regs->ARM_r6, &sf->uc.uc_mcontext.arm_r6, err);
 402        __put_user_error(regs->ARM_r7, &sf->uc.uc_mcontext.arm_r7, err);
 403        __put_user_error(regs->ARM_r8, &sf->uc.uc_mcontext.arm_r8, err);
 404        __put_user_error(regs->ARM_r9, &sf->uc.uc_mcontext.arm_r9, err);
 405        __put_user_error(regs->ARM_r10, &sf->uc.uc_mcontext.arm_r10, err);
 406        __put_user_error(regs->ARM_fp, &sf->uc.uc_mcontext.arm_fp, err);
 407        __put_user_error(regs->ARM_ip, &sf->uc.uc_mcontext.arm_ip, err);
 408        __put_user_error(regs->ARM_sp, &sf->uc.uc_mcontext.arm_sp, err);
 409        __put_user_error(regs->ARM_lr, &sf->uc.uc_mcontext.arm_lr, err);
 410        __put_user_error(regs->ARM_pc, &sf->uc.uc_mcontext.arm_pc, err);
 411        __put_user_error(regs->ARM_cpsr, &sf->uc.uc_mcontext.arm_cpsr, err);
 412
 413        __put_user_error(current->thread.trap_no, &sf->uc.uc_mcontext.trap_no, err);
 414        __put_user_error(current->thread.error_code, &sf->uc.uc_mcontext.error_code, err);
 415        __put_user_error(current->thread.address, &sf->uc.uc_mcontext.fault_address, err);
 416        __put_user_error(set->sig[0], &sf->uc.uc_mcontext.oldmask, err);
 417
 418        err |= __copy_to_user(&sf->uc.uc_sigmask, set, sizeof(*set));
 419
 420        aux = (struct aux_sigframe __user *) sf->uc.uc_regspace;
 421#ifdef CONFIG_CRUNCH
 422        if (err == 0)
 423                err |= preserve_crunch_context(&aux->crunch);
 424#endif
 425#ifdef CONFIG_IWMMXT
 426        if (err == 0 && test_thread_flag(TIF_USING_IWMMXT))
 427                err |= preserve_iwmmxt_context(&aux->iwmmxt);
 428#endif
 429#ifdef CONFIG_VFP
 430        if (err == 0)
 431                err |= preserve_vfp_context(&aux->vfp);
 432#endif
 433        __put_user_error(0, &aux->end_magic, err);
 434
 435        return err;
 436}
 437
 438static inline void __user *
 439get_sigframe(struct k_sigaction *ka, struct pt_regs *regs, int framesize)
 440{
 441        unsigned long sp = regs->ARM_sp;
 442        void __user *frame;
 443
 444        /*
 445         * This is the X/Open sanctioned signal stack switching.
 446         */
 447        if ((ka->sa.sa_flags & SA_ONSTACK) && !sas_ss_flags(sp))
 448                sp = current->sas_ss_sp + current->sas_ss_size;
 449
 450        /*
 451         * ATPCS B01 mandates 8-byte alignment
 452         */
 453        frame = (void __user *)((sp - framesize) & ~7);
 454
 455        /*
 456         * Check that we can actually write to the signal frame.
 457         */
 458        if (!access_ok(VERIFY_WRITE, frame, framesize))
 459                frame = NULL;
 460
 461        return frame;
 462}
 463
 464static int
 465setup_return(struct pt_regs *regs, struct k_sigaction *ka,
 466             unsigned long __user *rc, void __user *frame, int usig)
 467{
 468        unsigned long handler = (unsigned long)ka->sa.sa_handler;
 469        unsigned long retcode;
 470        int thumb = 0;
 471        unsigned long cpsr = regs->ARM_cpsr & ~(PSR_f | PSR_E_BIT);
 472
 473        cpsr |= PSR_ENDSTATE;
 474
 475        /*
 476         * Maybe we need to deliver a 32-bit signal to a 26-bit task.
 477         */
 478        if (ka->sa.sa_flags & SA_THIRTYTWO)
 479                cpsr = (cpsr & ~MODE_MASK) | USR_MODE;
 480
 481#ifdef CONFIG_ARM_THUMB
 482        if (elf_hwcap & HWCAP_THUMB) {
 483                /*
 484                 * The LSB of the handler determines if we're going to
 485                 * be using THUMB or ARM mode for this signal handler.
 486                 */
 487                thumb = handler & 1;
 488
 489                if (thumb) {
 490                        cpsr |= PSR_T_BIT;
 491#if __LINUX_ARM_ARCH__ >= 7
 492                        /* clear the If-Then Thumb-2 execution state */
 493                        cpsr &= ~PSR_IT_MASK;
 494#endif
 495                } else
 496                        cpsr &= ~PSR_T_BIT;
 497        }
 498#endif
 499
 500        if (ka->sa.sa_flags & SA_RESTORER) {
 501                retcode = (unsigned long)ka->sa.sa_restorer;
 502        } else {
 503                unsigned int idx = thumb << 1;
 504
 505                if (ka->sa.sa_flags & SA_SIGINFO)
 506                        idx += 3;
 507
 508                if (__put_user(sigreturn_codes[idx],   rc) ||
 509                    __put_user(sigreturn_codes[idx+1], rc+1))
 510                        return 1;
 511
 512                if (cpsr & MODE32_BIT) {
 513                        /*
 514                         * 32-bit code can use the new high-page
 515                         * signal return code support.
 516                         */
 517                        retcode = KERN_SIGRETURN_CODE + (idx << 2) + thumb;
 518                } else {
 519                        /*
 520                         * Ensure that the instruction cache sees
 521                         * the return code written onto the stack.
 522                         */
 523                        flush_icache_range((unsigned long)rc,
 524                                           (unsigned long)(rc + 2));
 525
 526                        retcode = ((unsigned long)rc) + thumb;
 527                }
 528        }
 529
 530        regs->ARM_r0 = usig;
 531        regs->ARM_sp = (unsigned long)frame;
 532        regs->ARM_lr = retcode;
 533        regs->ARM_pc = handler;
 534        regs->ARM_cpsr = cpsr;
 535
 536        return 0;
 537}
 538
 539static int
 540setup_frame(int usig, struct k_sigaction *ka, sigset_t *set, struct pt_regs *regs)
 541{
 542        struct sigframe __user *frame = get_sigframe(ka, regs, sizeof(*frame));
 543        int err = 0;
 544
 545        if (!frame)
 546                return 1;
 547
 548        /*
 549         * Set uc.uc_flags to a value which sc.trap_no would never have.
 550         */
 551        __put_user_error(0x5ac3c35a, &frame->uc.uc_flags, err);
 552
 553        err |= setup_sigframe(frame, regs, set);
 554        if (err == 0)
 555                err = setup_return(regs, ka, frame->retcode, frame, usig);
 556
 557        return err;
 558}
 559
 560static int
 561setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,
 562               sigset_t *set, struct pt_regs *regs)
 563{
 564        struct rt_sigframe __user *frame = get_sigframe(ka, regs, sizeof(*frame));
 565        stack_t stack;
 566        int err = 0;
 567
 568        if (!frame)
 569                return 1;
 570
 571        err |= copy_siginfo_to_user(&frame->info, info);
 572
 573        __put_user_error(0, &frame->sig.uc.uc_flags, err);
 574        __put_user_error(NULL, &frame->sig.uc.uc_link, err);
 575
 576        memset(&stack, 0, sizeof(stack));
 577        stack.ss_sp = (void __user *)current->sas_ss_sp;
 578        stack.ss_flags = sas_ss_flags(regs->ARM_sp);
 579        stack.ss_size = current->sas_ss_size;
 580        err |= __copy_to_user(&frame->sig.uc.uc_stack, &stack, sizeof(stack));
 581
 582        err |= setup_sigframe(&frame->sig, regs, set);
 583        if (err == 0)
 584                err = setup_return(regs, ka, frame->sig.retcode, frame, usig);
 585
 586        if (err == 0) {
 587                /*
 588                 * For realtime signals we must also set the second and third
 589                 * arguments for the signal handler.
 590                 *   -- Peter Maydell <pmaydell@chiark.greenend.org.uk> 2000-12-06
 591                 */
 592                regs->ARM_r1 = (unsigned long)&frame->info;
 593                regs->ARM_r2 = (unsigned long)&frame->sig.uc;
 594        }
 595
 596        return err;
 597}
 598
 599/*
 600 * OK, we're invoking a handler
 601 */     
 602static int
 603handle_signal(unsigned long sig, struct k_sigaction *ka,
 604              siginfo_t *info, sigset_t *oldset,
 605              struct pt_regs * regs)
 606{
 607        struct thread_info *thread = current_thread_info();
 608        struct task_struct *tsk = current;
 609        int usig = sig;
 610        int ret;
 611
 612        /*
 613         * translate the signal
 614         */
 615        if (usig < 32 && thread->exec_domain && thread->exec_domain->signal_invmap)
 616                usig = thread->exec_domain->signal_invmap[usig];
 617
 618        /*
 619         * Set up the stack frame
 620         */
 621        if (ka->sa.sa_flags & SA_SIGINFO)
 622                ret = setup_rt_frame(usig, ka, info, oldset, regs);
 623        else
 624                ret = setup_frame(usig, ka, oldset, regs);
 625
 626        /*
 627         * Check that the resulting registers are actually sane.
 628         */
 629        ret |= !valid_user_regs(regs);
 630
 631        if (ret != 0) {
 632                force_sigsegv(sig, tsk);
 633                return ret;
 634        }
 635
 636        /*
 637         * Block the signal if we were successful.
 638         */
 639        spin_lock_irq(&tsk->sighand->siglock);
 640        sigorsets(&tsk->blocked, &tsk->blocked,
 641                  &ka->sa.sa_mask);
 642        if (!(ka->sa.sa_flags & SA_NODEFER))
 643                sigaddset(&tsk->blocked, sig);
 644        recalc_sigpending();
 645        spin_unlock_irq(&tsk->sighand->siglock);
 646
 647        return 0;
 648}
 649
 650/*
 651 * Note that 'init' is a special process: it doesn't get signals it doesn't
 652 * want to handle. Thus you cannot kill init even with a SIGKILL even by
 653 * mistake.
 654 *
 655 * Note that we go through the signals twice: once to check the signals that
 656 * the kernel can handle, and then we build all the user-level signal handling
 657 * stack-frames in one go after that.
 658 */
 659static void do_signal(struct pt_regs *regs, int syscall)
 660{
 661        unsigned int retval = 0, continue_addr = 0, restart_addr = 0;
 662        struct k_sigaction ka;
 663        siginfo_t info;
 664        int signr;
 665
 666        /*
 667         * We want the common case to go fast, which
 668         * is why we may in certain cases get here from
 669         * kernel mode. Just return without doing anything
 670         * if so.
 671         */
 672        if (!user_mode(regs))
 673                return;
 674
 675        /*
 676         * If we were from a system call, check for system call restarting...
 677         */
 678        if (syscall) {
 679                continue_addr = regs->ARM_pc;
 680                restart_addr = continue_addr - (thumb_mode(regs) ? 2 : 4);
 681                retval = regs->ARM_r0;
 682
 683                /*
 684                 * Prepare for system call restart.  We do this here so that a
 685                 * debugger will see the already changed PSW.
 686                 */
 687                switch (retval) {
 688                case -ERESTARTNOHAND:
 689                case -ERESTARTSYS:
 690                case -ERESTARTNOINTR:
 691                        regs->ARM_r0 = regs->ARM_ORIG_r0;
 692                        regs->ARM_pc = restart_addr;
 693                        break;
 694                case -ERESTART_RESTARTBLOCK:
 695                        regs->ARM_r0 = -EINTR;
 696                        break;
 697                }
 698        }
 699
 700        if (try_to_freeze())
 701                goto no_signal;
 702
 703        /*
 704         * Get the signal to deliver.  When running under ptrace, at this
 705         * point the debugger may change all our registers ...
 706         */
 707        signr = get_signal_to_deliver(&info, &ka, regs, NULL);
 708        if (signr > 0) {
 709                sigset_t *oldset;
 710
 711                /*
 712                 * Depending on the signal settings we may need to revert the
 713                 * decision to restart the system call.  But skip this if a
 714                 * debugger has chosen to restart at a different PC.
 715                 */
 716                if (regs->ARM_pc == restart_addr) {
 717                        if (retval == -ERESTARTNOHAND
 718                            || (retval == -ERESTARTSYS
 719                                && !(ka.sa.sa_flags & SA_RESTART))) {
 720                                regs->ARM_r0 = -EINTR;
 721                                regs->ARM_pc = continue_addr;
 722                        }
 723                }
 724
 725                if (test_thread_flag(TIF_RESTORE_SIGMASK))
 726                        oldset = &current->saved_sigmask;
 727                else
 728                        oldset = &current->blocked;
 729                if (handle_signal(signr, &ka, &info, oldset, regs) == 0) {
 730                        /*
 731                         * A signal was successfully delivered; the saved
 732                         * sigmask will have been stored in the signal frame,
 733                         * and will be restored by sigreturn, so we can simply
 734                         * clear the TIF_RESTORE_SIGMASK flag.
 735                         */
 736                        if (test_thread_flag(TIF_RESTORE_SIGMASK))
 737                                clear_thread_flag(TIF_RESTORE_SIGMASK);
 738                }
 739                return;
 740        }
 741
 742 no_signal:
 743        if (syscall) {
 744                /*
 745                 * Handle restarting a different system call.  As above,
 746                 * if a debugger has chosen to restart at a different PC,
 747                 * ignore the restart.
 748                 */
 749                if (retval == -ERESTART_RESTARTBLOCK
 750                    && regs->ARM_pc == continue_addr) {
 751                        if (thumb_mode(regs)) {
 752                                regs->ARM_r7 = __NR_restart_syscall - __NR_SYSCALL_BASE;
 753                                regs->ARM_pc -= 2;
 754                        } else {
 755#if defined(CONFIG_AEABI) && !defined(CONFIG_OABI_COMPAT)
 756                                regs->ARM_r7 = __NR_restart_syscall;
 757                                regs->ARM_pc -= 4;
 758#else
 759                                u32 __user *usp;
 760
 761                                regs->ARM_sp -= 4;
 762                                usp = (u32 __user *)regs->ARM_sp;
 763
 764                                if (put_user(regs->ARM_pc, usp) == 0) {
 765                                        regs->ARM_pc = KERN_RESTART_CODE;
 766                                } else {
 767                                        regs->ARM_sp += 4;
 768                                        force_sigsegv(0, current);
 769                                }
 770#endif
 771                        }
 772                }
 773
 774                /* If there's no signal to deliver, we just put the saved sigmask
 775                 * back.
 776                 */
 777                if (test_thread_flag(TIF_RESTORE_SIGMASK)) {
 778                        clear_thread_flag(TIF_RESTORE_SIGMASK);
 779                        sigprocmask(SIG_SETMASK, &current->saved_sigmask, NULL);
 780                }
 781        }
 782}
 783
 784asmlinkage void
 785do_notify_resume(struct pt_regs *regs, unsigned int thread_flags, int syscall)
 786{
 787        if (thread_flags & _TIF_SIGPENDING)
 788                do_signal(regs, syscall);
 789
 790        if (thread_flags & _TIF_NOTIFY_RESUME) {
 791                clear_thread_flag(TIF_NOTIFY_RESUME);
 792                tracehook_notify_resume(regs);
 793                if (current->replacement_session_keyring)
 794                        key_replace_session_keyring();
 795        }
 796}
 797