Lines Matching +full:y +full:- +full:rp

1 // SPDX-License-Identifier: GPL-2.0
51 unsigned int extramask[_COMPAT_NSIG_WORDS - 1];
73 * 16-byte aligned, therefore we can always enforce that the restore
79 ((unsigned long)fp) > 0x100000000ULL - fplen) in invalid_frame_pointer()
95 /* Always make any pending restarted system calls return -EINTR */ in do_sigreturn32()
96 current->restart_block.fn = do_no_restart_syscall; in do_sigreturn32()
100 regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL; in do_sigreturn32()
101 sf = (struct signal_frame32 __user *) regs->u_regs[UREG_FP]; in do_sigreturn32()
107 if (get_user(ufp, &sf->info.si_regs.u_regs[UREG_FP])) in do_sigreturn32()
113 if (__get_user(pc, &sf->info.si_regs.pc) || in do_sigreturn32()
114 __get_user(npc, &sf->info.si_regs.npc)) in do_sigreturn32()
124 regs->tpc = pc; in do_sigreturn32()
125 regs->tnpc = npc; in do_sigreturn32()
128 err = __get_user(regs->y, &sf->info.si_regs.y); in do_sigreturn32()
129 err |= __get_user(psr, &sf->info.si_regs.psr); in do_sigreturn32()
132 err |= __get_user(regs->u_regs[i], &sf->info.si_regs.u_regs[i]); in do_sigreturn32()
134 err |= __get_user(i, &sf->v8plus.g_upper[0]); in do_sigreturn32()
139 err |= __get_user(((u32 *)regs->u_regs)[2*i], &sf->v8plus.g_upper[i]); in do_sigreturn32()
140 err |= __get_user(asi, &sf->v8plus.asi); in do_sigreturn32()
141 regs->tstate &= ~TSTATE_ASI; in do_sigreturn32()
142 regs->tstate |= ((asi & 0xffUL) << 24UL); in do_sigreturn32()
147 regs->tstate &= ~(TSTATE_ICC|TSTATE_XCC); in do_sigreturn32()
148 regs->tstate |= psr_to_tstate_icc(psr); in do_sigreturn32()
153 err |= __get_user(fpu_save, &sf->fpu_save); in do_sigreturn32()
156 err |= __get_user(rwin_save, &sf->rwin_save); in do_sigreturn32()
161 err |= __get_user(seta.sig[0], &sf->info.si_mask); in do_sigreturn32()
162 err |= copy_from_user(&seta.sig[1], &sf->extramask, in do_sigreturn32()
163 (_COMPAT_NSIG_WORDS - 1) * sizeof(unsigned int)); in do_sigreturn32()
184 /* Always make any pending restarted system calls return -EINTR */ in do_rt_sigreturn32()
185 current->restart_block.fn = do_no_restart_syscall; in do_rt_sigreturn32()
188 regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL; in do_rt_sigreturn32()
189 sf = (struct rt_signal_frame32 __user *) regs->u_regs[UREG_FP]; in do_rt_sigreturn32()
195 if (get_user(ufp, &sf->regs.u_regs[UREG_FP])) in do_rt_sigreturn32()
201 if (__get_user(pc, &sf->regs.pc) || in do_rt_sigreturn32()
202 __get_user(npc, &sf->regs.npc)) in do_rt_sigreturn32()
212 regs->tpc = pc; in do_rt_sigreturn32()
213 regs->tnpc = npc; in do_rt_sigreturn32()
216 err = __get_user(regs->y, &sf->regs.y); in do_rt_sigreturn32()
217 err |= __get_user(psr, &sf->regs.psr); in do_rt_sigreturn32()
220 err |= __get_user(regs->u_regs[i], &sf->regs.u_regs[i]); in do_rt_sigreturn32()
222 err |= __get_user(i, &sf->v8plus.g_upper[0]); in do_rt_sigreturn32()
227 err |= __get_user(((u32 *)regs->u_regs)[2*i], &sf->v8plus.g_upper[i]); in do_rt_sigreturn32()
228 err |= __get_user(asi, &sf->v8plus.asi); in do_rt_sigreturn32()
229 regs->tstate &= ~TSTATE_ASI; in do_rt_sigreturn32()
230 regs->tstate |= ((asi & 0xffUL) << 24UL); in do_rt_sigreturn32()
235 regs->tstate &= ~(TSTATE_ICC|TSTATE_XCC); in do_rt_sigreturn32()
236 regs->tstate |= psr_to_tstate_icc(psr); in do_rt_sigreturn32()
241 err |= __get_user(fpu_save, &sf->fpu_save); in do_rt_sigreturn32()
244 err |= get_compat_sigset(&set, &sf->mask); in do_rt_sigreturn32()
245 err |= compat_restore_altstack(&sf->stack); in do_rt_sigreturn32()
249 err |= __get_user(rwin_save, &sf->rwin_save); in do_rt_sigreturn32()
265 regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL; in get_sigframe()
266 sp = regs->u_regs[UREG_FP]; in get_sigframe()
270 * Return an always-bogus address instead so we will die with SIGSEGV. in get_sigframe()
272 if (on_sig_stack(sp) && !likely(on_sig_stack(sp - framesize))) in get_sigframe()
273 return (void __user *) -1L; in get_sigframe()
276 sp = sigsp(sp, ksig) - framesize; in get_sigframe()
289 /* The I-cache flush instruction only works in the primary ASI, which
308 /* Disable cross-call reception. In this way even a very wide in flush_signal_insns()
318 pgdp = pgd_offset(current->mm, address); in flush_signal_insns()
341 "r" (address & (PAGE_SIZE - 1)) in flush_signal_insns()
368 if (current_thread_info()->fpsaved[0] & FPRS_FEF) in setup_frame32()
379 current->comm, current->pid, (unsigned long)sf, in setup_frame32()
380 regs->tpc, regs->u_regs[UREG_I7]); in setup_frame32()
381 force_sigsegv(ksig->sig); in setup_frame32()
382 return -EINVAL; in setup_frame32()
389 regs->tpc &= 0xffffffff; in setup_frame32()
390 regs->tnpc &= 0xffffffff; in setup_frame32()
392 err = put_user(regs->tpc, &sf->info.si_regs.pc); in setup_frame32()
393 err |= __put_user(regs->tnpc, &sf->info.si_regs.npc); in setup_frame32()
394 err |= __put_user(regs->y, &sf->info.si_regs.y); in setup_frame32()
395 psr = tstate_to_psr(regs->tstate); in setup_frame32()
396 if (current_thread_info()->fpsaved[0] & FPRS_FEF) in setup_frame32()
398 err |= __put_user(psr, &sf->info.si_regs.psr); in setup_frame32()
400 err |= __put_user(regs->u_regs[i], &sf->info.si_regs.u_regs[i]); in setup_frame32()
401 err |= __put_user(sizeof(siginfo_extra_v8plus_t), &sf->extra_size); in setup_frame32()
402 err |= __put_user(SIGINFO_EXTRA_V8PLUS_MAGIC, &sf->v8plus.g_upper[0]); in setup_frame32()
404 err |= __put_user(((u32 *)regs->u_regs)[2*i], in setup_frame32()
405 &sf->v8plus.g_upper[i]); in setup_frame32()
406 err |= __put_user((regs->tstate & TSTATE_ASI) >> 24UL, in setup_frame32()
407 &sf->v8plus.asi); in setup_frame32()
413 err |= __put_user((u64)fp, &sf->fpu_save); in setup_frame32()
415 err |= __put_user(0, &sf->fpu_save); in setup_frame32()
421 err |= __put_user((u64)rwp, &sf->rwin_save); in setup_frame32()
424 err |= __put_user(0, &sf->rwin_save); in setup_frame32()
427 /* If these change we need to know - assignments to seta relies on these sizes */ in setup_frame32()
430 seta.sig[1] = (oldset->sig[0] >> 32); in setup_frame32()
431 seta.sig[0] = oldset->sig[0]; in setup_frame32()
433 err |= __put_user(seta.sig[0], &sf->info.si_mask); in setup_frame32()
434 err |= __copy_to_user(sf->extramask, &seta.sig[1], in setup_frame32()
435 (_COMPAT_NSIG_WORDS - 1) * sizeof(unsigned int)); in setup_frame32()
439 (u32 __user *)(regs->u_regs[UREG_FP]), in setup_frame32()
442 struct reg_window *rp; in setup_frame32() local
444 rp = &current_thread_info()->reg_window[wsaved - 1]; in setup_frame32()
446 err |= __put_user(rp->locals[i], &sf->ss.locals[i]); in setup_frame32()
448 err |= __put_user(rp->ins[i], &sf->ss.ins[i]); in setup_frame32()
449 err |= __put_user(rp->ins[6], &sf->ss.fp); in setup_frame32()
450 err |= __put_user(rp->ins[7], &sf->ss.callers_pc); in setup_frame32()
455 /* 3. signal handler back-trampoline and parameters */ in setup_frame32()
456 regs->u_regs[UREG_FP] = (unsigned long) sf; in setup_frame32()
457 regs->u_regs[UREG_I0] = ksig->sig; in setup_frame32()
458 regs->u_regs[UREG_I1] = (unsigned long) &sf->info; in setup_frame32()
459 regs->u_regs[UREG_I2] = (unsigned long) &sf->info; in setup_frame32()
462 regs->tpc = (unsigned long) ksig->ka.sa.sa_handler; in setup_frame32()
463 regs->tnpc = (regs->tpc + 4); in setup_frame32()
465 regs->tpc &= 0xffffffff; in setup_frame32()
466 regs->tnpc &= 0xffffffff; in setup_frame32()
470 if (ksig->ka.ka_restorer) { in setup_frame32()
471 regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer; in setup_frame32()
473 unsigned long address = ((unsigned long)&(sf->insns[0])); in setup_frame32()
475 regs->u_regs[UREG_I7] = (unsigned long) (&(sf->insns[0]) - 2); in setup_frame32()
477 err = __put_user(0x821020d8, &sf->insns[0]); /*mov __NR_sigreturn, %g1*/ in setup_frame32()
478 err |= __put_user(0x91d02010, &sf->insns[1]); /*t 0x10*/ in setup_frame32()
502 if (current_thread_info()->fpsaved[0] & FPRS_FEF) in setup_rt_frame32()
513 current->comm, current->pid, (unsigned long)sf, in setup_rt_frame32()
514 regs->tpc, regs->u_regs[UREG_I7]); in setup_rt_frame32()
515 force_sigsegv(ksig->sig); in setup_rt_frame32()
516 return -EINVAL; in setup_rt_frame32()
523 regs->tpc &= 0xffffffff; in setup_rt_frame32()
524 regs->tnpc &= 0xffffffff; in setup_rt_frame32()
526 err = put_user(regs->tpc, &sf->regs.pc); in setup_rt_frame32()
527 err |= __put_user(regs->tnpc, &sf->regs.npc); in setup_rt_frame32()
528 err |= __put_user(regs->y, &sf->regs.y); in setup_rt_frame32()
529 psr = tstate_to_psr(regs->tstate); in setup_rt_frame32()
530 if (current_thread_info()->fpsaved[0] & FPRS_FEF) in setup_rt_frame32()
532 err |= __put_user(psr, &sf->regs.psr); in setup_rt_frame32()
534 err |= __put_user(regs->u_regs[i], &sf->regs.u_regs[i]); in setup_rt_frame32()
535 err |= __put_user(sizeof(siginfo_extra_v8plus_t), &sf->extra_size); in setup_rt_frame32()
536 err |= __put_user(SIGINFO_EXTRA_V8PLUS_MAGIC, &sf->v8plus.g_upper[0]); in setup_rt_frame32()
538 err |= __put_user(((u32 *)regs->u_regs)[2*i], in setup_rt_frame32()
539 &sf->v8plus.g_upper[i]); in setup_rt_frame32()
540 err |= __put_user((regs->tstate & TSTATE_ASI) >> 24UL, in setup_rt_frame32()
541 &sf->v8plus.asi); in setup_rt_frame32()
547 err |= __put_user((u64)fp, &sf->fpu_save); in setup_rt_frame32()
549 err |= __put_user(0, &sf->fpu_save); in setup_rt_frame32()
555 err |= __put_user((u64)rwp, &sf->rwin_save); in setup_rt_frame32()
558 err |= __put_user(0, &sf->rwin_save); in setup_rt_frame32()
562 err |= copy_siginfo_to_user32(&sf->info, &ksig->info); in setup_rt_frame32()
565 err |= __compat_save_altstack(&sf->stack, regs->u_regs[UREG_FP]); in setup_rt_frame32()
567 err |= put_compat_sigset(&sf->mask, oldset, sizeof(compat_sigset_t)); in setup_rt_frame32()
571 (u32 __user *)(regs->u_regs[UREG_FP]), in setup_rt_frame32()
574 struct reg_window *rp; in setup_rt_frame32() local
576 rp = &current_thread_info()->reg_window[wsaved - 1]; in setup_rt_frame32()
578 err |= __put_user(rp->locals[i], &sf->ss.locals[i]); in setup_rt_frame32()
580 err |= __put_user(rp->ins[i], &sf->ss.ins[i]); in setup_rt_frame32()
581 err |= __put_user(rp->ins[6], &sf->ss.fp); in setup_rt_frame32()
582 err |= __put_user(rp->ins[7], &sf->ss.callers_pc); in setup_rt_frame32()
587 /* 3. signal handler back-trampoline and parameters */ in setup_rt_frame32()
588 regs->u_regs[UREG_FP] = (unsigned long) sf; in setup_rt_frame32()
589 regs->u_regs[UREG_I0] = ksig->sig; in setup_rt_frame32()
590 regs->u_regs[UREG_I1] = (unsigned long) &sf->info; in setup_rt_frame32()
591 regs->u_regs[UREG_I2] = (unsigned long) &sf->regs; in setup_rt_frame32()
594 regs->tpc = (unsigned long) ksig->ka.sa.sa_handler; in setup_rt_frame32()
595 regs->tnpc = (regs->tpc + 4); in setup_rt_frame32()
597 regs->tpc &= 0xffffffff; in setup_rt_frame32()
598 regs->tnpc &= 0xffffffff; in setup_rt_frame32()
602 if (ksig->ka.ka_restorer) in setup_rt_frame32()
603 regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer; in setup_rt_frame32()
605 unsigned long address = ((unsigned long)&(sf->insns[0])); in setup_rt_frame32()
607 regs->u_regs[UREG_I7] = (unsigned long) (&(sf->insns[0]) - 2); in setup_rt_frame32()
610 err |= __put_user(0x82102065, &sf->insns[0]); in setup_rt_frame32()
613 err |= __put_user(0x91d02010, &sf->insns[1]); in setup_rt_frame32()
628 if (ksig->ka.sa.sa_flags & SA_SIGINFO) in handle_signal32()
639 switch (regs->u_regs[UREG_I0]) { in syscall_restart32()
643 regs->u_regs[UREG_I0] = EINTR; in syscall_restart32()
644 regs->tstate |= TSTATE_ICARRY; in syscall_restart32()
647 if (!(sa->sa_flags & SA_RESTART)) in syscall_restart32()
651 regs->u_regs[UREG_I0] = orig_i0; in syscall_restart32()
652 regs->tpc -= 4; in syscall_restart32()
653 regs->tnpc -= 4; in syscall_restart32()
669 (regs->tstate & (TSTATE_XCARRY | TSTATE_ICARRY))) { in do_signal32()
671 orig_i0 = regs->u_regs[UREG_G6]; in do_signal32()
680 switch (regs->u_regs[UREG_I0]) { in do_signal32()
685 regs->u_regs[UREG_I0] = orig_i0; in do_signal32()
686 regs->tpc -= 4; in do_signal32()
687 regs->tnpc -= 4; in do_signal32()
691 regs->u_regs[UREG_G1] = __NR_restart_syscall; in do_signal32()
692 regs->tpc -= 4; in do_signal32()
693 regs->tnpc -= 4; in do_signal32()
712 int ret = -EFAULT; in do_sys32_sigstack()
716 if (put_user(current->sas_ss_sp + current->sas_ss_size, in do_sys32_sigstack()
717 &ossptr->the_stack) || in do_sys32_sigstack()
718 __put_user(on_sig_stack(sp), &ossptr->cur_status)) in do_sys32_sigstack()
726 if (get_user(ss_sp, &ssptr->the_stack)) in do_sys32_sigstack()
732 ret = -EPERM; in do_sys32_sigstack()
733 if (current->sas_ss_sp && on_sig_stack(sp)) in do_sys32_sigstack()
737 * track onstack-ness, but rather calculate it, we must in do_sys32_sigstack()
740 current->sas_ss_sp = (unsigned long)ss_sp - SIGSTKSZ; in do_sys32_sigstack()
741 current->sas_ss_size = SIGSTKSZ; in do_sys32_sigstack()
750 * Compile-time assertions for siginfo_t offsets. Check NSIG* as well, as