3 ;; This file is part of the Palacios Virtual Machine Monitor developed
4 ;; by the V3VEE Project with funding from the United States National
5 ;; Science Foundation and the Department of Energy.
7 ;; The V3VEE Project is a joint project between Northwestern University
8 ;; and the University of New Mexico. You can find out more at
9 ;; http://www.v3vee.org
11 ;; Copyright (c) 2008, Jack Lange <jarusl@cs.northwestern.edu>
12 ;; Copyright (c) 2008, The V3VEE Project <http://www.v3vee.org>
13 ;; All rights reserved.
15 ;; Author: Jack Lange <jarusl@cs.northwestern.edu>
17 ;; This is free software. You are permitted to use,
18 ;; redistribute, and modify it as specified in the file "V3VEE_LICENSE".
29 %include "vmcs_fields.asm"
31 VMX_SUCCESS equ 0x00000000
32 VMX_FAIL_INVALID equ 0x00000001
33 VMX_FAIL_VALID equ 0x00000002
34 VMM_ERROR equ 0x00000003
54 EXPORT Init_VMCS_HostState
55 EXPORT Init_VMCS_GuestState
70 mov eax, VMX_FAIL_INVALID
73 mov eax, VMX_FAIL_VALID
91 mov eax, VMX_FAIL_INVALID
94 mov eax, VMX_FAIL_VALID
121 mov eax, VMX_FAIL_INVALID
124 mov eax, VMX_FAIL_VALID
150 popa ; we only get here if there is an error in the vmresume
151 ; we restore the host state and return an error code
159 mov eax, VMX_FAIL_INVALID
162 mov eax, VMX_FAIL_VALID
171 ; Setup_VMCS_GuestState
172 ; Copy all of the Guest registers into the guest state of a vmcs
182 mov ebx, VMCS_GUEST_ES_SELECTOR
188 mov ebx, VMCS_GUEST_CS_SELECTOR
194 mov ebx, VMCS_GUEST_SS_SELECTOR
200 mov ebx, VMCS_GUEST_DS_SELECTOR
206 mov ebx, VMCS_GUEST_FS_SELECTOR
212 mov ebx, VMCS_GUEST_GS_SELECTOR
220 mov ebx, VMCS_GUEST_TR_SELECTOR
228 mov eax, VMX_FAIL_INVALID
231 mov eax, VMX_FAIL_VALID
250 mov ebx, GUEST_GDTR_LIMIT
256 mov ebx, GUEST_GDTR_BASE
265 mov ebx, GUEST_IDTR_LIMIT
271 mov ebx, GUEST_IDTR_BASE
279 mov ebx, GUEST_LDTR_BASE
286 mov ebx, GUEST_LDTR_LIMIT
295 mov eax, VMX_FAIL_INVALID
298 mov eax, VMX_FAIL_VALID
318 mov ebx, GUEST_ES_BASE
324 mov ebx, GUEST_CS_BASE
330 mov ebx, GUEST_SS_BASE
336 mov ebx, GUEST_DS_BASE
342 mov ebx, GUEST_FS_BASE
348 mov ebx, GUEST_GS_BASE
355 mov ebx, GUEST_TR_BASE
363 mov eax, VMX_FAIL_INVALID
366 mov eax, VMX_FAIL_VALID
379 mov eax, 1100000010010011b
380 mov ebx, GUEST_ES_ACCESS
387 mov eax, 1100000010011001b
388 ; mov eax, 0x0000c099
389 mov ebx, GUEST_CS_ACCESS
394 ; mov eax, 1100000010010111b
395 mov eax, 1100000010010011b
396 mov ebx, GUEST_SS_ACCESS
401 mov eax, 1100000010010011b
402 mov ebx, GUEST_DS_ACCESS
408 mov eax, 1100000010010011b
409 mov ebx, GUEST_FS_ACCESS
415 mov eax, 1100000010010011b
416 mov ebx, GUEST_GS_ACCESS
422 mov ebx, GUEST_LDTR_ACCESS
427 mov eax, 01000000010001011b
428 mov ebx, GUEST_TR_ACCESS
438 mov eax, VMX_FAIL_INVALID
441 mov eax, VMX_FAIL_VALID
455 ; mov eax, 0xffffffff
457 mov ebx, GUEST_ES_LIMIT
462 ; mov eax, 0xffffffff
464 mov ebx, GUEST_CS_LIMIT
469 ; mov eax, 0xffffffff
471 mov ebx, GUEST_SS_LIMIT
476 ; mov eax, 0xffffffff
478 mov ebx, GUEST_DS_LIMIT
483 ; mov eax, 0xffffffff
485 mov ebx, GUEST_FS_LIMIT
490 ; mov eax, 0xffffffff
492 mov ebx, GUEST_GS_LIMIT
497 ; mov eax, 0xffffffff
499 mov ebx, GUEST_TR_LIMIT
507 mov eax, VMX_FAIL_INVALID
510 mov eax, VMX_FAIL_VALID
518 Init_VMCS_GuestState:
529 call InitGuestSelectors
535 call InitGuestDescRegs
541 call InitGuestSegBases
548 call InitGuestSegsLimits
554 call InitGuestSegsAccess
566 mov ebx, GUEST_RFLAGS
567 mov eax, dword 0x00000002
573 mov eax, dword 0x00000400
581 mov eax, VMX_FAIL_INVALID
584 mov eax, VMX_FAIL_VALID
591 ; Setup_VMCS_HostState
592 ; Copy all of the host registers into the host state of a vmcs
602 mov ebx, VMCS_HOST_ES_SELECTOR
608 mov ebx, VMCS_HOST_CS_SELECTOR
614 mov ebx, VMCS_HOST_SS_SELECTOR;
615 PrintDebug("VMX revision: 0x%p\n", (void*)vmxon_ptr);
617 if (v3_enable_vmx(vmxon_ptr) == 0) {
618 PrintDebug("VMX Enabled\n");
620 PrintError("VMX initialization failure\n");
631 mov ebx, VMCS_HOST_DS_SELECTOR
637 mov ebx, VMCS_HOST_FS_SELECTOR
643 mov ebx, VMCS_HOST_GS_SELECTOR
651 mov ebx, VMCS_HOST_TR_SELECTOR
659 mov eax, VMX_FAIL_INVALID
662 mov eax, VMX_FAIL_VALID
683 mov ebx, HOST_GDTR_BASE
690 mov ebx, HOST_IDTR_BASE
697 mov ebx, HOST_FS_BASE
703 mov ebx, HOST_GS_BASE
709 mov ebx, HOST_TR_BASE
717 mov eax, VMX_FAIL_INVALID
720 mov eax, VMX_FAIL_VALID
749 call InitHostSelectors
755 call InitHostBaseRegs
765 mov eax, VMX_FAIL_INVALID
768 mov eax, VMX_FAIL_VALID
775 ; Launch_VM - inits a vmcs with an ip and launches it
776 ; [eip = ebp + 8], [vmcs = ebp + 12]
777 ; int Launch_VM(ullont_t VMCS, uint_t eip);
792 mov eax, dword 0x0000681E
794 vmwrite eax, [ebp+16]
805 mov eax, VMX_FAIL_INVALID
810 mov eax, VMX_FAIL_VALID
812 mov ebx, dword 0x00004400