X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Farmv7%2Fproc.S;h=4d7c89f714933623fcdbc6b81e85e97970de6394;hb=1baac59e0cea8985a60093e7415a1796bad138ae;hp=52dcb64aeaf09c882c2f4161933dd5e2127617b9;hpb=ad385e2864f65afcac4b19ac35e17eca2c30e32b;p=tpg%2Facess2.git diff --git a/Kernel/arch/armv7/proc.S b/Kernel/arch/armv7/proc.S index 52dcb64a..4d7c89f7 100644 --- a/Kernel/arch/armv7/proc.S +++ b/Kernel/arch/armv7/proc.S @@ -27,14 +27,6 @@ KernelThreadHeader: 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 @@ -54,6 +46,8 @@ SwitchTask: 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 @ Invalidate all (HACK! But it fixes things) @ Restore SP mov sp, r0 @@ -79,19 +73,29 @@ Proc_CloneInt: 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} +@ 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: