vector_gcc.S 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2013-07-05 Bernard the first version
  9. */
  10. .macro push_svc_reg pc_adjust
  11. sub sp, sp, #17 * 4 @/* Sizeof(struct rt_hw_exp_stack) */
  12. stmia sp, {r0 - r12} @/* Calling r0-r12 */
  13. mov r0, sp
  14. mrs r6, spsr @/* Save CPSR */
  15. sub r5, lr, #\pc_adjust
  16. str r5, [r0, #15*4] @/* Push fault PC */
  17. str r6, [r0, #16*4] @/* Push CPSR */
  18. cps #0x13 @/* Switch to SVC mode */
  19. str sp, [r0, #13*4] @/* Save calling SP */
  20. str lr, [r0, #14*4] @/* Save calling PC */
  21. .endm
  22. /*
  23. * EL2 exceptions are unexpected in the normal RT-Thread runtime because
  24. * the core has already descended into EL1. Keep the SDK policy simple:
  25. * capture a minimal register frame for diagnostics, then stop.
  26. */
  27. .macro push_hyp_reg pc_adjust
  28. mov r7, sp
  29. sub sp, sp, #17 * 4
  30. stmia sp, {r0 - r12}
  31. mov r0, sp
  32. str r7, [r0, #13*4]
  33. str lr, [r0, #14*4]
  34. sub r6, lr, #\pc_adjust
  35. str r6, [r0, #15*4]
  36. mrs r6, spsr
  37. str r6, [r0, #16*4]
  38. .endm
  39. .globl SWI_Handler
  40. SWI_Handler:
  41. push_svc_reg 4
  42. bl rt_hw_trap_swi
  43. b .
  44. .globl Undefined_Handler
  45. Undefined_Handler:
  46. push_svc_reg 4
  47. bl rt_hw_trap_undef
  48. b .
  49. .globl SVC_Handler
  50. SVC_Handler:
  51. push_svc_reg 4
  52. b rt_hw_trap_svc
  53. b .
  54. .globl Prefetch_Handler
  55. Prefetch_Handler:
  56. push_svc_reg 4
  57. b rt_hw_trap_pabt
  58. b .
  59. .globl Abort_Handler
  60. Abort_Handler:
  61. push_svc_reg 8
  62. b rt_hw_trap_dabt
  63. b .
  64. .globl Reserved_Handler
  65. Reserved_Handler:
  66. push_svc_reg 4
  67. b rt_hw_trap_resv
  68. b .
  69. .globl FIQ_Handler
  70. FIQ_Handler:
  71. stmdb sp!, {r0-r12, lr}
  72. #ifdef RT_USING_FPU
  73. vmrs r0, fpexc
  74. tst r0, #0x40000000
  75. beq __no_vfp_frame_str_fiq
  76. vstmdb sp!, {d0-d15}
  77. vmrs r1, fpscr
  78. stmdb sp!, {r1}
  79. __no_vfp_frame_str_fiq:
  80. stmdb sp!, {r0}
  81. #endif
  82. bl rt_interrupt_enter
  83. bl rt_hw_trap_fiq
  84. bl rt_interrupt_leave
  85. #ifdef RT_USING_FPU
  86. ldmia sp!, {r0}
  87. vmsr fpexc, r0
  88. tst r0, #0x40000000
  89. beq __no_vfp_frame_ldr_fiq
  90. ldmia sp!, {r1}
  91. vmsr fpscr, r1
  92. vldmia sp!, {d0-d15}
  93. __no_vfp_frame_ldr_fiq:
  94. #endif
  95. ldmia sp!, {r0-r12, lr}
  96. subs pc, lr, #4
  97. .globl EL2_Undefined_Handler
  98. EL2_Undefined_Handler:
  99. push_hyp_reg 4
  100. mov r1, #0
  101. b .
  102. .globl EL2_Prefetch_Handler
  103. EL2_Prefetch_Handler:
  104. push_hyp_reg 4
  105. mov r1, #1
  106. b .
  107. .globl EL2_Abort_Handler
  108. EL2_Abort_Handler:
  109. push_hyp_reg 8
  110. mov r1, #2
  111. b .
  112. .globl EL2_IRQ_Handler
  113. EL2_IRQ_Handler:
  114. push_hyp_reg 4
  115. mov r1, #3
  116. b .
  117. .globl EL2_FIQ_Handler
  118. EL2_FIQ_Handler:
  119. push_hyp_reg 4
  120. mov r1, #4
  121. b .
  122. .globl EL2_HVC_Handler
  123. EL2_HVC_Handler:
  124. push_hyp_reg 4
  125. mov r1, #5
  126. b .
  127. .globl EL2_Trap_Handler
  128. EL2_Trap_Handler:
  129. push_hyp_reg 4
  130. mov r1, #6
  131. b .