Lines Matching +full:sparc +full:- +full:linux +full:- +full:user

2  *  Emulation of Linux signals
21 #include "user-internals.h"
22 #include "signal-common.h"
23 #include "linux-user/trace.h"
25 /* A Sparc register window */
31 /* A Sparc stack frame. */
72 abi_ulong extramask[TARGET_NSIG_WORDS - 1];
104 * Return an always-bogus address instead so we will die with SIGSEGV. in get_sigframe()
106 if (on_sig_stack(sp) && !likely(on_sig_stack(sp - framesize))) { in get_sigframe()
107 return -1; in get_sigframe()
111 sp = target_sigsp(sp, sa) - framesize; in get_sigframe()
130 __put_user(sparc64_tstate(env), &regs->tstate); in save_pt_regs()
132 __put_user(0, &regs->magic); in save_pt_regs()
134 __put_user(cpu_get_psr(env), &regs->psr); in save_pt_regs()
137 __put_user(env->pc, &regs->pc); in save_pt_regs()
138 __put_user(env->npc, &regs->npc); in save_pt_regs()
139 __put_user(env->y, &regs->y); in save_pt_regs()
142 __put_user(env->gregs[i], &regs->u_regs[i]); in save_pt_regs()
145 __put_user(env->regwptr[WREG_O0 + i], &regs->u_regs[i + 8]); in save_pt_regs()
154 /* User can only change condition codes and %asi in %tstate. */ in restore_pt_regs()
156 __get_user(tstate, &regs->tstate); in restore_pt_regs()
158 env->asi = extract64(tstate, 24, 8); in restore_pt_regs()
161 * User can only change condition codes and FPU enabling in %psr. in restore_pt_regs()
163 * just re-enable the FPU upon the next fpu trap. in restore_pt_regs()
166 __get_user(psr, &regs->psr); in restore_pt_regs()
172 __get_user(env->y, &regs->y); in restore_pt_regs()
175 __get_user(env->gregs[i], &regs->u_regs[i]); in restore_pt_regs()
178 __get_user(env->regwptr[WREG_O0 + i], &regs->u_regs[i + 8]); in restore_pt_regs()
187 __put_user(env->regwptr[i + WREG_L0], &win->locals[i]); in save_reg_win()
190 __put_user(env->regwptr[i + WREG_I0], &win->ins[i]); in save_reg_win()
200 __put_user(env->fpr[i].ll, &fpu->si_double_regs[i]); in save_fpu()
202 __put_user(cpu_get_fsr(env), &fpu->si_fsr); in save_fpu()
203 __put_user(env->gsr, &fpu->si_gsr); in save_fpu()
204 __put_user(env->fprs, &fpu->si_fprs); in save_fpu()
207 __put_user(env->fpr[i].ll, &fpu->si_double_regs[i]); in save_fpu()
209 __put_user(cpu_get_fsr(env), &fpu->si_fsr); in save_fpu()
210 __put_user(0, &fpu->si_fpqdepth); in save_fpu()
221 __get_user(fprs, &fpu->si_fprs); in restore_fpu()
223 /* In case the user mucks about with FPRS, restore as directed. */ in restore_fpu()
226 __get_user(env->fpr[i].ll, &fpu->si_double_regs[i]); in restore_fpu()
231 __get_user(env->fpr[i].ll, &fpu->si_double_regs[i]); in restore_fpu()
234 __get_user(env->gsr, &fpu->si_gsr); in restore_fpu()
235 env->fprs |= fprs; in restore_fpu()
238 __get_user(env->fpr[i].ll, &fpu->si_double_regs[i]); in restore_fpu()
242 __get_user(fsr, &fpu->si_fsr); in restore_fpu()
271 save_pt_regs(&sf->regs, env); in setup_frame()
272 __put_user(0, &sf->extra_size); in setup_frame()
275 __put_user(sf_addr + sizeof(*sf), &sf->fpu_save); in setup_frame()
277 __put_user(0, &sf->rwin_save); /* TODO: save_rwin_state */ in setup_frame()
279 __put_user(set->sig[0], &sf->si_mask); in setup_frame()
280 for (i = 0; i < TARGET_NSIG_WORDS - 1; i++) { in setup_frame()
281 __put_user(set->sig[i + 1], &sf->extramask[i]); in setup_frame()
284 save_reg_win(&sf->ss.win, env); in setup_frame()
286 /* 3. signal handler back-trampoline and parameters */ in setup_frame()
287 env->regwptr[WREG_SP] = sf_addr; in setup_frame()
288 env->regwptr[WREG_O0] = sig; in setup_frame()
289 env->regwptr[WREG_O1] = sf_addr + in setup_frame()
291 env->regwptr[WREG_O2] = sf_addr + in setup_frame()
295 env->pc = ka->_sa_handler; in setup_frame()
296 env->npc = env->pc + 4; in setup_frame()
299 if (ka->ka_restorer) { in setup_frame()
300 env->regwptr[WREG_O7] = ka->ka_restorer; in setup_frame()
303 install_sigtramp(sf->insns, TARGET_NR_sigreturn); in setup_frame()
304 env->regwptr[WREG_O7] = default_sigreturn; in setup_frame()
328 save_reg_win(&sf->ss.win, env); in setup_rt_frame()
329 save_pt_regs(&sf->regs, env); in setup_rt_frame()
332 __put_user(sf_addr + sizeof(*sf), &sf->fpu_save); in setup_rt_frame()
334 __put_user(0, &sf->rwin_save); /* TODO: save_rwin_state */ in setup_rt_frame()
336 sf->info = *info; in setup_rt_frame()
337 tswap_sigset(&sf->mask, set); in setup_rt_frame()
338 target_save_altstack(&sf->stack, env); in setup_rt_frame()
341 __put_user(0, &sf->extra_size); in setup_rt_frame()
344 /* 3. signal handler back-trampoline and parameters */ in setup_rt_frame()
345 env->regwptr[WREG_SP] = sf_addr - TARGET_STACK_BIAS; in setup_rt_frame()
346 env->regwptr[WREG_O0] = sig; in setup_rt_frame()
347 env->regwptr[WREG_O1] = in setup_rt_frame()
350 env->regwptr[WREG_O2] = in setup_rt_frame()
353 env->regwptr[WREG_O2] = env->regwptr[WREG_O1]; in setup_rt_frame()
357 env->pc = ka->_sa_handler; in setup_rt_frame()
358 env->npc = env->pc + 4; in setup_rt_frame()
362 if (ka->ka_restorer) { in setup_rt_frame()
363 env->regwptr[WREG_O7] = ka->ka_restorer; in setup_rt_frame()
366 install_sigtramp(sf->insns, TARGET_NR_rt_sigreturn); in setup_rt_frame()
367 env->regwptr[WREG_O7] = default_rt_sigreturn; in setup_rt_frame()
370 env->regwptr[WREG_O7] = ka->ka_restorer; in setup_rt_frame()
386 sf_addr = env->regwptr[WREG_SP]; in do_sigreturn()
389 /* 1. Make sure we are not getting garbage from the user */ in do_sigreturn()
395 __get_user(ptr, &sf->regs.u_regs[14]); in do_sigreturn()
401 __get_user(pc, &sf->regs.pc); in do_sigreturn()
402 __get_user(npc, &sf->regs.npc); in do_sigreturn()
408 restore_pt_regs(&sf->regs, env); in do_sigreturn()
409 env->pc = pc; in do_sigreturn()
410 env->npc = npc; in do_sigreturn()
412 __get_user(ptr, &sf->fpu_save); in do_sigreturn()
422 __get_user(ptr, &sf->rwin_save); in do_sigreturn()
427 __get_user(set.sig[0], &sf->si_mask); in do_sigreturn()
429 __get_user(set.sig[i], &sf->extramask[i - 1]); in do_sigreturn()
436 return -QEMU_ESIGRETURN; in do_sigreturn()
441 return -QEMU_ESIGRETURN; in do_sigreturn()
443 return -TARGET_ENOSYS; in do_sigreturn()
456 /* 1. Make sure we are not getting garbage from the user */ in do_rt_sigreturn()
462 __get_user(ptr, &sf->regs.u_regs[8 + WREG_SP]); in do_rt_sigreturn()
468 __get_user(tpc, &sf->regs.pc); in do_rt_sigreturn()
469 __get_user(tnpc, &sf->regs.npc); in do_rt_sigreturn()
475 restore_pt_regs(&sf->regs, env); in do_rt_sigreturn()
477 __get_user(ptr, &sf->fpu_save); in do_rt_sigreturn()
487 __get_user(ptr, &sf->rwin_save); in do_rt_sigreturn()
492 target_restore_altstack(&sf->stack, env); in do_rt_sigreturn()
493 target_to_host_sigset(&set, &sf->mask); in do_rt_sigreturn()
496 env->pc = tpc; in do_rt_sigreturn()
497 env->npc = tnpc; in do_rt_sigreturn()
500 return -QEMU_ESIGRETURN; in do_rt_sigreturn()
505 return -QEMU_ESIGRETURN; in do_rt_sigreturn()
550 * Note the manual 16-alignment; the kernel gets this because it
584 /* {set, get}context() needed for 64-bit SparcLinux userland. */
595 ucp_addr = env->regwptr[WREG_O0]; in sparc64_set_context()
599 grp = &ucp->tuc_mcontext.mc_gregs; in sparc64_set_context()
605 if (env->regwptr[WREG_O1]) { in sparc64_set_context()
610 __get_user(target_set.sig[0], &ucp->tuc_sigmask.sig[0]); in sparc64_set_context()
613 src = ucp->tuc_sigmask.sig; in sparc64_set_context()
622 env->pc = pc; in sparc64_set_context()
623 env->npc = npc; in sparc64_set_context()
624 __get_user(env->y, &((*grp)[SPARC_MC_Y])); in sparc64_set_context()
627 env->asi = (tstate >> 24) & 0xff; in sparc64_set_context()
629 __get_user(env->gregs[1], (&(*grp)[SPARC_MC_G1])); in sparc64_set_context()
630 __get_user(env->gregs[2], (&(*grp)[SPARC_MC_G2])); in sparc64_set_context()
631 __get_user(env->gregs[3], (&(*grp)[SPARC_MC_G3])); in sparc64_set_context()
632 __get_user(env->gregs[4], (&(*grp)[SPARC_MC_G4])); in sparc64_set_context()
633 __get_user(env->gregs[5], (&(*grp)[SPARC_MC_G5])); in sparc64_set_context()
634 __get_user(env->gregs[6], (&(*grp)[SPARC_MC_G6])); in sparc64_set_context()
645 __get_user(env->regwptr[WREG_O0], (&(*grp)[SPARC_MC_O0])); in sparc64_set_context()
646 __get_user(env->regwptr[WREG_O1], (&(*grp)[SPARC_MC_O1])); in sparc64_set_context()
647 __get_user(env->regwptr[WREG_O2], (&(*grp)[SPARC_MC_O2])); in sparc64_set_context()
648 __get_user(env->regwptr[WREG_O3], (&(*grp)[SPARC_MC_O3])); in sparc64_set_context()
649 __get_user(env->regwptr[WREG_O4], (&(*grp)[SPARC_MC_O4])); in sparc64_set_context()
650 __get_user(env->regwptr[WREG_O5], (&(*grp)[SPARC_MC_O5])); in sparc64_set_context()
651 __get_user(env->regwptr[WREG_O6], (&(*grp)[SPARC_MC_O6])); in sparc64_set_context()
652 __get_user(env->regwptr[WREG_O7], (&(*grp)[SPARC_MC_O7])); in sparc64_set_context()
654 __get_user(env->regwptr[WREG_FP], &(ucp->tuc_mcontext.mc_fp)); in sparc64_set_context()
655 __get_user(env->regwptr[WREG_I7], &(ucp->tuc_mcontext.mc_i7)); in sparc64_set_context()
657 fpup = &ucp->tuc_mcontext.mc_fpregs; in sparc64_set_context()
659 __get_user(fenab, &(fpup->mcfpu_enab)); in sparc64_set_context()
670 * next FPU-disabled trap will copy the data out of in sparc64_set_context()
672 * QEMU doesn't need to handle lazy-FPU-state-restoring like that, in sparc64_set_context()
680 __get_user(fprs, &(fpup->mcfpu_fprs)); in sparc64_set_context()
683 __get_user(env->fpr[i].ll, &(fpup->mcfpu_fregs.dregs[i])); in sparc64_set_context()
688 __get_user(env->fpr[i].ll, &(fpup->mcfpu_fregs.dregs[i])); in sparc64_set_context()
691 __get_user(fsr, &(fpup->mcfpu_fsr)); in sparc64_set_context()
693 __get_user(env->gsr, &(fpup->mcfpu_gsr)); in sparc64_set_context()
713 ucp_addr = env->regwptr[WREG_O0]; in sparc64_get_context()
720 mcp = &ucp->tuc_mcontext; in sparc64_get_context()
721 grp = &mcp->mc_gregs; in sparc64_get_context()
724 env->pc = env->npc; in sparc64_get_context()
725 env->npc += 4; in sparc64_get_context()
737 (abi_ulong *)&ucp->tuc_sigmask); in sparc64_get_context()
741 dst = ucp->tuc_sigmask.sig; in sparc64_get_context()
748 __put_user(env->pc, &((*grp)[SPARC_MC_PC])); in sparc64_get_context()
749 __put_user(env->npc, &((*grp)[SPARC_MC_NPC])); in sparc64_get_context()
750 __put_user(env->y, &((*grp)[SPARC_MC_Y])); in sparc64_get_context()
751 __put_user(env->gregs[1], &((*grp)[SPARC_MC_G1])); in sparc64_get_context()
752 __put_user(env->gregs[2], &((*grp)[SPARC_MC_G2])); in sparc64_get_context()
753 __put_user(env->gregs[3], &((*grp)[SPARC_MC_G3])); in sparc64_get_context()
754 __put_user(env->gregs[4], &((*grp)[SPARC_MC_G4])); in sparc64_get_context()
755 __put_user(env->gregs[5], &((*grp)[SPARC_MC_G5])); in sparc64_get_context()
756 __put_user(env->gregs[6], &((*grp)[SPARC_MC_G6])); in sparc64_get_context()
757 __put_user(env->gregs[7], &((*grp)[SPARC_MC_G7])); in sparc64_get_context()
767 __put_user(env->regwptr[WREG_O0], &((*grp)[SPARC_MC_O0])); in sparc64_get_context()
768 __put_user(env->regwptr[WREG_O1], &((*grp)[SPARC_MC_O1])); in sparc64_get_context()
769 __put_user(env->regwptr[WREG_O2], &((*grp)[SPARC_MC_O2])); in sparc64_get_context()
770 __put_user(env->regwptr[WREG_O3], &((*grp)[SPARC_MC_O3])); in sparc64_get_context()
771 __put_user(env->regwptr[WREG_O4], &((*grp)[SPARC_MC_O4])); in sparc64_get_context()
772 __put_user(env->regwptr[WREG_O5], &((*grp)[SPARC_MC_O5])); in sparc64_get_context()
773 __put_user(env->regwptr[WREG_O6], &((*grp)[SPARC_MC_O6])); in sparc64_get_context()
774 __put_user(env->regwptr[WREG_O7], &((*grp)[SPARC_MC_O7])); in sparc64_get_context()
776 __put_user(env->regwptr[WREG_FP], &(mcp->mc_fp)); in sparc64_get_context()
777 __put_user(env->regwptr[WREG_I7], &(mcp->mc_i7)); in sparc64_get_context()