@ TODO: Do something with the thread pointer
ldr r4, [sp],#4 @ Function
- ldr r5, [sp],#4
- @ Get arguments
- sub r5, #1
- ldrhs r0, [sp],#4
-@ suble r5, #1
-@ ldrhs r1, [sp],#4
-@ suble r5, #1
-@ ldrhs r2, [sp],#4
-@ suble r5, #1
-@ ldrhs r3, [sp],#4
+ @ Get argument
+ ldr r0, [sp],#4
blx r4
bl Threads_Exit
b .
+.globl Proc_int_DropToUser
+@ R0: User IP
+@ R1: User SP
+Proc_int_DropToUser:
+ cps #16
+ mov sp, r1
+ mov pc, r0
+
.globl SwitchTask
@ R0: New stack
@ R1: Pointer to where to save old stack
@ R3: Pointer to save old IP
@ SP+0: New address space
SwitchTask:
- PUSH_GPRS
+ push {r4-r12,lr}
@ Save IP
ldr r4, =.return
str sp, [r1]
@ Only update TTBR0 if the task has an explicit address space
- ldr r1, [sp,#0x40]
+ ldr r1, [sp,#4*10]
tst r1, r1
mcrne p15, 0, r1, c2, c0, 0 @ Set TTBR0 to r0
bx r2
.return:
- POP_GPRS
- bx lr
+ pop {r4-r12,pc}
+
+.extern MM_Clone
+.extern MM_DumpTables
+.globl Proc_CloneInt
+Proc_CloneInt:
+ @ R0: SP Destination
+ @ R1: Mem Destination
+ push {r4-r12,lr}
+ mov r4, r1 @ Save mem destination
+ str sp, [r0] @ Save SP to SP dest
+
+ bl MM_Clone
+ str r0, [r4] @ Save clone return to Mem Dest
+
+ ldr r0, =Proc_CloneInt_new
+ pop {r4-r12,pc}
+Proc_CloneInt_new:
+@ cps #18
+
+@ mov r0, #0
+@ mvn r1, #0
+@ bl MM_DumpTables
+
+ ldr r0, =csProc_CloneInt_NewTaskMessage
+ bl Log
+
+@ cps #19
+ mov r0, #0
+ pop {r4-r12,pc}
+
+.section .rodata
+csProc_CloneInt_NewTaskMessage:
+ .asciz "New task"