vector_gcc.S 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. /*
  2. * Copyright (c) 2006-2020, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2018-10-06 ZhaoXiaowei the first version
  9. * 2024-03-28 Shell Move vector handling codes from context_gcc.S
  10. */
  11. #ifndef __ASSEMBLY__
  12. #define __ASSEMBLY__
  13. #endif
  14. #include <rtconfig.h>
  15. .text
  16. .globl system_vectors
  17. .globl vector_exception
  18. .globl vector_irq
  19. .globl vector_fiq
  20. system_vectors:
  21. .align 11
  22. .set VBAR, system_vectors
  23. .org VBAR
  24. /* Exception from CurrentEL (EL1) with SP_EL0 (SPSEL=1) */
  25. .org (VBAR + 0x00 + 0)
  26. b vector_serror /* Synchronous */
  27. .org (VBAR + 0x80 + 0)
  28. b vector_serror /* IRQ/vIRQ */
  29. .org (VBAR + 0x100 + 0)
  30. b vector_serror /* FIQ/vFIQ */
  31. .org (VBAR + 0x180 + 0)
  32. b vector_serror /* Error/vError */
  33. /* Exception from CurrentEL (EL1) with SP_ELn */
  34. .org (VBAR + 0x200 + 0)
  35. b vector_exception /* Synchronous */
  36. .org (VBAR + 0x280 + 0)
  37. b vector_irq /* IRQ/vIRQ */
  38. .org (VBAR + 0x300 + 0)
  39. b vector_fiq /* FIQ/vFIQ */
  40. .org (VBAR + 0x380 + 0)
  41. b vector_serror
  42. /* Exception from lower EL, aarch64 */
  43. .org (VBAR + 0x400 + 0)
  44. b vector_exception
  45. .org (VBAR + 0x480 + 0)
  46. b vector_irq
  47. .org (VBAR + 0x500 + 0)
  48. b vector_fiq
  49. .org (VBAR + 0x580 + 0)
  50. b vector_serror
  51. /* Exception from lower EL, aarch32 */
  52. .org (VBAR + 0x600 + 0)
  53. b vector_serror
  54. .org (VBAR + 0x680 + 0)
  55. b vector_serror
  56. .org (VBAR + 0x700 + 0)
  57. b vector_serror
  58. .org (VBAR + 0x780 + 0)
  59. b vector_serror
  60. #include "include/vector_gcc.h"
  61. #define EFRAMEX x19
  62. START_POINT(vector_exception)
  63. SAVE_IRQ_CONTEXT
  64. mov EFRAMEX, sp
  65. SAVE_USER_CTX EFRAMEX, x0
  66. mov x0, EFRAMEX
  67. bl rt_hw_trap_exception
  68. RESTORE_USER_CTX EFRAMEX, x0
  69. /* do exception switch for IRQ/exception handlers */
  70. EXCEPTION_SWITCH sp, x0
  71. RESTORE_IRQ_CONTEXT
  72. eret
  73. START_POINT_END(vector_exception)
  74. START_POINT(vector_serror)
  75. SAVE_IRQ_CONTEXT
  76. mov EFRAMEX, sp
  77. SAVE_USER_CTX EFRAMEX, x0
  78. mov x0, EFRAMEX
  79. bl rt_hw_trap_serror
  80. RESTORE_USER_CTX EFRAMEX, x0
  81. NEVER_RETURN
  82. START_POINT_END(vector_serror)
  83. START_POINT(vector_irq)
  84. SAVE_IRQ_CONTEXT
  85. mov EFRAMEX, sp
  86. /* trace IRQ level */
  87. bl rt_interrupt_enter
  88. SAVE_USER_CTX EFRAMEX, x0
  89. /* handline IRQ */
  90. mov x0, EFRAMEX
  91. bl rt_hw_trap_irq
  92. RESTORE_USER_CTX EFRAMEX, x0
  93. /* restore IRQ level */
  94. bl rt_interrupt_leave
  95. mov x0, EFRAMEX
  96. bl rt_hw_vector_irq_sched
  97. b rt_hw_irq_exit
  98. START_POINT_END(vector_irq)
  99. rt_hw_irq_exit:
  100. .globl rt_hw_irq_exit
  101. /* do exception switch for IRQ/exception handlers */
  102. EXCEPTION_SWITCH sp, x0
  103. RESTORE_IRQ_CONTEXT
  104. eret