Advertisement
Guest User

Untitled

a guest
Jul 21st, 2017
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.57 KB | None | 0 0
  1. /******************************/
  2. #define THREAD_R4 0x00
  3. #define THREAD_R5 0x04
  4. #define THREAD_R6 0x08
  5. #define THREAD_R7 0x0C
  6. #define THREAD_R8 0x10
  7. #define THREAD_R9 0x14
  8. #define THREAD_R10 0x18
  9. #define THREAD_R11 0x1C
  10. #define THREAD_R0 0x20
  11. #define THREAD_R1 0x24
  12. #define THREAD_R2 0x28
  13. #define THREAD_R3 0x2C
  14. #define THREAD_R12 0x30
  15. #define THREAD_R13 0x34
  16. #define THREAD_R14 0x38
  17. #define THREAD_R15 0x3C
  18. #define THREAD_CPSR 0x40
  19. #define THREAD_TEMP 0x44
  20. #define THREAD_LEN 0x48
  21. /******************************/
  22. #define THREAD_SHIFT 5
  23. #define THREAD_LIM (1<<(THREAD_SHIFT))
  24. /******************************/
  25. .arm
  26. .text
  27. .align
  28. /******************************/
  29.  
  30. thread_Init:
  31. rsb r0, r0, #0x10000
  32. orr r0, r0, #0xC00000
  33. mov r1, #0x04000000
  34. str r0, [r1, #0x100]
  35.  
  36. ldr r0, =thread_Tab
  37. stmia r0, {r4-r11} @ r0-r3,r12 are destroyed by call
  38. str sp, [r0, #THREAD_R13]
  39. str lr, [r0, #THREAD_R15]
  40. mrs r2, cpsr
  41. str r2, [r0, #THREAD_CPSR]
  42.  
  43. ldr r0, =irq_Tab
  44. ldr r2, =thread_Switch
  45. str r2, [r0, #0x0C]
  46. ldr r2, [r1, #0x210]
  47. orr r2, r2, #0x08
  48. str r2, [r1, #0x210]
  49.  
  50. ldr r0, =thread_Switch
  51. bx r0
  52.  
  53. /******************************/
  54. .size thread_Init, .-thread_Init
  55. .global thread_Init
  56. /******************************/
  57.  
  58. thread_New:
  59. add r1, r1, r2
  60. ldr r2, =thread_Tab - THREAD_LEN + THREAD_R15
  61. 1: ldr r3, [r2, #THREAD_LEN]!
  62. cmp r3, #0x00
  63. bne 1b
  64.  
  65. str r3, [r2, #THREAD_CPSR - THREAD_R15]
  66. str r0, [r2, #THREAD_R15 - THREAD_R15]
  67. ldr r0, =thread_Off
  68. str r0, [r2, #THREAD_R14 - THREAD_R15]
  69. str r1, [r2, #THREAD_R13 - THREAD_R15]
  70.  
  71. movs r0, r2
  72. bx lr
  73.  
  74. /******************************/
  75. .size thread_New, .-thread_New
  76. .global thread_New
  77. /******************************/
  78.  
  79. thread_Off:
  80. ldr r2, [r1, #THREAD_R15]
  81. str r2, [r1, #THREAD_TEMP]
  82. ldr r2, =0
  83. str r2, [r1, #THREAD_R15]
  84. ldr r0, =thread_Switch
  85. bx r0
  86.  
  87. /******************************/
  88. .size thread_Off, .-thread_Off
  89. .global thread_Off
  90. /******************************/
  91.  
  92. thread_Res:
  93. ldr r1, [r0, #THREAD_TEMP]
  94. str r1, [r0, #THREAD_R15]
  95. ldr r0, =thread_Switch
  96. bx r0
  97.  
  98. /******************************/
  99. .size thread_Res, .-thread_Res
  100. .global thread_Res
  101. /******************************/
  102. .section .itcm, "ax", %progbits
  103. .align
  104. /******************************/
  105.  
  106. thread_Switch:
  107. ldr r0, =thread_Cur
  108. ldrb r1, [r0]
  109. add r2, r1, #0x01
  110. and r2, r2, #THREAD_LIM-1
  111. strb r2, [r0]
  112. ldr r3, =THREAD_LEN
  113. ldr ip, =thread_Tab
  114. mla r1, r1, r3, ip
  115. stmia r1!, {r4-r11} @ r4-r11
  116. ldmfd sp!, {r4-r7,r8,r9}
  117.  
  118. mrs fp, cpsr
  119. mrs ip, spsr
  120. msr cpsr, ip
  121. stmia r1!, {r4-r7,r8,r9,r12,r13,r14} @ r0-r3,r12,cpsr,r13,r15
  122.  
  123. mla r0, r2, r3, ip
  124. ldr r1, [r0, #THREAD_CPSR]
  125. msr spsr, r1
  126. ldr sp, [r0, #THREAD_R13]
  127. ldr lr, [r0, #THREAD_R14]
  128.  
  129. msr cpsr, fp
  130.  
  131. ldmia r0!, {r4-r11} @ r4-r11 [r13, r14]
  132. ldr r12, [r0, #THREAD_R15] @ r4-r11, r13,r14,r15
  133. ldmia r0, {r0-r3,r12,r14}
  134. stmfd sp!, {r0-r3,r12} @ r0-r3,r4-r11,r12,r13,r14,
  135.  
  136. ldr r0, [r0] @ r0-r15, done
  137.  
  138. /******************************/
  139. .size thread_Switch, .-thread_Switch
  140. .global thread_Switch
  141. /******************************/
  142. .section .sbss
  143. .align
  144. /******************************/
  145.  
  146. thread_Tab:
  147. .rept THREAD_LIM
  148. .space 8*4 @ r4-r11
  149. .space 6*4 @ r0-r3,r12,r15
  150. .word 0 @ cpsr
  151. .word 0 @ sp
  152. .endr
  153.  
  154. /******************************/
  155. .size thread_Tab, .-thread_Tab
  156. .global thread_Tab
  157. /******************************/
  158.  
  159. thread_Cur:
  160. .word 0
  161.  
  162. /******************************/
  163. .size thread_Cur, .-thread_Cur
  164. .global thread_Cur
  165. /******************************/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement