Lines Matching +full:y +full:- +full:rp
1 // SPDX-License-Identifier: GPL-2.0
41 unsigned int extramask[_NSIG_WORDS - 1];
63 * 16-byte aligned, therefore we can always enforce that the restore
83 /* Always make any pending restarted system calls return -EINTR */ in do_sigreturn()
84 current->restart_block.fn = do_no_restart_syscall; in do_sigreturn()
88 sf = (struct signal_frame __user *) regs->u_regs[UREG_FP]; in do_sigreturn()
94 if (get_user(ufp, &sf->info.si_regs.u_regs[UREG_FP])) in do_sigreturn()
100 err = __get_user(pc, &sf->info.si_regs.pc); in do_sigreturn()
101 err |= __get_user(npc, &sf->info.si_regs.npc); in do_sigreturn()
107 up_psr = regs->psr; in do_sigreturn()
108 err |= __copy_from_user(regs, &sf->info.si_regs, sizeof(struct pt_regs)); in do_sigreturn()
111 regs->psr = (up_psr & ~(PSR_ICC | PSR_EF)) in do_sigreturn()
112 | (regs->psr & (PSR_ICC | PSR_EF)); in do_sigreturn()
117 err |= __get_user(fpu_save, &sf->fpu_save); in do_sigreturn()
120 err |= __get_user(rwin_save, &sf->rwin_save); in do_sigreturn()
127 err |= __get_user(set.sig[0], &sf->info.si_mask); in do_sigreturn()
128 err |= __copy_from_user(&set.sig[1], &sf->extramask, in do_sigreturn()
129 (_NSIG_WORDS-1) * sizeof(unsigned int)); in do_sigreturn()
151 sf = (struct rt_signal_frame __user *) regs->u_regs[UREG_FP]; in do_rt_sigreturn()
155 if (get_user(ufp, &sf->regs.u_regs[UREG_FP])) in do_rt_sigreturn()
161 err = __get_user(pc, &sf->regs.pc); in do_rt_sigreturn()
162 err |= __get_user(npc, &sf->regs.npc); in do_rt_sigreturn()
165 err |= __get_user(regs->y, &sf->regs.y); in do_rt_sigreturn()
166 err |= __get_user(psr, &sf->regs.psr); in do_rt_sigreturn()
168 err |= __copy_from_user(®s->u_regs[UREG_G1], in do_rt_sigreturn()
169 &sf->regs.u_regs[UREG_G1], 15 * sizeof(u32)); in do_rt_sigreturn()
171 regs->psr = (regs->psr & ~PSR_ICC) | (psr & PSR_ICC); in do_rt_sigreturn()
176 err |= __get_user(fpu_save, &sf->fpu_save); in do_rt_sigreturn()
179 err |= __copy_from_user(&set, &sf->mask, sizeof(sigset_t)); in do_rt_sigreturn()
180 err |= restore_altstack(&sf->stack); in do_rt_sigreturn()
185 regs->pc = pc; in do_rt_sigreturn()
186 regs->npc = npc; in do_rt_sigreturn()
188 err |= __get_user(rwin_save, &sf->rwin_save); in do_rt_sigreturn()
202 unsigned long sp = regs->u_regs[UREG_FP]; in get_sigframe()
206 * Return an always-bogus address instead so we will die with SIGSEGV. in get_sigframe()
208 if (on_sig_stack(sp) && !likely(on_sig_stack(sp - framesize))) in get_sigframe()
209 return (void __user *) -1L; in get_sigframe()
212 sp = sigsp(sp, ksig) - framesize; in get_sigframe()
235 wsaved = current_thread_info()->w_saved; in setup_frame()
248 return -EINVAL; in setup_frame()
254 err = __copy_to_user(&sf->info.si_regs, regs, sizeof(struct pt_regs)); in setup_frame()
256 err |= __put_user(0, &sf->extra_size); in setup_frame()
262 err |= __put_user(fp, &sf->fpu_save); in setup_frame()
264 err |= __put_user(0, &sf->fpu_save); in setup_frame()
270 err |= __put_user(rwp, &sf->rwin_save); in setup_frame()
272 err |= __put_user(0, &sf->rwin_save); in setup_frame()
275 err |= __put_user(oldset->sig[0], &sf->info.si_mask); in setup_frame()
276 err |= __copy_to_user(sf->extramask, &oldset->sig[1], in setup_frame()
277 (_NSIG_WORDS - 1) * sizeof(unsigned int)); in setup_frame()
279 err |= __copy_to_user(sf, (char *) regs->u_regs[UREG_FP], in setup_frame()
282 struct reg_window32 *rp; in setup_frame() local
284 rp = ¤t_thread_info()->reg_window[wsaved - 1]; in setup_frame()
285 err |= __copy_to_user(sf, rp, sizeof(struct reg_window32)); in setup_frame()
290 /* 3. signal handler back-trampoline and parameters */ in setup_frame()
291 regs->u_regs[UREG_FP] = (unsigned long) sf; in setup_frame()
292 regs->u_regs[UREG_I0] = ksig->sig; in setup_frame()
293 regs->u_regs[UREG_I1] = (unsigned long) &sf->info; in setup_frame()
294 regs->u_regs[UREG_I2] = (unsigned long) &sf->info; in setup_frame()
297 regs->pc = (unsigned long) ksig->ka.sa.sa_handler; in setup_frame()
298 regs->npc = (regs->pc + 4); in setup_frame()
301 if (ksig->ka.ka_restorer) in setup_frame()
302 regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer; in setup_frame()
304 regs->u_regs[UREG_I7] = (unsigned long)(&(sf->insns[0]) - 2); in setup_frame()
307 err |= __put_user(0x821020d8, &sf->insns[0]); in setup_frame()
310 err |= __put_user(0x91d02010, &sf->insns[1]); in setup_frame()
315 flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0])); in setup_frame()
330 wsaved = current_thread_info()->w_saved; in setup_rt_frame()
340 return -EINVAL; in setup_rt_frame()
344 err = __put_user(regs->pc, &sf->regs.pc); in setup_rt_frame()
345 err |= __put_user(regs->npc, &sf->regs.npc); in setup_rt_frame()
346 err |= __put_user(regs->y, &sf->regs.y); in setup_rt_frame()
347 psr = regs->psr; in setup_rt_frame()
350 err |= __put_user(psr, &sf->regs.psr); in setup_rt_frame()
351 err |= __copy_to_user(&sf->regs.u_regs, regs->u_regs, sizeof(regs->u_regs)); in setup_rt_frame()
352 err |= __put_user(0, &sf->extra_size); in setup_rt_frame()
358 err |= __put_user(fp, &sf->fpu_save); in setup_rt_frame()
360 err |= __put_user(0, &sf->fpu_save); in setup_rt_frame()
366 err |= __put_user(rwp, &sf->rwin_save); in setup_rt_frame()
368 err |= __put_user(0, &sf->rwin_save); in setup_rt_frame()
370 err |= __copy_to_user(&sf->mask, &oldset->sig[0], sizeof(sigset_t)); in setup_rt_frame()
373 err |= __save_altstack(&sf->stack, regs->u_regs[UREG_FP]); in setup_rt_frame()
376 err |= __copy_to_user(sf, (char *) regs->u_regs[UREG_FP], in setup_rt_frame()
379 struct reg_window32 *rp; in setup_rt_frame() local
381 rp = ¤t_thread_info()->reg_window[wsaved - 1]; in setup_rt_frame()
382 err |= __copy_to_user(sf, rp, sizeof(struct reg_window32)); in setup_rt_frame()
385 err |= copy_siginfo_to_user(&sf->info, &ksig->info); in setup_rt_frame()
390 regs->u_regs[UREG_FP] = (unsigned long) sf; in setup_rt_frame()
391 regs->u_regs[UREG_I0] = ksig->sig; in setup_rt_frame()
392 regs->u_regs[UREG_I1] = (unsigned long) &sf->info; in setup_rt_frame()
393 regs->u_regs[UREG_I2] = (unsigned long) &sf->regs; in setup_rt_frame()
395 regs->pc = (unsigned long) ksig->ka.sa.sa_handler; in setup_rt_frame()
396 regs->npc = (regs->pc + 4); in setup_rt_frame()
398 if (ksig->ka.ka_restorer) in setup_rt_frame()
399 regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer; in setup_rt_frame()
401 regs->u_regs[UREG_I7] = (unsigned long)(&(sf->insns[0]) - 2); in setup_rt_frame()
404 err |= __put_user(0x82102065, &sf->insns[0]); in setup_rt_frame()
407 err |= __put_user(0x91d02010, &sf->insns[1]); in setup_rt_frame()
412 flush_sig_insns(current->mm, (unsigned long) &(sf->insns[0])); in setup_rt_frame()
423 if (ksig->ka.sa.sa_flags & SA_SIGINFO) in handle_signal()
433 switch(regs->u_regs[UREG_I0]) { in syscall_restart()
437 regs->u_regs[UREG_I0] = EINTR; in syscall_restart()
438 regs->psr |= PSR_C; in syscall_restart()
441 if (!(sa->sa_flags & SA_RESTART)) in syscall_restart()
445 regs->u_regs[UREG_I0] = orig_i0; in syscall_restart()
446 regs->pc -= 4; in syscall_restart()
447 regs->npc -= 4; in syscall_restart()
479 if (pt_regs_is_syscall(regs) && (regs->psr & PSR_C)) in do_signal()
480 regs->u_regs[UREG_G6] = orig_i0; in do_signal()
489 if (pt_regs_is_syscall(regs) && (regs->psr & PSR_C)) { in do_signal()
491 orig_i0 = regs->u_regs[UREG_G6]; in do_signal()
500 switch (regs->u_regs[UREG_I0]) { in do_signal()
505 regs->u_regs[UREG_I0] = orig_i0; in do_signal()
506 regs->pc -= 4; in do_signal()
507 regs->npc -= 4; in do_signal()
511 regs->u_regs[UREG_G1] = __NR_restart_syscall; in do_signal()
512 regs->pc -= 4; in do_signal()
513 regs->npc -= 4; in do_signal()
534 int ret = -EFAULT; in do_sys_sigstack()
538 if (put_user(current->sas_ss_sp + current->sas_ss_size, in do_sys_sigstack()
539 &ossptr->the_stack) || in do_sys_sigstack()
540 __put_user(on_sig_stack(sp), &ossptr->cur_status)) in do_sys_sigstack()
548 if (get_user(ss_sp, &ssptr->the_stack)) in do_sys_sigstack()
552 ret = -EPERM; in do_sys_sigstack()
553 if (current->sas_ss_sp && on_sig_stack(sp)) in do_sys_sigstack()
557 track onstack-ness, but rather calculate it, we must in do_sys_sigstack()
559 current->sas_ss_sp = (unsigned long)ss_sp - SIGSTKSZ; in do_sys_sigstack()
560 current->sas_ss_size = SIGSTKSZ; in do_sys_sigstack()