context_gcc.h 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /*
  2. * Copyright (c) 2006-2024, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2024-03-25 Shell Trimming unecessary ops and
  9. * improve the performance of ctx switch
  10. */
  11. #ifndef __ARM64_CONTEXT_H__
  12. #define __ARM64_CONTEXT_H__
  13. #include "../include/context_gcc.h"
  14. #include <rtconfig.h>
  15. #include <asm-generic.h>
  16. #include <asm-fpu.h>
  17. #include <armv8.h>
  18. .macro RESTORE_CONTEXT_SWITCH using_sp
  19. /* Set the SP to point to the stack of the task being restored. */
  20. mov sp, \using_sp
  21. #ifdef RT_USING_SMART
  22. bl rt_thread_self
  23. mov x19, x0
  24. bl lwp_aspace_switch
  25. mov x0, x19
  26. bl lwp_user_setting_restore
  27. #endif /* RT_USING_SMART */
  28. _RESTORE_CONTEXT_SWITCH
  29. .endm
  30. .macro RESTORE_IRQ_CONTEXT
  31. #ifdef RT_USING_SMART
  32. BL rt_thread_self
  33. MOV X19, X0
  34. BL lwp_aspace_switch
  35. MOV X0, X19
  36. BL lwp_user_setting_restore
  37. #endif
  38. LDP X2, X3, [SP], #0x10 /* SPSR and ELR. */
  39. TST X3, #0x1f
  40. MSR SPSR_EL1, X3
  41. MSR ELR_EL1, X2
  42. LDP X29, X30, [SP], #0x10
  43. MSR SP_EL0, X29
  44. LDP X28, X29, [SP], #0x10
  45. MSR FPCR, X28
  46. MSR FPSR, X29
  47. LDP X28, X29, [SP], #0x10
  48. LDP X26, X27, [SP], #0x10
  49. LDP X24, X25, [SP], #0x10
  50. LDP X22, X23, [SP], #0x10
  51. LDP X20, X21, [SP], #0x10
  52. LDP X18, X19, [SP], #0x10
  53. LDP X16, X17, [SP], #0x10
  54. LDP X14, X15, [SP], #0x10
  55. LDP X12, X13, [SP], #0x10
  56. LDP X10, X11, [SP], #0x10
  57. LDP X8, X9, [SP], #0x10
  58. LDP X6, X7, [SP], #0x10
  59. LDP X4, X5, [SP], #0x10
  60. LDP X2, X3, [SP], #0x10
  61. LDP X0, X1, [SP], #0x10
  62. RESTORE_FPU SP
  63. #ifdef RT_USING_SMART
  64. BEQ arch_ret_to_user
  65. #endif
  66. ERET
  67. .endm
  68. #endif /* __ARM64_CONTEXT_H__ */