X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86_64%2Fproc.asm;h=90eb3dca0f357a23a1dff0586b2de5fb834b7cca;hb=90311ae923051afa0db6554679e7389d1c95e4f2;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..90eb3dca 100644 --- a/Kernel/arch/x86_64/proc.asm +++ b/Kernel/arch/x86_64/proc.asm @@ -98,21 +98,28 @@ 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