lwp_rvds.S 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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. AREA |.text|, CODE, READONLY, ALIGN=2
  11. THUMB
  12. REQUIRE8
  13. PRESERVE8
  14. ;/*
  15. ; * void* lwp_get_sys_api(rt_uint32_t number);
  16. ; */
  17. IMPORT lwp_get_sys_api
  18. IMPORT lwp_get_kernel_sp
  19. IMPORT lwp_set_kernel_sp
  20. ;/*
  21. ; * void lwp_user_entry(args, text, data);
  22. ; */
  23. lwp_user_entry PROC
  24. EXPORT lwp_user_entry
  25. PUSH {R0-R3} ; push text&data addr.
  26. MOV R0, SP ; v1 = SP
  27. BL lwp_set_kernel_sp ; lwp_set_kernel_sp(v1)
  28. ; set CPU to user-thread mode.
  29. MRS R2, CONTROL
  30. ORR R2, R2, #0x03 ; use PSP, user-thread mode.
  31. MSR CONTROL, R2
  32. POP {R0-R3} ; pop app address to R1.
  33. ; set data address.
  34. MOV R9, R2
  35. ; run app, only Thumb-mode.
  36. ORR R1, R1, #0x01
  37. BX R1
  38. ; never reach here!
  39. ENDP
  40. ;/*
  41. ; * void SVC_Handler(void);
  42. ; */
  43. SVC_Handler PROC
  44. EXPORT 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. ENDP
  82. ;/*
  83. ; * void svc_exit(void);
  84. ; */
  85. svc_exit PROC
  86. EXPORT 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.
  103. ENDP
  104. ALIGN
  105. END