trap_common.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #include <rthw.h>
  2. #include <rtthread.h>
  3. #include "riscv-ops.h"
  4. #include "rt_hw_stack_frame.h"
  5. #define ISR_NUMBER 32
  6. static volatile rt_hw_stack_frame_t *s_stack_frame;
  7. static struct rt_irq_desc rv32irq_table[ISR_NUMBER];
  8. void rt_show_stack_frame(void);
  9. /**
  10. * Temporary interrupt entry function
  11. *
  12. * @param mcause Machine Cause Register
  13. * @return RT_NULL
  14. */
  15. rt_weak rt_isr_handler_t rt_hw_interrupt_handle(rt_uint32_t mcause)
  16. {
  17. rt_kprintf("UN-handled interrupt %d occurred!!!\n", mcause);
  18. return RT_NULL;
  19. }
  20. /**
  21. * Interrupt entry function initialization
  22. */
  23. rt_weak void rt_hw_interrupt_init(void)
  24. {
  25. int idx = 0;
  26. for (idx = 0; idx < ISR_NUMBER; idx++)
  27. {
  28. rv32irq_table[idx].handler = (rt_isr_handler_t)rt_hw_interrupt_handle;
  29. rv32irq_table[idx].param = RT_NULL;
  30. }
  31. }
  32. /**
  33. * Break Entry Function Binding
  34. *
  35. * @param vector interrupt number
  36. * @param handler Break-in function requiring binding
  37. * @param param NULL
  38. * @param name NULL
  39. * @return old handler
  40. */
  41. rt_weak rt_isr_handler_t rt_hw_interrupt_install(int vector, rt_isr_handler_t handler,
  42. void *param, const char *name)
  43. {
  44. rt_isr_handler_t old_handler = RT_NULL;
  45. void *user_param = param;
  46. if(vector < ISR_NUMBER)
  47. {
  48. old_handler = rv32irq_table[vector].handler;
  49. if (handler != RT_NULL)
  50. {
  51. rv32irq_table[vector].handler = (rt_isr_handler_t)handler;
  52. rv32irq_table[vector].param = param;
  53. }
  54. }
  55. return old_handler;
  56. }
  57. /**
  58. * Query and Distribution Entry for Exception and Interrupt Sources
  59. *
  60. * @param mcause Machine Cause Register
  61. */
  62. rt_weak void rt_rv32_system_irq_handler(rt_uint32_t mcause)
  63. {
  64. rt_uint32_t mscratch = read_csr(0x340);
  65. rt_uint32_t irq_id = (mcause & 0x1F);
  66. rt_uint32_t exception = !(mcause & 0x80000000);
  67. if(exception)
  68. {
  69. s_stack_frame = (rt_hw_stack_frame_t *)mscratch;
  70. rt_show_stack_frame();
  71. }
  72. else
  73. {
  74. rv32irq_table[irq_id].handler(irq_id, rv32irq_table[irq_id].param);
  75. }
  76. }
  77. /**
  78. * Register Print on Exception
  79. */
  80. rt_weak void rt_show_stack_frame(void)
  81. {
  82. rt_kprintf("Stack frame:\r\n----------------------------------------\r\n");
  83. rt_kprintf("ra : 0x%08x\r\n", s_stack_frame->ra);
  84. rt_kprintf("mstatus : 0x%08x\r\n", read_csr(0x300));//mstatus
  85. rt_kprintf("t0 : 0x%08x\r\n", s_stack_frame->t0);
  86. rt_kprintf("t1 : 0x%08x\r\n", s_stack_frame->t1);
  87. rt_kprintf("t2 : 0x%08x\r\n", s_stack_frame->t2);
  88. rt_kprintf("a0 : 0x%08x\r\n", s_stack_frame->a0);
  89. rt_kprintf("a1 : 0x%08x\r\n", s_stack_frame->a1);
  90. rt_kprintf("a2 : 0x%08x\r\n", s_stack_frame->a2);
  91. rt_kprintf("a3 : 0x%08x\r\n", s_stack_frame->a3);
  92. rt_kprintf("a4 : 0x%08x\r\n", s_stack_frame->a4);
  93. rt_kprintf("a5 : 0x%08x\r\n", s_stack_frame->a5);
  94. #ifndef __riscv_32e
  95. rt_kprintf("a6 : 0x%08x\r\n", s_stack_frame->a6);
  96. rt_kprintf("a7 : 0x%08x\r\n", s_stack_frame->a7);
  97. rt_kprintf("t3 : 0x%08x\r\n", s_stack_frame->t3);
  98. rt_kprintf("t4 : 0x%08x\r\n", s_stack_frame->t4);
  99. rt_kprintf("t5 : 0x%08x\r\n", s_stack_frame->t5);
  100. rt_kprintf("t6 : 0x%08x\r\n", s_stack_frame->t6);
  101. #endif
  102. }