.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
+