vector_gcc.S 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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. * 2024-03-28 Shell Move vector handling codes from context_gcc.S
  9. */
  10. #ifndef __ASSEMBLY__
  11. #define __ASSEMBLY__
  12. #endif
  13. #include "../include/vector_gcc.h"
  14. #include "context_gcc.h"
  15. #include <rtconfig.h>
  16. #include <asm-generic.h>
  17. #include <asm-fpu.h>
  18. #include <armv8.h>
  19. .section .text
  20. .align 8
  21. .globl vector_fiq
  22. vector_fiq:
  23. SAVE_IRQ_CONTEXT
  24. stp x0, x1, [sp, #-0x10]!
  25. bl rt_hw_trap_fiq
  26. ldp x0, x1, [sp], #0x10
  27. RESTORE_IRQ_CONTEXT
  28. .globl rt_interrupt_enter
  29. .globl rt_interrupt_leave
  30. .globl rt_thread_switch_interrupt_flag
  31. .globl rt_interrupt_from_thread
  32. .globl rt_interrupt_to_thread
  33. .align 8
  34. .globl vector_irq
  35. vector_irq:
  36. SAVE_IRQ_CONTEXT
  37. stp x0, x1, [sp, #-0x10]! /* X0 is thread sp */
  38. bl rt_interrupt_enter
  39. bl rt_hw_trap_irq
  40. bl rt_interrupt_leave
  41. ldp x0, x1, [sp], #0x10
  42. /**
  43. * if rt_thread_switch_interrupt_flag set, jump to
  44. * rt_hw_context_switch_interrupt_do and don't return
  45. */
  46. ldr x1, =rt_thread_switch_interrupt_flag
  47. ldr x2, [x1]
  48. cmp x2, #1
  49. b.ne vector_irq_exit
  50. mov x2, #0 // clear flag
  51. str x2, [x1]
  52. ldr x3, =rt_interrupt_from_thread
  53. ldr x4, [x3]
  54. str x0, [x4] // store sp in preempted tasks's tcb
  55. ldr x3, =rt_interrupt_to_thread
  56. ldr x4, [x3]
  57. ldr x0, [x4] // get new task's stack pointer
  58. RESTORE_IRQ_CONTEXT
  59. vector_irq_exit:
  60. RESTORE_IRQ_CONTEXT_WITHOUT_MMU_SWITCH