You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
bluepill/vmxexit_handler.asm

106 lines
2.0 KiB

extern exit_handler : proc
extern vmresume_failure : proc
.code
vmxlaunch_processor proc
pushfq ; vmlaunch sets some flags if an error happens...
mov rcx, 0681Ch ; VMCS_GUEST_RSP
vmwrite rcx, rsp ; current rsp pointer...
mov rcx, 0681Eh ; VMCS_GUEST_RIP
lea rdx, done ;
vmwrite rcx, rdx ; return C0FFEE on success...
vmlaunch
pushfq ; push rflags to the stack then put it into rax...
pop rax ;
popfq ; restore rflags back to what it was in the c++ code...
ret
done:
popfq ; restore flags and return back to c++ code...
mov rax, 0C0FFEEh
ret
vmxlaunch_processor endp
vmxexit_handler proc
push rax
push rbx
push rcx
push rdx
push rsi
push rdi
push rbp
push r8
push r9
push r10
push r11
push r12
push r13
push r14
push r15
sub rsp, 0108h ; 16 xmm registers... and +8 bytes for alignment...
movaps [rsp], xmm0
movaps [rsp + 010h], xmm1
movaps [rsp + 020h], xmm2
movaps [rsp + 030h], xmm3
movaps [rsp + 040h], xmm4
movaps [rsp + 050h], xmm5
movaps [rsp + 060h], xmm6
movaps [rsp + 070h], xmm7
movaps [rsp + 080h], xmm8
movaps [rsp + 090h], xmm9
movaps [rsp + 0A0h], xmm10
movaps [rsp + 0B0h], xmm11
movaps [rsp + 0C0h], xmm12
movaps [rsp + 0D0h], xmm13
movaps [rsp + 0E0h], xmm14
movaps [rsp + 0F0h], xmm15
mov rcx, rsp
sub rsp, 20h
call exit_handler
add rsp, 20h
movups xmm0, [rsp]
movups xmm1, [rsp + 010h]
movups xmm2, [rsp + 020h]
movups xmm3, [rsp + 030h]
movups xmm4, [rsp + 040h]
movups xmm5, [rsp + 050h]
movups xmm6, [rsp + 060h]
movups xmm7, [rsp + 070h]
movups xmm8, [rsp + 080h]
movups xmm9, [rsp + 090h]
movups xmm10, [rsp + 0A0h]
movups xmm11, [rsp + 0B0h]
movups xmm12, [rsp + 0C0h]
movups xmm13, [rsp + 0D0h]
movups xmm14, [rsp + 0E0h]
movups xmm15, [rsp + 0F0h]
add rsp, 0108h ; 16 xmm registers... and +8 bytes for alignment...
pop r15
pop r14
pop r13
pop r12
pop r11
pop r10
pop r9
pop r8
pop rbp
pop rdi
pop rsi
pop rdx
pop rcx
pop rbx
pop rax
vmresume
call vmresume_failure
int 3
vmxexit_handler endp
end