trap.c 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. /*
  2. * Copyright (c) 2006-2024, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2024/01/11 flyingcys The first version
  9. */
  10. #include <rtthread.h>
  11. #include <encoding.h>
  12. struct exception_stack_frame
  13. {
  14. uint64_t x1;
  15. uint64_t x2;
  16. uint64_t x3;
  17. uint64_t x4;
  18. uint64_t x5;
  19. uint64_t x6;
  20. uint64_t x7;
  21. uint64_t x8;
  22. uint64_t x9;
  23. uint64_t x10;
  24. uint64_t x11;
  25. uint64_t x12;
  26. uint64_t x13;
  27. uint64_t x14;
  28. uint64_t x15;
  29. uint64_t x16;
  30. uint64_t x17;
  31. uint64_t x18;
  32. uint64_t x19;
  33. uint64_t x20;
  34. uint64_t x21;
  35. uint64_t x22;
  36. uint64_t x23;
  37. uint64_t x24;
  38. uint64_t x25;
  39. uint64_t x26;
  40. uint64_t x27;
  41. uint64_t x28;
  42. uint64_t x29;
  43. uint64_t x30;
  44. uint64_t x31;
  45. };
  46. static void print_stack_frame(uintptr_t * sp)
  47. {
  48. struct exception_stack_frame * esf = (struct exception_stack_frame *)(sp+1);
  49. rt_kprintf("\n=================================================================\n");
  50. rt_kprintf("x1 (ra : Return address ) ==> 0x%08x%08x\n", esf->x1 >> 32 , esf->x1 & UINT32_MAX);
  51. rt_kprintf("x2 (sp : Stack pointer ) ==> 0x%08x%08x\n", esf->x2 >> 32 , esf->x2 & UINT32_MAX);
  52. rt_kprintf("x3 (gp : Global pointer ) ==> 0x%08x%08x\n", esf->x3 >> 32 , esf->x3 & UINT32_MAX);
  53. rt_kprintf("x4 (tp : Thread pointer ) ==> 0x%08x%08x\n", esf->x4 >> 32 , esf->x4 & UINT32_MAX);
  54. rt_kprintf("x5 (t0 : Temporary ) ==> 0x%08x%08x\n", esf->x5 >> 32 , esf->x5 & UINT32_MAX);
  55. rt_kprintf("x6 (t1 : Temporary ) ==> 0x%08x%08x\n", esf->x6 >> 32 , esf->x6 & UINT32_MAX);
  56. rt_kprintf("x7 (t2 : Temporary ) ==> 0x%08x%08x\n", esf->x7 >> 32 , esf->x7 & UINT32_MAX);
  57. rt_kprintf("x8 (s0/fp: Save register,frame pointer ) ==> 0x%08x%08x\n", esf->x8 >> 32 , esf->x8 & UINT32_MAX);
  58. rt_kprintf("x9 (s1 : Save register ) ==> 0x%08x%08x\n", esf->x9 >> 32 , esf->x9 & UINT32_MAX);
  59. rt_kprintf("x10(a0 : Function argument,return value) ==> 0x%08x%08x\n", esf->x10 >> 32 , esf->x10 & UINT32_MAX);
  60. rt_kprintf("x11(a1 : Function argument,return value) ==> 0x%08x%08x\n", esf->x11 >> 32 , esf->x11 & UINT32_MAX);
  61. rt_kprintf("x12(a2 : Function argument ) ==> 0x%08x%08x\n", esf->x12 >> 32 , esf->x12 & UINT32_MAX);
  62. rt_kprintf("x13(a3 : Function argument ) ==> 0x%08x%08x\n", esf->x13 >> 32 , esf->x13 & UINT32_MAX);
  63. rt_kprintf("x14(a4 : Function argument ) ==> 0x%08x%08x\n", esf->x14 >> 32 , esf->x14 & UINT32_MAX);
  64. rt_kprintf("x15(a5 : Function argument ) ==> 0x%08x%08x\n", esf->x15 >> 32 , esf->x15 & UINT32_MAX);
  65. rt_kprintf("x16(a6 : Function argument ) ==> 0x%08x%08x\n", esf->x16 >> 32 , esf->x16 & UINT32_MAX);
  66. rt_kprintf("x17(a7 : Function argument ) ==> 0x%08x%08x\n", esf->x17 >> 32 , esf->x17 & UINT32_MAX);
  67. rt_kprintf("x18(s2 : Save register ) ==> 0x%08x%08x\n", esf->x18 >> 32 , esf->x18 & UINT32_MAX);
  68. rt_kprintf("x19(s3 : Save register ) ==> 0x%08x%08x\n", esf->x19 >> 32 , esf->x19 & UINT32_MAX);
  69. rt_kprintf("x20(s4 : Save register ) ==> 0x%08x%08x\n", esf->x20 >> 32 , esf->x20 & UINT32_MAX);
  70. rt_kprintf("x21(s5 : Save register ) ==> 0x%08x%08x\n", esf->x21 >> 32 , esf->x21 & UINT32_MAX);
  71. rt_kprintf("x22(s6 : Save register ) ==> 0x%08x%08x\n", esf->x22 >> 32 , esf->x22 & UINT32_MAX);
  72. rt_kprintf("x23(s7 : Save register ) ==> 0x%08x%08x\n", esf->x23 >> 32 , esf->x23 & UINT32_MAX);
  73. rt_kprintf("x24(s8 : Save register ) ==> 0x%08x%08x\n", esf->x24 >> 32 , esf->x24 & UINT32_MAX);
  74. rt_kprintf("x25(s9 : Save register ) ==> 0x%08x%08x\n", esf->x25 >> 32 , esf->x25 & UINT32_MAX);
  75. rt_kprintf("x26(s10 : Save register ) ==> 0x%08x%08x\n", esf->x26 >> 32 , esf->x26 & UINT32_MAX);
  76. rt_kprintf("x27(s11 : Save register ) ==> 0x%08x%08x\n", esf->x27 >> 32 , esf->x27 & UINT32_MAX);
  77. rt_kprintf("x28(t3 : Temporary ) ==> 0x%08x%08x\n", esf->x28 >> 32 , esf->x28 & UINT32_MAX);
  78. rt_kprintf("x29(t4 : Temporary ) ==> 0x%08x%08x\n", esf->x29 >> 32 , esf->x29 & UINT32_MAX);
  79. rt_kprintf("x30(t5 : Temporary ) ==> 0x%08x%08x\n", esf->x30 >> 32 , esf->x30 & UINT32_MAX);
  80. rt_kprintf("x31(t6 : Temporary ) ==> 0x%08x%08x\n", esf->x31 >> 32 , esf->x31 & UINT32_MAX);
  81. rt_kprintf("=================================================================\n");
  82. }
  83. rt_weak void rt_hw_soft_irq_isr(void)
  84. {
  85. }
  86. rt_weak int rt_hw_tick_isr(void)
  87. {
  88. return 0;
  89. }
  90. rt_weak void rt_hw_irq_isr(void)
  91. {
  92. }
  93. rt_weak rt_size_t handle_trap(rt_size_t cause, rt_size_t epc, rt_size_t *sp)
  94. {
  95. if (cause & (1UL << (__riscv_xlen - 1))) //interrupt
  96. {
  97. if ((cause & 0x1f) == IRQ_M_SOFT)
  98. {
  99. rt_hw_soft_irq_isr();
  100. }
  101. else if ((cause & 0x1f) == IRQ_M_TIMER)
  102. {
  103. rt_hw_tick_isr();
  104. }
  105. else if ((cause & 0x1f) == IRQ_M_EXT)
  106. {
  107. rt_hw_irq_isr();
  108. }
  109. }
  110. else
  111. {
  112. rt_thread_t tid;
  113. #if defined(RT_USING_FINSH) && defined(MSH_USING_BUILT_IN_COMMANDS)
  114. extern long list_thread();
  115. #endif
  116. rt_hw_interrupt_disable();
  117. tid = rt_thread_self();
  118. rt_kprintf("\nException:\n");
  119. switch (cause)
  120. {
  121. case CAUSE_MISALIGNED_FETCH:
  122. rt_kprintf("Instruction address misaligned");
  123. break;
  124. case CAUSE_FAULT_FETCH:
  125. rt_kprintf("Instruction access fault");
  126. break;
  127. case CAUSE_ILLEGAL_INSTRUCTION:
  128. rt_kprintf("Illegal instruction");
  129. break;
  130. case CAUSE_BREAKPOINT:
  131. rt_kprintf("Breakpoint");
  132. break;
  133. case CAUSE_MISALIGNED_LOAD:
  134. rt_kprintf("Load address misaligned");
  135. break;
  136. case CAUSE_FAULT_LOAD:
  137. rt_kprintf("Load access fault");
  138. break;
  139. case CAUSE_MISALIGNED_STORE:
  140. rt_kprintf("Store address misaligned");
  141. break;
  142. case CAUSE_FAULT_STORE:
  143. rt_kprintf("Store access fault");
  144. break;
  145. case CAUSE_USER_ECALL:
  146. rt_kprintf("Environment call from U-mode");
  147. break;
  148. case CAUSE_SUPERVISOR_ECALL:
  149. rt_kprintf("Environment call from S-mode");
  150. break;
  151. case CAUSE_HYPERVISOR_ECALL:
  152. rt_kprintf("Environment call from H-mode");
  153. break;
  154. case CAUSE_MACHINE_ECALL:
  155. rt_kprintf("Environment call from M-mode");
  156. break;
  157. default:
  158. rt_kprintf("Uknown exception : %08lX", cause);
  159. break;
  160. }
  161. rt_kprintf("\n");
  162. print_stack_frame(sp);
  163. rt_kprintf("exception pc => 0x%08x\n", epc);
  164. rt_kprintf("current thread: %.*s\n", RT_NAME_MAX, tid->parent.name);
  165. #if defined(RT_USING_FINSH) && defined(MSH_USING_BUILT_IN_COMMANDS)
  166. list_thread();
  167. #endif
  168. while(1);
  169. }
  170. return epc;
  171. }