This source file includes following definitions.
- copy_fp_to_sigcontext
- copy_fp_from_sigcontext
- copy_fp_to_sigcontext
- copy_fp_from_sigcontext
- save_hw_fp_context
- restore_hw_fp_context
- sc_to_extcontext
- save_msa_extcontext
- restore_msa_extcontext
- save_msa_extcontext
- restore_msa_extcontext
- save_extcontext
- restore_extcontext
- protected_save_fp_context
- protected_restore_fp_context
- setup_sigcontext
- extcontext_max_size
- fpcsr_pending
- restore_sigcontext
- get_sigframe
- SYSCALL_DEFINE1
- SYSCALL_DEFINE3
- sys_sigreturn
- sys_rt_sigreturn
- setup_frame
- setup_rt_frame
- handle_signal
- do_signal
- do_notify_resume
- smp_save_fp_context
- smp_restore_fp_context
- signal_setup
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 #include <linux/cache.h>
  12 #include <linux/context_tracking.h>
  13 #include <linux/irqflags.h>
  14 #include <linux/sched.h>
  15 #include <linux/mm.h>
  16 #include <linux/personality.h>
  17 #include <linux/smp.h>
  18 #include <linux/kernel.h>
  19 #include <linux/signal.h>
  20 #include <linux/errno.h>
  21 #include <linux/wait.h>
  22 #include <linux/ptrace.h>
  23 #include <linux/unistd.h>
  24 #include <linux/uprobes.h>
  25 #include <linux/compiler.h>
  26 #include <linux/syscalls.h>
  27 #include <linux/uaccess.h>
  28 #include <linux/tracehook.h>
  29 
  30 #include <asm/abi.h>
  31 #include <asm/asm.h>
  32 #include <linux/bitops.h>
  33 #include <asm/cacheflush.h>
  34 #include <asm/fpu.h>
  35 #include <asm/sim.h>
  36 #include <asm/ucontext.h>
  37 #include <asm/cpu-features.h>
  38 #include <asm/war.h>
  39 #include <asm/dsp.h>
  40 #include <asm/inst.h>
  41 #include <asm/msa.h>
  42 
  43 #include "signal-common.h"
  44 
  45 static int (*save_fp_context)(void __user *sc);
  46 static int (*restore_fp_context)(void __user *sc);
  47 
  48 struct sigframe {
  49         u32 sf_ass[4];          
  50         u32 sf_pad[2];          
  51 
  52         
  53         struct sigcontext sf_sc;
  54         sigset_t sf_mask;
  55         unsigned long long sf_extcontext[0];
  56 };
  57 
  58 struct rt_sigframe {
  59         u32 rs_ass[4];          
  60         u32 rs_pad[2];          
  61         struct siginfo rs_info;
  62         struct ucontext rs_uc;
  63 };
  64 
  65 #ifdef CONFIG_MIPS_FP_SUPPORT
  66 
  67 
  68 
  69 
  70 
  71 static int copy_fp_to_sigcontext(void __user *sc)
  72 {
  73         struct mips_abi *abi = current->thread.abi;
  74         uint64_t __user *fpregs = sc + abi->off_sc_fpregs;
  75         uint32_t __user *csr = sc + abi->off_sc_fpc_csr;
  76         int i;
  77         int err = 0;
  78         int inc = test_thread_flag(TIF_32BIT_FPREGS) ? 2 : 1;
  79 
  80         for (i = 0; i < NUM_FPU_REGS; i += inc) {
  81                 err |=
  82                     __put_user(get_fpr64(¤t->thread.fpu.fpr[i], 0),
  83                                &fpregs[i]);
  84         }
  85         err |= __put_user(current->thread.fpu.fcr31, csr);
  86 
  87         return err;
  88 }
  89 
  90 static int copy_fp_from_sigcontext(void __user *sc)
  91 {
  92         struct mips_abi *abi = current->thread.abi;
  93         uint64_t __user *fpregs = sc + abi->off_sc_fpregs;
  94         uint32_t __user *csr = sc + abi->off_sc_fpc_csr;
  95         int i;
  96         int err = 0;
  97         int inc = test_thread_flag(TIF_32BIT_FPREGS) ? 2 : 1;
  98         u64 fpr_val;
  99 
 100         for (i = 0; i < NUM_FPU_REGS; i += inc) {
 101                 err |= __get_user(fpr_val, &fpregs[i]);
 102                 set_fpr64(¤t->thread.fpu.fpr[i], 0, fpr_val);
 103         }
 104         err |= __get_user(current->thread.fpu.fcr31, csr);
 105 
 106         return err;
 107 }
 108 
 109 #else 
 110 
 111 static int copy_fp_to_sigcontext(void __user *sc)
 112 {
 113         return 0;
 114 }
 115 
 116 static int copy_fp_from_sigcontext(void __user *sc)
 117 {
 118         return 0;
 119 }
 120 
 121 #endif 
 122 
 123 
 124 
 125 
 126 static int save_hw_fp_context(void __user *sc)
 127 {
 128         struct mips_abi *abi = current->thread.abi;
 129         uint64_t __user *fpregs = sc + abi->off_sc_fpregs;
 130         uint32_t __user *csr = sc + abi->off_sc_fpc_csr;
 131 
 132         return _save_fp_context(fpregs, csr);
 133 }
 134 
 135 static int restore_hw_fp_context(void __user *sc)
 136 {
 137         struct mips_abi *abi = current->thread.abi;
 138         uint64_t __user *fpregs = sc + abi->off_sc_fpregs;
 139         uint32_t __user *csr = sc + abi->off_sc_fpc_csr;
 140 
 141         return _restore_fp_context(fpregs, csr);
 142 }
 143 
 144 
 145 
 146 
 147 
 148 static inline void __user *sc_to_extcontext(void __user *sc)
 149 {
 150         struct ucontext __user *uc;
 151 
 152         
 153 
 154 
 155 
 156 
 157         uc = container_of(sc, struct ucontext, uc_mcontext);
 158         return &uc->uc_extcontext;
 159 }
 160 
 161 #ifdef CONFIG_CPU_HAS_MSA
 162 
 163 static int save_msa_extcontext(void __user *buf)
 164 {
 165         struct msa_extcontext __user *msa = buf;
 166         uint64_t val;
 167         int i, err;
 168 
 169         if (!thread_msa_context_live())
 170                 return 0;
 171 
 172         
 173 
 174 
 175 
 176         preempt_disable();
 177 
 178         if (is_msa_enabled()) {
 179                 
 180 
 181 
 182 
 183 
 184 
 185 
 186                 BUG_ON(IS_ENABLED(CONFIG_EVA));
 187 
 188                 err = __put_user(read_msa_csr(), &msa->csr);
 189                 err |= _save_msa_all_upper(&msa->wr);
 190 
 191                 preempt_enable();
 192         } else {
 193                 preempt_enable();
 194 
 195                 err = __put_user(current->thread.fpu.msacsr, &msa->csr);
 196 
 197                 for (i = 0; i < NUM_FPU_REGS; i++) {
 198                         val = get_fpr64(¤t->thread.fpu.fpr[i], 1);
 199                         err |= __put_user(val, &msa->wr[i]);
 200                 }
 201         }
 202 
 203         err |= __put_user(MSA_EXTCONTEXT_MAGIC, &msa->ext.magic);
 204         err |= __put_user(sizeof(*msa), &msa->ext.size);
 205 
 206         return err ? -EFAULT : sizeof(*msa);
 207 }
 208 
 209 static int restore_msa_extcontext(void __user *buf, unsigned int size)
 210 {
 211         struct msa_extcontext __user *msa = buf;
 212         unsigned long long val;
 213         unsigned int csr;
 214         int i, err;
 215 
 216         if (size != sizeof(*msa))
 217                 return -EINVAL;
 218 
 219         err = get_user(csr, &msa->csr);
 220         if (err)
 221                 return err;
 222 
 223         preempt_disable();
 224 
 225         if (is_msa_enabled()) {
 226                 
 227 
 228 
 229 
 230 
 231 
 232 
 233                 BUG_ON(IS_ENABLED(CONFIG_EVA));
 234 
 235                 write_msa_csr(csr);
 236                 err |= _restore_msa_all_upper(&msa->wr);
 237                 preempt_enable();
 238         } else {
 239                 preempt_enable();
 240 
 241                 current->thread.fpu.msacsr = csr;
 242 
 243                 for (i = 0; i < NUM_FPU_REGS; i++) {
 244                         err |= __get_user(val, &msa->wr[i]);
 245                         set_fpr64(¤t->thread.fpu.fpr[i], 1, val);
 246                 }
 247         }
 248 
 249         return err;
 250 }
 251 
 252 #else 
 253 
 254 static int save_msa_extcontext(void __user *buf)
 255 {
 256         return 0;
 257 }
 258 
 259 static int restore_msa_extcontext(void __user *buf, unsigned int size)
 260 {
 261         return SIGSYS;
 262 }
 263 
 264 #endif 
 265 
 266 static int save_extcontext(void __user *buf)
 267 {
 268         int sz;
 269 
 270         sz = save_msa_extcontext(buf);
 271         if (sz < 0)
 272                 return sz;
 273         buf += sz;
 274 
 275         
 276         if (!sz)
 277                 return 0;
 278 
 279         
 280         if (__put_user(END_EXTCONTEXT_MAGIC, (u32 *)buf))
 281                 return -EFAULT;
 282 
 283         sz += sizeof(((struct extcontext *)NULL)->magic);
 284         return sz;
 285 }
 286 
 287 static int restore_extcontext(void __user *buf)
 288 {
 289         struct extcontext ext;
 290         int err;
 291 
 292         while (1) {
 293                 err = __get_user(ext.magic, (unsigned int *)buf);
 294                 if (err)
 295                         return err;
 296 
 297                 if (ext.magic == END_EXTCONTEXT_MAGIC)
 298                         return 0;
 299 
 300                 err = __get_user(ext.size, (unsigned int *)(buf
 301                         + offsetof(struct extcontext, size)));
 302                 if (err)
 303                         return err;
 304 
 305                 switch (ext.magic) {
 306                 case MSA_EXTCONTEXT_MAGIC:
 307                         err = restore_msa_extcontext(buf, ext.size);
 308                         break;
 309 
 310                 default:
 311                         err = -EINVAL;
 312                         break;
 313                 }
 314 
 315                 if (err)
 316                         return err;
 317 
 318                 buf += ext.size;
 319         }
 320 }
 321 
 322 
 323 
 324 
 325 int protected_save_fp_context(void __user *sc)
 326 {
 327         struct mips_abi *abi = current->thread.abi;
 328         uint64_t __user *fpregs = sc + abi->off_sc_fpregs;
 329         uint32_t __user *csr = sc + abi->off_sc_fpc_csr;
 330         uint32_t __user *used_math = sc + abi->off_sc_used_math;
 331         unsigned int used, ext_sz;
 332         int err;
 333 
 334         used = used_math() ? USED_FP : 0;
 335         if (!used)
 336                 goto fp_done;
 337 
 338         if (!test_thread_flag(TIF_32BIT_FPREGS))
 339                 used |= USED_FR1;
 340         if (test_thread_flag(TIF_HYBRID_FPREGS))
 341                 used |= USED_HYBRID_FPRS;
 342 
 343         
 344 
 345 
 346 
 347         if (IS_ENABLED(CONFIG_EVA))
 348                 lose_fpu(1);
 349 
 350         while (1) {
 351                 lock_fpu_owner();
 352                 if (is_fpu_owner()) {
 353                         err = save_fp_context(sc);
 354                         unlock_fpu_owner();
 355                 } else {
 356                         unlock_fpu_owner();
 357                         err = copy_fp_to_sigcontext(sc);
 358                 }
 359                 if (likely(!err))
 360                         break;
 361                 
 362                 err = __put_user(0, &fpregs[0]) |
 363                         __put_user(0, &fpregs[31]) |
 364                         __put_user(0, csr);
 365                 if (err)
 366                         return err;     
 367         }
 368 
 369 fp_done:
 370         ext_sz = err = save_extcontext(sc_to_extcontext(sc));
 371         if (err < 0)
 372                 return err;
 373         used |= ext_sz ? USED_EXTCONTEXT : 0;
 374 
 375         return __put_user(used, used_math);
 376 }
 377 
 378 int protected_restore_fp_context(void __user *sc)
 379 {
 380         struct mips_abi *abi = current->thread.abi;
 381         uint64_t __user *fpregs = sc + abi->off_sc_fpregs;
 382         uint32_t __user *csr = sc + abi->off_sc_fpc_csr;
 383         uint32_t __user *used_math = sc + abi->off_sc_used_math;
 384         unsigned int used;
 385         int err, sig = 0, tmp __maybe_unused;
 386 
 387         err = __get_user(used, used_math);
 388         conditional_used_math(used & USED_FP);
 389 
 390         
 391 
 392 
 393 
 394         if (err || !(used & USED_FP))
 395                 lose_fpu(0);
 396         if (err)
 397                 return err;
 398         if (!(used & USED_FP))
 399                 goto fp_done;
 400 
 401         err = sig = fpcsr_pending(csr);
 402         if (err < 0)
 403                 return err;
 404 
 405         
 406 
 407 
 408 
 409 
 410         if (IS_ENABLED(CONFIG_EVA))
 411                 lose_fpu(0);
 412 
 413         while (1) {
 414                 lock_fpu_owner();
 415                 if (is_fpu_owner()) {
 416                         err = restore_fp_context(sc);
 417                         unlock_fpu_owner();
 418                 } else {
 419                         unlock_fpu_owner();
 420                         err = copy_fp_from_sigcontext(sc);
 421                 }
 422                 if (likely(!err))
 423                         break;
 424                 
 425                 err = __get_user(tmp, &fpregs[0]) |
 426                         __get_user(tmp, &fpregs[31]) |
 427                         __get_user(tmp, csr);
 428                 if (err)
 429                         break;  
 430         }
 431 
 432 fp_done:
 433         if (!err && (used & USED_EXTCONTEXT))
 434                 err = restore_extcontext(sc_to_extcontext(sc));
 435 
 436         return err ?: sig;
 437 }
 438 
 439 int setup_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
 440 {
 441         int err = 0;
 442         int i;
 443 
 444         err |= __put_user(regs->cp0_epc, &sc->sc_pc);
 445 
 446         err |= __put_user(0, &sc->sc_regs[0]);
 447         for (i = 1; i < 32; i++)
 448                 err |= __put_user(regs->regs[i], &sc->sc_regs[i]);
 449 
 450 #ifdef CONFIG_CPU_HAS_SMARTMIPS
 451         err |= __put_user(regs->acx, &sc->sc_acx);
 452 #endif
 453         err |= __put_user(regs->hi, &sc->sc_mdhi);
 454         err |= __put_user(regs->lo, &sc->sc_mdlo);
 455         if (cpu_has_dsp) {
 456                 err |= __put_user(mfhi1(), &sc->sc_hi1);
 457                 err |= __put_user(mflo1(), &sc->sc_lo1);
 458                 err |= __put_user(mfhi2(), &sc->sc_hi2);
 459                 err |= __put_user(mflo2(), &sc->sc_lo2);
 460                 err |= __put_user(mfhi3(), &sc->sc_hi3);
 461                 err |= __put_user(mflo3(), &sc->sc_lo3);
 462                 err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp);
 463         }
 464 
 465 
 466         
 467 
 468 
 469 
 470         err |= protected_save_fp_context(sc);
 471 
 472         return err;
 473 }
 474 
 475 static size_t extcontext_max_size(void)
 476 {
 477         size_t sz = 0;
 478 
 479         
 480 
 481 
 482 
 483 
 484 
 485 
 486 
 487         if (thread_msa_context_live())
 488                 sz += sizeof(struct msa_extcontext);
 489 
 490         
 491         if (sz)
 492                 sz += sizeof(((struct extcontext *)NULL)->magic);
 493 
 494         return sz;
 495 }
 496 
 497 int fpcsr_pending(unsigned int __user *fpcsr)
 498 {
 499         int err, sig = 0;
 500         unsigned int csr, enabled;
 501 
 502         err = __get_user(csr, fpcsr);
 503         enabled = FPU_CSR_UNI_X | ((csr & FPU_CSR_ALL_E) << 5);
 504         
 505 
 506 
 507 
 508         if (csr & enabled) {
 509                 csr &= ~enabled;
 510                 err |= __put_user(csr, fpcsr);
 511                 sig = SIGFPE;
 512         }
 513         return err ?: sig;
 514 }
 515 
 516 int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
 517 {
 518         unsigned long treg;
 519         int err = 0;
 520         int i;
 521 
 522         
 523         current->restart_block.fn = do_no_restart_syscall;
 524 
 525         err |= __get_user(regs->cp0_epc, &sc->sc_pc);
 526 
 527 #ifdef CONFIG_CPU_HAS_SMARTMIPS
 528         err |= __get_user(regs->acx, &sc->sc_acx);
 529 #endif
 530         err |= __get_user(regs->hi, &sc->sc_mdhi);
 531         err |= __get_user(regs->lo, &sc->sc_mdlo);
 532         if (cpu_has_dsp) {
 533                 err |= __get_user(treg, &sc->sc_hi1); mthi1(treg);
 534                 err |= __get_user(treg, &sc->sc_lo1); mtlo1(treg);
 535                 err |= __get_user(treg, &sc->sc_hi2); mthi2(treg);
 536                 err |= __get_user(treg, &sc->sc_lo2); mtlo2(treg);
 537                 err |= __get_user(treg, &sc->sc_hi3); mthi3(treg);
 538                 err |= __get_user(treg, &sc->sc_lo3); mtlo3(treg);
 539                 err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK);
 540         }
 541 
 542         for (i = 1; i < 32; i++)
 543                 err |= __get_user(regs->regs[i], &sc->sc_regs[i]);
 544 
 545         return err ?: protected_restore_fp_context(sc);
 546 }
 547 
 548 void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs,
 549                           size_t frame_size)
 550 {
 551         unsigned long sp;
 552 
 553         
 554         frame_size += extcontext_max_size();
 555 
 556         
 557         sp = regs->regs[29];
 558 
 559         
 560 
 561 
 562 
 563 
 564         sp -= 32;
 565 
 566         sp = sigsp(sp, ksig);
 567 
 568         return (void __user *)((sp - frame_size) & (ICACHE_REFILLS_WORKAROUND_WAR ? ~(cpu_icache_line_size()-1) : ALMASK));
 569 }
 570 
 571 
 572 
 573 
 574 
 575 #ifdef CONFIG_TRAD_SIGNALS
 576 SYSCALL_DEFINE1(sigsuspend, sigset_t __user *, uset)
 577 {
 578         return sys_rt_sigsuspend(uset, sizeof(sigset_t));
 579 }
 580 #endif
 581 
 582 #ifdef CONFIG_TRAD_SIGNALS
 583 SYSCALL_DEFINE3(sigaction, int, sig, const struct sigaction __user *, act,
 584         struct sigaction __user *, oact)
 585 {
 586         struct k_sigaction new_ka, old_ka;
 587         int ret;
 588         int err = 0;
 589 
 590         if (act) {
 591                 old_sigset_t mask;
 592 
 593                 if (!access_ok(act, sizeof(*act)))
 594                         return -EFAULT;
 595                 err |= __get_user(new_ka.sa.sa_handler, &act->sa_handler);
 596                 err |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
 597                 err |= __get_user(mask, &act->sa_mask.sig[0]);
 598                 if (err)
 599                         return -EFAULT;
 600 
 601                 siginitset(&new_ka.sa.sa_mask, mask);
 602         }
 603 
 604         ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
 605 
 606         if (!ret && oact) {
 607                 if (!access_ok(oact, sizeof(*oact)))
 608                         return -EFAULT;
 609                 err |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
 610                 err |= __put_user(old_ka.sa.sa_handler, &oact->sa_handler);
 611                 err |= __put_user(old_ka.sa.sa_mask.sig[0], oact->sa_mask.sig);
 612                 err |= __put_user(0, &oact->sa_mask.sig[1]);
 613                 err |= __put_user(0, &oact->sa_mask.sig[2]);
 614                 err |= __put_user(0, &oact->sa_mask.sig[3]);
 615                 if (err)
 616                         return -EFAULT;
 617         }
 618 
 619         return ret;
 620 }
 621 #endif
 622 
 623 #ifdef CONFIG_TRAD_SIGNALS
 624 asmlinkage void sys_sigreturn(void)
 625 {
 626         struct sigframe __user *frame;
 627         struct pt_regs *regs;
 628         sigset_t blocked;
 629         int sig;
 630 
 631         regs = current_pt_regs();
 632         frame = (struct sigframe __user *)regs->regs[29];
 633         if (!access_ok(frame, sizeof(*frame)))
 634                 goto badframe;
 635         if (__copy_from_user(&blocked, &frame->sf_mask, sizeof(blocked)))
 636                 goto badframe;
 637 
 638         set_current_blocked(&blocked);
 639 
 640         sig = restore_sigcontext(regs, &frame->sf_sc);
 641         if (sig < 0)
 642                 goto badframe;
 643         else if (sig)
 644                 force_sig(sig);
 645 
 646         
 647 
 648 
 649         __asm__ __volatile__(
 650                 "move\t$29, %0\n\t"
 651                 "j\tsyscall_exit"
 652                 : 
 653                 : "r" (regs));
 654         
 655 
 656 badframe:
 657         force_sig(SIGSEGV);
 658 }
 659 #endif 
 660 
 661 asmlinkage void sys_rt_sigreturn(void)
 662 {
 663         struct rt_sigframe __user *frame;
 664         struct pt_regs *regs;
 665         sigset_t set;
 666         int sig;
 667 
 668         regs = current_pt_regs();
 669         frame = (struct rt_sigframe __user *)regs->regs[29];
 670         if (!access_ok(frame, sizeof(*frame)))
 671                 goto badframe;
 672         if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set)))
 673                 goto badframe;
 674 
 675         set_current_blocked(&set);
 676 
 677         sig = restore_sigcontext(regs, &frame->rs_uc.uc_mcontext);
 678         if (sig < 0)
 679                 goto badframe;
 680         else if (sig)
 681                 force_sig(sig);
 682 
 683         if (restore_altstack(&frame->rs_uc.uc_stack))
 684                 goto badframe;
 685 
 686         
 687 
 688 
 689         __asm__ __volatile__(
 690                 "move\t$29, %0\n\t"
 691                 "j\tsyscall_exit"
 692                 : 
 693                 : "r" (regs));
 694         
 695 
 696 badframe:
 697         force_sig(SIGSEGV);
 698 }
 699 
 700 #ifdef CONFIG_TRAD_SIGNALS
 701 static int setup_frame(void *sig_return, struct ksignal *ksig,
 702                        struct pt_regs *regs, sigset_t *set)
 703 {
 704         struct sigframe __user *frame;
 705         int err = 0;
 706 
 707         frame = get_sigframe(ksig, regs, sizeof(*frame));
 708         if (!access_ok(frame, sizeof (*frame)))
 709                 return -EFAULT;
 710 
 711         err |= setup_sigcontext(regs, &frame->sf_sc);
 712         err |= __copy_to_user(&frame->sf_mask, set, sizeof(*set));
 713         if (err)
 714                 return -EFAULT;
 715 
 716         
 717 
 718 
 719 
 720 
 721 
 722 
 723 
 724 
 725 
 726         regs->regs[ 4] = ksig->sig;
 727         regs->regs[ 5] = 0;
 728         regs->regs[ 6] = (unsigned long) &frame->sf_sc;
 729         regs->regs[29] = (unsigned long) frame;
 730         regs->regs[31] = (unsigned long) sig_return;
 731         regs->cp0_epc = regs->regs[25] = (unsigned long) ksig->ka.sa.sa_handler;
 732 
 733         DEBUGP("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%lx\n",
 734                current->comm, current->pid,
 735                frame, regs->cp0_epc, regs->regs[31]);
 736         return 0;
 737 }
 738 #endif
 739 
 740 static int setup_rt_frame(void *sig_return, struct ksignal *ksig,
 741                           struct pt_regs *regs, sigset_t *set)
 742 {
 743         struct rt_sigframe __user *frame;
 744         int err = 0;
 745 
 746         frame = get_sigframe(ksig, regs, sizeof(*frame));
 747         if (!access_ok(frame, sizeof (*frame)))
 748                 return -EFAULT;
 749 
 750         
 751         err |= copy_siginfo_to_user(&frame->rs_info, &ksig->info);
 752 
 753         
 754         err |= __put_user(0, &frame->rs_uc.uc_flags);
 755         err |= __put_user(NULL, &frame->rs_uc.uc_link);
 756         err |= __save_altstack(&frame->rs_uc.uc_stack, regs->regs[29]);
 757         err |= setup_sigcontext(regs, &frame->rs_uc.uc_mcontext);
 758         err |= __copy_to_user(&frame->rs_uc.uc_sigmask, set, sizeof(*set));
 759 
 760         if (err)
 761                 return -EFAULT;
 762 
 763         
 764 
 765 
 766 
 767 
 768 
 769 
 770 
 771 
 772 
 773         regs->regs[ 4] = ksig->sig;
 774         regs->regs[ 5] = (unsigned long) &frame->rs_info;
 775         regs->regs[ 6] = (unsigned long) &frame->rs_uc;
 776         regs->regs[29] = (unsigned long) frame;
 777         regs->regs[31] = (unsigned long) sig_return;
 778         regs->cp0_epc = regs->regs[25] = (unsigned long) ksig->ka.sa.sa_handler;
 779 
 780         DEBUGP("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%lx\n",
 781                current->comm, current->pid,
 782                frame, regs->cp0_epc, regs->regs[31]);
 783 
 784         return 0;
 785 }
 786 
 787 struct mips_abi mips_abi = {
 788 #ifdef CONFIG_TRAD_SIGNALS
 789         .setup_frame    = setup_frame,
 790 #endif
 791         .setup_rt_frame = setup_rt_frame,
 792         .restart        = __NR_restart_syscall,
 793 
 794         .off_sc_fpregs = offsetof(struct sigcontext, sc_fpregs),
 795         .off_sc_fpc_csr = offsetof(struct sigcontext, sc_fpc_csr),
 796         .off_sc_used_math = offsetof(struct sigcontext, sc_used_math),
 797 
 798         .vdso           = &vdso_image,
 799 };
 800 
 801 static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)
 802 {
 803         sigset_t *oldset = sigmask_to_save();
 804         int ret;
 805         struct mips_abi *abi = current->thread.abi;
 806         void *vdso = current->mm->context.vdso;
 807 
 808         
 809 
 810 
 811 
 812 
 813 
 814         dsemul_thread_rollback(regs);
 815 
 816         if (regs->regs[0]) {
 817                 switch(regs->regs[2]) {
 818                 case ERESTART_RESTARTBLOCK:
 819                 case ERESTARTNOHAND:
 820                         regs->regs[2] = EINTR;
 821                         break;
 822                 case ERESTARTSYS:
 823                         if (!(ksig->ka.sa.sa_flags & SA_RESTART)) {
 824                                 regs->regs[2] = EINTR;
 825                                 break;
 826                         }
 827                 
 828                 case ERESTARTNOINTR:
 829                         regs->regs[7] = regs->regs[26];
 830                         regs->regs[2] = regs->regs[0];
 831                         regs->cp0_epc -= 4;
 832                 }
 833 
 834                 regs->regs[0] = 0;              
 835         }
 836 
 837         rseq_signal_deliver(ksig, regs);
 838 
 839         if (sig_uses_siginfo(&ksig->ka, abi))
 840                 ret = abi->setup_rt_frame(vdso + abi->vdso->off_rt_sigreturn,
 841                                           ksig, regs, oldset);
 842         else
 843                 ret = abi->setup_frame(vdso + abi->vdso->off_sigreturn,
 844                                        ksig, regs, oldset);
 845 
 846         signal_setup_done(ret, ksig, 0);
 847 }
 848 
 849 static void do_signal(struct pt_regs *regs)
 850 {
 851         struct ksignal ksig;
 852 
 853         if (get_signal(&ksig)) {
 854                 
 855                 handle_signal(&ksig, regs);
 856                 return;
 857         }
 858 
 859         if (regs->regs[0]) {
 860                 switch (regs->regs[2]) {
 861                 case ERESTARTNOHAND:
 862                 case ERESTARTSYS:
 863                 case ERESTARTNOINTR:
 864                         regs->regs[2] = regs->regs[0];
 865                         regs->regs[7] = regs->regs[26];
 866                         regs->cp0_epc -= 4;
 867                         break;
 868 
 869                 case ERESTART_RESTARTBLOCK:
 870                         regs->regs[2] = current->thread.abi->restart;
 871                         regs->regs[7] = regs->regs[26];
 872                         regs->cp0_epc -= 4;
 873                         break;
 874                 }
 875                 regs->regs[0] = 0;      
 876         }
 877 
 878         
 879 
 880 
 881 
 882         restore_saved_sigmask();
 883 }
 884 
 885 
 886 
 887 
 888 
 889 asmlinkage void do_notify_resume(struct pt_regs *regs, void *unused,
 890         __u32 thread_info_flags)
 891 {
 892         local_irq_enable();
 893 
 894         user_exit();
 895 
 896         if (thread_info_flags & _TIF_UPROBE)
 897                 uprobe_notify_resume(regs);
 898 
 899         
 900         if (thread_info_flags & _TIF_SIGPENDING)
 901                 do_signal(regs);
 902 
 903         if (thread_info_flags & _TIF_NOTIFY_RESUME) {
 904                 clear_thread_flag(TIF_NOTIFY_RESUME);
 905                 tracehook_notify_resume(regs);
 906                 rseq_handle_notify_resume(NULL, regs);
 907         }
 908 
 909         user_enter();
 910 }
 911 
 912 #if defined(CONFIG_SMP) && defined(CONFIG_MIPS_FP_SUPPORT)
 913 static int smp_save_fp_context(void __user *sc)
 914 {
 915         return raw_cpu_has_fpu
 916                ? save_hw_fp_context(sc)
 917                : copy_fp_to_sigcontext(sc);
 918 }
 919 
 920 static int smp_restore_fp_context(void __user *sc)
 921 {
 922         return raw_cpu_has_fpu
 923                ? restore_hw_fp_context(sc)
 924                : copy_fp_from_sigcontext(sc);
 925 }
 926 #endif
 927 
 928 static int signal_setup(void)
 929 {
 930         
 931 
 932 
 933 
 934 
 935         BUILD_BUG_ON((offsetof(struct sigframe, sf_extcontext) -
 936                       offsetof(struct sigframe, sf_sc)) !=
 937                      (offsetof(struct rt_sigframe, rs_uc.uc_extcontext) -
 938                       offsetof(struct rt_sigframe, rs_uc.uc_mcontext)));
 939 
 940 #if defined(CONFIG_SMP) && defined(CONFIG_MIPS_FP_SUPPORT)
 941         
 942         save_fp_context = smp_save_fp_context;
 943         restore_fp_context = smp_restore_fp_context;
 944 #else
 945         if (cpu_has_fpu) {
 946                 save_fp_context = save_hw_fp_context;
 947                 restore_fp_context = restore_hw_fp_context;
 948         } else {
 949                 save_fp_context = copy_fp_to_sigcontext;
 950                 restore_fp_context = copy_fp_from_sigcontext;
 951         }
 952 #endif 
 953 
 954         return 0;
 955 }
 956 
 957 arch_initcall(signal_setup);