lwp_iar.S 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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. SECTION .text:CODE(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. EXPORT lwp_user_entry
  24. 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. ;/*
  39. ; * void SVC_Handler(void);
  40. ; */
  41. EXPORT SVC_Handler
  42. SVC_Handler:
  43. PUSH {LR}
  44. ; get user SP.
  45. TST LR, #0x4
  46. ITE EQ
  47. MRSEQ R1, MSP
  48. MRSNE R1, PSP
  49. PUSH {R1} ; push app SP.
  50. ; get SVC number.
  51. mov R0, R7
  52. ; get kernel system API
  53. BL lwp_get_sys_api
  54. PUSH {R0} ; push api
  55. ; get kernel SP to R0.
  56. BL lwp_get_kernel_sp
  57. POP {R2} ; pop api to R2.
  58. POP {R1} ; pop app SP to R1.
  59. stmfd r0!, {r1} ; save app SP to kernel SP
  60. ;push app parm5~6 to kernel SP
  61. STMFD R0!, {R4 - R5}
  62. ; copy R1(app SP) to R0(kernel SP).
  63. push {r8-r11}
  64. LDMFD R1, {R4 - R11} ; pop exception_stack_frame to r4 - r11 register
  65. STMFD R0!, {R4 - R11} ; push exception_stack_frame to server SP.
  66. pop {r8-r11}
  67. LDR R3, =svc_exit
  68. STR R3, [R0, #20] ; update LR
  69. STR R2, [R0, #24] ; update api to PC
  70. MSR PSP, R0 ; update SP, API is executed with kernel SP
  71. ; set to thread-privilege mode.
  72. MRS R3, CONTROL
  73. BIC R3, R3, #0x01
  74. ORR R3, R3, #0x02
  75. MSR CONTROL, R3
  76. POP {LR} ; 0xFFFFFFED
  77. ORR LR, LR, #0x10
  78. BX LR
  79. ;/*
  80. ; * void svc_exit(void);
  81. ; */
  82. EXPORT svc_exit
  83. svc_exit:
  84. ; get user SP.
  85. PUSH {R0} ; push result to SP.
  86. BL lwp_get_kernel_sp
  87. ldr r3, [r0, #-4]
  88. pop {r0}
  89. ldr lr, [r3, #20]
  90. ldr r1, [r3, #24] ; load pc
  91. add r3, r3, #32 ; exception_stack_frame size
  92. MSR PSP, R3 ; restore app stack pointer
  93. ; restore to PSP & thread-unprivilege mode.
  94. MRS R2, CONTROL
  95. ORR R2, R2, #0x03
  96. MSR CONTROL, R2
  97. ; return to lwp.
  98. ORR R1, R1, #0x01 ; only Thumb-mode.
  99. BX R1 ; return to user app.
  100. END