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

1 // SPDX-License-Identifier: GPL-2.0
40 /* {set, get}context() needed for 64-bit SparcLinux userland. */
44 regs->u_regs[UREG_I0]; in sparc64_set_context()
54 (((unsigned long)ucp) & (sizeof(unsigned long)-1)) || in sparc64_set_context()
57 grp = &ucp->uc_mcontext.mc_gregs; in sparc64_set_context()
62 if (regs->u_regs[UREG_I1]) { in sparc64_set_context()
66 if (__get_user(set.sig[0], &ucp->uc_sigmask.sig[0])) in sparc64_set_context()
69 if (__copy_from_user(&set, &ucp->uc_sigmask, sizeof(sigset_t))) in sparc64_set_context()
78 regs->tpc = pc; in sparc64_set_context()
79 regs->tnpc = npc; in sparc64_set_context()
80 err |= __get_user(regs->y, &((*grp)[MC_Y])); in sparc64_set_context()
82 regs->tstate &= ~(TSTATE_ASI | TSTATE_ICC | TSTATE_XCC); in sparc64_set_context()
83 regs->tstate |= (tstate & (TSTATE_ASI | TSTATE_ICC | TSTATE_XCC)); in sparc64_set_context()
84 err |= __get_user(regs->u_regs[UREG_G1], (&(*grp)[MC_G1])); in sparc64_set_context()
85 err |= __get_user(regs->u_regs[UREG_G2], (&(*grp)[MC_G2])); in sparc64_set_context()
86 err |= __get_user(regs->u_regs[UREG_G3], (&(*grp)[MC_G3])); in sparc64_set_context()
87 err |= __get_user(regs->u_regs[UREG_G4], (&(*grp)[MC_G4])); in sparc64_set_context()
88 err |= __get_user(regs->u_regs[UREG_G5], (&(*grp)[MC_G5])); in sparc64_set_context()
89 err |= __get_user(regs->u_regs[UREG_G6], (&(*grp)[MC_G6])); in sparc64_set_context()
93 err |= __get_user(regs->u_regs[UREG_I0], (&(*grp)[MC_O0])); in sparc64_set_context()
94 err |= __get_user(regs->u_regs[UREG_I1], (&(*grp)[MC_O1])); in sparc64_set_context()
95 err |= __get_user(regs->u_regs[UREG_I2], (&(*grp)[MC_O2])); in sparc64_set_context()
96 err |= __get_user(regs->u_regs[UREG_I3], (&(*grp)[MC_O3])); in sparc64_set_context()
97 err |= __get_user(regs->u_regs[UREG_I4], (&(*grp)[MC_O4])); in sparc64_set_context()
98 err |= __get_user(regs->u_regs[UREG_I5], (&(*grp)[MC_O5])); in sparc64_set_context()
99 err |= __get_user(regs->u_regs[UREG_I6], (&(*grp)[MC_O6])); in sparc64_set_context()
100 err |= __get_user(regs->u_regs[UREG_I7], (&(*grp)[MC_O7])); in sparc64_set_context()
102 err |= __get_user(fp, &(ucp->uc_mcontext.mc_fp)); in sparc64_set_context()
103 err |= __get_user(i7, &(ucp->uc_mcontext.mc_i7)); in sparc64_set_context()
105 (&(((struct reg_window __user *)(STACK_BIAS+regs->u_regs[UREG_I6]))->ins[6]))); in sparc64_set_context()
107 (&(((struct reg_window __user *)(STACK_BIAS+regs->u_regs[UREG_I6]))->ins[7]))); in sparc64_set_context()
109 err |= __get_user(fenab, &(ucp->uc_mcontext.mc_fpregs.mcfpu_enab)); in sparc64_set_context()
111 unsigned long *fpregs = current_thread_info()->fpregs; in sparc64_set_context()
115 err |= __get_user(fprs, &(ucp->uc_mcontext.mc_fpregs.mcfpu_fprs)); in sparc64_set_context()
118 &(ucp->uc_mcontext.mc_fpregs.mcfpu_fregs), in sparc64_set_context()
122 ((unsigned long __user *)&(ucp->uc_mcontext.mc_fpregs.mcfpu_fregs))+16, in sparc64_set_context()
124 err |= __get_user(current_thread_info()->xfsr[0], in sparc64_set_context()
125 &(ucp->uc_mcontext.mc_fpregs.mcfpu_fsr)); in sparc64_set_context()
126 err |= __get_user(current_thread_info()->gsr[0], in sparc64_set_context()
127 &(ucp->uc_mcontext.mc_fpregs.mcfpu_gsr)); in sparc64_set_context()
128 regs->tstate &= ~TSTATE_PEF; in sparc64_set_context()
143 regs->u_regs[UREG_I0]; in sparc64_get_context()
156 fenab = 0; /* IMO get_context is like any other system call, thus modifies FPU state -jj */ in sparc64_get_context()
158 fenab = (current_thread_info()->fpsaved[0] & FPRS_FEF); in sparc64_get_context()
161 mcp = &ucp->uc_mcontext; in sparc64_get_context()
162 grp = &mcp->mc_gregs; in sparc64_get_context()
166 regs->tpc = (regs->tnpc & 0xffffffff); in sparc64_get_context()
167 regs->tnpc = (regs->tnpc + 4) & 0xffffffff; in sparc64_get_context()
169 regs->tpc = regs->tnpc; in sparc64_get_context()
170 regs->tnpc += 4; in sparc64_get_context()
174 err |= __put_user(current->blocked.sig[0], in sparc64_get_context()
175 (unsigned long __user *)&ucp->uc_sigmask); in sparc64_get_context()
177 err |= __copy_to_user(&ucp->uc_sigmask, &current->blocked, in sparc64_get_context()
180 err |= __put_user(regs->tstate, &((*grp)[MC_TSTATE])); in sparc64_get_context()
181 err |= __put_user(regs->tpc, &((*grp)[MC_PC])); in sparc64_get_context()
182 err |= __put_user(regs->tnpc, &((*grp)[MC_NPC])); in sparc64_get_context()
183 err |= __put_user(regs->y, &((*grp)[MC_Y])); in sparc64_get_context()
184 err |= __put_user(regs->u_regs[UREG_G1], &((*grp)[MC_G1])); in sparc64_get_context()
185 err |= __put_user(regs->u_regs[UREG_G2], &((*grp)[MC_G2])); in sparc64_get_context()
186 err |= __put_user(regs->u_regs[UREG_G3], &((*grp)[MC_G3])); in sparc64_get_context()
187 err |= __put_user(regs->u_regs[UREG_G4], &((*grp)[MC_G4])); in sparc64_get_context()
188 err |= __put_user(regs->u_regs[UREG_G5], &((*grp)[MC_G5])); in sparc64_get_context()
189 err |= __put_user(regs->u_regs[UREG_G6], &((*grp)[MC_G6])); in sparc64_get_context()
190 err |= __put_user(regs->u_regs[UREG_G7], &((*grp)[MC_G7])); in sparc64_get_context()
191 err |= __put_user(regs->u_regs[UREG_I0], &((*grp)[MC_O0])); in sparc64_get_context()
192 err |= __put_user(regs->u_regs[UREG_I1], &((*grp)[MC_O1])); in sparc64_get_context()
193 err |= __put_user(regs->u_regs[UREG_I2], &((*grp)[MC_O2])); in sparc64_get_context()
194 err |= __put_user(regs->u_regs[UREG_I3], &((*grp)[MC_O3])); in sparc64_get_context()
195 err |= __put_user(regs->u_regs[UREG_I4], &((*grp)[MC_O4])); in sparc64_get_context()
196 err |= __put_user(regs->u_regs[UREG_I5], &((*grp)[MC_O5])); in sparc64_get_context()
197 err |= __put_user(regs->u_regs[UREG_I6], &((*grp)[MC_O6])); in sparc64_get_context()
198 err |= __put_user(regs->u_regs[UREG_I7], &((*grp)[MC_O7])); in sparc64_get_context()
201 (&(((struct reg_window __user *)(STACK_BIAS+regs->u_regs[UREG_I6]))->ins[6]))); in sparc64_get_context()
203 (&(((struct reg_window __user *)(STACK_BIAS+regs->u_regs[UREG_I6]))->ins[7]))); in sparc64_get_context()
204 err |= __put_user(fp, &(mcp->mc_fp)); in sparc64_get_context()
205 err |= __put_user(i7, &(mcp->mc_i7)); in sparc64_get_context()
207 err |= __put_user(fenab, &(mcp->mc_fpregs.mcfpu_enab)); in sparc64_get_context()
209 unsigned long *fpregs = current_thread_info()->fpregs; in sparc64_get_context()
212 fprs = current_thread_info()->fpsaved[0]; in sparc64_get_context()
214 err |= copy_to_user(&(mcp->mc_fpregs.mcfpu_fregs), fpregs, in sparc64_get_context()
218 ((unsigned long __user *)&(mcp->mc_fpregs.mcfpu_fregs))+16, fpregs+16, in sparc64_get_context()
220 err |= __put_user(current_thread_info()->xfsr[0], &(mcp->mc_fpregs.mcfpu_fsr)); in sparc64_get_context()
221 err |= __put_user(current_thread_info()->gsr[0], &(mcp->mc_fpregs.mcfpu_gsr)); in sparc64_get_context()
222 err |= __put_user(fprs, &(mcp->mc_fpregs.mcfpu_fprs)); in sparc64_get_context()
235 * are 16-byte aligned, therefore we can always enforce that the
264 /* Always make any pending restarted system calls return -EINTR */ in do_rt_sigreturn()
265 current->restart_block.fn = do_no_restart_syscall; in do_rt_sigreturn()
269 (regs->u_regs [UREG_FP] + STACK_BIAS); in do_rt_sigreturn()
275 if (get_user(ufp, &sf->regs.u_regs[UREG_FP])) in do_rt_sigreturn()
281 err = __get_user(tpc, &sf->regs.tpc); in do_rt_sigreturn()
282 err |= __get_user(tnpc, &sf->regs.tnpc); in do_rt_sigreturn()
290 err |= __get_user(regs->y, &sf->regs.y); in do_rt_sigreturn()
291 err |= __get_user(tstate, &sf->regs.tstate); in do_rt_sigreturn()
292 err |= copy_from_user(regs->u_regs, sf->regs.u_regs, sizeof(regs->u_regs)); in do_rt_sigreturn()
295 regs->tstate &= ~(TSTATE_ASI | TSTATE_ICC | TSTATE_XCC); in do_rt_sigreturn()
296 regs->tstate |= (tstate & (TSTATE_ASI | TSTATE_ICC | TSTATE_XCC)); in do_rt_sigreturn()
298 err |= __get_user(fpu_save, &sf->fpu_save); in do_rt_sigreturn()
302 err |= __copy_from_user(&set, &sf->mask, sizeof(sigset_t)); in do_rt_sigreturn()
303 err |= restore_altstack(&sf->stack); in do_rt_sigreturn()
307 err |= __get_user(rwin_save, &sf->rwin_save); in do_rt_sigreturn()
313 regs->tpc = tpc; in do_rt_sigreturn()
314 regs->tnpc = tnpc; in do_rt_sigreturn()
327 unsigned long sp = regs->u_regs[UREG_FP] + STACK_BIAS; in get_sigframe()
331 * Return an always-bogus address instead so we will die with SIGSEGV. in get_sigframe()
333 if (on_sig_stack(sp) && !likely(on_sig_stack(sp - framesize))) in get_sigframe()
334 return (void __user *) -1L; in get_sigframe()
337 sp = sigsp(sp, ksig) - framesize; in get_sigframe()
364 if (current_thread_info()->fpsaved[0] & FPRS_FEF) in setup_rt_frame()
374 current->comm, current->pid, (unsigned long)sf, in setup_rt_frame()
375 regs->tpc, regs->u_regs[UREG_I7]); in setup_rt_frame()
376 force_sigsegv(ksig->sig); in setup_rt_frame()
377 return -EINVAL; in setup_rt_frame()
383 err = copy_to_user(&sf->regs, regs, sizeof (*regs)); in setup_rt_frame()
385 if (current_thread_info()->fpsaved[0] & FPRS_FEF) { in setup_rt_frame()
389 err |= __put_user((u64)fpu_save, &sf->fpu_save); in setup_rt_frame()
391 err |= __put_user(0, &sf->fpu_save); in setup_rt_frame()
397 err |= __put_user((u64)rwin_save, &sf->rwin_save); in setup_rt_frame()
400 err |= __put_user(0, &sf->rwin_save); in setup_rt_frame()
404 err |= __save_altstack(&sf->stack, regs->u_regs[UREG_FP]); in setup_rt_frame()
406 err |= copy_to_user(&sf->mask, sigmask_to_save(), sizeof(sigset_t)); in setup_rt_frame()
410 (u64 __user *)(regs->u_regs[UREG_FP] + in setup_rt_frame()
414 struct reg_window *rp; in setup_rt_frame() local
416 rp = &current_thread_info()->reg_window[wsaved - 1]; in setup_rt_frame()
417 err |= copy_to_user(sf, rp, sizeof(struct reg_window)); in setup_rt_frame()
419 if (ksig->ka.sa.sa_flags & SA_SIGINFO) in setup_rt_frame()
420 err |= copy_siginfo_to_user(&sf->info, &ksig->info); in setup_rt_frame()
422 err |= __put_user(ksig->sig, &sf->info.si_signo); in setup_rt_frame()
423 err |= __put_user(SI_NOINFO, &sf->info.si_code); in setup_rt_frame()
428 /* 3. signal handler back-trampoline and parameters */ in setup_rt_frame()
429 regs->u_regs[UREG_FP] = ((unsigned long) sf) - STACK_BIAS; in setup_rt_frame()
430 regs->u_regs[UREG_I0] = ksig->sig; in setup_rt_frame()
431 regs->u_regs[UREG_I1] = (unsigned long) &sf->info; in setup_rt_frame()
437 regs->u_regs[UREG_I2] = (unsigned long) &sf->info; in setup_rt_frame()
440 regs->tpc = (unsigned long) ksig->ka.sa.sa_handler; in setup_rt_frame()
441 regs->tnpc = (regs->tpc + 4); in setup_rt_frame()
443 regs->tpc &= 0xffffffff; in setup_rt_frame()
444 regs->tnpc &= 0xffffffff; in setup_rt_frame()
447 regs->u_regs[UREG_I7] = (unsigned long)ksig->ka.ka_restorer; in setup_rt_frame()
454 switch (regs->u_regs[UREG_I0]) { in syscall_restart()
458 regs->u_regs[UREG_I0] = EINTR; in syscall_restart()
459 regs->tstate |= (TSTATE_ICARRY|TSTATE_XCARRY); in syscall_restart()
462 if (!(sa->sa_flags & SA_RESTART)) in syscall_restart()
466 regs->u_regs[UREG_I0] = orig_i0; in syscall_restart()
467 regs->tpc -= 4; in syscall_restart()
468 regs->tnpc -= 4; in syscall_restart()
501 (regs->tstate & (TSTATE_XCARRY | TSTATE_ICARRY))) in do_signal()
502 regs->u_regs[UREG_G6] = orig_i0; in do_signal()
515 (regs->tstate & (TSTATE_XCARRY | TSTATE_ICARRY))) { in do_signal()
517 orig_i0 = regs->u_regs[UREG_G6]; in do_signal()
526 switch (regs->u_regs[UREG_I0]) { in do_signal()
531 regs->u_regs[UREG_I0] = orig_i0; in do_signal()
532 regs->tpc -= 4; in do_signal()
533 regs->tnpc -= 4; in do_signal()
537 regs->u_regs[UREG_G1] = __NR_restart_syscall; in do_signal()
538 regs->tpc -= 4; in do_signal()
539 regs->tnpc -= 4; in do_signal()
560 * Compile-time assertions for siginfo_t offsets. Check NSIG* as well, as