Build - Restructured configuration
[tpg/acess2.git] / Kernel / arch / x86_64 / proc.asm
index 4771e1b..db22a16 100644 (file)
@@ -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,61 @@ 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
+
+[global Proc_InitialiseSSE]
+Proc_InitialiseSSE:
+       mov rax, cr4
+       or ax, (1 << 9)|(1 << 10)       ; Set OSFXSR and OSXMMEXCPT
+       mov cr4, rax
+       mov rax, cr0
+       and ax, ~(1 << 2)       ; Clear EM
+       or rax, (1 << 1)        ; Set MP
+       mov rax, cr0
+       ret
+[global Proc_DisableSSE]
+Proc_DisableSSE:
+       mov rax, cr0
+       or ax, 1 << 3   ; Set TS
+       mov cr0, rax
+       ret
+[global Proc_EnableSSE]
+Proc_EnableSSE:
+       mov rax, cr0
+       and ax, ~(1 << 3)       ; Clear TS
+       mov cr0, rax
+       ret
+
+[global Proc_SaveSSE]
+Proc_SaveSSE:
+       fxsave [rdi]
+       ret
+[global Proc_RestoreSSE]
+Proc_RestoreSSE:
+       fxrstor [rdi]
        ret
 
+; vim: ft=nasm

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