X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86_64%2Fproc.asm;h=e6db3ce23d211d52aeac45f718101c149385d69f;hb=dc42c3998b01e66a609fed5d503a81a972e636d6;hp=4771e1b963dc0a30dd94eea09673e5f53aba8dd5;hpb=a12f34dd45f08acd22664db795423a238ca6e569;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86_64/proc.asm b/Kernel/arch/x86_64/proc.asm index 4771e1b9..e6db3ce2 100644 --- a/Kernel/arch/x86_64/proc.asm +++ b/Kernel/arch/x86_64/proc.asm @@ -48,6 +48,7 @@ NewTaskHeader: jmp .hlt [extern MM_Clone] +[extern MM_DumpTables] [global Proc_CloneInt] Proc_CloneInt: PUSH_GPR @@ -55,13 +56,16 @@ Proc_CloneInt: mov [rdi], rsp call MM_Clone ; Save CR3 - mov rsi, [rsp+0x30] + mov rsi, [rsp+0x30] ; Saved version of RSI mov [rsi], rax ; Undo the PUSH_GPR add rsp, 0x80 mov rax, .newTask ret .newTask: +; mov rdi, 0 +; mov rsi, 0x800000000000 +; call MM_DumpTables POP_GPR xor eax, eax ret @@ -98,21 +102,29 @@ SaveState: SwitchTasks: PUSH_GPR + ; Save state RIP and RSP lea rax, [rel .restore] - mov QWORD [rcx], rax + mov [rcx], rax mov [rsi], rsp + ; Change CR3 if requested test r8, r8 jz .setState mov cr3, r8 + + ; Make sure the stack is valid before jumping invlpg [rdi] invlpg [rdi+0x1000] + + ; Go to new state .setState: mov rsp, rdi jmp rdx + ; Restore point for saved state .restore: POP_GPR - xor eax, eax + xor eax, eax ; Return zero ret +; vim: ft=nasm