| 31 | #include <rtdbg.h> |
| 32 | |
| 33 | void dump_regs(struct rt_hw_stack_frame *regs) |
| 34 | { |
| 35 | rt_kprintf("--------------Dump Registers-----------------\n"); |
| 36 | |
| 37 | rt_kprintf("Function Registers:\n"); |
| 38 | rt_kprintf("\tra(x1) = %p\tuser_sp = %p\n", regs->ra, |
| 39 | regs->user_sp_exc_stack); |
| 40 | rt_kprintf("\tgp(x3) = %p\ttp(x4) = %p\n", regs->gp, regs->tp); |
| 41 | rt_kprintf("Temporary Registers:\n"); |
| 42 | rt_kprintf("\tt0(x5) = %p\tt1(x6) = %p\n", regs->t0, regs->t1); |
| 43 | rt_kprintf("\tt2(x7) = %p\n", regs->t2); |
| 44 | rt_kprintf("\tt3(x28) = %p\tt4(x29) = %p\n", regs->t3, regs->t4); |
| 45 | rt_kprintf("\tt5(x30) = %p\tt6(x31) = %p\n", regs->t5, regs->t6); |
| 46 | rt_kprintf("Saved Registers:\n"); |
| 47 | rt_kprintf("\ts0/fp(x8) = %p\ts1(x9) = %p\n", regs->s0_fp, regs->s1); |
| 48 | rt_kprintf("\ts2(x18) = %p\ts3(x19) = %p\n", regs->s2, regs->s3); |
| 49 | rt_kprintf("\ts4(x20) = %p\ts5(x21) = %p\n", regs->s4, regs->s5); |
| 50 | rt_kprintf("\ts6(x22) = %p\ts7(x23) = %p\n", regs->s6, regs->s7); |
| 51 | rt_kprintf("\ts8(x24) = %p\ts9(x25) = %p\n", regs->s8, regs->s9); |
| 52 | rt_kprintf("\ts10(x26) = %p\ts11(x27) = %p\n", regs->s10, regs->s11); |
| 53 | rt_kprintf("Function Arguments Registers:\n"); |
| 54 | rt_kprintf("\ta0(x10) = %p\ta1(x11) = %p\n", regs->a0, regs->a1); |
| 55 | rt_kprintf("\ta2(x12) = %p\ta3(x13) = %p\n", regs->a2, regs->a3); |
| 56 | rt_kprintf("\ta4(x14) = %p\ta5(x15) = %p\n", regs->a4, regs->a5); |
| 57 | rt_kprintf("\ta6(x16) = %p\ta7(x17) = %p\n", regs->a6, regs->a7); |
| 58 | rt_kprintf("sstatus = %p\n", regs->sstatus); |
| 59 | rt_kprintf("\t%s\n", (regs->sstatus & SSTATUS_SIE) |
| 60 | ? "Supervisor Interrupt Enabled" |
| 61 | : "Supervisor Interrupt Disabled"); |
| 62 | rt_kprintf("\t%s\n", (regs->sstatus & SSTATUS_SPIE) |
| 63 | ? "Last Time Supervisor Interrupt Enabled" |
| 64 | : "Last Time Supervisor Interrupt Disabled"); |
| 65 | rt_kprintf("\t%s\n", (regs->sstatus & SSTATUS_SPP) |
| 66 | ? "Last Privilege is Supervisor Mode" |
| 67 | : "Last Privilege is User Mode"); |
| 68 | rt_kprintf("\t%s\n", (regs->sstatus & SSTATUS_SUM) |
| 69 | ? "Permit to Access User Page" |
| 70 | : "Not Permit to Access User Page"); |
| 71 | rt_kprintf("\t%s\n", (regs->sstatus & (1 << 19)) |
| 72 | ? "Permit to Read Executable-only Page" |
| 73 | : "Not Permit to Read Executable-only Page"); |
| 74 | rt_ubase_t satp_v = read_csr(satp); |
| 75 | rt_kprintf("satp = %p\n", satp_v); |
| 76 | rt_kprintf("\tCurrent Page Table(Physical) = %p\n", |
| 77 | __MASKVALUE(satp_v, __MASK(44)) << PAGE_OFFSET_BIT); |
| 78 | rt_kprintf("\tCurrent ASID = %p\n", __MASKVALUE(satp_v >> 44, __MASK(16)) |
| 79 | << PAGE_OFFSET_BIT); |
| 80 | const char *mode_str = "Unknown Address Translation/Protection Mode"; |
| 81 | |
| 82 | switch (__MASKVALUE(satp_v >> 60, __MASK(4))) |
| 83 | { |
| 84 | case 0: |
| 85 | mode_str = "No Address Translation/Protection Mode"; |
| 86 | break; |
| 87 | |
| 88 | case 8: |
| 89 | mode_str = "Page-based 39-bit Virtual Addressing Mode"; |
| 90 | break; |
no test coverage detected