trap.c 1.7 KB

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