Kernel - Added pointer to IRQ callbacks
[tpg/acess2.git] / Kernel / arch / x86_64 / proc.asm
index 541abd6..4771e1b 100644 (file)
@@ -47,26 +47,72 @@ 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
-       xchg bx, bx
        add rsi, 0x80
        SAVE_GPR rsi
-       sub rsi, 0x80
+       ; Save return addr
+       mov rax, [rsp]
+       mov [rsi], rax
        ; Return RSI as the RSP value
+       sub rsi, 0x80
        mov [rdi], rsi
-       call GetRIP
-       cmp eax, 0x80000000
-       ja .fastret
+       ; Check for 
+       mov rax, .restore
+       ret
 .restore:
-       ; RSP = RSI from call
-       xchg bx, bx
+       ; RSP = RSI now
        POP_GPR
+       mov rax, [rsp]
        mov rsp, [rsp-0x60]     ; Restore RSP from the saved value
+       mov [rsp], rax  ; Restore return address
        xor eax, eax
        ret
-.fastret:
-       ; RAX is still the return addr
-       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
+

UCC git Repository :: git.ucc.asn.au