0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <linux/sched.h>
0011 #include <linux/kernel.h>
0012 #include <linux/signal.h>
0013 #include <linux/errno.h>
0014 #include <linux/wait.h>
0015 #include <linux/ptrace.h>
0016 #include <linux/unistd.h>
0017 #include <linux/mm.h>
0018 #include <linux/tty.h>
0019 #include <linux/smp.h>
0020 #include <linux/binfmts.h> /* do_coredum */
0021 #include <linux/bitops.h>
0022 #include <linux/resume_user_mode.h>
0023
0024 #include <linux/uaccess.h>
0025 #include <asm/ptrace.h>
0026 #include <asm/cacheflush.h> /* flush_sig_insns */
0027 #include <asm/switch_to.h>
0028
0029 #include "sigutil.h"
0030 #include "kernel.h"
0031
0032 extern void fpsave(unsigned long *fpregs, unsigned long *fsr,
0033 void *fpqueue, unsigned long *fpqdepth);
0034 extern void fpload(unsigned long *fpregs, unsigned long *fsr);
0035
0036 struct signal_frame {
0037 struct sparc_stackf ss;
0038 __siginfo32_t info;
0039 __siginfo_fpu_t __user *fpu_save;
0040 unsigned long insns[2] __attribute__ ((aligned (8)));
0041 unsigned int extramask[_NSIG_WORDS - 1];
0042 unsigned int extra_size;
0043 __siginfo_rwin_t __user *rwin_save;
0044 } __attribute__((aligned(8)));
0045
0046 struct rt_signal_frame {
0047 struct sparc_stackf ss;
0048 siginfo_t info;
0049 struct pt_regs regs;
0050 sigset_t mask;
0051 __siginfo_fpu_t __user *fpu_save;
0052 unsigned int insns[2];
0053 stack_t stack;
0054 unsigned int extra_size;
0055 __siginfo_rwin_t __user *rwin_save;
0056 } __attribute__((aligned(8)));
0057
0058
0059 #define SF_ALIGNEDSZ (((sizeof(struct signal_frame) + 7) & (~7)))
0060 #define RT_ALIGNEDSZ (((sizeof(struct rt_signal_frame) + 7) & (~7)))
0061
0062
0063
0064
0065
0066 static inline bool invalid_frame_pointer(void __user *fp, int fplen)
0067 {
0068 if ((((unsigned long) fp) & 15) || !access_ok(fp, fplen))
0069 return true;
0070
0071 return false;
0072 }
0073
0074 asmlinkage void do_sigreturn(struct pt_regs *regs)
0075 {
0076 unsigned long up_psr, pc, npc, ufp;
0077 struct signal_frame __user *sf;
0078 sigset_t set;
0079 __siginfo_fpu_t __user *fpu_save;
0080 __siginfo_rwin_t __user *rwin_save;
0081 int err;
0082
0083
0084 current->restart_block.fn = do_no_restart_syscall;
0085
0086 synchronize_user_stack();
0087
0088 sf = (struct signal_frame __user *) regs->u_regs[UREG_FP];
0089
0090
0091 if (invalid_frame_pointer(sf, sizeof(*sf)))
0092 goto segv_and_exit;
0093
0094 if (get_user(ufp, &sf->info.si_regs.u_regs[UREG_FP]))
0095 goto segv_and_exit;
0096
0097 if (ufp & 0x7)
0098 goto segv_and_exit;
0099
0100 err = __get_user(pc, &sf->info.si_regs.pc);
0101 err |= __get_user(npc, &sf->info.si_regs.npc);
0102
0103 if ((pc | npc) & 3)
0104 goto segv_and_exit;
0105
0106
0107 up_psr = regs->psr;
0108 err |= __copy_from_user(regs, &sf->info.si_regs, sizeof(struct pt_regs));
0109
0110
0111 regs->psr = (up_psr & ~(PSR_ICC | PSR_EF))
0112 | (regs->psr & (PSR_ICC | PSR_EF));
0113
0114
0115 pt_regs_clear_syscall(regs);
0116
0117 err |= __get_user(fpu_save, &sf->fpu_save);
0118 if (fpu_save)
0119 err |= restore_fpu_state(regs, fpu_save);
0120 err |= __get_user(rwin_save, &sf->rwin_save);
0121 if (rwin_save)
0122 err |= restore_rwin_state(rwin_save);
0123
0124
0125
0126
0127 err |= __get_user(set.sig[0], &sf->info.si_mask);
0128 err |= __copy_from_user(&set.sig[1], &sf->extramask,
0129 (_NSIG_WORDS-1) * sizeof(unsigned int));
0130
0131 if (err)
0132 goto segv_and_exit;
0133
0134 set_current_blocked(&set);
0135 return;
0136
0137 segv_and_exit:
0138 force_sig(SIGSEGV);
0139 }
0140
0141 asmlinkage void do_rt_sigreturn(struct pt_regs *regs)
0142 {
0143 struct rt_signal_frame __user *sf;
0144 unsigned int psr, pc, npc, ufp;
0145 __siginfo_fpu_t __user *fpu_save;
0146 __siginfo_rwin_t __user *rwin_save;
0147 sigset_t set;
0148 int err;
0149
0150 synchronize_user_stack();
0151 sf = (struct rt_signal_frame __user *) regs->u_regs[UREG_FP];
0152 if (invalid_frame_pointer(sf, sizeof(*sf)))
0153 goto segv;
0154
0155 if (get_user(ufp, &sf->regs.u_regs[UREG_FP]))
0156 goto segv;
0157
0158 if (ufp & 0x7)
0159 goto segv;
0160
0161 err = __get_user(pc, &sf->regs.pc);
0162 err |= __get_user(npc, &sf->regs.npc);
0163 err |= ((pc | npc) & 0x03);
0164
0165 err |= __get_user(regs->y, &sf->regs.y);
0166 err |= __get_user(psr, &sf->regs.psr);
0167
0168 err |= __copy_from_user(®s->u_regs[UREG_G1],
0169 &sf->regs.u_regs[UREG_G1], 15 * sizeof(u32));
0170
0171 regs->psr = (regs->psr & ~PSR_ICC) | (psr & PSR_ICC);
0172
0173
0174 pt_regs_clear_syscall(regs);
0175
0176 err |= __get_user(fpu_save, &sf->fpu_save);
0177 if (!err && fpu_save)
0178 err |= restore_fpu_state(regs, fpu_save);
0179 err |= __copy_from_user(&set, &sf->mask, sizeof(sigset_t));
0180 err |= restore_altstack(&sf->stack);
0181
0182 if (err)
0183 goto segv;
0184
0185 regs->pc = pc;
0186 regs->npc = npc;
0187
0188 err |= __get_user(rwin_save, &sf->rwin_save);
0189 if (!err && rwin_save) {
0190 if (restore_rwin_state(rwin_save))
0191 goto segv;
0192 }
0193
0194 set_current_blocked(&set);
0195 return;
0196 segv:
0197 force_sig(SIGSEGV);
0198 }
0199
0200 static inline void __user *get_sigframe(struct ksignal *ksig, struct pt_regs *regs, unsigned long framesize)
0201 {
0202 unsigned long sp = regs->u_regs[UREG_FP];
0203
0204
0205
0206
0207
0208 if (on_sig_stack(sp) && !likely(on_sig_stack(sp - framesize)))
0209 return (void __user *) -1L;
0210
0211
0212 sp = sigsp(sp, ksig) - framesize;
0213
0214
0215
0216
0217
0218
0219
0220 sp &= ~15UL;
0221
0222 return (void __user *) sp;
0223 }
0224
0225 static int setup_frame(struct ksignal *ksig, struct pt_regs *regs,
0226 sigset_t *oldset)
0227 {
0228 struct signal_frame __user *sf;
0229 int sigframe_size, err, wsaved;
0230 void __user *tail;
0231
0232
0233 synchronize_user_stack();
0234
0235 wsaved = current_thread_info()->w_saved;
0236
0237 sigframe_size = sizeof(*sf);
0238 if (used_math())
0239 sigframe_size += sizeof(__siginfo_fpu_t);
0240 if (wsaved)
0241 sigframe_size += sizeof(__siginfo_rwin_t);
0242
0243 sf = (struct signal_frame __user *)
0244 get_sigframe(ksig, regs, sigframe_size);
0245
0246 if (invalid_frame_pointer(sf, sigframe_size)) {
0247 force_exit_sig(SIGILL);
0248 return -EINVAL;
0249 }
0250
0251 tail = sf + 1;
0252
0253
0254 err = __copy_to_user(&sf->info.si_regs, regs, sizeof(struct pt_regs));
0255
0256 err |= __put_user(0, &sf->extra_size);
0257
0258 if (used_math()) {
0259 __siginfo_fpu_t __user *fp = tail;
0260 tail += sizeof(*fp);
0261 err |= save_fpu_state(regs, fp);
0262 err |= __put_user(fp, &sf->fpu_save);
0263 } else {
0264 err |= __put_user(0, &sf->fpu_save);
0265 }
0266 if (wsaved) {
0267 __siginfo_rwin_t __user *rwp = tail;
0268 tail += sizeof(*rwp);
0269 err |= save_rwin_state(wsaved, rwp);
0270 err |= __put_user(rwp, &sf->rwin_save);
0271 } else {
0272 err |= __put_user(0, &sf->rwin_save);
0273 }
0274
0275 err |= __put_user(oldset->sig[0], &sf->info.si_mask);
0276 err |= __copy_to_user(sf->extramask, &oldset->sig[1],
0277 (_NSIG_WORDS - 1) * sizeof(unsigned int));
0278 if (!wsaved) {
0279 err |= __copy_to_user(sf, (char *) regs->u_regs[UREG_FP],
0280 sizeof(struct reg_window32));
0281 } else {
0282 struct reg_window32 *rp;
0283
0284 rp = ¤t_thread_info()->reg_window[wsaved - 1];
0285 err |= __copy_to_user(sf, rp, sizeof(struct reg_window32));
0286 }
0287 if (err)
0288 return err;
0289
0290
0291 regs->u_regs[UREG_FP] = (unsigned long) sf;
0292 regs->u_regs[UREG_I0] = ksig->sig;
0293 regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
0294 regs->u_regs[UREG_I2] = (unsigned long) &sf->info;
0295
0296
0297 regs->pc = (unsigned long) ksig->ka.sa.sa_handler;
0298 regs->npc = (regs->pc + 4);
0299
0300
0301 if (ksig->ka.ka_restorer)
0302 regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer;
0303 else {
0304 regs->u_regs[UREG_I7] = (unsigned long)(&(sf->insns[0]) - 2);
0305
0306
0307 err |= __put_user(0x821020d8, &sf->insns[0]);
0308
0309
0310 err |= __put_user(0x91d02010, &sf->insns[1]);
0311 if (err)
0312 return err;
0313
0314
0315 flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0]));
0316 }
0317 return 0;
0318 }
0319
0320 static int setup_rt_frame(struct ksignal *ksig, struct pt_regs *regs,
0321 sigset_t *oldset)
0322 {
0323 struct rt_signal_frame __user *sf;
0324 int sigframe_size, wsaved;
0325 void __user *tail;
0326 unsigned int psr;
0327 int err;
0328
0329 synchronize_user_stack();
0330 wsaved = current_thread_info()->w_saved;
0331 sigframe_size = sizeof(*sf);
0332 if (used_math())
0333 sigframe_size += sizeof(__siginfo_fpu_t);
0334 if (wsaved)
0335 sigframe_size += sizeof(__siginfo_rwin_t);
0336 sf = (struct rt_signal_frame __user *)
0337 get_sigframe(ksig, regs, sigframe_size);
0338 if (invalid_frame_pointer(sf, sigframe_size)) {
0339 force_exit_sig(SIGILL);
0340 return -EINVAL;
0341 }
0342
0343 tail = sf + 1;
0344 err = __put_user(regs->pc, &sf->regs.pc);
0345 err |= __put_user(regs->npc, &sf->regs.npc);
0346 err |= __put_user(regs->y, &sf->regs.y);
0347 psr = regs->psr;
0348 if (used_math())
0349 psr |= PSR_EF;
0350 err |= __put_user(psr, &sf->regs.psr);
0351 err |= __copy_to_user(&sf->regs.u_regs, regs->u_regs, sizeof(regs->u_regs));
0352 err |= __put_user(0, &sf->extra_size);
0353
0354 if (psr & PSR_EF) {
0355 __siginfo_fpu_t __user *fp = tail;
0356 tail += sizeof(*fp);
0357 err |= save_fpu_state(regs, fp);
0358 err |= __put_user(fp, &sf->fpu_save);
0359 } else {
0360 err |= __put_user(0, &sf->fpu_save);
0361 }
0362 if (wsaved) {
0363 __siginfo_rwin_t __user *rwp = tail;
0364 tail += sizeof(*rwp);
0365 err |= save_rwin_state(wsaved, rwp);
0366 err |= __put_user(rwp, &sf->rwin_save);
0367 } else {
0368 err |= __put_user(0, &sf->rwin_save);
0369 }
0370 err |= __copy_to_user(&sf->mask, &oldset->sig[0], sizeof(sigset_t));
0371
0372
0373 err |= __save_altstack(&sf->stack, regs->u_regs[UREG_FP]);
0374
0375 if (!wsaved) {
0376 err |= __copy_to_user(sf, (char *) regs->u_regs[UREG_FP],
0377 sizeof(struct reg_window32));
0378 } else {
0379 struct reg_window32 *rp;
0380
0381 rp = ¤t_thread_info()->reg_window[wsaved - 1];
0382 err |= __copy_to_user(sf, rp, sizeof(struct reg_window32));
0383 }
0384
0385 err |= copy_siginfo_to_user(&sf->info, &ksig->info);
0386
0387 if (err)
0388 return err;
0389
0390 regs->u_regs[UREG_FP] = (unsigned long) sf;
0391 regs->u_regs[UREG_I0] = ksig->sig;
0392 regs->u_regs[UREG_I1] = (unsigned long) &sf->info;
0393 regs->u_regs[UREG_I2] = (unsigned long) &sf->regs;
0394
0395 regs->pc = (unsigned long) ksig->ka.sa.sa_handler;
0396 regs->npc = (regs->pc + 4);
0397
0398 if (ksig->ka.ka_restorer)
0399 regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer;
0400 else {
0401 regs->u_regs[UREG_I7] = (unsigned long)(&(sf->insns[0]) - 2);
0402
0403
0404 err |= __put_user(0x82102065, &sf->insns[0]);
0405
0406
0407 err |= __put_user(0x91d02010, &sf->insns[1]);
0408 if (err)
0409 return err;
0410
0411
0412 flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0]));
0413 }
0414 return 0;
0415 }
0416
0417 static inline void
0418 handle_signal(struct ksignal *ksig, struct pt_regs *regs)
0419 {
0420 sigset_t *oldset = sigmask_to_save();
0421 int err;
0422
0423 if (ksig->ka.sa.sa_flags & SA_SIGINFO)
0424 err = setup_rt_frame(ksig, regs, oldset);
0425 else
0426 err = setup_frame(ksig, regs, oldset);
0427 signal_setup_done(err, ksig, 0);
0428 }
0429
0430 static inline void syscall_restart(unsigned long orig_i0, struct pt_regs *regs,
0431 struct sigaction *sa)
0432 {
0433 switch(regs->u_regs[UREG_I0]) {
0434 case ERESTART_RESTARTBLOCK:
0435 case ERESTARTNOHAND:
0436 no_system_call_restart:
0437 regs->u_regs[UREG_I0] = EINTR;
0438 regs->psr |= PSR_C;
0439 break;
0440 case ERESTARTSYS:
0441 if (!(sa->sa_flags & SA_RESTART))
0442 goto no_system_call_restart;
0443 fallthrough;
0444 case ERESTARTNOINTR:
0445 regs->u_regs[UREG_I0] = orig_i0;
0446 regs->pc -= 4;
0447 regs->npc -= 4;
0448 }
0449 }
0450
0451
0452
0453
0454
0455 static void do_signal(struct pt_regs *regs, unsigned long orig_i0)
0456 {
0457 struct ksignal ksig;
0458 int restart_syscall;
0459 bool has_handler;
0460
0461
0462
0463
0464
0465
0466
0467
0468
0469
0470
0471
0472
0473
0474
0475
0476
0477
0478
0479 if (pt_regs_is_syscall(regs) && (regs->psr & PSR_C))
0480 regs->u_regs[UREG_G6] = orig_i0;
0481
0482 has_handler = get_signal(&ksig);
0483
0484
0485
0486
0487
0488 restart_syscall = 0;
0489 if (pt_regs_is_syscall(regs) && (regs->psr & PSR_C)) {
0490 restart_syscall = 1;
0491 orig_i0 = regs->u_regs[UREG_G6];
0492 }
0493
0494 if (has_handler) {
0495 if (restart_syscall)
0496 syscall_restart(orig_i0, regs, &ksig.ka.sa);
0497 handle_signal(&ksig, regs);
0498 } else {
0499 if (restart_syscall) {
0500 switch (regs->u_regs[UREG_I0]) {
0501 case ERESTARTNOHAND:
0502 case ERESTARTSYS:
0503 case ERESTARTNOINTR:
0504
0505 regs->u_regs[UREG_I0] = orig_i0;
0506 regs->pc -= 4;
0507 regs->npc -= 4;
0508 pt_regs_clear_syscall(regs);
0509 fallthrough;
0510 case ERESTART_RESTARTBLOCK:
0511 regs->u_regs[UREG_G1] = __NR_restart_syscall;
0512 regs->pc -= 4;
0513 regs->npc -= 4;
0514 pt_regs_clear_syscall(regs);
0515 }
0516 }
0517 restore_saved_sigmask();
0518 }
0519 }
0520
0521 void do_notify_resume(struct pt_regs *regs, unsigned long orig_i0,
0522 unsigned long thread_info_flags)
0523 {
0524 if (thread_info_flags & (_TIF_SIGPENDING | _TIF_NOTIFY_SIGNAL))
0525 do_signal(regs, orig_i0);
0526 if (thread_info_flags & _TIF_NOTIFY_RESUME)
0527 resume_user_mode_work(regs);
0528 }
0529
0530 asmlinkage int do_sys_sigstack(struct sigstack __user *ssptr,
0531 struct sigstack __user *ossptr,
0532 unsigned long sp)
0533 {
0534 int ret = -EFAULT;
0535
0536
0537 if (ossptr) {
0538 if (put_user(current->sas_ss_sp + current->sas_ss_size,
0539 &ossptr->the_stack) ||
0540 __put_user(on_sig_stack(sp), &ossptr->cur_status))
0541 goto out;
0542 }
0543
0544
0545 if (ssptr) {
0546 char *ss_sp;
0547
0548 if (get_user(ss_sp, &ssptr->the_stack))
0549 goto out;
0550
0551
0552 ret = -EPERM;
0553 if (current->sas_ss_sp && on_sig_stack(sp))
0554 goto out;
0555
0556
0557
0558
0559 current->sas_ss_sp = (unsigned long)ss_sp - SIGSTKSZ;
0560 current->sas_ss_size = SIGSTKSZ;
0561 }
0562 ret = 0;
0563 out:
0564 return ret;
0565 }