11 %include "vmcs_fields.asm"
13 VMX_SUCCESS equ 0x00000000
14 VMX_FAIL_INVALID equ 0x00000001
15 VMX_FAIL_VALID equ 0x00000002
16 VMM_ERROR equ 0x00000003
36 EXPORT Init_VMCS_HostState
37 EXPORT Init_VMCS_GuestState
40 ; Enable_VMX - Turn on VMX
48 or ebx, dword 0x00002000
51 or ebx, dword 0x80000021
58 mov eax, VMX_FAIL_INVALID
64 ; VMREAD - read a value from a VMCS
87 mov eax, VMX_FAIL_INVALID
90 mov eax, VMX_FAIL_VALID
95 ; VMWRITE - write a value to a VMCS
114 mov eax, VMX_FAIL_INVALID
117 mov eax, VMX_FAIL_VALID
122 ; VMCLEAR - Initializes a VMCS
133 mov eax, VMX_FAIL_INVALID
136 mov eax, VMX_FAIL_VALID
143 ; VMCS_LOAD - load a VMCS
154 mov eax, VMX_FAIL_INVALID
157 mov eax, VMX_FAIL_VALID
164 ; VMCS_STORE - Store a VMCS
176 mov eax, VMX_FAIL_INVALID
179 mov eax, VMX_FAIL_VALID
196 mov eax, VMX_FAIL_INVALID
199 mov eax, VMX_FAIL_VALID
217 mov eax, VMX_FAIL_INVALID
220 mov eax, VMX_FAIL_VALID
247 mov eax, VMX_FAIL_INVALID
250 mov eax, VMX_FAIL_VALID
276 popa ; we only get here if there is an error in the vmresume
277 ; we restore the host state and return an error code
285 mov eax, VMX_FAIL_INVALID
288 mov eax, VMX_FAIL_VALID
297 ; Setup_VMCS_GuestState
298 ; Copy all of the Guest registers into the guest state of a vmcs
308 mov ebx, VMCS_GUEST_ES_SELECTOR
314 mov ebx, VMCS_GUEST_CS_SELECTOR
320 mov ebx, VMCS_GUEST_SS_SELECTOR
326 mov ebx, VMCS_GUEST_DS_SELECTOR
332 mov ebx, VMCS_GUEST_FS_SELECTOR
338 mov ebx, VMCS_GUEST_GS_SELECTOR
346 mov ebx, VMCS_GUEST_TR_SELECTOR
354 mov eax, VMX_FAIL_INVALID
357 mov eax, VMX_FAIL_VALID
376 mov ebx, GUEST_GDTR_LIMIT
382 mov ebx, GUEST_GDTR_BASE
391 mov ebx, GUEST_IDTR_LIMIT
397 mov ebx, GUEST_IDTR_BASE
405 mov ebx, GUEST_LDTR_BASE
412 mov ebx, GUEST_LDTR_LIMIT
421 mov eax, VMX_FAIL_INVALID
424 mov eax, VMX_FAIL_VALID
444 mov ebx, GUEST_ES_BASE
450 mov ebx, GUEST_CS_BASE
456 mov ebx, GUEST_SS_BASE
462 mov ebx, GUEST_DS_BASE
468 mov ebx, GUEST_FS_BASE
474 mov ebx, GUEST_GS_BASE
481 mov ebx, GUEST_TR_BASE
489 mov eax, VMX_FAIL_INVALID
492 mov eax, VMX_FAIL_VALID
505 mov eax, 1100000010010011b
506 mov ebx, GUEST_ES_ACCESS
513 mov eax, 1100000010011001b
514 ; mov eax, 0x0000c099
515 mov ebx, GUEST_CS_ACCESS
520 ; mov eax, 1100000010010111b
521 mov eax, 1100000010010011b
522 mov ebx, GUEST_SS_ACCESS
527 mov eax, 1100000010010011b
528 mov ebx, GUEST_DS_ACCESS
534 mov eax, 1100000010010011b
535 mov ebx, GUEST_FS_ACCESS
541 mov eax, 1100000010010011b
542 mov ebx, GUEST_GS_ACCESS
548 mov ebx, GUEST_LDTR_ACCESS
553 mov eax, 01000000010001011b
554 mov ebx, GUEST_TR_ACCESS
564 mov eax, VMX_FAIL_INVALID
567 mov eax, VMX_FAIL_VALID
581 ; mov eax, 0xffffffff
583 mov ebx, GUEST_ES_LIMIT
588 ; mov eax, 0xffffffff
590 mov ebx, GUEST_CS_LIMIT
595 ; mov eax, 0xffffffff
597 mov ebx, GUEST_SS_LIMIT
602 ; mov eax, 0xffffffff
604 mov ebx, GUEST_DS_LIMIT
609 ; mov eax, 0xffffffff
611 mov ebx, GUEST_FS_LIMIT
616 ; mov eax, 0xffffffff
618 mov ebx, GUEST_GS_LIMIT
623 ; mov eax, 0xffffffff
625 mov ebx, GUEST_TR_LIMIT
633 mov eax, VMX_FAIL_INVALID
636 mov eax, VMX_FAIL_VALID
644 Init_VMCS_GuestState:
655 call InitGuestSelectors
661 call InitGuestDescRegs
667 call InitGuestSegBases
674 call InitGuestSegsLimits
680 call InitGuestSegsAccess
692 mov ebx, GUEST_RFLAGS
693 mov eax, dword 0x00000002
699 mov eax, dword 0x00000400
707 mov eax, VMX_FAIL_INVALID
710 mov eax, VMX_FAIL_VALID
717 ; Setup_VMCS_HostState
718 ; Copy all of the host registers into the host state of a vmcs
728 mov ebx, VMCS_HOST_ES_SELECTOR
734 mov ebx, VMCS_HOST_CS_SELECTOR
740 mov ebx, VMCS_HOST_SS_SELECTOR
746 mov ebx, VMCS_HOST_DS_SELECTOR
752 mov ebx, VMCS_HOST_FS_SELECTOR
758 mov ebx, VMCS_HOST_GS_SELECTOR
766 mov ebx, VMCS_HOST_TR_SELECTOR
774 mov eax, VMX_FAIL_INVALID
777 mov eax, VMX_FAIL_VALID
798 mov ebx, HOST_GDTR_BASE
805 mov ebx, HOST_IDTR_BASE
812 mov ebx, HOST_FS_BASE
818 mov ebx, HOST_GS_BASE
824 mov ebx, HOST_TR_BASE
832 mov eax, VMX_FAIL_INVALID
835 mov eax, VMX_FAIL_VALID
864 call InitHostSelectors
870 call InitHostBaseRegs
880 mov eax, VMX_FAIL_INVALID
883 mov eax, VMX_FAIL_VALID
890 ; Launch_VM - inits a vmcs with an ip and launches it
891 ; [eip = ebp + 8], [vmcs = ebp + 12]
892 ; int Launch_VM(ullont_t VMCS, uint_t eip);
907 mov eax, dword 0x0000681E
909 vmwrite eax, [ebp+16]
920 mov eax, VMX_FAIL_INVALID
925 mov eax, VMX_FAIL_VALID
927 mov ebx, dword 0x00004400