trap.c 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. /**
  2. ******************************************************************************
  3. * @file trap.c
  4. * @author StarFive Technology
  5. * @version V1.0
  6. * @date 06/25/2020
  7. * @brief
  8. ******************************************************************************
  9. * @copy
  10. *
  11. * THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  12. * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  13. * TIME. AS A RESULT, STARFIVE SHALL NOT BE HELD LIABLE FOR ANY
  14. * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  15. * FROM THE CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  16. * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  17. *
  18. * COPYRIGHT 2020 Shanghai StarFive Technology Co., Ltd.
  19. */
  20. #include "encoding.h"
  21. #include "uart.h"
  22. #include "comdef.h"
  23. #if __riscv_xlen == 32
  24. #define MCAUSE_INT 0x80000000UL
  25. #define MCAUSE_CAUSE 0x000003FFUL
  26. #else
  27. #define MCAUSE_INT 0x8000000000000000UL
  28. #define MCAUSE_CAUSE 0x00000000000003FFUL
  29. #endif
  30. uintptr_t handle_trap(uintptr_t mcause, uintptr_t epc)
  31. {
  32. #if 0
  33. if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_EXT)) {
  34. rlSendString("extern interrupt.\n");
  35. } else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_TIMER)){
  36. rlSendString("timer interrupt.\n");
  37. } else if (mcause & MCAUSE_INT) {
  38. rlSendString("local interrupt.\n");
  39. }
  40. else {
  41. rlSendString("unhandle trap.\n");
  42. }
  43. #endif
  44. printk("trap mcause:0x%x epc:0x%x\n",mcause,epc);
  45. return epc;
  46. }
  47. void trap_entry(void)
  48. {
  49. unsigned long mcause = read_csr(mcause);
  50. unsigned long mepc = read_csr(mepc);
  51. handle_trap(mcause, mepc);
  52. }