0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <linux/cache.h>
0012 #include <linux/context_tracking.h>
0013 #include <linux/irqflags.h>
0014 #include <linux/sched.h>
0015 #include <linux/mm.h>
0016 #include <linux/personality.h>
0017 #include <linux/smp.h>
0018 #include <linux/kernel.h>
0019 #include <linux/signal.h>
0020 #include <linux/errno.h>
0021 #include <linux/wait.h>
0022 #include <linux/ptrace.h>
0023 #include <linux/unistd.h>
0024 #include <linux/uprobes.h>
0025 #include <linux/compiler.h>
0026 #include <linux/syscalls.h>
0027 #include <linux/uaccess.h>
0028 #include <linux/resume_user_mode.h>
0029
0030 #include <asm/abi.h>
0031 #include <asm/asm.h>
0032 #include <linux/bitops.h>
0033 #include <asm/cacheflush.h>
0034 #include <asm/fpu.h>
0035 #include <asm/sim.h>
0036 #include <asm/ucontext.h>
0037 #include <asm/cpu-features.h>
0038 #include <asm/dsp.h>
0039 #include <asm/inst.h>
0040 #include <asm/msa.h>
0041
0042 #include "signal-common.h"
0043
0044 static int (*save_fp_context)(void __user *sc);
0045 static int (*restore_fp_context)(void __user *sc);
0046
0047 struct sigframe {
0048 u32 sf_ass[4];
0049 u32 sf_pad[2];
0050
0051
0052 struct sigcontext sf_sc;
0053 sigset_t sf_mask;
0054 unsigned long long sf_extcontext[];
0055 };
0056
0057 struct rt_sigframe {
0058 u32 rs_ass[4];
0059 u32 rs_pad[2];
0060 struct siginfo rs_info;
0061 struct ucontext rs_uc;
0062 };
0063
0064 #ifdef CONFIG_MIPS_FP_SUPPORT
0065
0066
0067
0068
0069
0070 static int copy_fp_to_sigcontext(void __user *sc)
0071 {
0072 struct mips_abi *abi = current->thread.abi;
0073 uint64_t __user *fpregs = sc + abi->off_sc_fpregs;
0074 uint32_t __user *csr = sc + abi->off_sc_fpc_csr;
0075 int i;
0076 int err = 0;
0077 int inc = test_thread_flag(TIF_32BIT_FPREGS) ? 2 : 1;
0078
0079 for (i = 0; i < NUM_FPU_REGS; i += inc) {
0080 err |=
0081 __put_user(get_fpr64(¤t->thread.fpu.fpr[i], 0),
0082 &fpregs[i]);
0083 }
0084 err |= __put_user(current->thread.fpu.fcr31, csr);
0085
0086 return err;
0087 }
0088
0089 static int copy_fp_from_sigcontext(void __user *sc)
0090 {
0091 struct mips_abi *abi = current->thread.abi;
0092 uint64_t __user *fpregs = sc + abi->off_sc_fpregs;
0093 uint32_t __user *csr = sc + abi->off_sc_fpc_csr;
0094 int i;
0095 int err = 0;
0096 int inc = test_thread_flag(TIF_32BIT_FPREGS) ? 2 : 1;
0097 u64 fpr_val;
0098
0099 for (i = 0; i < NUM_FPU_REGS; i += inc) {
0100 err |= __get_user(fpr_val, &fpregs[i]);
0101 set_fpr64(¤t->thread.fpu.fpr[i], 0, fpr_val);
0102 }
0103 err |= __get_user(current->thread.fpu.fcr31, csr);
0104
0105 return err;
0106 }
0107
0108 #else
0109
0110 static int copy_fp_to_sigcontext(void __user *sc)
0111 {
0112 return 0;
0113 }
0114
0115 static int copy_fp_from_sigcontext(void __user *sc)
0116 {
0117 return 0;
0118 }
0119
0120 #endif
0121
0122
0123
0124
0125 static int save_hw_fp_context(void __user *sc)
0126 {
0127 struct mips_abi *abi = current->thread.abi;
0128 uint64_t __user *fpregs = sc + abi->off_sc_fpregs;
0129 uint32_t __user *csr = sc + abi->off_sc_fpc_csr;
0130
0131 return _save_fp_context(fpregs, csr);
0132 }
0133
0134 static int restore_hw_fp_context(void __user *sc)
0135 {
0136 struct mips_abi *abi = current->thread.abi;
0137 uint64_t __user *fpregs = sc + abi->off_sc_fpregs;
0138 uint32_t __user *csr = sc + abi->off_sc_fpc_csr;
0139
0140 return _restore_fp_context(fpregs, csr);
0141 }
0142
0143
0144
0145
0146
0147 static inline void __user *sc_to_extcontext(void __user *sc)
0148 {
0149 struct ucontext __user *uc;
0150
0151
0152
0153
0154
0155
0156 uc = container_of(sc, struct ucontext, uc_mcontext);
0157 return &uc->uc_extcontext;
0158 }
0159
0160 #ifdef CONFIG_CPU_HAS_MSA
0161
0162 static int save_msa_extcontext(void __user *buf)
0163 {
0164 struct msa_extcontext __user *msa = buf;
0165 uint64_t val;
0166 int i, err;
0167
0168 if (!thread_msa_context_live())
0169 return 0;
0170
0171
0172
0173
0174
0175 preempt_disable();
0176
0177 if (is_msa_enabled()) {
0178
0179
0180
0181
0182
0183
0184
0185 BUG_ON(IS_ENABLED(CONFIG_EVA));
0186
0187 err = __put_user(read_msa_csr(), &msa->csr);
0188 err |= _save_msa_all_upper(&msa->wr);
0189
0190 preempt_enable();
0191 } else {
0192 preempt_enable();
0193
0194 err = __put_user(current->thread.fpu.msacsr, &msa->csr);
0195
0196 for (i = 0; i < NUM_FPU_REGS; i++) {
0197 val = get_fpr64(¤t->thread.fpu.fpr[i], 1);
0198 err |= __put_user(val, &msa->wr[i]);
0199 }
0200 }
0201
0202 err |= __put_user(MSA_EXTCONTEXT_MAGIC, &msa->ext.magic);
0203 err |= __put_user(sizeof(*msa), &msa->ext.size);
0204
0205 return err ? -EFAULT : sizeof(*msa);
0206 }
0207
0208 static int restore_msa_extcontext(void __user *buf, unsigned int size)
0209 {
0210 struct msa_extcontext __user *msa = buf;
0211 unsigned long long val;
0212 unsigned int csr;
0213 int i, err;
0214
0215 if (size != sizeof(*msa))
0216 return -EINVAL;
0217
0218 err = get_user(csr, &msa->csr);
0219 if (err)
0220 return err;
0221
0222 preempt_disable();
0223
0224 if (is_msa_enabled()) {
0225
0226
0227
0228
0229
0230
0231
0232 BUG_ON(IS_ENABLED(CONFIG_EVA));
0233
0234 write_msa_csr(csr);
0235 err |= _restore_msa_all_upper(&msa->wr);
0236 preempt_enable();
0237 } else {
0238 preempt_enable();
0239
0240 current->thread.fpu.msacsr = csr;
0241
0242 for (i = 0; i < NUM_FPU_REGS; i++) {
0243 err |= __get_user(val, &msa->wr[i]);
0244 set_fpr64(¤t->thread.fpu.fpr[i], 1, val);
0245 }
0246 }
0247
0248 return err;
0249 }
0250
0251 #else
0252
0253 static int save_msa_extcontext(void __user *buf)
0254 {
0255 return 0;
0256 }
0257
0258 static int restore_msa_extcontext(void __user *buf, unsigned int size)
0259 {
0260 return SIGSYS;
0261 }
0262
0263 #endif
0264
0265 static int save_extcontext(void __user *buf)
0266 {
0267 int sz;
0268
0269 sz = save_msa_extcontext(buf);
0270 if (sz < 0)
0271 return sz;
0272 buf += sz;
0273
0274
0275 if (!sz)
0276 return 0;
0277
0278
0279 if (__put_user(END_EXTCONTEXT_MAGIC, (u32 *)buf))
0280 return -EFAULT;
0281
0282 sz += sizeof(((struct extcontext *)NULL)->magic);
0283 return sz;
0284 }
0285
0286 static int restore_extcontext(void __user *buf)
0287 {
0288 struct extcontext ext;
0289 int err;
0290
0291 while (1) {
0292 err = __get_user(ext.magic, (unsigned int *)buf);
0293 if (err)
0294 return err;
0295
0296 if (ext.magic == END_EXTCONTEXT_MAGIC)
0297 return 0;
0298
0299 err = __get_user(ext.size, (unsigned int *)(buf
0300 + offsetof(struct extcontext, size)));
0301 if (err)
0302 return err;
0303
0304 switch (ext.magic) {
0305 case MSA_EXTCONTEXT_MAGIC:
0306 err = restore_msa_extcontext(buf, ext.size);
0307 break;
0308
0309 default:
0310 err = -EINVAL;
0311 break;
0312 }
0313
0314 if (err)
0315 return err;
0316
0317 buf += ext.size;
0318 }
0319 }
0320
0321
0322
0323
0324 int protected_save_fp_context(void __user *sc)
0325 {
0326 struct mips_abi *abi = current->thread.abi;
0327 uint64_t __user *fpregs = sc + abi->off_sc_fpregs;
0328 uint32_t __user *csr = sc + abi->off_sc_fpc_csr;
0329 uint32_t __user *used_math = sc + abi->off_sc_used_math;
0330 unsigned int used, ext_sz;
0331 int err;
0332
0333 used = used_math() ? USED_FP : 0;
0334 if (!used)
0335 goto fp_done;
0336
0337 if (!test_thread_flag(TIF_32BIT_FPREGS))
0338 used |= USED_FR1;
0339 if (test_thread_flag(TIF_HYBRID_FPREGS))
0340 used |= USED_HYBRID_FPRS;
0341
0342
0343
0344
0345
0346 if (IS_ENABLED(CONFIG_EVA))
0347 lose_fpu(1);
0348
0349 while (1) {
0350 lock_fpu_owner();
0351 if (is_fpu_owner()) {
0352 err = save_fp_context(sc);
0353 unlock_fpu_owner();
0354 } else {
0355 unlock_fpu_owner();
0356 err = copy_fp_to_sigcontext(sc);
0357 }
0358 if (likely(!err))
0359 break;
0360
0361 err = __put_user(0, &fpregs[0]) |
0362 __put_user(0, &fpregs[31]) |
0363 __put_user(0, csr);
0364 if (err)
0365 return err;
0366 }
0367
0368 fp_done:
0369 ext_sz = err = save_extcontext(sc_to_extcontext(sc));
0370 if (err < 0)
0371 return err;
0372 used |= ext_sz ? USED_EXTCONTEXT : 0;
0373
0374 return __put_user(used, used_math);
0375 }
0376
0377 int protected_restore_fp_context(void __user *sc)
0378 {
0379 struct mips_abi *abi = current->thread.abi;
0380 uint64_t __user *fpregs = sc + abi->off_sc_fpregs;
0381 uint32_t __user *csr = sc + abi->off_sc_fpc_csr;
0382 uint32_t __user *used_math = sc + abi->off_sc_used_math;
0383 unsigned int used;
0384 int err, sig = 0, tmp __maybe_unused;
0385
0386 err = __get_user(used, used_math);
0387 conditional_used_math(used & USED_FP);
0388
0389
0390
0391
0392
0393 if (err || !(used & USED_FP))
0394 lose_fpu(0);
0395 if (err)
0396 return err;
0397 if (!(used & USED_FP))
0398 goto fp_done;
0399
0400 err = sig = fpcsr_pending(csr);
0401 if (err < 0)
0402 return err;
0403
0404
0405
0406
0407
0408
0409 if (IS_ENABLED(CONFIG_EVA))
0410 lose_fpu(0);
0411
0412 while (1) {
0413 lock_fpu_owner();
0414 if (is_fpu_owner()) {
0415 err = restore_fp_context(sc);
0416 unlock_fpu_owner();
0417 } else {
0418 unlock_fpu_owner();
0419 err = copy_fp_from_sigcontext(sc);
0420 }
0421 if (likely(!err))
0422 break;
0423
0424 err = __get_user(tmp, &fpregs[0]) |
0425 __get_user(tmp, &fpregs[31]) |
0426 __get_user(tmp, csr);
0427 if (err)
0428 break;
0429 }
0430
0431 fp_done:
0432 if (!err && (used & USED_EXTCONTEXT))
0433 err = restore_extcontext(sc_to_extcontext(sc));
0434
0435 return err ?: sig;
0436 }
0437
0438 int setup_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
0439 {
0440 int err = 0;
0441 int i;
0442
0443 err |= __put_user(regs->cp0_epc, &sc->sc_pc);
0444
0445 err |= __put_user(0, &sc->sc_regs[0]);
0446 for (i = 1; i < 32; i++)
0447 err |= __put_user(regs->regs[i], &sc->sc_regs[i]);
0448
0449 #ifdef CONFIG_CPU_HAS_SMARTMIPS
0450 err |= __put_user(regs->acx, &sc->sc_acx);
0451 #endif
0452 err |= __put_user(regs->hi, &sc->sc_mdhi);
0453 err |= __put_user(regs->lo, &sc->sc_mdlo);
0454 if (cpu_has_dsp) {
0455 err |= __put_user(mfhi1(), &sc->sc_hi1);
0456 err |= __put_user(mflo1(), &sc->sc_lo1);
0457 err |= __put_user(mfhi2(), &sc->sc_hi2);
0458 err |= __put_user(mflo2(), &sc->sc_lo2);
0459 err |= __put_user(mfhi3(), &sc->sc_hi3);
0460 err |= __put_user(mflo3(), &sc->sc_lo3);
0461 err |= __put_user(rddsp(DSP_MASK), &sc->sc_dsp);
0462 }
0463
0464
0465
0466
0467
0468
0469 err |= protected_save_fp_context(sc);
0470
0471 return err;
0472 }
0473
0474 static size_t extcontext_max_size(void)
0475 {
0476 size_t sz = 0;
0477
0478
0479
0480
0481
0482
0483
0484
0485
0486 if (thread_msa_context_live())
0487 sz += sizeof(struct msa_extcontext);
0488
0489
0490 if (sz)
0491 sz += sizeof(((struct extcontext *)NULL)->magic);
0492
0493 return sz;
0494 }
0495
0496 int fpcsr_pending(unsigned int __user *fpcsr)
0497 {
0498 int err, sig = 0;
0499 unsigned int csr, enabled;
0500
0501 err = __get_user(csr, fpcsr);
0502 enabled = FPU_CSR_UNI_X | ((csr & FPU_CSR_ALL_E) << 5);
0503
0504
0505
0506
0507 if (csr & enabled) {
0508 csr &= ~enabled;
0509 err |= __put_user(csr, fpcsr);
0510 sig = SIGFPE;
0511 }
0512 return err ?: sig;
0513 }
0514
0515 int restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
0516 {
0517 unsigned long treg;
0518 int err = 0;
0519 int i;
0520
0521
0522 current->restart_block.fn = do_no_restart_syscall;
0523
0524 err |= __get_user(regs->cp0_epc, &sc->sc_pc);
0525
0526 #ifdef CONFIG_CPU_HAS_SMARTMIPS
0527 err |= __get_user(regs->acx, &sc->sc_acx);
0528 #endif
0529 err |= __get_user(regs->hi, &sc->sc_mdhi);
0530 err |= __get_user(regs->lo, &sc->sc_mdlo);
0531 if (cpu_has_dsp) {
0532 err |= __get_user(treg, &sc->sc_hi1); mthi1(treg);
0533 err |= __get_user(treg, &sc->sc_lo1); mtlo1(treg);
0534 err |= __get_user(treg, &sc->sc_hi2); mthi2(treg);
0535 err |= __get_user(treg, &sc->sc_lo2); mtlo2(treg);
0536 err |= __get_user(treg, &sc->sc_hi3); mthi3(treg);
0537 err |= __get_user(treg, &sc->sc_lo3); mtlo3(treg);
0538 err |= __get_user(treg, &sc->sc_dsp); wrdsp(treg, DSP_MASK);
0539 }
0540
0541 for (i = 1; i < 32; i++)
0542 err |= __get_user(regs->regs[i], &sc->sc_regs[i]);
0543
0544 return err ?: protected_restore_fp_context(sc);
0545 }
0546
0547 #ifdef CONFIG_WAR_ICACHE_REFILLS
0548 #define SIGMASK ~(cpu_icache_line_size()-1)
0549 #else
0550 #define SIGMASK ALMASK
0551 #endif
0552
0553 void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs,
0554 size_t frame_size)
0555 {
0556 unsigned long sp;
0557
0558
0559 frame_size += extcontext_max_size();
0560
0561
0562 sp = regs->regs[29];
0563
0564
0565
0566
0567
0568 if (on_sig_stack(sp) && !likely(on_sig_stack(sp - frame_size)))
0569 return (void __user __force *)(-1UL);
0570
0571
0572
0573
0574
0575
0576 sp -= 32;
0577
0578 sp = sigsp(sp, ksig);
0579
0580 return (void __user *)((sp - frame_size) & SIGMASK);
0581 }
0582
0583
0584
0585
0586
0587 #ifdef CONFIG_TRAD_SIGNALS
0588 SYSCALL_DEFINE1(sigsuspend, sigset_t __user *, uset)
0589 {
0590 return sys_rt_sigsuspend(uset, sizeof(sigset_t));
0591 }
0592 #endif
0593
0594 #ifdef CONFIG_TRAD_SIGNALS
0595 SYSCALL_DEFINE3(sigaction, int, sig, const struct sigaction __user *, act,
0596 struct sigaction __user *, oact)
0597 {
0598 struct k_sigaction new_ka, old_ka;
0599 int ret;
0600 int err = 0;
0601
0602 if (act) {
0603 old_sigset_t mask;
0604
0605 if (!access_ok(act, sizeof(*act)))
0606 return -EFAULT;
0607 err |= __get_user(new_ka.sa.sa_handler, &act->sa_handler);
0608 err |= __get_user(new_ka.sa.sa_flags, &act->sa_flags);
0609 err |= __get_user(mask, &act->sa_mask.sig[0]);
0610 if (err)
0611 return -EFAULT;
0612
0613 siginitset(&new_ka.sa.sa_mask, mask);
0614 }
0615
0616 ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL);
0617
0618 if (!ret && oact) {
0619 if (!access_ok(oact, sizeof(*oact)))
0620 return -EFAULT;
0621 err |= __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
0622 err |= __put_user(old_ka.sa.sa_handler, &oact->sa_handler);
0623 err |= __put_user(old_ka.sa.sa_mask.sig[0], oact->sa_mask.sig);
0624 err |= __put_user(0, &oact->sa_mask.sig[1]);
0625 err |= __put_user(0, &oact->sa_mask.sig[2]);
0626 err |= __put_user(0, &oact->sa_mask.sig[3]);
0627 if (err)
0628 return -EFAULT;
0629 }
0630
0631 return ret;
0632 }
0633 #endif
0634
0635 #ifdef CONFIG_TRAD_SIGNALS
0636 asmlinkage void sys_sigreturn(void)
0637 {
0638 struct sigframe __user *frame;
0639 struct pt_regs *regs;
0640 sigset_t blocked;
0641 int sig;
0642
0643 regs = current_pt_regs();
0644 frame = (struct sigframe __user *)regs->regs[29];
0645 if (!access_ok(frame, sizeof(*frame)))
0646 goto badframe;
0647 if (__copy_from_user(&blocked, &frame->sf_mask, sizeof(blocked)))
0648 goto badframe;
0649
0650 set_current_blocked(&blocked);
0651
0652 sig = restore_sigcontext(regs, &frame->sf_sc);
0653 if (sig < 0)
0654 goto badframe;
0655 else if (sig)
0656 force_sig(sig);
0657
0658
0659
0660
0661 __asm__ __volatile__(
0662 "move\t$29, %0\n\t"
0663 "j\tsyscall_exit"
0664 :
0665 : "r" (regs));
0666
0667
0668 badframe:
0669 force_sig(SIGSEGV);
0670 }
0671 #endif
0672
0673 asmlinkage void sys_rt_sigreturn(void)
0674 {
0675 struct rt_sigframe __user *frame;
0676 struct pt_regs *regs;
0677 sigset_t set;
0678 int sig;
0679
0680 regs = current_pt_regs();
0681 frame = (struct rt_sigframe __user *)regs->regs[29];
0682 if (!access_ok(frame, sizeof(*frame)))
0683 goto badframe;
0684 if (__copy_from_user(&set, &frame->rs_uc.uc_sigmask, sizeof(set)))
0685 goto badframe;
0686
0687 set_current_blocked(&set);
0688
0689 sig = restore_sigcontext(regs, &frame->rs_uc.uc_mcontext);
0690 if (sig < 0)
0691 goto badframe;
0692 else if (sig)
0693 force_sig(sig);
0694
0695 if (restore_altstack(&frame->rs_uc.uc_stack))
0696 goto badframe;
0697
0698
0699
0700
0701 __asm__ __volatile__(
0702 "move\t$29, %0\n\t"
0703 "j\tsyscall_exit"
0704 :
0705 : "r" (regs));
0706
0707
0708 badframe:
0709 force_sig(SIGSEGV);
0710 }
0711
0712 #ifdef CONFIG_TRAD_SIGNALS
0713 static int setup_frame(void *sig_return, struct ksignal *ksig,
0714 struct pt_regs *regs, sigset_t *set)
0715 {
0716 struct sigframe __user *frame;
0717 int err = 0;
0718
0719 frame = get_sigframe(ksig, regs, sizeof(*frame));
0720 if (!access_ok(frame, sizeof (*frame)))
0721 return -EFAULT;
0722
0723 err |= setup_sigcontext(regs, &frame->sf_sc);
0724 err |= __copy_to_user(&frame->sf_mask, set, sizeof(*set));
0725 if (err)
0726 return -EFAULT;
0727
0728
0729
0730
0731
0732
0733
0734
0735
0736
0737
0738 regs->regs[ 4] = ksig->sig;
0739 regs->regs[ 5] = 0;
0740 regs->regs[ 6] = (unsigned long) &frame->sf_sc;
0741 regs->regs[29] = (unsigned long) frame;
0742 regs->regs[31] = (unsigned long) sig_return;
0743 regs->cp0_epc = regs->regs[25] = (unsigned long) ksig->ka.sa.sa_handler;
0744
0745 DEBUGP("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%lx\n",
0746 current->comm, current->pid,
0747 frame, regs->cp0_epc, regs->regs[31]);
0748 return 0;
0749 }
0750 #endif
0751
0752 static int setup_rt_frame(void *sig_return, struct ksignal *ksig,
0753 struct pt_regs *regs, sigset_t *set)
0754 {
0755 struct rt_sigframe __user *frame;
0756
0757 frame = get_sigframe(ksig, regs, sizeof(*frame));
0758 if (!access_ok(frame, sizeof (*frame)))
0759 return -EFAULT;
0760
0761
0762 if (copy_siginfo_to_user(&frame->rs_info, &ksig->info))
0763 return -EFAULT;
0764
0765
0766 if (__put_user(0, &frame->rs_uc.uc_flags))
0767 return -EFAULT;
0768 if (__put_user(NULL, &frame->rs_uc.uc_link))
0769 return -EFAULT;
0770 if (__save_altstack(&frame->rs_uc.uc_stack, regs->regs[29]))
0771 return -EFAULT;
0772 if (setup_sigcontext(regs, &frame->rs_uc.uc_mcontext))
0773 return -EFAULT;
0774 if (__copy_to_user(&frame->rs_uc.uc_sigmask, set, sizeof(*set)))
0775 return -EFAULT;
0776
0777
0778
0779
0780
0781
0782
0783
0784
0785
0786
0787 regs->regs[ 4] = ksig->sig;
0788 regs->regs[ 5] = (unsigned long) &frame->rs_info;
0789 regs->regs[ 6] = (unsigned long) &frame->rs_uc;
0790 regs->regs[29] = (unsigned long) frame;
0791 regs->regs[31] = (unsigned long) sig_return;
0792 regs->cp0_epc = regs->regs[25] = (unsigned long) ksig->ka.sa.sa_handler;
0793
0794 DEBUGP("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%lx\n",
0795 current->comm, current->pid,
0796 frame, regs->cp0_epc, regs->regs[31]);
0797
0798 return 0;
0799 }
0800
0801 struct mips_abi mips_abi = {
0802 #ifdef CONFIG_TRAD_SIGNALS
0803 .setup_frame = setup_frame,
0804 #endif
0805 .setup_rt_frame = setup_rt_frame,
0806 .restart = __NR_restart_syscall,
0807
0808 .off_sc_fpregs = offsetof(struct sigcontext, sc_fpregs),
0809 .off_sc_fpc_csr = offsetof(struct sigcontext, sc_fpc_csr),
0810 .off_sc_used_math = offsetof(struct sigcontext, sc_used_math),
0811
0812 .vdso = &vdso_image,
0813 };
0814
0815 static void handle_signal(struct ksignal *ksig, struct pt_regs *regs)
0816 {
0817 sigset_t *oldset = sigmask_to_save();
0818 int ret;
0819 struct mips_abi *abi = current->thread.abi;
0820 void *vdso = current->mm->context.vdso;
0821
0822
0823
0824
0825
0826
0827
0828 dsemul_thread_rollback(regs);
0829
0830 if (regs->regs[0]) {
0831 switch(regs->regs[2]) {
0832 case ERESTART_RESTARTBLOCK:
0833 case ERESTARTNOHAND:
0834 regs->regs[2] = EINTR;
0835 break;
0836 case ERESTARTSYS:
0837 if (!(ksig->ka.sa.sa_flags & SA_RESTART)) {
0838 regs->regs[2] = EINTR;
0839 break;
0840 }
0841 fallthrough;
0842 case ERESTARTNOINTR:
0843 regs->regs[7] = regs->regs[26];
0844 regs->regs[2] = regs->regs[0];
0845 regs->cp0_epc -= 4;
0846 }
0847
0848 regs->regs[0] = 0;
0849 }
0850
0851 rseq_signal_deliver(ksig, regs);
0852
0853 if (sig_uses_siginfo(&ksig->ka, abi))
0854 ret = abi->setup_rt_frame(vdso + abi->vdso->off_rt_sigreturn,
0855 ksig, regs, oldset);
0856 else
0857 ret = abi->setup_frame(vdso + abi->vdso->off_sigreturn,
0858 ksig, regs, oldset);
0859
0860 signal_setup_done(ret, ksig, 0);
0861 }
0862
0863 static void do_signal(struct pt_regs *regs)
0864 {
0865 struct ksignal ksig;
0866
0867 if (get_signal(&ksig)) {
0868
0869 handle_signal(&ksig, regs);
0870 return;
0871 }
0872
0873 if (regs->regs[0]) {
0874 switch (regs->regs[2]) {
0875 case ERESTARTNOHAND:
0876 case ERESTARTSYS:
0877 case ERESTARTNOINTR:
0878 regs->regs[2] = regs->regs[0];
0879 regs->regs[7] = regs->regs[26];
0880 regs->cp0_epc -= 4;
0881 break;
0882
0883 case ERESTART_RESTARTBLOCK:
0884 regs->regs[2] = current->thread.abi->restart;
0885 regs->regs[7] = regs->regs[26];
0886 regs->cp0_epc -= 4;
0887 break;
0888 }
0889 regs->regs[0] = 0;
0890 }
0891
0892
0893
0894
0895
0896 restore_saved_sigmask();
0897 }
0898
0899
0900
0901
0902
0903 asmlinkage void do_notify_resume(struct pt_regs *regs, void *unused,
0904 __u32 thread_info_flags)
0905 {
0906 local_irq_enable();
0907
0908 user_exit();
0909
0910 if (thread_info_flags & _TIF_UPROBE)
0911 uprobe_notify_resume(regs);
0912
0913
0914 if (thread_info_flags & (_TIF_SIGPENDING | _TIF_NOTIFY_SIGNAL))
0915 do_signal(regs);
0916
0917 if (thread_info_flags & _TIF_NOTIFY_RESUME)
0918 resume_user_mode_work(regs);
0919
0920 user_enter();
0921 }
0922
0923 #if defined(CONFIG_SMP) && defined(CONFIG_MIPS_FP_SUPPORT)
0924 static int smp_save_fp_context(void __user *sc)
0925 {
0926 return raw_cpu_has_fpu
0927 ? save_hw_fp_context(sc)
0928 : copy_fp_to_sigcontext(sc);
0929 }
0930
0931 static int smp_restore_fp_context(void __user *sc)
0932 {
0933 return raw_cpu_has_fpu
0934 ? restore_hw_fp_context(sc)
0935 : copy_fp_from_sigcontext(sc);
0936 }
0937 #endif
0938
0939 static int signal_setup(void)
0940 {
0941
0942
0943
0944
0945
0946 BUILD_BUG_ON((offsetof(struct sigframe, sf_extcontext) -
0947 offsetof(struct sigframe, sf_sc)) !=
0948 (offsetof(struct rt_sigframe, rs_uc.uc_extcontext) -
0949 offsetof(struct rt_sigframe, rs_uc.uc_mcontext)));
0950
0951 #if defined(CONFIG_SMP) && defined(CONFIG_MIPS_FP_SUPPORT)
0952
0953 save_fp_context = smp_save_fp_context;
0954 restore_fp_context = smp_restore_fp_context;
0955 #else
0956 if (cpu_has_fpu) {
0957 save_fp_context = save_hw_fp_context;
0958 restore_fp_context = restore_hw_fp_context;
0959 } else {
0960 save_fp_context = copy_fp_to_sigcontext;
0961 restore_fp_context = copy_fp_from_sigcontext;
0962 }
0963 #endif
0964
0965 return 0;
0966 }
0967
0968 arch_initcall(signal_setup);