@ 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
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
+ mov r1, #0
+ mcrne p15, 0, r1, c8, c7, 0 @ TLBIALL - Invalidate all
@ Restore SP
mov sp, r0
bx r2
.return:
- push {r4-r12,pc}
+ pop {r4-r12,pc}
.extern MM_Clone
.extern MM_DumpTables
ldr r0, =Proc_CloneInt_new
pop {r4-r12,pc}
Proc_CloneInt_new:
- mov r0, #0
- mov r1, #0x80000000
- bl MM_DumpTables
mov r0, #0
pop {r4-r12,pc}
+
+@ R0: New user SP
+@ Return: Old user SP
+.globl Proc_int_SwapUserSP
+Proc_int_SwapUserSP:
+ cps #31 @ Go to system mode
+ mov r1, sp
+ tst r0, r0 @ Only update if non-zero
+ movne sp, r0
+ mov r0, r1
+ cps #19
+ mov pc, lr
+
+.section .usertext, "ax"
+.globl Proc_int_DropToUser
+@ R0: User IP
+@ R1: User SP
+Proc_int_DropToUser:
+ cps #16
+ mov sp, r1
+ mov pc, r0
+
+.section .rodata
+csProc_CloneInt_NewTaskMessage:
+ .asciz "New task PC=%p, R4=%p, sp=%p"
+csProc_CloneInt_OldTaskMessage:
+ .asciz "Parent task PC=%p, R4=%p, SP=%p"