X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Farch%2Fx86_64%2Fproc.asm;h=4771e1b963dc0a30dd94eea09673e5f53aba8dd5;hb=a12f34dd45f08acd22664db795423a238ca6e569;hp=664ad21916fb8785748ad9f1649831a2512372e3;hpb=b542705de8f0290f0a3e30687e8327e8e64b0576;p=tpg%2Facess2.git diff --git a/Kernel/arch/x86_64/proc.asm b/Kernel/arch/x86_64/proc.asm index 664ad219..4771e1b9 100644 --- a/Kernel/arch/x86_64/proc.asm +++ b/Kernel/arch/x86_64/proc.asm @@ -47,6 +47,25 @@ NewTaskHeader: .hlt: jmp .hlt +[extern MM_Clone] +[global Proc_CloneInt] +Proc_CloneInt: + PUSH_GPR + ; Save RSP + mov [rdi], rsp + call MM_Clone + ; Save CR3 + mov rsi, [rsp+0x30] + mov [rsi], rax + ; Undo the PUSH_GPR + add rsp, 0x80 + mov rax, .newTask + ret +.newTask: + POP_GPR + xor eax, eax + ret + [global SaveState] SaveState: ; Save regs to RSI @@ -69,4 +88,31 @@ SaveState: mov [rsp], rax ; Restore return address xor eax, eax ret + +[global SwitchTasks] +; rdi = New RSP +; rsi = Old RSP save loc +; rdx = New RIP +; rcx = Old RIP save loc +; r8 = CR3 +SwitchTasks: + PUSH_GPR + lea rax, [rel .restore] + mov QWORD [rcx], rax + mov [rsi], rsp + + test r8, r8 + jz .setState + mov cr3, r8 + invlpg [rdi] + invlpg [rdi+0x1000] +.setState: + mov rsp, rdi + jmp rdx + +.restore: + POP_GPR + xor eax, eax + ret +