void show_regs(struct pt_regs *regs) { struct task_struct *tsk = current; struct callee_regs *cregs; /* * generic code calls us with preemption disabled, but some calls * here could sleep, so re-enable to avoid lockdep splat */ preempt_enable(); print_task_path_n_nm(tsk); show_regs_print_info(KERN_INFO); show_ecr_verbose(regs); pr_info("[EFA ]: 0x%08lx\n[BLINK ]: %pS\n[ERET ]: %pS\n", current->thread.fault_address, (void *)regs->blink, (void *)regs->ret); if (user_mode(regs)) show_faulting_vma(regs->ret); /* faulting code, not data */ pr_info("[STAT32]: 0x%08lx", regs->status32); #define STS_BIT(r, bit) r->status32 & STATUS_##bit##_MASK ? #bit" " : "" #ifdef CONFIG_ISA_ARCOMPACT pr_cont(" : %2s%2s%2s%2s%2s%2s%2s\n", (regs->status32 & STATUS_U_MASK) ? "U " : "K ", STS_BIT(regs, DE), STS_BIT(regs, AE), STS_BIT(regs, A2), STS_BIT(regs, A1), STS_BIT(regs, E2), STS_BIT(regs, E1)); #else pr_cont(" : %2s%2s%2s%2s\n", STS_BIT(regs, IE), (regs->status32 & STATUS_U_MASK) ? "U " : "K ", STS_BIT(regs, DE), STS_BIT(regs, AE)); #endif pr_info("BTA: 0x%08lx\t SP: 0x%08lx\t FP: 0x%08lx\n", regs->bta, regs->sp, regs->fp); pr_info("LPS: 0x%08lx\tLPE: 0x%08lx\tLPC: 0x%08lx\n", regs->lp_start, regs->lp_end, regs->lp_count); /* print regs->r0 thru regs->r12 * Sequential printing was generating horrible code */ print_reg_file(&(regs->r0), 0); /* If Callee regs were saved, display them too */ cregs = (struct callee_regs *)current->thread.callee_reg; if (cregs) show_callee_regs(cregs); preempt_disable(); }
void show_regs(struct pt_regs *regs) { struct task_struct *tsk = current; struct callee_regs *cregs; char *buf; buf = (char *)__get_free_page(GFP_TEMPORARY); if (!buf) return; print_task_path_n_nm(tsk, buf); show_regs_print_info(KERN_INFO); show_ecr_verbose(regs); pr_info("[EFA ]: 0x%08lx\n[BLINK ]: %pS\n[ERET ]: %pS\n", current->thread.fault_address, (void *)regs->blink, (void *)regs->ret); if (user_mode(regs)) show_faulting_vma(regs->ret, buf); /* faulting code, not data */ pr_info("[STAT32]: 0x%08lx", regs->status32); #define STS_BIT(r, bit) r->status32 & STATUS_##bit##_MASK ? #bit" " : "" #ifdef CONFIG_ISA_ARCOMPACT pr_cont(" : %2s%2s%2s%2s%2s%2s%2s\n", (regs->status32 & STATUS_U_MASK) ? "U " : "K ", STS_BIT(regs, DE), STS_BIT(regs, AE), STS_BIT(regs, A2), STS_BIT(regs, A1), STS_BIT(regs, E2), STS_BIT(regs, E1)); #else pr_cont(" : %2s%2s%2s%2s\n", STS_BIT(regs, IE), (regs->status32 & STATUS_U_MASK) ? "U " : "K ", STS_BIT(regs, DE), STS_BIT(regs, AE)); #endif pr_info("BTA: 0x%08lx\t SP: 0x%08lx\t FP: 0x%08lx\n", regs->bta, regs->sp, regs->fp); pr_info("LPS: 0x%08lx\tLPE: 0x%08lx\tLPC: 0x%08lx\n", regs->lp_start, regs->lp_end, regs->lp_count); /* print regs->r0 thru regs->r12 * Sequential printing was generating horrible code */ print_reg_file(&(regs->r0), 0); /* If Callee regs were saved, display them too */ cregs = (struct callee_regs *)current->thread.callee_reg; if (cregs) show_callee_regs(cregs); free_page((unsigned long)buf); }