3 ;; (c) 2008, Jack Lange <jarusl@cs.northwestern.edu>
4 ;; (c) 2008, The V3VEE Project <http://www.v3vee.org>
15 %include "vmcs_fields.asm"
17 VMX_SUCCESS equ 0x00000000
18 VMX_FAIL_INVALID equ 0x00000001
19 VMX_FAIL_VALID equ 0x00000002
20 VMM_ERROR equ 0x00000003
40 EXPORT Init_VMCS_HostState
41 EXPORT Init_VMCS_GuestState
44 ; Enable_VMX - Turn on VMX
52 or ebx, dword 0x00002000
55 or ebx, dword 0x80000021
62 mov eax, VMX_FAIL_INVALID
68 ; VMREAD - read a value from a VMCS
91 mov eax, VMX_FAIL_INVALID
94 mov eax, VMX_FAIL_VALID
99 ; VMWRITE - write a value to a VMCS
118 mov eax, VMX_FAIL_INVALID
121 mov eax, VMX_FAIL_VALID
126 ; VMCLEAR - Initializes a VMCS
137 mov eax, VMX_FAIL_INVALID
140 mov eax, VMX_FAIL_VALID
147 ; VMCS_LOAD - load a VMCS
158 mov eax, VMX_FAIL_INVALID
161 mov eax, VMX_FAIL_VALID
168 ; VMCS_STORE - Store a VMCS
180 mov eax, VMX_FAIL_INVALID
183 mov eax, VMX_FAIL_VALID
200 mov eax, VMX_FAIL_INVALID
203 mov eax, VMX_FAIL_VALID
221 mov eax, VMX_FAIL_INVALID
224 mov eax, VMX_FAIL_VALID
251 mov eax, VMX_FAIL_INVALID
254 mov eax, VMX_FAIL_VALID
280 popa ; we only get here if there is an error in the vmresume
281 ; we restore the host state and return an error code
289 mov eax, VMX_FAIL_INVALID
292 mov eax, VMX_FAIL_VALID
301 ; Setup_VMCS_GuestState
302 ; Copy all of the Guest registers into the guest state of a vmcs
312 mov ebx, VMCS_GUEST_ES_SELECTOR
318 mov ebx, VMCS_GUEST_CS_SELECTOR
324 mov ebx, VMCS_GUEST_SS_SELECTOR
330 mov ebx, VMCS_GUEST_DS_SELECTOR
336 mov ebx, VMCS_GUEST_FS_SELECTOR
342 mov ebx, VMCS_GUEST_GS_SELECTOR
350 mov ebx, VMCS_GUEST_TR_SELECTOR
358 mov eax, VMX_FAIL_INVALID
361 mov eax, VMX_FAIL_VALID
380 mov ebx, GUEST_GDTR_LIMIT
386 mov ebx, GUEST_GDTR_BASE
395 mov ebx, GUEST_IDTR_LIMIT
401 mov ebx, GUEST_IDTR_BASE
409 mov ebx, GUEST_LDTR_BASE
416 mov ebx, GUEST_LDTR_LIMIT
425 mov eax, VMX_FAIL_INVALID
428 mov eax, VMX_FAIL_VALID
448 mov ebx, GUEST_ES_BASE
454 mov ebx, GUEST_CS_BASE
460 mov ebx, GUEST_SS_BASE
466 mov ebx, GUEST_DS_BASE
472 mov ebx, GUEST_FS_BASE
478 mov ebx, GUEST_GS_BASE
485 mov ebx, GUEST_TR_BASE
493 mov eax, VMX_FAIL_INVALID
496 mov eax, VMX_FAIL_VALID
509 mov eax, 1100000010010011b
510 mov ebx, GUEST_ES_ACCESS
517 mov eax, 1100000010011001b
518 ; mov eax, 0x0000c099
519 mov ebx, GUEST_CS_ACCESS
524 ; mov eax, 1100000010010111b
525 mov eax, 1100000010010011b
526 mov ebx, GUEST_SS_ACCESS
531 mov eax, 1100000010010011b
532 mov ebx, GUEST_DS_ACCESS
538 mov eax, 1100000010010011b
539 mov ebx, GUEST_FS_ACCESS
545 mov eax, 1100000010010011b
546 mov ebx, GUEST_GS_ACCESS
552 mov ebx, GUEST_LDTR_ACCESS
557 mov eax, 01000000010001011b
558 mov ebx, GUEST_TR_ACCESS
568 mov eax, VMX_FAIL_INVALID
571 mov eax, VMX_FAIL_VALID
585 ; mov eax, 0xffffffff
587 mov ebx, GUEST_ES_LIMIT
592 ; mov eax, 0xffffffff
594 mov ebx, GUEST_CS_LIMIT
599 ; mov eax, 0xffffffff
601 mov ebx, GUEST_SS_LIMIT
606 ; mov eax, 0xffffffff
608 mov ebx, GUEST_DS_LIMIT
613 ; mov eax, 0xffffffff
615 mov ebx, GUEST_FS_LIMIT
620 ; mov eax, 0xffffffff
622 mov ebx, GUEST_GS_LIMIT
627 ; mov eax, 0xffffffff
629 mov ebx, GUEST_TR_LIMIT
637 mov eax, VMX_FAIL_INVALID
640 mov eax, VMX_FAIL_VALID
648 Init_VMCS_GuestState:
659 call InitGuestSelectors
665 call InitGuestDescRegs
671 call InitGuestSegBases
678 call InitGuestSegsLimits
684 call InitGuestSegsAccess
696 mov ebx, GUEST_RFLAGS
697 mov eax, dword 0x00000002
703 mov eax, dword 0x00000400
711 mov eax, VMX_FAIL_INVALID
714 mov eax, VMX_FAIL_VALID
721 ; Setup_VMCS_HostState
722 ; Copy all of the host registers into the host state of a vmcs
732 mov ebx, VMCS_HOST_ES_SELECTOR
738 mov ebx, VMCS_HOST_CS_SELECTOR
744 mov ebx, VMCS_HOST_SS_SELECTOR
750 mov ebx, VMCS_HOST_DS_SELECTOR
756 mov ebx, VMCS_HOST_FS_SELECTOR
762 mov ebx, VMCS_HOST_GS_SELECTOR
770 mov ebx, VMCS_HOST_TR_SELECTOR
778 mov eax, VMX_FAIL_INVALID
781 mov eax, VMX_FAIL_VALID
802 mov ebx, HOST_GDTR_BASE
809 mov ebx, HOST_IDTR_BASE
816 mov ebx, HOST_FS_BASE
822 mov ebx, HOST_GS_BASE
828 mov ebx, HOST_TR_BASE
836 mov eax, VMX_FAIL_INVALID
839 mov eax, VMX_FAIL_VALID
868 call InitHostSelectors
874 call InitHostBaseRegs
884 mov eax, VMX_FAIL_INVALID
887 mov eax, VMX_FAIL_VALID
894 ; Launch_VM - inits a vmcs with an ip and launches it
895 ; [eip = ebp + 8], [vmcs = ebp + 12]
896 ; int Launch_VM(ullont_t VMCS, uint_t eip);
911 mov eax, dword 0x0000681E
913 vmwrite eax, [ebp+16]
924 mov eax, VMX_FAIL_INVALID
929 mov eax, VMX_FAIL_VALID
931 mov ebx, dword 0x00004400