diff --git a/src/libsys/boards/denano/board.c b/src/libsys/boards/denano/board.c index c417bff..dd5bbb2 100644 --- a/src/libsys/boards/denano/board.c +++ b/src/libsys/boards/denano/board.c @@ -84,6 +84,10 @@ void dbg_uart_isr(struct xcptcontext *xcp) void dbg_putchar(char c) { + if (c == 0x0A) + { + writechar(4, 0x0D); + } writechar(4, c); } diff --git a/src/libsys/mips_dbg.c b/src/libsys/mips_dbg.c index 7767f2b..fc3b4c4 100644 --- a/src/libsys/mips_dbg.c +++ b/src/libsys/mips_dbg.c @@ -9,16 +9,10 @@ extern int instr_info(unsigned iword, instr_info_t *pInfo); extern int tdisasm(char *buffer, unsigned address, unsigned iword, unsigned char ext, unsigned *regmask, unsigned *symbol_value, unsigned *ls_register); -#define DBG_PRINT_REG(tag_str, reg) \ +#define DBG_PRINT_REG_CHG(tag_str, reg, reg_last) \ dbg_puts(tag_str); \ dbg_print_word(reg); \ - dbg_puts(" "); - - -#define DBG_PRINT_REG_CHG(tag_str, reg, chg_tag) \ - dbg_puts(tag_str); \ - dbg_print_word(reg); \ - dbg_puts(chg_tag); \ + dbg_puts(reg != reg_last ? "*" : " "); \ dbg_puts(" "); #define MAX_USER_BP 16 @@ -167,16 +161,59 @@ uint32_t BreakGetType(uint32_t instr) return (instr >> 6) & BP_MASK_TYPE; } -char* reg_changed(uint32_t reg1, uint32_t reg2) +void print_regs(struct xcptcontext * xcp, struct xcptcontext * xcp_last) { - static char chg_str[2] = {0}; + DBG_PRINT_REG_CHG(" Status : ", xcp->sr, xcp_last->sr); + DBG_PRINT_REG_CHG(" Cause : ", xcp->cr, xcp_last->cr); + DBG_PRINT_REG_CHG(" EPC : ", xcp->epc, xcp_last->epc); + DBG_PRINT_REG_CHG("BadAddr : ", xcp->baddr, xcp_last->baddr); + dbg_puts("\n"); + DBG_PRINT_REG_CHG(" MDLO : ", xcp->mdlo, xcp_last->mdlo); + DBG_PRINT_REG_CHG(" MDHI : ", xcp->mdhi, xcp_last->mdhi); - if (reg1 != reg2) - chg_str[0] = '*'; - else - chg_str[0] = ' '; + dbg_puts("\n"); - return chg_str; + dbg_puts("Registers:\n"); + DBG_PRINT_REG_CHG(" 0 (ze) : ", xcp->regs[0], xcp_last->regs[0]); + DBG_PRINT_REG_CHG(" 1 (at) : ", xcp->regs[1], xcp_last->regs[1]); + DBG_PRINT_REG_CHG(" 2 (v0) : ", xcp->regs[2], xcp_last->regs[2]); + DBG_PRINT_REG_CHG(" 3 (v1) : ", xcp->regs[3], xcp_last->regs[3]); + dbg_puts("\n"); + DBG_PRINT_REG_CHG(" 4 (a0) : ", xcp->regs[4], xcp_last->regs[4]); + DBG_PRINT_REG_CHG(" 5 (a1) : ", xcp->regs[5], xcp_last->regs[5]); + DBG_PRINT_REG_CHG(" 6 (a2) : ", xcp->regs[6], xcp_last->regs[6]); + DBG_PRINT_REG_CHG(" 7 (a3) : ", xcp->regs[7], xcp_last->regs[7]); + dbg_puts("\n"); + DBG_PRINT_REG_CHG(" 8 (t0) : ", xcp->regs[8], xcp_last->regs[8]); + DBG_PRINT_REG_CHG(" 9 (t1) : ", xcp->regs[9], xcp_last->regs[9]); + DBG_PRINT_REG_CHG("10 (t2) : ", xcp->regs[10], xcp_last->regs[10]); + DBG_PRINT_REG_CHG("11 (t3) : ", xcp->regs[11], xcp_last->regs[11]); + dbg_puts("\n"); + DBG_PRINT_REG_CHG("12 (t4) : ", xcp->regs[12], xcp_last->regs[12]); + DBG_PRINT_REG_CHG("13 (t5) : ", xcp->regs[13], xcp_last->regs[13]); + DBG_PRINT_REG_CHG("14 (t6) : ", xcp->regs[14], xcp_last->regs[14]); + DBG_PRINT_REG_CHG("15 (t7) : ", xcp->regs[15], xcp_last->regs[15]); + dbg_puts("\n"); + DBG_PRINT_REG_CHG("16 (s0) : ", xcp->regs[16], xcp_last->regs[16]); + DBG_PRINT_REG_CHG("17 (s1) : ", xcp->regs[17], xcp_last->regs[17]); + DBG_PRINT_REG_CHG("18 (s2) : ", xcp->regs[18], xcp_last->regs[18]); + DBG_PRINT_REG_CHG("19 (s3) : ", xcp->regs[19], xcp_last->regs[19]); + dbg_puts("\n"); + DBG_PRINT_REG_CHG("20 (s4) : ", xcp->regs[20], xcp_last->regs[20]); + DBG_PRINT_REG_CHG("21 (s5) : ", xcp->regs[21], xcp_last->regs[21]); + DBG_PRINT_REG_CHG("22 (s6) : ", xcp->regs[22], xcp_last->regs[22]); + DBG_PRINT_REG_CHG("23 (s7) : ", xcp->regs[23], xcp_last->regs[23]); + dbg_puts("\n"); + DBG_PRINT_REG_CHG("24 (t8) : ", xcp->regs[24], xcp_last->regs[24]); + DBG_PRINT_REG_CHG("25 (t9) : ", xcp->regs[25], xcp_last->regs[25]); + DBG_PRINT_REG_CHG("26 (k0) : ", xcp->regs[26], xcp_last->regs[26]); + DBG_PRINT_REG_CHG("27 (k1) : ", xcp->regs[27], xcp_last->regs[27]); + dbg_puts("\n"); + DBG_PRINT_REG_CHG("28 (gp) : ", xcp->regs[28], xcp_last->regs[28]); + DBG_PRINT_REG_CHG("29 (sp) : ", xcp->regs[29], xcp_last->regs[29]); + DBG_PRINT_REG_CHG("30 (fp) : ", xcp->regs[30], xcp_last->regs[30]); + DBG_PRINT_REG_CHG("31 (ra) : ", xcp->regs[31], xcp_last->regs[31]); + dbg_puts("\n"); } void set_mgmt_break(uint32_t *pAddr_break, int index) @@ -184,7 +221,7 @@ void set_mgmt_break(uint32_t *pAddr_break, int index) mgmt_bp_ss[index].pAddr = NULL; mgmt_bp_ss[index].instr = 0; - dbg_puts_d("Set management break at ");dbg_print_word_d((long)pAddr_break);dbg_puts_d("\n\r"); + dbg_puts_d("Set management break at ");dbg_print_word_d((long)pAddr_break);dbg_puts_d("\n"); // Don't overwrite user breaks if (IsBreak(*pAddr_break) && (BreakGetType(*pAddr_break) == BP_USER_BASE)) { @@ -265,7 +302,7 @@ void dbg_handler(struct xcptcontext * xcp) pAddr_prev = pAddr_curr - 1; pAddr_next = pAddr_curr + 1; - dbg_puts_d("\n\r");dbg_puts_d(g_state_names[g_state]);dbg_puts_d("\n\r"); + dbg_puts_d("\n");dbg_puts_d(g_state_names[g_state]);dbg_puts_d("\n"); if (IsBreak(*pAddr_curr)) { @@ -276,12 +313,12 @@ void dbg_handler(struct xcptcontext * xcp) case BP_MGMT_BASE_SS: // Restore original instructions after single-step - dbg_puts_d("1. Restore after single-step at ");dbg_print_word_d((long)mgmt_bp_ss[0].pAddr);dbg_puts_d("\n\r"); + dbg_puts_d("1. Restore after single-step at ");dbg_print_word_d((long)mgmt_bp_ss[0].pAddr);dbg_puts_d("\n"); *(mgmt_bp_ss[0].pAddr) = mgmt_bp_ss[0].instr; ICACHE_invalidate_at(mgmt_bp_ss[0].pAddr); if (mgmt_bp_ss[1].pAddr) { - dbg_puts_d("2. Restore after single-step at ");dbg_print_word_d((long)mgmt_bp_ss[1].pAddr);dbg_puts_d("\n\r"); + dbg_puts_d("2. Restore after single-step at ");dbg_print_word_d((long)mgmt_bp_ss[1].pAddr);dbg_puts_d("\n"); *(mgmt_bp_ss[1].pAddr) = mgmt_bp_ss[1].instr; ICACHE_invalidate_at(mgmt_bp_ss[1].pAddr); } @@ -291,19 +328,19 @@ void dbg_handler(struct xcptcontext * xcp) case BP_MGMT_BASE_RU: bp_index = BP_GET_ID(*pAddr_curr); - dbg_puts_d("Restore user break at ");dbg_print_word_d((long)user_bp[bp_index].pAddr);dbg_puts_d("\n\r"); + dbg_puts_d("Restore user break at ");dbg_print_word_d((long)user_bp[bp_index].pAddr);dbg_puts_d("\n"); *(user_bp[bp_index].pAddr) = BP_USER(bp_index); ICACHE_invalidate_at(user_bp[bp_index].pAddr); *(mgmt_bp_ru[0].pAddr) = mgmt_bp_ru[0].instr; ICACHE_invalidate_at(mgmt_bp_ru[0].pAddr); - dbg_puts_d("1. Restore after RU at ");dbg_print_word_d((long)mgmt_bp_ru[0].pAddr);dbg_puts_d("\n\r"); + dbg_puts_d("1. Restore after RU at ");dbg_print_word_d((long)mgmt_bp_ru[0].pAddr);dbg_puts_d("\n"); if (mgmt_bp_ru[1].pAddr) { *(mgmt_bp_ru[1].pAddr) = mgmt_bp_ru[1].instr; ICACHE_invalidate_at(mgmt_bp_ru[1].pAddr); - dbg_puts_d("2. Restore after RU at ");dbg_print_word_d((long)mgmt_bp_ru[1].pAddr);dbg_puts_d("\n\r"); + dbg_puts_d("2. Restore after RU at ");dbg_print_word_d((long)mgmt_bp_ru[1].pAddr);dbg_puts_d("\n"); } if (!g_is_ss) return; @@ -314,70 +351,19 @@ void dbg_handler(struct xcptcontext * xcp) is_user_bp = 1; bp_index = BP_GET_ID(*pAddr_curr); - dbg_puts_d("Restore instruction at ");dbg_print_word_d((long)user_bp[bp_index].pAddr);dbg_puts_d("\n\r"); + dbg_puts_d("Restore instruction at ");dbg_print_word_d((long)user_bp[bp_index].pAddr);dbg_puts_d("\n"); *(user_bp[bp_index].pAddr) = user_bp[bp_index].instr; ICACHE_invalidate_at(user_bp[bp_index].pAddr); break; default: - dbg_puts_d("Found ordinary break at ");dbg_print_word_d((long)pAddr_curr);dbg_puts_d("\n\r"); + dbg_puts_d("Found ordinary break at ");dbg_print_word_d((long)pAddr_curr);dbg_puts_d("\n"); break; } } - - dbg_puts("\n\r"); - DBG_PRINT_REG_CHG(" Status : ", xcp->sr, reg_changed(xcp->sr, xcp_last.sr)); - DBG_PRINT_REG_CHG(" Cause : ", xcp->cr, reg_changed(xcp->cr, xcp_last.cr)); - DBG_PRINT_REG_CHG(" EPC : ", xcp->epc, reg_changed(xcp->epc, xcp_last.epc)); - DBG_PRINT_REG_CHG("BadAddr : ", xcp->baddr, reg_changed(xcp->baddr, xcp_last.baddr)); - dbg_puts("\n\r"); - DBG_PRINT_REG_CHG(" MDLO : ", xcp->mdlo, reg_changed(xcp->mdlo, xcp_last.mdlo)); - DBG_PRINT_REG_CHG(" MDHI : ", xcp->mdhi, reg_changed(xcp->mdhi, xcp_last.mdhi)); - - dbg_puts("\n\r"); - - dbg_puts("Registers:\n\r"); - DBG_PRINT_REG_CHG(" 0 (ze) : ", xcp->regs[0], reg_changed(xcp->regs[0], xcp_last.regs[0])); - DBG_PRINT_REG_CHG(" 1 (at) : ", xcp->regs[1], reg_changed(xcp->regs[1], xcp_last.regs[1])); - DBG_PRINT_REG_CHG(" 2 (v0) : ", xcp->regs[2], reg_changed(xcp->regs[2], xcp_last.regs[2])); - DBG_PRINT_REG_CHG(" 3 (v1) : ", xcp->regs[3], reg_changed(xcp->regs[3], xcp_last.regs[3])); - dbg_puts("\n\r"); - DBG_PRINT_REG_CHG(" 4 (a0) : ", xcp->regs[4], reg_changed(xcp->regs[4], xcp_last.regs[4])); - DBG_PRINT_REG_CHG(" 5 (a1) : ", xcp->regs[5], reg_changed(xcp->regs[5], xcp_last.regs[5])); - DBG_PRINT_REG_CHG(" 6 (a2) : ", xcp->regs[6], reg_changed(xcp->regs[6], xcp_last.regs[6])); - DBG_PRINT_REG_CHG(" 7 (a3) : ", xcp->regs[7], reg_changed(xcp->regs[7], xcp_last.regs[7])); - dbg_puts("\n\r"); - DBG_PRINT_REG_CHG(" 8 (t0) : ", xcp->regs[8], reg_changed(xcp->regs[8], xcp_last.regs[8])); - DBG_PRINT_REG_CHG(" 9 (t1) : ", xcp->regs[9], reg_changed(xcp->regs[9], xcp_last.regs[9])); - DBG_PRINT_REG_CHG("10 (t2) : ", xcp->regs[10], reg_changed(xcp->regs[10], xcp_last.regs[10])); - DBG_PRINT_REG_CHG("11 (t3) : ", xcp->regs[11], reg_changed(xcp->regs[11], xcp_last.regs[11])); - dbg_puts("\n\r"); - DBG_PRINT_REG_CHG("12 (t4) : ", xcp->regs[12], reg_changed(xcp->regs[12], xcp_last.regs[12])); - DBG_PRINT_REG_CHG("13 (t5) : ", xcp->regs[13], reg_changed(xcp->regs[13], xcp_last.regs[13])); - DBG_PRINT_REG_CHG("14 (t6) : ", xcp->regs[14], reg_changed(xcp->regs[14], xcp_last.regs[14])); - DBG_PRINT_REG_CHG("15 (t7) : ", xcp->regs[15], reg_changed(xcp->regs[15], xcp_last.regs[15])); - dbg_puts("\n\r"); - DBG_PRINT_REG_CHG("16 (s0) : ", xcp->regs[16], reg_changed(xcp->regs[16], xcp_last.regs[16])); - DBG_PRINT_REG_CHG("17 (s1) : ", xcp->regs[17], reg_changed(xcp->regs[17], xcp_last.regs[17])); - DBG_PRINT_REG_CHG("18 (s2) : ", xcp->regs[18], reg_changed(xcp->regs[18], xcp_last.regs[18])); - DBG_PRINT_REG_CHG("19 (s3) : ", xcp->regs[19], reg_changed(xcp->regs[19], xcp_last.regs[19])); - dbg_puts("\n\r"); - DBG_PRINT_REG_CHG("20 (s4) : ", xcp->regs[20], reg_changed(xcp->regs[20], xcp_last.regs[20])); - DBG_PRINT_REG_CHG("21 (s5) : ", xcp->regs[21], reg_changed(xcp->regs[21], xcp_last.regs[21])); - DBG_PRINT_REG_CHG("22 (s6) : ", xcp->regs[22], reg_changed(xcp->regs[22], xcp_last.regs[22])); - DBG_PRINT_REG_CHG("23 (s7) : ", xcp->regs[23], reg_changed(xcp->regs[23], xcp_last.regs[23])); - dbg_puts("\n\r"); - DBG_PRINT_REG_CHG("24 (t8) : ", xcp->regs[24], reg_changed(xcp->regs[24], xcp_last.regs[24])); - DBG_PRINT_REG_CHG("25 (t9) : ", xcp->regs[25], reg_changed(xcp->regs[25], xcp_last.regs[25])); - DBG_PRINT_REG_CHG("26 (k0) : ", xcp->regs[26], reg_changed(xcp->regs[26], xcp_last.regs[26])); - DBG_PRINT_REG_CHG("27 (k1) : ", xcp->regs[27], reg_changed(xcp->regs[27], xcp_last.regs[27])); - dbg_puts("\n\r"); - DBG_PRINT_REG_CHG("28 (gp) : ", xcp->regs[28], reg_changed(xcp->regs[28], xcp_last.regs[28])); - DBG_PRINT_REG_CHG("29 (sp) : ", xcp->regs[29], reg_changed(xcp->regs[29], xcp_last.regs[29])); - DBG_PRINT_REG_CHG("30 (fp) : ", xcp->regs[30], reg_changed(xcp->regs[30], xcp_last.regs[30])); - DBG_PRINT_REG_CHG("31 (ra) : ", xcp->regs[31], reg_changed(xcp->regs[31], xcp_last.regs[31])); - dbg_puts("\n\r"); + dbg_puts("\n"); + print_regs(xcp, &xcp_last); pInstr = pAddr_prev; // Disassemble instructions @@ -410,7 +396,7 @@ void dbg_handler(struct xcptcontext * xcp) } } dbg_puts(g_buf); - dbg_puts("\n\r"); + dbg_puts("\n"); pInstr++; } @@ -424,7 +410,7 @@ void dbg_handler(struct xcptcontext * xcp) ICACHE_invalidate_at(mgmt_bp_ru[0].pAddr); mgmt_bp_ru[1].pAddr = NULL; mgmt_bp_ru[1].instr = 0; - dbg_puts_d("1. Insert RU-break at ");dbg_print_word_d((long)mgmt_bp_ru[0].pAddr);dbg_puts_d("\n\r"); + dbg_puts_d("1. Insert RU-break at ");dbg_print_word_d((long)mgmt_bp_ru[0].pAddr);dbg_puts_d("\n"); // We have two possible management breaks, if previous instruction was branch or jump if (is_branch_shadow) @@ -445,7 +431,7 @@ void dbg_handler(struct xcptcontext * xcp) // Replace instruction with managment breakpoint *(mgmt_bp_ru[1].pAddr) = BP_MGMT_RU(bp_index); ICACHE_invalidate_at(mgmt_bp_ru[1].pAddr); - dbg_puts_d("2. Insert RU-break at ");dbg_print_word_d((long)mgmt_bp_ru[1].pAddr);dbg_puts_d("\n\r"); + dbg_puts_d("2. Insert RU-break at ");dbg_print_word_d((long)mgmt_bp_ru[1].pAddr);dbg_puts_d("\n"); } } @@ -472,14 +458,14 @@ void dbg_handler(struct xcptcontext * xcp) dbg_puts("Enter breakpoint: "); dbg_gets(buffer, sizeof(buffer)); bp_addr = strtol(buffer, NULL, 16); - dbg_puts("Insert breakpoint at "); dbg_print_word(bp_addr); dbg_puts("\n\r"); + dbg_puts("Insert breakpoint at "); dbg_print_word(bp_addr); dbg_puts("\n"); user_bp[g_bp_count].pAddr = (uint32_t*)bp_addr; user_bp[g_bp_count].instr = *(user_bp[g_bp_count].pAddr); *(user_bp[g_bp_count].pAddr) = BP_USER(g_bp_count); tdisasm(g_buf, (long)user_bp[g_bp_count].pAddr, user_bp[g_bp_count].instr, 0, &junk, &junk, &junk); - dbg_print_word((long)user_bp[g_bp_count].pAddr);dbg_puts(": b ");dbg_puts(g_buf);dbg_puts("\n\r"); + dbg_print_word((long)user_bp[g_bp_count].pAddr);dbg_puts(": b ");dbg_puts(g_buf);dbg_puts("\n"); ICACHE_invalidate_at(user_bp[g_bp_count].pAddr); g_bp_count++; break; @@ -545,7 +531,7 @@ void dbg_handler(struct xcptcontext * xcp) pInstr++; } while(1); - dbg_puts_d("Return found at "); dbg_print_word_d((long)pInstr);dbg_puts_d("\n\r"); + dbg_puts_d("Return found at "); dbg_print_word_d((long)pInstr);dbg_puts_d("\n"); set_mgmt_break(pInstr, 0); break; @@ -573,7 +559,7 @@ void dbg_handler(struct xcptcontext * xcp) if ((result == INSTR_TYPE_JUMP) && (info.flags & INSTR_FLAGS_JUMP_LINK)) { singlestep(xcp, pAddr_next, 0); - dbg_puts_d("Skip sub-routine\n\r"); + dbg_puts_d("Skip sub-routine\n"); } else { diff --git a/src/libsys/xcpt.c b/src/libsys/xcpt.c index 981085f..5b43694 100644 --- a/src/libsys/xcpt.c +++ b/src/libsys/xcpt.c @@ -24,59 +24,63 @@ void xcpt_register(int xcpt_num, fp_xcpt_t fp) g_xcpt_handler[xcpt_num] = fp; } - void xcpt_registers_print(struct xcptcontext * xcp) { - PRINT_REG(" Status : ", xcp->sr); - PRINT_REG(" Cause : ", xcp->cr); - PRINT_REG(" EPC : ", xcp->epc); - PRINT_REG("BadAddr : ", xcp->baddr); + xcpt_registers_print_with_change(xcp, xcp); +} + +void xcpt_registers_print_with_change(struct xcptcontext * xcp, struct xcptcontext * xcp_last) +{ + PRINT_REG_CHG(" Status : ", xcp->sr, xcp_last->sr); + PRINT_REG_CHG(" Cause : ", xcp->cr, xcp_last->cr); + PRINT_REG_CHG(" EPC : ", xcp->epc, xcp_last->epc); + PRINT_REG_CHG("BadAddr : ", xcp->baddr, xcp_last->baddr); sputs("\n"); - PRINT_REG(" MDLO : ", xcp->mdlo); - PRINT_REG(" MDHI : ", xcp->mdhi); + PRINT_REG_CHG(" MDLO : ", xcp->mdlo, xcp_last->mdlo); + PRINT_REG_CHG(" MDHI : ", xcp->mdhi, xcp_last->mdhi); sputs("\n"); sputs("Registers:\n"); - PRINT_REG(" 0 (ze) : ", xcp->regs[0]); - PRINT_REG(" 1 (at) : ", xcp->regs[1]); - PRINT_REG(" 2 (v0) : ", xcp->regs[2]); - PRINT_REG(" 3 (v1) : ", xcp->regs[3]); + PRINT_REG_CHG(" 0 (ze) : ", xcp->regs[0], xcp_last->regs[0]); + PRINT_REG_CHG(" 1 (at) : ", xcp->regs[1], xcp_last->regs[1]); + PRINT_REG_CHG(" 2 (v0) : ", xcp->regs[2], xcp_last->regs[2]); + PRINT_REG_CHG(" 3 (v1) : ", xcp->regs[3], xcp_last->regs[3]); sputs("\n"); - PRINT_REG(" 4 (a0) : ", xcp->regs[4]); - PRINT_REG(" 5 (a1) : ", xcp->regs[5]); - PRINT_REG(" 6 (a2) : ", xcp->regs[6]); - PRINT_REG(" 7 (a3) : ", xcp->regs[7]); + PRINT_REG_CHG(" 4 (a0) : ", xcp->regs[4], xcp_last->regs[4]); + PRINT_REG_CHG(" 5 (a1) : ", xcp->regs[5], xcp_last->regs[5]); + PRINT_REG_CHG(" 6 (a2) : ", xcp->regs[6], xcp_last->regs[6]); + PRINT_REG_CHG(" 7 (a3) : ", xcp->regs[7], xcp_last->regs[7]); sputs("\n"); - PRINT_REG(" 8 (t0) : ", xcp->regs[8]); - PRINT_REG(" 9 (t1) : ", xcp->regs[9]); - PRINT_REG("10 (t2) : ", xcp->regs[10]); - PRINT_REG("11 (t3) : ", xcp->regs[11]); + PRINT_REG_CHG(" 8 (t0) : ", xcp->regs[8], xcp_last->regs[8]); + PRINT_REG_CHG(" 9 (t1) : ", xcp->regs[9], xcp_last->regs[9]); + PRINT_REG_CHG("10 (t2) : ", xcp->regs[10], xcp_last->regs[10]); + PRINT_REG_CHG("11 (t3) : ", xcp->regs[11], xcp_last->regs[11]); sputs("\n"); - PRINT_REG("12 (t4) : ", xcp->regs[12]); - PRINT_REG("13 (t5) : ", xcp->regs[13]); - PRINT_REG("14 (t6) : ", xcp->regs[14]); - PRINT_REG("15 (t7) : ", xcp->regs[15]); + PRINT_REG_CHG("12 (t4) : ", xcp->regs[12], xcp_last->regs[12]); + PRINT_REG_CHG("13 (t5) : ", xcp->regs[13], xcp_last->regs[13]); + PRINT_REG_CHG("14 (t6) : ", xcp->regs[14], xcp_last->regs[14]); + PRINT_REG_CHG("15 (t7) : ", xcp->regs[15], xcp_last->regs[15]); sputs("\n"); - PRINT_REG("16 (s0) : ", xcp->regs[16]); - PRINT_REG("17 (s1) : ", xcp->regs[17]); - PRINT_REG("18 (s2) : ", xcp->regs[18]); - PRINT_REG("19 (s3) : ", xcp->regs[19]); + PRINT_REG_CHG("16 (s0) : ", xcp->regs[16], xcp_last->regs[16]); + PRINT_REG_CHG("17 (s1) : ", xcp->regs[17], xcp_last->regs[17]); + PRINT_REG_CHG("18 (s2) : ", xcp->regs[18], xcp_last->regs[18]); + PRINT_REG_CHG("19 (s3) : ", xcp->regs[19], xcp_last->regs[19]); sputs("\n"); - PRINT_REG("20 (s4) : ", xcp->regs[20]); - PRINT_REG("21 (s5) : ", xcp->regs[21]); - PRINT_REG("22 (s6) : ", xcp->regs[22]); - PRINT_REG("23 (s7) : ", xcp->regs[23]); + PRINT_REG_CHG("20 (s4) : ", xcp->regs[20], xcp_last->regs[20]); + PRINT_REG_CHG("21 (s5) : ", xcp->regs[21], xcp_last->regs[21]); + PRINT_REG_CHG("22 (s6) : ", xcp->regs[22], xcp_last->regs[22]); + PRINT_REG_CHG("23 (s7) : ", xcp->regs[23], xcp_last->regs[23]); sputs("\n"); - PRINT_REG("24 (t8) : ", xcp->regs[24]); - PRINT_REG("25 (t9) : ", xcp->regs[25]); - PRINT_REG("26 (k0) : ", xcp->regs[26]); - PRINT_REG("27 (k1) : ", xcp->regs[27]); + PRINT_REG_CHG("24 (t8) : ", xcp->regs[24], xcp_last->regs[24]); + PRINT_REG_CHG("25 (t9) : ", xcp->regs[25], xcp_last->regs[25]); + PRINT_REG_CHG("26 (k0) : ", xcp->regs[26], xcp_last->regs[26]); + PRINT_REG_CHG("27 (k1) : ", xcp->regs[27], xcp_last->regs[27]); sputs("\n"); - PRINT_REG("28 (gp) : ", xcp->regs[28]); - PRINT_REG("29 (sp) : ", xcp->regs[29]); - PRINT_REG("30 (fp) : ", xcp->regs[30]); - PRINT_REG("31 (ra) : ", xcp->regs[31]); + PRINT_REG_CHG("28 (gp) : ", xcp->regs[28], xcp_last->regs[28]); + PRINT_REG_CHG("29 (sp) : ", xcp->regs[29], xcp_last->regs[29]); + PRINT_REG_CHG("30 (fp) : ", xcp->regs[30], xcp_last->regs[30]); + PRINT_REG_CHG("31 (ra) : ", xcp->regs[31], xcp_last->regs[31]); sputs("\n"); } diff --git a/src/libsys/xcpt.h b/src/libsys/xcpt.h index 0ec20ea..fcb3120 100644 --- a/src/libsys/xcpt.h +++ b/src/libsys/xcpt.h @@ -42,17 +42,18 @@ typedef int (*fp_xcpt_t)(struct xcptcontext * xcp); sputs(" "); -#define PRINT_REG_CHG(tag_str, reg, chg_tag) \ - sputs(tag_str); \ - print_word(reg); \ - sputs(chg_tag); \ - sputs(" "); +#define PRINT_REG_CHG(tag_str, reg, reg_last) \ + dbg_puts(tag_str); \ + dbg_print_word(reg); \ + dbg_puts(reg != reg_last ? "*" : " "); \ + dbg_puts(" "); // Public functions void xcpt_register(int xcpt_num, fp_xcpt_t fp); int xcpt_get_type(struct xcptcontext * xcp); void xcpt_registers_print(struct xcptcontext * xcp); +void xcpt_registers_print_with_change(struct xcptcontext * xcp, struct xcptcontext * xcp_last); void xcpt_exctype_print(struct xcptcontext * xcp); #endif // XCPT_H