context_gcc.h 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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 __ARM64_INC_CONTEXT_H__
  11. #define __ARM64_INC_CONTEXT_H__
  12. #include "armv8.h"
  13. .macro SAVE_CONTEXT_SWITCH, tmpx, tmp2x
  14. /* Save the entire context. */
  15. SAVE_FPU sp
  16. stp x19, x20, [sp, #-0x10]!
  17. stp x21, x22, [sp, #-0x10]!
  18. stp x23, x24, [sp, #-0x10]!
  19. stp x25, x26, [sp, #-0x10]!
  20. stp x27, x28, [sp, #-0x10]!
  21. mrs \tmpx, sp_el0
  22. stp x29, \tmpx, [sp, #-0x10]!
  23. mrs \tmpx, fpcr
  24. mrs \tmp2x, fpsr
  25. stp \tmpx, \tmp2x, [sp, #-0x10]!
  26. mov \tmpx, #((3 << 6) | 0x5) /* el1h, disable interrupt */
  27. stp x30, \tmpx, [sp, #-0x10]!
  28. .endm
  29. .macro SAVE_CONTEXT_SWITCH_FAST
  30. /* Save the entire context. */
  31. add sp, sp, #-1 * CONTEXT_FPU_SIZE
  32. add sp, sp, #-7 * 16
  33. mov x19, #((3 << 6) | 0x4 | 0x1) /* el1h, disable interrupt */
  34. stp lr, x19, [sp, #-0x10]!
  35. .endm
  36. .macro _RESTORE_CONTEXT_SWITCH
  37. ldp x30, x19, [sp], #0x10 /* SPSR and ELR. */
  38. msr elr_el1, x30
  39. msr spsr_el1, x19
  40. /* restore NEON */
  41. ldp x19, x20, [sp], #0x10
  42. msr fpcr, x19
  43. msr fpsr, x20
  44. ldp x29, x19, [sp], #0x10
  45. msr sp_el0, x19
  46. ldp x27, x28, [sp], #0x10
  47. ldp x25, x26, [sp], #0x10
  48. ldp x23, x24, [sp], #0x10
  49. ldp x21, x22, [sp], #0x10
  50. ldp x19, x20, [sp], #0x10
  51. RESTORE_FPU sp
  52. eret
  53. .endm
  54. #endif /* __ARM64_INC_CONTEXT_H__ */