jmp .hlt
[extern MM_Clone]
+[extern MM_DumpTables]
[global Proc_CloneInt]
Proc_CloneInt:
PUSH_GPR
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
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