Lines Matching defs:tf
101 usertrap_p(struct trapframe *tf)
103 return (tf->tf_srr1 & PSL_PR) != 0;
107 mchk_exception(struct trapframe *tf, ksiginfo_t *ksi)
109 const bool usertrap = usertrap_p(tf);
110 const vaddr_t faultva = tf->tf_mcar;
127 get_faulttype(const struct trapframe * const tf)
129 return VM_PROT_READ | (tf->tf_esr & ESR_ST ? VM_PROT_WRITE : 0);
133 get_faultmap(const struct trapframe * const tf, register_t psl_mask)
135 return (tf->tf_srr1 & psl_mask)
145 trap_pte_lookup(struct trapframe *tf, vaddr_t va, register_t psl_mask)
148 pmap_segtab_t * const stb = stbs[(tf->tf_srr1 / psl_mask) & 1];
213 dsi_exception(struct trapframe *tf, ksiginfo_t *ksi)
215 const vaddr_t faultva = tf->tf_dear;
216 const vm_prot_t ftype = get_faulttype(tf);
217 struct vm_map * const faultmap = get_faultmap(tf, PSL_DS);
218 const bool usertrap = usertrap_p(tf);
232 pt_entry_t * const ptep = trap_pte_lookup(tf, trunc_page(faultva),
266 isi_exception(struct trapframe *tf, ksiginfo_t *ksi)
268 const vaddr_t faultva = trunc_page(tf->tf_srr0);
269 struct vm_map * const faultmap = get_faultmap(tf, PSL_IS);
270 const bool usertrap = usertrap_p(tf);
284 pt_entry_t * const ptep = trap_pte_lookup(tf, trunc_page(faultva),
287 dump_trapframe(tf, NULL);
304 tf->tf_srr0, (uintptr_t)pg, pa, 0);
309 tf->tf_srr0, (uintptr_t)pg, pa, 0);
335 vm_signal(rv, EXC_ISI, tf->tf_srr0, ksi);
342 dtlb_exception(struct trapframe *tf, ksiginfo_t *ksi)
344 const vaddr_t faultva = tf->tf_dear;
345 const vm_prot_t ftype = get_faulttype(tf);
346 struct vm_map * const faultmap = get_faultmap(tf, PSL_DS);
348 const bool usertrap = usertrap_p(tf);
355 trap_pte_lookup(tf, trunc_page(faultva), PSL_DS);
377 itlb_exception(struct trapframe *tf, ksiginfo_t *ksi)
379 struct vm_map * const faultmap = get_faultmap(tf, PSL_IS);
380 const vaddr_t faultva = tf->tf_srr0;
382 const bool usertrap = usertrap_p(tf);
391 vm_signal(rv, EXC_ISI, tf->tf_srr0, ksi);
397 spe_exception(struct trapframe *tf, ksiginfo_t *ksi)
401 if (!usertrap_p(tf))
414 ksi->ksi_addr = (void *)tf->tf_srr0;
420 emulate_opcode(struct trapframe *tf, ksiginfo_t *ksi)
423 if (copyin((void *)tf->tf_srr0, &opcode, sizeof(opcode)) != 0)
430 __asm ("mfpvr %0" : "=r"(tf->tf_fixreg[OPC_MFSPR_REG(opcode)]));
436 : "=r"(tf->tf_fixreg[OPC_MFSPR_REG(opcode)])
443 : "=r"(tf->tf_fixreg[OPC_MFSPR_REG(opcode)])
448 return emulate_mxmsr(curlwp, tf, opcode);
452 pgm_exception(struct trapframe *tf, ksiginfo_t *ksi)
457 if (!usertrap_p(tf))
463 tf->tf_srr0, tf->tf_srr1, tf->tf_esr,
464 *trap_pte_lookup(tf, trunc_page(tf->tf_srr0), PSL_IS));
470 if (tf->tf_esr & ESR_PTR) {
473 vaddr_t va = (vaddr_t)tf->tf_srr0;
492 tf->tf_srr0 += (ksi->ksi_code == TRAP_TRACE) ? 0 : 4;
497 if (tf->tf_esr & (ESR_PIL|ESR_PPR)) {
498 if (emulate_opcode(tf, ksi)) {
499 tf->tf_srr0 += 4;
504 if (tf->tf_esr & ESR_PIL) {
512 if (fpu_emulate(tf, &pcb->pcb_fpu, ksi)) {
523 if (tf->tf_esr & ESR_PIL) {
525 } else if (tf->tf_esr & ESR_PPR) {
527 } else if (tf->tf_esr & ESR_PTR) {
532 ksi->ksi_addr = (void *)tf->tf_srr0;
538 debug_exception(struct trapframe *tf, ksiginfo_t *ksi)
543 if (!usertrap_p(tf))
551 mtspr(SPR_DBSR, tf->tf_esr);
552 KASSERT(tf->tf_esr & (DBSR_IAC1|DBSR_IAC2|DBSR_BRT));
553 KASSERT((tf->tf_srr1 & PSL_SE) == 0);
567 ksi->ksi_addr = (void *)tf->tf_srr0;
574 ali_exception(struct trapframe *tf, ksiginfo_t *ksi)
581 if (rv != 0 && usertrap_p(tf)) {
586 if (tf->tf_esr & ESR_PIL)
588 else if (tf->tf_esr & ESR_PPR)
590 else if (tf->tf_esr & ESR_PTR)
594 ksi->ksi_addr = (void *)tf->tf_srr0;
600 embedded_fp_data_exception(struct trapframe *tf, ksiginfo_t *ksi)
607 if (rv != 0 && usertrap_p(tf)) {
611 ksi->ksi_trap = tf->tf_exc;
612 ksi->ksi_code = vec_siginfo_code(tf);
618 ksi->ksi_addr = (void *)tf->tf_srr0;
624 embedded_fp_round_exception(struct trapframe *tf, ksiginfo_t *ksi)
631 if (rv != 0 && usertrap_p(tf)) {
635 ksi->ksi_trap = tf->tf_exc;
636 ksi->ksi_code = vec_siginfo_code(tf);
642 ksi->ksi_addr = (void *)tf->tf_srr0;
648 dump_trapframe(const struct trapframe *tf, void (*pr)(const char *, ...))
653 tf, tf->tf_exc, tf->tf_srr0, tf->tf_srr1, tf->tf_esr, tf->tf_dear);
655 tf->tf_lr, tf->tf_ctr, tf->tf_cr, tf->tf_xer);
658 r+0, tf->tf_fixreg[r+0], r+1, tf->tf_fixreg[r+1],
659 r+2, tf->tf_fixreg[r+2], r+3, tf->tf_fixreg[r+3]);
665 ddb_exception(struct trapframe *tf)
669 if ((tf->tf_esr & ESR_PTR) == 0)
671 if (ddb_trapfunc <= tf->tf_srr0 && tf->tf_srr0 <= ddb_trapfunc+16) {
672 register_t srr0 = tf->tf_srr0;
673 if (kdb_trap(tf->tf_exc, tf)) {
674 if (srr0 == tf->tf_srr0)
675 tf->tf_srr0 += 4;
691 dump_trapframe(tf, NULL);
693 if (kdb_trap(tf->tf_exc, tf)) {
694 tf->tf_srr0 += 4;
703 onfaulted(struct trapframe *tf, register_t rv)
710 tf->tf_srr0 = fb->fb_pc;
711 tf->tf_srr1 = fb->fb_msr;
712 tf->tf_cr = fb->fb_cr;
713 tf->tf_fixreg[1] = fb->fb_sp;
714 tf->tf_fixreg[2] = fb->fb_r2;
715 tf->tf_fixreg[3] = rv;
716 memcpy(&tf->tf_fixreg[13], fb->fb_fixreg, sizeof(fb->fb_fixreg));
721 trap(enum ppc_booke_exceptions trap_code, struct trapframe *tf)
723 const bool usertrap = usertrap_p(tf);
733 KASSERTMSG(!usertrap || tf == trapframe(l),
734 "trap: tf=%p is invalid: trapframe(%p)=%p", tf, l, trapframe(l));
738 printf("trap(enter): %s (tf=%p, esr/dear=%#x/%#lx, srr0/1=%#lx/%#lx, lr=%#lx)\n",
739 trap_names[trap_code], tf, tf->tf_esr, tf->tf_dear,
740 tf->tf_srr0, tf->tf_srr1, tf->tf_lr);
743 if ((register_t)tf >= (register_t)l->l_addr + USPACE
744 || (register_t)tf < (register_t)l->l_addr + PAGE_SIZE) {
745 printf("%s(entry): pid %d.%d (%s): invalid tf addr %p\n",
746 __func__, p->p_pid, l->l_lid, p->p_comm, tf);
747 dump_trapframe(tf, NULL);
756 dump_trapframe(tf, NULL);
761 && usertrap && (tf->tf_fixreg[1] & 0x80000000)) {
764 trap_names[trap_code], tf->tf_fixreg[1],
766 dump_trapframe(tf, NULL);
770 if (usertrap && (tf->tf_srr1 & (PSL_DS|PSL_IS)) != (PSL_DS|PSL_IS)) {
773 trap_names[trap_code], tf->tf_srr1);
774 dump_trapframe(tf, NULL);
787 panic("trap: unexcepted trap code %d! (tf=%p, srr0/1=%#lx/%#lx)",
788 trap_code, tf, tf->tf_srr0, tf->tf_srr1);
790 rv = mchk_exception(tf, &ksi);
793 rv = dsi_exception(tf, &ksi);
796 rv = isi_exception(tf, &ksi);
799 rv = ali_exception(tf, &ksi);
802 rv = spe_exception(tf, &ksi);
806 if (!usertrap && ddb_exception(tf))
809 rv = pgm_exception(tf, &ksi);
813 panic("trap: unexcepted trap code %d! (tf=%p, srr0/1=%#lx/%#lx)",
814 trap_code, tf, tf->tf_srr0, tf->tf_srr1);
816 rv = dtlb_exception(tf, &ksi);
819 rv = itlb_exception(tf, &ksi);
824 if (!usertrap && ddb_exception(tf))
827 rv = debug_exception(tf, &ksi);
831 rv = embedded_fp_data_exception(tf, &ksi);
834 rv = embedded_fp_round_exception(tf, &ksi);
838 //db_stack_trace_print(tf->tf_fixreg[1], true, 40, "", printf);
840 dump_trapframe(tf, NULL);
847 && (tf->tf_fixreg[1] & 0x80000000)) {
850 tf->tf_fixreg[1]);
851 dump_trapframe(tf, NULL);
854 if ((tf->tf_srr1 & (PSL_DS|PSL_IS)) != (PSL_DS|PSL_IS)) {
857 trap_names[trap_code], tf->tf_srr1);
858 dump_trapframe(tf, NULL);
866 dump_trapframe(tf, NULL);
869 userret(l, tf);
874 if (!onfaulted(tf, rv)) {
876 db_stack_trace_print(tf->tf_fixreg[1], true, 40, "", printf);
878 dump_trapframe(tf, NULL);
880 " (tf=%p, dear=%#lx, esr=%#x,"
883 trap_names[trap_code], tf, tf->tf_dear,
884 tf->tf_esr, tf->tf_srr0, tf->tf_srr1);
888 if (tf->tf_fixreg[1] >= (register_t)l->l_addr + USPACE
889 || tf->tf_fixreg[1] < (register_t)l->l_addr + PAGE_SIZE) {
892 tf->tf_fixreg[1]);
893 dump_trapframe(tf, NULL);
903 dump_trapframe(tf, NULL);
929 dump_trapframe(tf, NULL);
934 if ((tf->tf_srr1 & (PSL_DS|PSL_IS)) != (PSL_DS|PSL_IS)) {
937 trap_names[trap_code], tf->tf_srr1);
938 dump_trapframe(tf, NULL);
947 dump_trapframe(tf, NULL);
950 userret(l, tf);