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

1 // SPDX-License-Identifier: GPL-2.0
50 unsigned int extramask[_COMPAT_NSIG_WORDS - 1];
72 * 16-byte aligned, therefore we can always enforce that the restore
78 ((unsigned long)fp) > 0x100000000ULL - fplen) in invalid_frame_pointer()
94 /* Always make any pending restarted system calls return -EINTR */ in do_sigreturn32()
95 current->restart_block.fn = do_no_restart_syscall; in do_sigreturn32()
99 regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL; in do_sigreturn32()
100 sf = (struct signal_frame32 __user *) regs->u_regs[UREG_FP]; in do_sigreturn32()
106 if (get_user(ufp, &sf->info.si_regs.u_regs[UREG_FP])) in do_sigreturn32()
112 if (__get_user(pc, &sf->info.si_regs.pc) || in do_sigreturn32()
113 __get_user(npc, &sf->info.si_regs.npc)) in do_sigreturn32()
123 regs->tpc = pc; in do_sigreturn32()
124 regs->tnpc = npc; in do_sigreturn32()
127 err = __get_user(regs->y, &sf->info.si_regs.y); in do_sigreturn32()
128 err |= __get_user(psr, &sf->info.si_regs.psr); in do_sigreturn32()
131 err |= __get_user(regs->u_regs[i], &sf->info.si_regs.u_regs[i]); in do_sigreturn32()
133 err |= __get_user(i, &sf->v8plus.g_upper[0]); in do_sigreturn32()
138 err |= __get_user(((u32 *)regs->u_regs)[2*i], &sf->v8plus.g_upper[i]); in do_sigreturn32()
139 err |= __get_user(asi, &sf->v8plus.asi); in do_sigreturn32()
140 regs->tstate &= ~TSTATE_ASI; in do_sigreturn32()
141 regs->tstate |= ((asi & 0xffUL) << 24UL); in do_sigreturn32()
146 regs->tstate &= ~(TSTATE_ICC|TSTATE_XCC); in do_sigreturn32()
147 regs->tstate |= psr_to_tstate_icc(psr); in do_sigreturn32()
152 err |= __get_user(fpu_save, &sf->fpu_save); in do_sigreturn32()
155 err |= __get_user(rwin_save, &sf->rwin_save); in do_sigreturn32()
160 err |= __get_user(seta.sig[0], &sf->info.si_mask); in do_sigreturn32()
161 err |= copy_from_user(&seta.sig[1], &sf->extramask, in do_sigreturn32()
162 (_COMPAT_NSIG_WORDS - 1) * sizeof(unsigned int)); in do_sigreturn32()
183 /* Always make any pending restarted system calls return -EINTR */ in do_rt_sigreturn32()
184 current->restart_block.fn = do_no_restart_syscall; in do_rt_sigreturn32()
187 regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL; in do_rt_sigreturn32()
188 sf = (struct rt_signal_frame32 __user *) regs->u_regs[UREG_FP]; in do_rt_sigreturn32()
194 if (get_user(ufp, &sf->regs.u_regs[UREG_FP])) in do_rt_sigreturn32()
200 if (__get_user(pc, &sf->regs.pc) || in do_rt_sigreturn32()
201 __get_user(npc, &sf->regs.npc)) in do_rt_sigreturn32()
211 regs->tpc = pc; in do_rt_sigreturn32()
212 regs->tnpc = npc; in do_rt_sigreturn32()
215 err = __get_user(regs->y, &sf->regs.y); in do_rt_sigreturn32()
216 err |= __get_user(psr, &sf->regs.psr); in do_rt_sigreturn32()
219 err |= __get_user(regs->u_regs[i], &sf->regs.u_regs[i]); in do_rt_sigreturn32()
221 err |= __get_user(i, &sf->v8plus.g_upper[0]); in do_rt_sigreturn32()
226 err |= __get_user(((u32 *)regs->u_regs)[2*i], &sf->v8plus.g_upper[i]); in do_rt_sigreturn32()
227 err |= __get_user(asi, &sf->v8plus.asi); in do_rt_sigreturn32()
228 regs->tstate &= ~TSTATE_ASI; in do_rt_sigreturn32()
229 regs->tstate |= ((asi & 0xffUL) << 24UL); in do_rt_sigreturn32()
234 regs->tstate &= ~(TSTATE_ICC|TSTATE_XCC); in do_rt_sigreturn32()
235 regs->tstate |= psr_to_tstate_icc(psr); in do_rt_sigreturn32()
240 err |= __get_user(fpu_save, &sf->fpu_save); in do_rt_sigreturn32()
243 err |= get_compat_sigset(&set, &sf->mask); in do_rt_sigreturn32()
244 err |= compat_restore_altstack(&sf->stack); in do_rt_sigreturn32()
248 err |= __get_user(rwin_save, &sf->rwin_save); in do_rt_sigreturn32()
264 regs->u_regs[UREG_FP] &= 0x00000000ffffffffUL; in get_sigframe()
265 sp = regs->u_regs[UREG_FP]; in get_sigframe()
269 * Return an always-bogus address instead so we will die with SIGSEGV. in get_sigframe()
271 if (on_sig_stack(sp) && !likely(on_sig_stack(sp - framesize))) in get_sigframe()
272 return (void __user *) -1L; in get_sigframe()
275 sp = sigsp(sp, ksig) - framesize; in get_sigframe()
288 /* The I-cache flush instruction only works in the primary ASI, which
307 /* Disable cross-call reception. In this way even a very wide in flush_signal_insns()
317 pgdp = pgd_offset(current->mm, address); in flush_signal_insns()
342 "r" (address & (PAGE_SIZE - 1)) in flush_signal_insns()
369 if (current_thread_info()->fpsaved[0] & FPRS_FEF) in setup_frame32()
380 current->comm, current->pid, (unsigned long)sf, in setup_frame32()
381 regs->tpc, regs->u_regs[UREG_I7]); in setup_frame32()
382 force_sigsegv(ksig->sig); in setup_frame32()
383 return -EINVAL; in setup_frame32()
390 regs->tpc &= 0xffffffff; in setup_frame32()
391 regs->tnpc &= 0xffffffff; in setup_frame32()
393 err = put_user(regs->tpc, &sf->info.si_regs.pc); in setup_frame32()
394 err |= __put_user(regs->tnpc, &sf->info.si_regs.npc); in setup_frame32()
395 err |= __put_user(regs->y, &sf->info.si_regs.y); in setup_frame32()
396 psr = tstate_to_psr(regs->tstate); in setup_frame32()
397 if (current_thread_info()->fpsaved[0] & FPRS_FEF) in setup_frame32()
399 err |= __put_user(psr, &sf->info.si_regs.psr); in setup_frame32()
401 err |= __put_user(regs->u_regs[i], &sf->info.si_regs.u_regs[i]); in setup_frame32()
402 err |= __put_user(sizeof(siginfo_extra_v8plus_t), &sf->extra_size); in setup_frame32()
403 err |= __put_user(SIGINFO_EXTRA_V8PLUS_MAGIC, &sf->v8plus.g_upper[0]); in setup_frame32()
405 err |= __put_user(((u32 *)regs->u_regs)[2*i], in setup_frame32()
406 &sf->v8plus.g_upper[i]); in setup_frame32()
407 err |= __put_user((regs->tstate & TSTATE_ASI) >> 24UL, in setup_frame32()
408 &sf->v8plus.asi); in setup_frame32()
414 err |= __put_user((u64)fp, &sf->fpu_save); in setup_frame32()
416 err |= __put_user(0, &sf->fpu_save); in setup_frame32()
422 err |= __put_user((u64)rwp, &sf->rwin_save); in setup_frame32()
425 err |= __put_user(0, &sf->rwin_save); in setup_frame32()
428 /* If these change we need to know - assignments to seta relies on these sizes */ in setup_frame32()
431 seta.sig[1] = (oldset->sig[0] >> 32); in setup_frame32()
432 seta.sig[0] = oldset->sig[0]; in setup_frame32()
434 err |= __put_user(seta.sig[0], &sf->info.si_mask); in setup_frame32()
435 err |= __copy_to_user(sf->extramask, &seta.sig[1], in setup_frame32()
436 (_COMPAT_NSIG_WORDS - 1) * sizeof(unsigned int)); in setup_frame32()
440 (u32 __user *)(regs->u_regs[UREG_FP]), in setup_frame32()
443 struct reg_window *rp; in setup_frame32() local
445 rp = &current_thread_info()->reg_window[wsaved - 1]; in setup_frame32()
447 err |= __put_user(rp->locals[i], &sf->ss.locals[i]); in setup_frame32()
449 err |= __put_user(rp->ins[i], &sf->ss.ins[i]); in setup_frame32()
450 err |= __put_user(rp->ins[6], &sf->ss.fp); in setup_frame32()
451 err |= __put_user(rp->ins[7], &sf->ss.callers_pc); in setup_frame32()
456 /* 3. signal handler back-trampoline and parameters */ in setup_frame32()
457 regs->u_regs[UREG_FP] = (unsigned long) sf; in setup_frame32()
458 regs->u_regs[UREG_I0] = ksig->sig; in setup_frame32()
459 regs->u_regs[UREG_I1] = (unsigned long) &sf->info; in setup_frame32()
460 regs->u_regs[UREG_I2] = (unsigned long) &sf->info; in setup_frame32()
463 regs->tpc = (unsigned long) ksig->ka.sa.sa_handler; in setup_frame32()
464 regs->tnpc = (regs->tpc + 4); in setup_frame32()
466 regs->tpc &= 0xffffffff; in setup_frame32()
467 regs->tnpc &= 0xffffffff; in setup_frame32()
471 if (ksig->ka.ka_restorer) { in setup_frame32()
472 regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer; in setup_frame32()
474 unsigned long address = ((unsigned long)&(sf->insns[0])); in setup_frame32()
476 regs->u_regs[UREG_I7] = (unsigned long) (&(sf->insns[0]) - 2); in setup_frame32()
478 err = __put_user(0x821020d8, &sf->insns[0]); /*mov __NR_sigreturn, %g1*/ in setup_frame32()
479 err |= __put_user(0x91d02010, &sf->insns[1]); /*t 0x10*/ in setup_frame32()
503 if (current_thread_info()->fpsaved[0] & FPRS_FEF) in setup_rt_frame32()
514 current->comm, current->pid, (unsigned long)sf, in setup_rt_frame32()
515 regs->tpc, regs->u_regs[UREG_I7]); in setup_rt_frame32()
516 force_sigsegv(ksig->sig); in setup_rt_frame32()
517 return -EINVAL; in setup_rt_frame32()
524 regs->tpc &= 0xffffffff; in setup_rt_frame32()
525 regs->tnpc &= 0xffffffff; in setup_rt_frame32()
527 err = put_user(regs->tpc, &sf->regs.pc); in setup_rt_frame32()
528 err |= __put_user(regs->tnpc, &sf->regs.npc); in setup_rt_frame32()
529 err |= __put_user(regs->y, &sf->regs.y); in setup_rt_frame32()
530 psr = tstate_to_psr(regs->tstate); in setup_rt_frame32()
531 if (current_thread_info()->fpsaved[0] & FPRS_FEF) in setup_rt_frame32()
533 err |= __put_user(psr, &sf->regs.psr); in setup_rt_frame32()
535 err |= __put_user(regs->u_regs[i], &sf->regs.u_regs[i]); in setup_rt_frame32()
536 err |= __put_user(sizeof(siginfo_extra_v8plus_t), &sf->extra_size); in setup_rt_frame32()
537 err |= __put_user(SIGINFO_EXTRA_V8PLUS_MAGIC, &sf->v8plus.g_upper[0]); in setup_rt_frame32()
539 err |= __put_user(((u32 *)regs->u_regs)[2*i], in setup_rt_frame32()
540 &sf->v8plus.g_upper[i]); in setup_rt_frame32()
541 err |= __put_user((regs->tstate & TSTATE_ASI) >> 24UL, in setup_rt_frame32()
542 &sf->v8plus.asi); in setup_rt_frame32()
548 err |= __put_user((u64)fp, &sf->fpu_save); in setup_rt_frame32()
550 err |= __put_user(0, &sf->fpu_save); in setup_rt_frame32()
556 err |= __put_user((u64)rwp, &sf->rwin_save); in setup_rt_frame32()
559 err |= __put_user(0, &sf->rwin_save); in setup_rt_frame32()
563 err |= copy_siginfo_to_user32(&sf->info, &ksig->info); in setup_rt_frame32()
566 err |= __compat_save_altstack(&sf->stack, regs->u_regs[UREG_FP]); in setup_rt_frame32()
568 err |= put_compat_sigset(&sf->mask, oldset, sizeof(compat_sigset_t)); in setup_rt_frame32()
572 (u32 __user *)(regs->u_regs[UREG_FP]), in setup_rt_frame32()
575 struct reg_window *rp; in setup_rt_frame32() local
577 rp = &current_thread_info()->reg_window[wsaved - 1]; in setup_rt_frame32()
579 err |= __put_user(rp->locals[i], &sf->ss.locals[i]); in setup_rt_frame32()
581 err |= __put_user(rp->ins[i], &sf->ss.ins[i]); in setup_rt_frame32()
582 err |= __put_user(rp->ins[6], &sf->ss.fp); in setup_rt_frame32()
583 err |= __put_user(rp->ins[7], &sf->ss.callers_pc); in setup_rt_frame32()
588 /* 3. signal handler back-trampoline and parameters */ in setup_rt_frame32()
589 regs->u_regs[UREG_FP] = (unsigned long) sf; in setup_rt_frame32()
590 regs->u_regs[UREG_I0] = ksig->sig; in setup_rt_frame32()
591 regs->u_regs[UREG_I1] = (unsigned long) &sf->info; in setup_rt_frame32()
592 regs->u_regs[UREG_I2] = (unsigned long) &sf->regs; in setup_rt_frame32()
595 regs->tpc = (unsigned long) ksig->ka.sa.sa_handler; in setup_rt_frame32()
596 regs->tnpc = (regs->tpc + 4); in setup_rt_frame32()
598 regs->tpc &= 0xffffffff; in setup_rt_frame32()
599 regs->tnpc &= 0xffffffff; in setup_rt_frame32()
603 if (ksig->ka.ka_restorer) in setup_rt_frame32()
604 regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer; in setup_rt_frame32()
606 unsigned long address = ((unsigned long)&(sf->insns[0])); in setup_rt_frame32()
608 regs->u_regs[UREG_I7] = (unsigned long) (&(sf->insns[0]) - 2); in setup_rt_frame32()
611 err |= __put_user(0x82102065, &sf->insns[0]); in setup_rt_frame32()
614 err |= __put_user(0x91d02010, &sf->insns[1]); in setup_rt_frame32()
629 if (ksig->ka.sa.sa_flags & SA_SIGINFO) in handle_signal32()
640 switch (regs->u_regs[UREG_I0]) { in syscall_restart32()
644 regs->u_regs[UREG_I0] = EINTR; in syscall_restart32()
645 regs->tstate |= TSTATE_ICARRY; in syscall_restart32()
648 if (!(sa->sa_flags & SA_RESTART)) in syscall_restart32()
652 regs->u_regs[UREG_I0] = orig_i0; in syscall_restart32()
653 regs->tpc -= 4; in syscall_restart32()
654 regs->tnpc -= 4; in syscall_restart32()
670 (regs->tstate & (TSTATE_XCARRY | TSTATE_ICARRY))) { in do_signal32()
672 orig_i0 = regs->u_regs[UREG_G6]; in do_signal32()
681 switch (regs->u_regs[UREG_I0]) { in do_signal32()
686 regs->u_regs[UREG_I0] = orig_i0; in do_signal32()
687 regs->tpc -= 4; in do_signal32()
688 regs->tnpc -= 4; in do_signal32()
692 regs->u_regs[UREG_G1] = __NR_restart_syscall; in do_signal32()
693 regs->tpc -= 4; in do_signal32()
694 regs->tnpc -= 4; in do_signal32()
713 int ret = -EFAULT; in do_sys32_sigstack()
717 if (put_user(current->sas_ss_sp + current->sas_ss_size, in do_sys32_sigstack()
718 &ossptr->the_stack) || in do_sys32_sigstack()
719 __put_user(on_sig_stack(sp), &ossptr->cur_status)) in do_sys32_sigstack()
727 if (get_user(ss_sp, &ssptr->the_stack)) in do_sys32_sigstack()
733 ret = -EPERM; in do_sys32_sigstack()
734 if (current->sas_ss_sp && on_sig_stack(sp)) in do_sys32_sigstack()
738 * track onstack-ness, but rather calculate it, we must in do_sys32_sigstack()
741 current->sas_ss_sp = (unsigned long)ss_sp - SIGSTKSZ; in do_sys32_sigstack()
742 current->sas_ss_size = SIGSTKSZ; in do_sys32_sigstack()
751 * Compile-time assertions for siginfo_t offsets. Check NSIG* as well, as