vectors_clic.S 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. /*
  2. * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include "sdkconfig.h"
  7. #include "soc/soc.h"
  8. /* If memory protection interrupts are meant to trigger a panic, attach them to panic handler,
  9. * else, attach them to the interrupt handler. */
  10. #if CONFIG_ESP_SYSTEM_MEMPROT_FEATURE
  11. #define MEMPROT_ISR _panic_handler
  12. #else
  13. #define MEMPROT_ISR _interrupt_handler
  14. #endif // CONFIG_ESP_SYSTEM_MEMPROT_FEATURE
  15. #if CONFIG_ESP_IPC_ISR_ENABLE
  16. #define IPC_ISR_HANDLER esp_ipc_isr_handler
  17. #else
  18. #define IPC_ISR_HANDLER _interrupt_handler
  19. #endif // CONFIG_ESP_IPC_ISR_ENABLE
  20. /* The system interrupts are not used for now, so trigger a panic every time one occurs. */
  21. #define _system_int_handler _panic_handler
  22. /* Handlers defined in the `vector.S` file, common to all RISC-V targets */
  23. .global _interrupt_handler
  24. .global _panic_handler
  25. .section .exception_vectors_table.text
  26. /* Prevent the compiler from generating 2-byte instruction in the vector tables */
  27. .option push
  28. .option norvc
  29. /**
  30. * Non-hardware vectored interrupt entry. MTVEC CSR points here.
  31. *
  32. * On targets that use CLIC as their interrupt controller, when an exception occurs, the CPU
  33. * jumps to the address stored in MTVEC[31:6] << 6. The CPU will also jump to this location
  34. * if an interrupt is configured as non-vectored (CLIC_INT_ATTR.shv = 0).
  35. *
  36. * Because of the left-shift `<< 6`, this entry must be aligned on 64.
  37. */
  38. .global _vector_table
  39. .type _vector_table, @function
  40. .balign 0x40
  41. _vector_table:
  42. j _panic_handler
  43. .size _vector_table, .-_vector_table
  44. /**
  45. * Vectored interrupt table. MTVT CSR points here.
  46. *
  47. * If an interrupt occurs and is configured as (hardware) vectored, the CPU will jump to
  48. * MTVT[31:0] + 4 * interrupt_id
  49. *
  50. * In the case of the ESP32P4, the interrupt matrix, between the CPU interrupt lines
  51. * and the peripherals, offers 32 lines. As such, the interrupt_id between 0 and 31.
  52. *
  53. * Since the interrupts are initialized as vectored on CPU start, we can manage the special
  54. * interrupts ETS_T1_WDT_INUM, ETS_CACHEERR_INUM and ETS_MEMPROT_ERR_INUM here.
  55. */
  56. .balign 0x40
  57. .global _mtvt_table
  58. .type _mtvt_table, @function
  59. _mtvt_table:
  60. .word _system_int_handler /* 0: System interrupt number. Exceptions are non-vectored, won't load this. */
  61. .word _system_int_handler /* 1: System interrupt number */
  62. .word _system_int_handler /* 2: System interrupt number */
  63. .word _system_int_handler /* 3: System interrupt number */
  64. .word _system_int_handler /* 4: System interrupt number */
  65. .word _system_int_handler /* 5: System interrupt number */
  66. .word _system_int_handler /* 6: System interrupt number */
  67. .word _system_int_handler /* 7: System interrupt number */
  68. .word _system_int_handler /* 8: System interrupt number */
  69. .word _system_int_handler /* 9: System interrupt number */
  70. .word _system_int_handler /* 10: System interrupt number */
  71. .word _system_int_handler /* 11: System interrupt number */
  72. .word _system_int_handler /* 12: System interrupt number */
  73. .word _system_int_handler /* 13: System interrupt number */
  74. .word _system_int_handler /* 14: System interrupt number */
  75. .word _system_int_handler /* 15: System interrupt number */
  76. .word _interrupt_handler /* 16: Free interrupt number */
  77. .word _interrupt_handler /* 17: Free interrupt number */
  78. .word _interrupt_handler /* 18: Free interrupt number */
  79. .word _interrupt_handler /* 19: Free interrupt number */
  80. .word _interrupt_handler /* 20: Free interrupt number */
  81. .word _interrupt_handler /* 21: Free interrupt number */
  82. .word _interrupt_handler /* 22: Free interrupt number */
  83. .word _interrupt_handler /* 23: Free interrupt number */
  84. .word _interrupt_handler /* 24: Free interrupt number */
  85. .word _interrupt_handler /* 25: Free interrupt number */
  86. .word _interrupt_handler /* 26: Free interrupt number */
  87. .word _interrupt_handler /* 27: Free interrupt number */
  88. .word _interrupt_handler /* 28: Free interrupt number */
  89. .word _interrupt_handler /* 29: Free interrupt number */
  90. .word _interrupt_handler /* 30: Free interrupt number */
  91. .word _interrupt_handler /* 31: Free interrupt number */
  92. .word _interrupt_handler /* 32: Free interrupt number */
  93. .word _interrupt_handler /* 33: Free interrupt number */
  94. .word _interrupt_handler /* 34: Free interrupt number */
  95. .word _interrupt_handler /* 35: Free interrupt number */
  96. .word _interrupt_handler /* 36: Free interrupt number */
  97. .word _interrupt_handler /* 37: Free interrupt number */
  98. .word _interrupt_handler /* 38: Free interrupt number */
  99. .word _interrupt_handler /* 39: Free interrupt number */
  100. .word _panic_handler /* 40: ETS_INT_WDT_INUM (+16) panic-interrupt (soc-level panic) */
  101. .word _panic_handler /* 41: ETS_CACHEERR_INUM (+16) panic-interrupt (soc-level panic) */
  102. .word MEMPROT_ISR /* 42: ETS_MEMPROT_ERR_INUM (+16) handler (soc-level panic) */
  103. .word _interrupt_handler /* 43: Free interrupt number */
  104. .word IPC_ISR_HANDLER /* 44: ETS_IPC_ISR_INUM (+16) handler*/
  105. .word _interrupt_handler /* 45: Free interrupt number */
  106. .word _interrupt_handler /* 46: Free interrupt number */
  107. .word _interrupt_handler /* 47: Free interrupt number */
  108. .size _mtvt_table, .-_mtvt_table
  109. .option pop