vector_gcc.S 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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. RESTORE_IRQ_CONTEXT
  70. START_POINT_END(vector_exception)
  71. START_POINT(vector_serror)
  72. SAVE_IRQ_CONTEXT
  73. mov EFRAMEX, sp
  74. SAVE_USER_CTX EFRAMEX, x0
  75. mov x0, EFRAMEX
  76. bl rt_hw_trap_serror
  77. RESTORE_USER_CTX EFRAMEX, x0
  78. NEVER_RETURN
  79. START_POINT_END(vector_serror)
  80. START_POINT(vector_irq)
  81. SAVE_IRQ_CONTEXT
  82. mov EFRAMEX, sp
  83. /* trace IRQ level */
  84. bl rt_interrupt_enter
  85. SAVE_USER_CTX EFRAMEX, x0
  86. /* handline IRQ */
  87. mov x0, EFRAMEX
  88. bl rt_hw_trap_irq
  89. RESTORE_USER_CTX EFRAMEX, x0
  90. /* restore IRQ level */
  91. bl rt_interrupt_leave
  92. mov x0, EFRAMEX
  93. bl rt_hw_vector_irq_sched
  94. b rt_hw_irq_exit
  95. START_POINT_END(vector_irq)
  96. rt_hw_irq_exit:
  97. .globl rt_hw_irq_exit
  98. RESTORE_IRQ_CONTEXT