3 ;; Northwestern University
4 ;; (c) 2008, Jack Lange <jarusl@cs.northwestern.edu>
14 %include "vmcs_fields.asm"
16 VMX_SUCCESS equ 0x00000000
17 VMX_FAIL_INVALID equ 0x00000001
18 VMX_FAIL_VALID equ 0x00000002
19 VMM_ERROR equ 0x00000003
39 EXPORT Init_VMCS_HostState
40 EXPORT Init_VMCS_GuestState
43 ; Enable_VMX - Turn on VMX
51 or ebx, dword 0x00002000
54 or ebx, dword 0x80000021
61 mov eax, VMX_FAIL_INVALID
67 ; VMREAD - read a value from a VMCS
90 mov eax, VMX_FAIL_INVALID
93 mov eax, VMX_FAIL_VALID
98 ; VMWRITE - write a value to a VMCS
117 mov eax, VMX_FAIL_INVALID
120 mov eax, VMX_FAIL_VALID
125 ; VMCLEAR - Initializes a VMCS
136 mov eax, VMX_FAIL_INVALID
139 mov eax, VMX_FAIL_VALID
146 ; VMCS_LOAD - load a VMCS
157 mov eax, VMX_FAIL_INVALID
160 mov eax, VMX_FAIL_VALID
167 ; VMCS_STORE - Store a VMCS
179 mov eax, VMX_FAIL_INVALID
182 mov eax, VMX_FAIL_VALID
199 mov eax, VMX_FAIL_INVALID
202 mov eax, VMX_FAIL_VALID
220 mov eax, VMX_FAIL_INVALID
223 mov eax, VMX_FAIL_VALID
250 mov eax, VMX_FAIL_INVALID
253 mov eax, VMX_FAIL_VALID
279 popa ; we only get here if there is an error in the vmresume
280 ; we restore the host state and return an error code
288 mov eax, VMX_FAIL_INVALID
291 mov eax, VMX_FAIL_VALID
300 ; Setup_VMCS_GuestState
301 ; Copy all of the Guest registers into the guest state of a vmcs
311 mov ebx, VMCS_GUEST_ES_SELECTOR
317 mov ebx, VMCS_GUEST_CS_SELECTOR
323 mov ebx, VMCS_GUEST_SS_SELECTOR
329 mov ebx, VMCS_GUEST_DS_SELECTOR
335 mov ebx, VMCS_GUEST_FS_SELECTOR
341 mov ebx, VMCS_GUEST_GS_SELECTOR
349 mov ebx, VMCS_GUEST_TR_SELECTOR
357 mov eax, VMX_FAIL_INVALID
360 mov eax, VMX_FAIL_VALID
379 mov ebx, GUEST_GDTR_LIMIT
385 mov ebx, GUEST_GDTR_BASE
394 mov ebx, GUEST_IDTR_LIMIT
400 mov ebx, GUEST_IDTR_BASE
408 mov ebx, GUEST_LDTR_BASE
415 mov ebx, GUEST_LDTR_LIMIT
424 mov eax, VMX_FAIL_INVALID
427 mov eax, VMX_FAIL_VALID
447 mov ebx, GUEST_ES_BASE
453 mov ebx, GUEST_CS_BASE
459 mov ebx, GUEST_SS_BASE
465 mov ebx, GUEST_DS_BASE
471 mov ebx, GUEST_FS_BASE
477 mov ebx, GUEST_GS_BASE
484 mov ebx, GUEST_TR_BASE
492 mov eax, VMX_FAIL_INVALID
495 mov eax, VMX_FAIL_VALID
508 mov eax, 1100000010010011b
509 mov ebx, GUEST_ES_ACCESS
516 mov eax, 1100000010011001b
517 ; mov eax, 0x0000c099
518 mov ebx, GUEST_CS_ACCESS
523 ; mov eax, 1100000010010111b
524 mov eax, 1100000010010011b
525 mov ebx, GUEST_SS_ACCESS
530 mov eax, 1100000010010011b
531 mov ebx, GUEST_DS_ACCESS
537 mov eax, 1100000010010011b
538 mov ebx, GUEST_FS_ACCESS
544 mov eax, 1100000010010011b
545 mov ebx, GUEST_GS_ACCESS
551 mov ebx, GUEST_LDTR_ACCESS
556 mov eax, 01000000010001011b
557 mov ebx, GUEST_TR_ACCESS
567 mov eax, VMX_FAIL_INVALID
570 mov eax, VMX_FAIL_VALID
584 ; mov eax, 0xffffffff
586 mov ebx, GUEST_ES_LIMIT
591 ; mov eax, 0xffffffff
593 mov ebx, GUEST_CS_LIMIT
598 ; mov eax, 0xffffffff
600 mov ebx, GUEST_SS_LIMIT
605 ; mov eax, 0xffffffff
607 mov ebx, GUEST_DS_LIMIT
612 ; mov eax, 0xffffffff
614 mov ebx, GUEST_FS_LIMIT
619 ; mov eax, 0xffffffff
621 mov ebx, GUEST_GS_LIMIT
626 ; mov eax, 0xffffffff
628 mov ebx, GUEST_TR_LIMIT
636 mov eax, VMX_FAIL_INVALID
639 mov eax, VMX_FAIL_VALID
647 Init_VMCS_GuestState:
658 call InitGuestSelectors
664 call InitGuestDescRegs
670 call InitGuestSegBases
677 call InitGuestSegsLimits
683 call InitGuestSegsAccess
695 mov ebx, GUEST_RFLAGS
696 mov eax, dword 0x00000002
702 mov eax, dword 0x00000400
710 mov eax, VMX_FAIL_INVALID
713 mov eax, VMX_FAIL_VALID
720 ; Setup_VMCS_HostState
721 ; Copy all of the host registers into the host state of a vmcs
731 mov ebx, VMCS_HOST_ES_SELECTOR
737 mov ebx, VMCS_HOST_CS_SELECTOR
743 mov ebx, VMCS_HOST_SS_SELECTOR
749 mov ebx, VMCS_HOST_DS_SELECTOR
755 mov ebx, VMCS_HOST_FS_SELECTOR
761 mov ebx, VMCS_HOST_GS_SELECTOR
769 mov ebx, VMCS_HOST_TR_SELECTOR
777 mov eax, VMX_FAIL_INVALID
780 mov eax, VMX_FAIL_VALID
801 mov ebx, HOST_GDTR_BASE
808 mov ebx, HOST_IDTR_BASE
815 mov ebx, HOST_FS_BASE
821 mov ebx, HOST_GS_BASE
827 mov ebx, HOST_TR_BASE
835 mov eax, VMX_FAIL_INVALID
838 mov eax, VMX_FAIL_VALID
867 call InitHostSelectors
873 call InitHostBaseRegs
883 mov eax, VMX_FAIL_INVALID
886 mov eax, VMX_FAIL_VALID
893 ; Launch_VM - inits a vmcs with an ip and launches it
894 ; [eip = ebp + 8], [vmcs = ebp + 12]
895 ; int Launch_VM(ullont_t VMCS, uint_t eip);
910 mov eax, dword 0x0000681E
912 vmwrite eax, [ebp+16]
923 mov eax, VMX_FAIL_INVALID
928 mov eax, VMX_FAIL_VALID
930 mov ebx, dword 0x00004400