+
+[global SwitchTasks]
+; rdi = New RSP
+; rsi = Old RSP save loc
+; rdx = New RIP
+; rcx = Old RIP save loc
+; r8 = CR3
+SwitchTasks:
+ PUSH_GPR
+
+ ; Save state RIP and RSP
+ lea rax, [rel .restore]
+ 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]