Lines Matching +full:tf +full:- +full:a

1 /*-
2 * SPDX-License-Identifier: BSD-4-Clause AND BSD-2-Clause
24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
33 /*-
48 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
152 struct trapframe *tf; in sendsig() local
169 p = td->td_proc; in sendsig()
172 psp = p->p_sigacts; in sendsig()
173 mtx_assert(&psp->ps_mtx, MA_OWNED); in sendsig()
174 tf = td->td_frame; in sendsig()
179 ksi->ksi_info.si_signo = ksi->ksi_signo; in sendsig()
180 ksi->ksi_info.si_addr = in sendsig()
181 (void *)((tf->exc == EXC_DSI || tf->exc == EXC_DSE) ? in sendsig()
182 tf->dar : tf->srr0); in sendsig()
186 siginfo_to_siginfo32(&ksi->ksi_info, &siginfo32); in sendsig()
192 sp = (uint32_t)tf->fixreg[1]; in sendsig()
203 sf32.sf_uc.uc_stack.ss_sp = (uintptr_t)td->td_sigstk.ss_sp; in sendsig()
204 sf32.sf_uc.uc_stack.ss_size = (uint32_t)td->td_sigstk.ss_size; in sendsig()
205 sf32.sf_uc.uc_stack.ss_flags = (td->td_pflags & TDP_ALTSTACK) in sendsig()
211 sig = ksi->ksi_signo; in sendsig()
212 code = ksi->ksi_code; in sendsig()
217 * 64-bit PPC defines a 512 byte red zone below in sendsig()
224 sp = tf->fixreg[1]; in sendsig()
235 sf.sf_uc.uc_stack = td->td_sigstk; in sendsig()
236 sf.sf_uc.uc_stack.ss_flags = (td->td_pflags & TDP_ALTSTACK) in sendsig()
244 CTR4(KTR_SIG, "sendsig: td=%p (%s) catcher=%p sig=%d", td, p->p_comm, in sendsig()
250 if ((td->td_pflags & TDP_ALTSTACK) != 0 && !oonstack && in sendsig()
251 SIGISMEMBER(psp->ps_sigonstack, sig)) { in sendsig()
252 usfp = (void *)(((uintptr_t)td->td_sigstk.ss_sp + in sendsig()
253 td->td_sigstk.ss_size - rndfsize) & ~0xFul); in sendsig()
255 usfp = (void *)((sp - rndfsize) & ~0xFul); in sendsig()
262 if (td->td_pcb->pcb_flags & PCB_FPU) in sendsig()
263 tf->srr1 = tf->srr1 & ~(PSL_FE0 | PSL_FE1); in sendsig()
268 * r1/sp - sigframe ptr in sendsig()
269 * lr - sig function, dispatched to by blrl in trampoline in sendsig()
270 * r3 - sig number in sendsig()
271 * r4 - SIGINFO ? &siginfo : exception code in sendsig()
272 * r5 - user context in sendsig()
273 * srr0 - trampoline function addr in sendsig()
275 tf->lr = (register_t)catcher; in sendsig()
276 tf->fixreg[1] = (register_t)usfp; in sendsig()
277 tf->fixreg[FIRSTARG] = sig; in sendsig()
279 tf->fixreg[FIRSTARG+2] = (register_t)usfp + in sendsig()
284 tf->fixreg[FIRSTARG+2] = (register_t)usfp + in sendsig()
287 if (SIGISMEMBER(psp->ps_siginfo, sig)) { in sendsig()
294 tf->fixreg[FIRSTARG+1] = (register_t)usfp + in sendsig()
299 tf->fixreg[FIRSTARG+1] = (register_t)usfp + in sendsig()
301 sf.sf_si = ksi->ksi_info; in sendsig()
306 /* Old FreeBSD-style arguments. */ in sendsig()
307 tf->fixreg[FIRSTARG+1] = code; in sendsig()
308 tf->fixreg[FIRSTARG+3] = (tf->exc == EXC_DSI) ? in sendsig()
309 tf->dar : tf->srr0; in sendsig()
311 mtx_unlock(&psp->ps_mtx); in sendsig()
314 tf->srr0 = (register_t)PROC_SIGCODE(p); in sendsig()
329 tf->srr0, tf->fixreg[1]); in sendsig()
332 mtx_lock(&psp->ps_mtx); in sendsig()
341 CTR2(KTR_SIG, "sigreturn: td=%p ucp=%p", td, uap->sigcntxp); in sys_sigreturn()
343 if (copyin(uap->sigcntxp, &uc, sizeof(uc)) != 0) { in sys_sigreturn()
370 * Construct a PCB from a trapframe. This is called from kdb_trap() where
371 * we want to start a backtrace from the function that caused us to enter
374 * enough for a backtrace.
377 makectx(struct trapframe *tf, struct pcb *pcb) in makectx() argument
380 pcb->pcb_lr = tf->srr0; in makectx()
381 pcb->pcb_sp = tf->fixreg[1]; in makectx()
394 pcb = td->td_pcb; in grab_mcontext()
398 mcp->mc_vers = _MC_VERSION; in grab_mcontext()
399 mcp->mc_flags = 0; in grab_mcontext()
400 memcpy(&mcp->mc_frame, td->td_frame, sizeof(struct trapframe)); in grab_mcontext()
402 mcp->mc_gpr[3] = 0; in grab_mcontext()
403 mcp->mc_gpr[4] = 0; in grab_mcontext()
407 * This assumes that floating-point context is *not* lazy, in grab_mcontext()
408 * so if the thread has used FP there would have been a in grab_mcontext()
409 * FP-unavailable exception that would have set things up in grab_mcontext()
412 if (pcb->pcb_flags & PCB_FPREGS) { in grab_mcontext()
413 if (pcb->pcb_flags & PCB_FPU) { in grab_mcontext()
420 mcp->mc_flags |= _MC_FP_VALID; in grab_mcontext()
421 memcpy(&mcp->mc_fpscr, &pcb->pcb_fpu.fpscr, sizeof(double)); in grab_mcontext()
423 memcpy(&mcp->mc_fpreg[i], &pcb->pcb_fpu.fpr[i].fpr, in grab_mcontext()
427 if (pcb->pcb_flags & PCB_VSX) { in grab_mcontext()
428 mcp->mc_flags |= _MC_VS_VALID; in grab_mcontext()
430 memcpy(&mcp->mc_vsxfpreg[i], in grab_mcontext()
431 &pcb->pcb_fpu.fpr[i].vsr[2], sizeof(double)); in grab_mcontext()
438 if (pcb->pcb_flags & PCB_VECREGS) { in grab_mcontext()
439 if (pcb->pcb_flags & PCB_VEC) { in grab_mcontext()
446 mcp->mc_flags |= _MC_AV_VALID; in grab_mcontext()
447 mcp->mc_vscr = pcb->pcb_vec.vscr; in grab_mcontext()
448 mcp->mc_vrsave = pcb->pcb_vec.vrsave; in grab_mcontext()
449 memcpy(mcp->mc_avec, pcb->pcb_vec.vr, sizeof(mcp->mc_avec)); in grab_mcontext()
452 mcp->mc_len = sizeof(*mcp); in grab_mcontext()
464 PROC_LOCK(curthread->td_proc); in get_mcontext()
465 mcp->mc_onstack = sigonstack(td->td_frame->fixreg[1]); in get_mcontext()
466 PROC_UNLOCK(curthread->td_proc); in get_mcontext()
476 struct trapframe *tf; in set_mcontext() local
481 pcb = td->td_pcb; in set_mcontext()
482 tf = td->td_frame; in set_mcontext()
484 if (mcp->mc_vers != _MC_VERSION || mcp->mc_len != sizeof(*mcp)) in set_mcontext()
498 * support for a new conditional facility! in set_mcontext()
500 if ((mcp->mc_srr1 & psl_userstatic) != (tf->srr1 & psl_userstatic)) { in set_mcontext()
505 if (SV_PROC_FLAG(td->td_proc, SV_LP64)) in set_mcontext()
506 tls = tf->fixreg[13]; in set_mcontext()
508 tls = tf->fixreg[2]; in set_mcontext()
509 memcpy(tf, mcp->mc_frame, sizeof(mcp->mc_frame)); in set_mcontext()
510 if (SV_PROC_FLAG(td->td_proc, SV_LP64)) in set_mcontext()
511 tf->fixreg[13] = tls; in set_mcontext()
513 tf->fixreg[2] = tls; in set_mcontext()
519 * This prevents an issue where a process that uses floating point in set_mcontext()
520 * inside a signal handler could end up in a state where the MSR in set_mcontext()
526 tf->srr1 &= ~(PSL_FP | PSL_VSX | PSL_VEC); in set_mcontext()
527 pcb->pcb_flags &= ~(PCB_FPU | PCB_VSX | PCB_VEC); in set_mcontext()
533 * don't switch to a FPU disabled context before resuming the original in set_mcontext()
545 if (mcp->mc_flags & _MC_FP_VALID) { in set_mcontext()
546 /* enable_fpu() will happen lazily on a fault */ in set_mcontext()
547 pcb->pcb_flags |= PCB_FPREGS; in set_mcontext()
548 memcpy(&pcb->pcb_fpu.fpscr, &mcp->mc_fpscr, sizeof(double)); in set_mcontext()
549 bzero(pcb->pcb_fpu.fpr, sizeof(pcb->pcb_fpu.fpr)); in set_mcontext()
551 memcpy(&pcb->pcb_fpu.fpr[i].fpr, &mcp->mc_fpreg[i], in set_mcontext()
554 if (mcp->mc_flags & _MC_VS_VALID) { in set_mcontext()
556 memcpy(&pcb->pcb_fpu.fpr[i].vsr[2], in set_mcontext()
557 &mcp->mc_vsxfpreg[i], sizeof(double)); in set_mcontext()
562 if (mcp->mc_flags & _MC_AV_VALID) { in set_mcontext()
563 /* enable_vec() will happen lazily on a fault */ in set_mcontext()
564 pcb->pcb_flags |= PCB_VECREGS; in set_mcontext()
565 pcb->pcb_vec.vscr = mcp->mc_vscr; in set_mcontext()
566 pcb->pcb_vec.vrsave = mcp->mc_vrsave; in set_mcontext()
567 memcpy(pcb->pcb_vec.vr, mcp->mc_avec, sizeof(mcp->mc_avec)); in set_mcontext()
574 * Clean up extra POWER state. Some per-process registers and states are not
578 * DSCR -- Data stream control register (PowerISA 2.06+)
579 * FSCR -- Facility Status and Control Register (PowerISA 2.07+)
589 pcb_flags = td->td_pcb->pcb_flags; in cleanup_power_extras()
601 * Ensure the PCB has been updated in preparation for copying a thread.
604 * but when we are cloning a thread, we need the updated state before doing
619 pcb = td->td_pcb; in cpu_update_pcb()
621 pcb_flags = pcb->pcb_flags; in cpu_update_pcb()
626 pcb->pcb_fscr = mfspr(SPR_FSCR); in cpu_update_pcb()
628 if (pcb->pcb_fscr & FSCR_EBB) { in cpu_update_pcb()
629 pcb->pcb_ebb.ebbhr = mfspr(SPR_EBBHR); in cpu_update_pcb()
630 pcb->pcb_ebb.ebbrr = mfspr(SPR_EBBRR); in cpu_update_pcb()
631 pcb->pcb_ebb.bescr = mfspr(SPR_BESCR); in cpu_update_pcb()
633 if (pcb->pcb_fscr & FSCR_LM) { in cpu_update_pcb()
634 pcb->pcb_lm.lmrr = mfspr(SPR_LMRR); in cpu_update_pcb()
635 pcb->pcb_lm.lmser = mfspr(SPR_LMSER); in cpu_update_pcb()
637 if (pcb->pcb_fscr & FSCR_TAR) in cpu_update_pcb()
638 pcb->pcb_tar = mfspr(SPR_TAR); in cpu_update_pcb()
646 pcb->pcb_dscr = mfspr(SPR_DSCRP); in cpu_update_pcb()
651 * On E500v2, single-precision scalar instructions and access to in cpu_update_pcb()
658 pcb->pcb_vec.vscr = mfspr(SPR_SPEFSCR); in cpu_update_pcb()
674 struct trapframe *tf; in exec_setregs() local
677 tf = trapframe(td); in exec_setregs()
678 bzero(tf, sizeof *tf); in exec_setregs()
680 tf->fixreg[1] = -roundup(-stack + 48, 16); in exec_setregs()
682 tf->fixreg[1] = -roundup(-stack + 8, 16); in exec_setregs()
690 * - obj and cleanup are the auxilliary and termination in exec_setregs()
692 * - ps_strings is a NetBSD extention, and will be in exec_setregs()
700 tf->fixreg[3] = argc; in exec_setregs()
701 tf->fixreg[4] = stack + sizeof(register_t); in exec_setregs()
702 tf->fixreg[5] = stack + (2 + argc)*sizeof(register_t); in exec_setregs()
703 tf->fixreg[6] = 0; /* auxiliary vector */ in exec_setregs()
704 tf->fixreg[7] = 0; /* termination vector */ in exec_setregs()
705 tf->fixreg[8] = (register_t)imgp->ps_strings; /* NetBSD extension */ in exec_setregs()
707 tf->srr0 = imgp->entry_addr; in exec_setregs()
709 tf->fixreg[12] = imgp->entry_addr; in exec_setregs()
711 tf->srr1 = psl_userset | PSL_FE_DFLT; in exec_setregs()
713 td->td_pcb->pcb_flags = 0; in exec_setregs()
720 struct trapframe *tf; in ppc32_setregs() local
723 tf = trapframe(td); in ppc32_setregs()
724 bzero(tf, sizeof *tf); in ppc32_setregs()
725 tf->fixreg[1] = -roundup(-stack + 8, 16); in ppc32_setregs()
729 tf->fixreg[3] = argc; in ppc32_setregs()
730 tf->fixreg[4] = stack + sizeof(uint32_t); in ppc32_setregs()
731 tf->fixreg[5] = stack + (2 + argc)*sizeof(uint32_t); in ppc32_setregs()
732 tf->fixreg[6] = 0; /* auxiliary vector */ in ppc32_setregs()
733 tf->fixreg[7] = 0; /* termination vector */ in ppc32_setregs()
734 tf->fixreg[8] = (register_t)imgp->ps_strings; /* NetBSD extension */ in ppc32_setregs()
736 tf->srr0 = imgp->entry_addr; in ppc32_setregs()
737 tf->srr1 = psl_userset32 | PSL_FE_DFLT; in ppc32_setregs()
739 td->td_pcb->pcb_flags = 0; in ppc32_setregs()
746 struct trapframe *tf; in fill_regs() local
748 tf = td->td_frame; in fill_regs()
749 memcpy(regs, tf, sizeof(struct reg)); in fill_regs()
767 pcb = td->td_pcb; in fill_fpregs()
769 if ((pcb->pcb_flags & PCB_FPREGS) == 0) in fill_fpregs()
772 memcpy(&fpregs->fpscr, &pcb->pcb_fpu.fpscr, sizeof(double)); in fill_fpregs()
774 memcpy(&fpregs->fpreg[i], &pcb->pcb_fpu.fpr[i].fpr, in fill_fpregs()
784 struct trapframe *tf; in set_regs() local
786 tf = td->td_frame; in set_regs()
787 memcpy(tf, regs, sizeof(struct reg)); in set_regs()
805 pcb = td->td_pcb; in set_fpregs()
806 pcb->pcb_flags |= PCB_FPREGS; in set_fpregs()
807 memcpy(&pcb->pcb_fpu.fpscr, &fpregs->fpscr, sizeof(double)); in set_fpregs()
809 memcpy(&pcb->pcb_fpu.fpr[i].fpr, &fpregs->fpreg[i], in set_fpregs()
820 struct trapframe *tf; in set_regs32() local
823 tf = td->td_frame; in set_regs32()
825 tf->fixreg[i] = regs->fixreg[i]; in set_regs32()
826 tf->lr = regs->lr; in set_regs32()
827 tf->cr = regs->cr; in set_regs32()
828 tf->xer = regs->xer; in set_regs32()
829 tf->ctr = regs->ctr; in set_regs32()
830 tf->srr0 = regs->pc; in set_regs32()
838 struct trapframe *tf; in fill_regs32() local
841 tf = td->td_frame; in fill_regs32()
843 regs->fixreg[i] = tf->fixreg[i]; in fill_regs32()
844 regs->lr = tf->lr; in fill_regs32()
845 regs->cr = tf->cr; in fill_regs32()
846 regs->xer = tf->xer; in fill_regs32()
847 regs->ctr = tf->ctr; in fill_regs32()
848 regs->pc = tf->srr0; in fill_regs32()
863 mcp->mc_vers = mcp64.mc_vers; in grab_mcontext32()
864 mcp->mc_flags = mcp64.mc_flags; in grab_mcontext32()
865 mcp->mc_onstack = mcp64.mc_onstack; in grab_mcontext32()
866 mcp->mc_len = mcp64.mc_len; in grab_mcontext32()
867 memcpy(mcp->mc_avec,mcp64.mc_avec,sizeof(mcp64.mc_avec)); in grab_mcontext32()
868 memcpy(mcp->mc_av,mcp64.mc_av,sizeof(mcp64.mc_av)); in grab_mcontext32()
870 mcp->mc_frame[i] = mcp64.mc_frame[i]; in grab_mcontext32()
871 memcpy(mcp->mc_fpreg,mcp64.mc_fpreg,sizeof(mcp64.mc_fpreg)); in grab_mcontext32()
872 memcpy(mcp->mc_vsxfpreg,mcp64.mc_vsxfpreg,sizeof(mcp64.mc_vsxfpreg)); in grab_mcontext32()
884 PROC_LOCK(curthread->td_proc); in get_mcontext32()
885 mcp->mc_onstack = sigonstack(td->td_frame->fixreg[1]); in get_mcontext32()
886 PROC_UNLOCK(curthread->td_proc); in get_mcontext32()
898 mcp64.mc_vers = mcp->mc_vers; in set_mcontext32()
899 mcp64.mc_flags = mcp->mc_flags; in set_mcontext32()
900 mcp64.mc_onstack = mcp->mc_onstack; in set_mcontext32()
901 mcp64.mc_len = mcp->mc_len; in set_mcontext32()
902 memcpy(mcp64.mc_avec,mcp->mc_avec,sizeof(mcp64.mc_avec)); in set_mcontext32()
903 memcpy(mcp64.mc_av,mcp->mc_av,sizeof(mcp64.mc_av)); in set_mcontext32()
905 mcp64.mc_frame[i] = mcp->mc_frame[i]; in set_mcontext32()
906 mcp64.mc_srr1 |= (td->td_frame->srr1 & 0xFFFFFFFF00000000ULL); in set_mcontext32()
907 memcpy(mcp64.mc_fpreg,mcp->mc_fpreg,sizeof(mcp64.mc_fpreg)); in set_mcontext32()
908 memcpy(mcp64.mc_vsxfpreg,mcp->mc_vsxfpreg,sizeof(mcp64.mc_vsxfpreg)); in set_mcontext32()
923 CTR2(KTR_SIG, "sigreturn: td=%p ucp=%p", td, uap->sigcntxp); in freebsd32_sigreturn()
925 if (copyin(uap->sigcntxp, &uc, sizeof(uc)) != 0) { in freebsd32_sigreturn()
950 * The first two fields of a ucontext_t are the signal mask and the machine
962 if (uap->ucp == NULL) in freebsd32_getcontext()
967 PROC_LOCK(td->td_proc); in freebsd32_getcontext()
968 uc.uc_sigmask = td->td_sigmask; in freebsd32_getcontext()
969 PROC_UNLOCK(td->td_proc); in freebsd32_getcontext()
970 ret = copyout(&uc, uap->ucp, UC32_COPY_SIZE); in freebsd32_getcontext()
981 if (uap->ucp == NULL) in freebsd32_setcontext()
984 ret = copyin(uap->ucp, &uc, UC32_COPY_SIZE); in freebsd32_setcontext()
1002 if (uap->oucp == NULL || uap->ucp == NULL) in freebsd32_swapcontext()
1007 PROC_LOCK(td->td_proc); in freebsd32_swapcontext()
1008 uc.uc_sigmask = td->td_sigmask; in freebsd32_swapcontext()
1009 PROC_UNLOCK(td->td_proc); in freebsd32_swapcontext()
1010 ret = copyout(&uc, uap->oucp, UC32_COPY_SIZE); in freebsd32_swapcontext()
1012 ret = copyin(uap->ucp, &uc, UC32_COPY_SIZE); in freebsd32_swapcontext()
1031 struct trapframe *tf; in cpu_set_syscall_retval() local
1037 p = td->td_proc; in cpu_set_syscall_retval()
1038 tf = td->td_frame; in cpu_set_syscall_retval()
1040 if (tf->fixreg[0] == SYS___syscall && in cpu_set_syscall_retval()
1042 int code = tf->fixreg[FIRSTARG + 1]; in cpu_set_syscall_retval()
1055 * 64-bit return, 32-bit syscall. Fixup byte order in cpu_set_syscall_retval()
1057 tf->fixreg[FIRSTARG] = 0; in cpu_set_syscall_retval()
1058 tf->fixreg[FIRSTARG + 1] = td->td_retval[0]; in cpu_set_syscall_retval()
1060 tf->fixreg[FIRSTARG] = td->td_retval[0]; in cpu_set_syscall_retval()
1061 tf->fixreg[FIRSTARG + 1] = td->td_retval[1]; in cpu_set_syscall_retval()
1063 tf->cr &= ~0x10000000; /* Unset summary overflow */ in cpu_set_syscall_retval()
1069 tf->srr0 -= 4; in cpu_set_syscall_retval()
1072 tf->fixreg[FIRSTARG] = error; in cpu_set_syscall_retval()
1073 tf->cr |= 0x10000000; /* Set summary overflow */ in cpu_set_syscall_retval()
1097 pcb = (struct pcb *)((td->td_kstack + td->td_kstack_pages * PAGE_SIZE - in cpu_thread_alloc()
1099 td->td_pcb = pcb; in cpu_thread_alloc()
1100 td->td_frame = (struct trapframe *)pcb - 1; in cpu_thread_alloc()
1112 if (SV_PROC_FLAG(td->td_proc, SV_LP64)) in cpu_set_user_tls()
1113 td->td_frame->fixreg[13] = (register_t)tls_base + 0x7010; in cpu_set_user_tls()
1115 td->td_frame->fixreg[2] = (register_t)tls_base + 0x7008; in cpu_set_user_tls()
1123 struct trapframe *tf; in cpu_copy_thread() local
1130 pcb2 = td->td_pcb; in cpu_copy_thread()
1133 bcopy(td0->td_pcb, pcb2, sizeof(*pcb2)); in cpu_copy_thread()
1135 /* Create a stack for the new thread */ in cpu_copy_thread()
1136 tf = td->td_frame; in cpu_copy_thread()
1137 bcopy(td0->td_frame, tf, sizeof(struct trapframe)); in cpu_copy_thread()
1138 tf->fixreg[FIRSTARG] = 0; in cpu_copy_thread()
1139 tf->fixreg[FIRSTARG + 1] = 0; in cpu_copy_thread()
1140 tf->cr &= ~0x10000000; in cpu_copy_thread()
1143 cf = (struct callframe *)tf - 1; in cpu_copy_thread()
1145 cf->cf_func = (register_t)fork_return; in cpu_copy_thread()
1146 cf->cf_arg0 = (register_t)td; in cpu_copy_thread()
1147 cf->cf_arg1 = (register_t)tf; in cpu_copy_thread()
1149 pcb2->pcb_sp = (register_t)cf; in cpu_copy_thread()
1151 pcb2->pcb_lr = ((register_t *)fork_trampoline)[0]; in cpu_copy_thread()
1152 pcb2->pcb_toc = ((register_t *)fork_trampoline)[1]; in cpu_copy_thread()
1154 pcb2->pcb_lr = (register_t)fork_trampoline; in cpu_copy_thread()
1155 pcb2->pcb_context[0] = pcb2->pcb_lr; in cpu_copy_thread()
1157 pcb2->pcb_cpu.aim.usr_vsid = 0; in cpu_copy_thread()
1159 pcb2->pcb_vec.vscr = SPEFSCR_DFLT; in cpu_copy_thread()
1163 td->td_md.md_spinlock_count = 1; in cpu_copy_thread()
1164 td->td_md.md_saved_msr = psl_kernset; in cpu_copy_thread()
1171 struct trapframe *tf; in cpu_set_upcall() local
1177 tf = td->td_frame; in cpu_set_upcall()
1180 sp = ((uintptr_t)stack->ss_sp + stack->ss_size - 48) & in cpu_set_upcall()
1183 sp = ((uintptr_t)stack->ss_sp + stack->ss_size - 8) & in cpu_set_upcall()
1186 bzero(tf, sizeof(struct trapframe)); in cpu_set_upcall()
1188 tf->fixreg[1] = (register_t)sp; in cpu_set_upcall()
1189 tf->fixreg[3] = (register_t)arg; in cpu_set_upcall()
1190 if (SV_PROC_FLAG(td->td_proc, SV_ILP32)) { in cpu_set_upcall()
1191 tf->srr0 = (register_t)entry; in cpu_set_upcall()
1193 tf->srr1 = psl_userset32 | PSL_FE_DFLT; in cpu_set_upcall()
1195 tf->srr1 = psl_userset | PSL_FE_DFLT; in cpu_set_upcall()
1199 if (td->td_proc->p_sysent == &elf64_freebsd_sysvec_v2) { in cpu_set_upcall()
1200 tf->srr0 = (register_t)entry; in cpu_set_upcall()
1202 tf->fixreg[12] = (register_t)entry; in cpu_set_upcall()
1209 tf->srr0 = entry_desc[0]; in cpu_set_upcall()
1210 tf->fixreg[2] = entry_desc[1]; in cpu_set_upcall()
1211 tf->fixreg[11] = entry_desc[2]; in cpu_set_upcall()
1213 tf->srr1 = psl_userset | PSL_FE_DFLT; in cpu_set_upcall()
1217 td->td_pcb->pcb_flags = 0; in cpu_set_upcall()
1219 td->td_pcb->pcb_vec.vscr = SPEFSCR_DFLT; in cpu_set_upcall()
1222 td->td_retval[0] = (register_t)entry; in cpu_set_upcall()
1223 td->td_retval[1] = 0; in cpu_set_upcall()
1237 if ((td->td_pcb->pcb_flags & PCB_CDSCR) == 0) in emulate_mfspr()
1238 td->td_pcb->pcb_dscr = mfspr(SPR_DSCRP); in emulate_mfspr()
1240 frame->fixreg[reg] = td->td_pcb->pcb_dscr; in emulate_mfspr()
1241 frame->srr0 += 4; in emulate_mfspr()
1256 td->td_pcb->pcb_flags |= PCB_CDSCR; in emulate_mtspr()
1257 td->td_pcb->pcb_dscr = frame->fixreg[reg]; in emulate_mtspr()
1258 mtspr(SPR_DSCRP, frame->fixreg[reg]); in emulate_mtspr()
1259 frame->srr0 += 4; in emulate_mtspr()
1274 instr = fuword32((void *)frame->srr0); in ppc_instr_emulate()
1279 frame->fixreg[reg] = mfpvr(); in ppc_instr_emulate()
1280 frame->srr0 += 4; in ppc_instr_emulate()
1291 powerpc_sync(); /* Do a heavy-weight sync */ in ppc_instr_emulate()
1292 frame->srr0 += 4; in ppc_instr_emulate()
1296 pcb = td->td_pcb; in ppc_instr_emulate()
1298 if (!(pcb->pcb_flags & PCB_FPREGS)) { in ppc_instr_emulate()
1299 bzero(&pcb->pcb_fpu, sizeof(pcb->pcb_fpu)); in ppc_instr_emulate()
1300 pcb->pcb_flags |= PCB_FPREGS; in ppc_instr_emulate()
1301 } else if (pcb->pcb_flags & PCB_FPU) in ppc_instr_emulate()
1303 sig = fpu_emulate(frame, &pcb->pcb_fpu); in ppc_instr_emulate()
1304 if ((sig == 0 || sig == SIGFPE) && pcb->pcb_flags & PCB_FPU) in ppc_instr_emulate()
1308 if (pcb->pcb_lastill != frame->srr0) { in ppc_instr_emulate()
1309 /* Allow a second chance, in case of cache sync issues. */ in ppc_instr_emulate()
1311 pmap_sync_icache(PCPU_GET(curpmap), frame->srr0, 4); in ppc_instr_emulate()
1312 pcb->pcb_lastill = frame->srr0; in ppc_instr_emulate()