%include "defs.asm"
%include "symbol.asm"
+SVM_ERROR equ 0xFFFFFFFF
+SVM_SUCCESS equ 0x00000000
+
+EXPORT DisableInts
+
+EXPORT GetGDTR
+EXPORT GetIDTR
+EXPORT GetTR
+
+EXPORT exit_test
+
+EXTERN handle_svm_exit
+
+EXPORT launch_svm
+EXPORT safe_svm_launch
+
+
+
+
+;; These need to be kept similar with the svm return values in svm.h
+SVM_HANDLER_SUCCESS equ 0x00
+SVM_HANDLER_ERROR equ 0x1
+SVM_HANDLER_HALT equ 0x2
[BITS 32]
+; Save and restore registers needed by SVM
+%macro Save_SVM_Registers 1
+ push eax
+ mov eax, dword %1
+ mov [eax], edi
+ mov [eax + 8], esi
+ mov [eax + 16], ebp
+ mov [eax + 24], dword 0 ;; esp
+ mov [eax + 32], ebx
+ mov [eax + 40], edx
+ mov [eax + 48], ecx
+
+ push ebx
+ mov ebx, [esp + 4]
+ mov [eax + 56], ebx ;; eax
+ pop ebx
+
+ pop eax
+%endmacro
+
+
+%macro Restore_SVM_Registers 1
+ push eax
+ mov eax, dword %1
+ mov edi, [eax]
+ mov esi, [eax + 8]
+ mov ebp, [eax + 16]
+;; mov esp, [eax + 24]
+ mov ebx, [eax + 32]
+ mov edx, [eax + 40]
+ mov ecx, [eax + 48]
+;; mov eax, [eax + 56]
+ pop eax
+%endmacro
+
+%macro vmrun 0
+ db 00fh, 001h, 0d8h
+%endmacro
+
+%macro vmsave 0
+ db 00fh, 001h, 0dbh
+%endmacro
+
+%macro vmload 0
+ db 00fh, 001h, 0dah
+%endmacro
+
+;VMRUN equ db 0Fh, 01h, D8h
+;VMLOAD equ db 0x0F,0x01,0xDA
+;VMSAVE equ db 0x0F,0x01,0xDB
+;STGI equ db 0x0F,0x01,0xDC
+;CLGI equ db 0x0F,0x01,0xDD
+
+
+align 8
+DisableInts:
+ cli
+ ret
+
+
+align 8
+GetGDTR:
+ push ebp
+ mov ebp, esp
+ pusha
+ mov ebx, [ebp + 8]
+ sgdt [ebx]
+
+ popa
+ pop ebp
+ ret
+align 8
+GetIDTR:
+ push ebp
+ mov ebp, esp
+ pusha
+
+ mov ebx, [ebp + 8]
+ sidt [ebx]
+
+ popa
+ pop ebp
+ ret
+
+
+
+align 8
+GetTR:
+ push ebp
+ mov ebp, esp
+ pusha
+ mov ebx, [ebp + 8]
+ str [ebx]
+
+ popa
+ pop ebp
+ ret
+
+
+
+; I think its safe to say that there are some pretty serious register issues...
+align 8
+launch_svm:
+ push ebp
+ mov ebp, esp
+ pusha
+
+ mov eax, [ebp + 8]
+ vmrun
+; db 00fh, 001h, 0d8h
+ popa
+ pop ebp
+ ret
+
+
+
+
+exit_test:
+ mov cr4, eax
+ ret
+
+
+;; Need to check this..
+;; save_svm_launch(rax, struct guest_gprs * regs)
+align 8
+safe_svm_launch:
+ push ebp
+ mov ebp, esp
+ pushf
+ pusha ;; Save Host state
+
+
+ push dword [ebp + 12] ;; pointer to the guest GPR save area
+ push dword [ebp + 8] ;; pointer to the VMCB pointer
+
+;; mov eax, [esp + 4] ;; mov guest GPR pointer to eax
+
+ Restore_SVM_Registers [esp + 4] ;; Restore Guest GPR state
+ pop eax ;; pop VMCB pointer into eax
+
+ vmload
+ vmrun
+ vmsave
+
+;; pop eax ;; pop Guest GPR pointer into eax
+ Save_SVM_Registers [esp] ;; save guest GPRs
+
+ add esp, 4 ;; skip past the gpr ptr
+
+ popa ;; Restore Host state
+ popf
+ pop ebp
+ ret
%endif
+
+