lwp_gcc.S 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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. * 2018-10-30 heyuanjie first version
  9. */
  10. .cpu cortex-m3
  11. .syntax unified
  12. .thumb
  13. .text
  14. /*
  15. * void* lwp_get_sys_api(rt_uint32_t number);
  16. */
  17. .global lwp_get_sys_api
  18. .global lwp_get_kernel_sp
  19. .global lwp_set_kernel_sp
  20. /*
  21. * void lwp_user_entry(args, text, data);
  22. */
  23. .global lwp_user_entry
  24. .type lwp_user_entry, % function
  25. lwp_user_entry:
  26. PUSH {R0-R3} @; push text&data addr.
  27. MOV R0, SP @; v1 = SP
  28. BL lwp_set_kernel_sp @; lwp_set_kernel_sp(v1)
  29. @; set CPU to user-thread mode.
  30. MRS R2, CONTROL
  31. ORR R2, R2, #0x03 @; use PSP, user-thread mode.
  32. MSR CONTROL, R2
  33. POP {R0-R3} @; pop app address to R1.
  34. @; set data address.
  35. MOV R9, R2
  36. @; run app, only Thumb-mode.
  37. ORR R1, R1, #0x01
  38. BX R1
  39. /*
  40. * void SVC_Handler(void);
  41. */
  42. .global SVC_Handler
  43. .type SVC_Handler, % function
  44. SVC_Handler:
  45. PUSH {LR}
  46. @; get user SP.
  47. TST LR, #0x4
  48. ITE EQ
  49. MRSEQ R1, MSP
  50. MRSNE R1, PSP
  51. PUSH {R1} @; push app SP.
  52. @; get SVC number.
  53. mov R0, R7
  54. @; get kernel system API
  55. BL lwp_get_sys_api
  56. PUSH {R0} @; push api
  57. @; get kernel SP to R0.
  58. BL lwp_get_kernel_sp
  59. POP {R2} @; pop api to R2.
  60. POP {R1} @; pop app SP to R1.
  61. stmfd r0!, {r1} @; save app SP to kernel SP
  62. @;push app parm5~6 to kernel SP
  63. STMFD R0!, {R4 - R5}
  64. @; copy R1(app SP) to R0(kernel SP).
  65. push {r8-r11}
  66. LDMFD R1, {R4 - R11} @; pop exception_stack_frame to r4 - r11 register
  67. STMFD R0!, {R4 - R11} @; push exception_stack_frame to server SP.
  68. pop {r8-r11}
  69. LDR R3, =svc_exit
  70. STR R3, [R0, #20] @; update LR
  71. STR R2, [R0, #24] @; update api to PC
  72. MSR PSP, R0 @; update SP, API is executed with kernel SP
  73. @; set to thread-privilege mode.
  74. MRS R3, CONTROL
  75. BIC R3, R3, #0x01
  76. ORR R3, R3, #0x02
  77. MSR CONTROL, R3
  78. POP {LR} @; 0xFFFFFFED
  79. ORR LR, LR, #0x10
  80. BX LR
  81. /*
  82. * void svc_exit(void);
  83. */
  84. .global svc_exit
  85. .type svc_exit, % function
  86. svc_exit:
  87. @; get user SP.
  88. PUSH {R0} @; push result to SP.
  89. BL lwp_get_kernel_sp
  90. ldr r3, [r0, #-4]
  91. pop {r0}
  92. ldr lr, [r3, #20]
  93. ldr r1, [r3, #24] @; load pc
  94. add r3, #32 @; exception_stack_frame size
  95. MSR PSP, R3 @; restore app stack pointer
  96. @; restore to PSP & thread-unprivilege mode.
  97. MRS R2, CONTROL
  98. ORR R2, R2, #0x03
  99. MSR CONTROL, R2
  100. @; return to lwp.
  101. ORR R1, R1, #0x01 @; only Thumb-mode.
  102. BX R1 @; return to user app.