background image

Vol. 3C 24-1

CHAPTER 24

VIRTUAL MACHINE CONTROL STRUCTURES

24.1 OVERVIEW

A logical processor uses virtual-machine control data structures (VMCSs) while it is in VMX operation. These 
manage transitions into and out of VMX non-root operation (VM entries and VM exits) as well as processor behavior 
in VMX non-root operation. This structure is manipulated by the new instructions VMCLEAR, VMPTRLD, VMREAD, 
and VMWRITE.
A VMM can use a different VMCS for each virtual machine that it supports. For a virtual machine with multiple 
logical processors (virtual processors), the VMM can use a different VMCS for each virtual processor.
A logical processor associates a region in memory with each VMCS. This region is called the VMCS region.

1

 Soft-

ware references a specific VMCS using the 64-bit physical address of the region (a VMCS pointer). VMCS pointers 
must be aligned on a 4-KByte boundary (bits 11:0 must be zero). These pointers must not set bits beyond the 
processor’s physical-address width.

2,3

A logical processor may maintain a number of VMCSs that are active. The processor may optimize VMX operation 
by maintaining the state of an active VMCS in memory, on the processor, or both. At any given time, at most one 
of the active VMCSs is the current VMCS. (This document frequently uses the term “the VMCS” to refer to the 
current VMCS.) The VMLAUNCH, VMREAD, VMRESUME, and VMWRITE instructions operate only on the current 
VMCS.
The following items describe how a logical processor determines which VMCSs are active and which is current:

The memory operand of the VMPTRLD instruction is the address of a VMCS. After execution of the instruction, 
that VMCS is both active and current on the logical processor. Any other VMCS that had been active remains so, 
but no other VMCS is current.

The VMCS link pointer field in the current VMCS (see Section 24.4.2) is itself the address of a VMCS. If VM entry 
is performed successfully with the 1-setting of the “VMCS shadowing” VM-execution control, the VMCS 
referenced by the VMCS link pointer field becomes active on the logical processor. The identity of the current 
VMCS does not change.

The memory operand of the VMCLEAR instruction is also the address of a VMCS. After execution of the 
instruction, that VMCS is neither active nor current on the logical processor. If the VMCS had been current on 
the logical processor, the logical processor no longer has a current VMCS.

The VMPTRST instruction stores the address of the logical processor’s current VMCS into a specified memory loca-
tion (it stores the value FFFFFFFF_FFFFFFFFH if there is no current VMCS).
The launch state of a VMCS determines which VM-entry instruction should be used with that VMCS: the 
VMLAUNCH instruction requires a VMCS whose launch state is “clear”; the VMRESUME instruction requires a VMCS 
whose launch state is “launched”. A logical processor maintains a VMCS’s launch state in the corresponding VMCS 
region. The following items describe how a logical processor manages the launch state of a VMCS:

If the launch state of the current VMCS is “clear”, successful execution of the VMLAUNCH instruction changes 
the launch state to “launched”.

The memory operand of the VMCLEAR instruction is the address of a VMCS. After execution of the instruction, 
the launch state of that VMCS is “clear”.

There are no other ways to modify the launch state of a VMCS (it cannot be modified using VMWRITE) and there 
is no direct way to discover it (it cannot be read using VMREAD).

1. The amount of memory required for a VMCS region is at most 4 KBytes. The exact size is implementation specific and can be deter-

mined by consulting the VMX capability MSR IA32_VMX_BASIC to determine the size of the VMCS region (see Appendix A.1).

2. Software can determine a processor’s physical-address width by executing CPUID with 80000008H in EAX. The physical-address 

width is returned in bits 7:0 of EAX.

3. If IA32_VMX_BASIC[48] is read as 1, these pointers must not set any bits in the range 63:32; see Appendix A.1.