[0x00] Concept
VM Entries 챕터에서는 VM Entry 기준의 VMCS Data 에 대한 지침을 알아보았습니다.
이번에는 VM Exit 기준으로 그러한 지침을 알아보겠습니다.
우선 VM Exit 는 VMX non-root operation 의 특정 명령 및 이벤트에 대한 응답으로 발생하며 아래와 같은 작업을 수행합니다.
VM Exit의 원인에 대한 정보는VM-exit information field에 기록되고VM-entry control field를 수정합니다.- 프로세서 상태는 게스트 상태 영역에 저장됩니다.
MSR은VM-exit MSR-store영역에 저장될 수 있습니다. 이 단계는SMI,SMM의dual-monitor처리를 활성화 하는SMM VM Exit에 대해 수행되지 않습니다.- 다음은 병렬로 처리되거나 임의의 순서로 수행될 수 있습니다.
- 프로세서 상태는 부분적으로 호스트 상태 영역과 일부
VM-exit control에서 로드됩니다. Address-range monitoring을 지웁니다.
- 프로세서 상태는 부분적으로 호스트 상태 영역과 일부
MSR은VM-exit MSR-load영역에서 로드될 수 있습니다.
[0x01] Recording VM-Exiting Information
VM Exit 는 VM-exit information field 에 이유와 특성에 대한 정보를 기록하는 것으로 시작됩니다.
기록하는 것 외에도 VM-entry interruption-information 필드에서 valid 비트를 0으로 변경합니다. 또한 IA32_VMX_MISC MSR 의 bit 5가 1인 경우 IA32_EFER.LMA 의 값은 VM-entry control 내 IA-32e mode guest 제어에 저장됩니다.
이러한 이유로 제목에 “Updating VM-Entry Control Fields” 가 붙었지만 너무 길어 제거하였습니다.
VM-exiting information fields 의 구조에 대해서는 이전 포스트 내용에서 참조할 수 있습니다.(링크)
[-] Basic VM-Exit Information
[+] Exit Reason

- 이 필드의 bits 15:0 은 기본적인 종료 이유를 포함합니다.
VM Exit의 일반적인 원인을 나타내는 숫자로 로드됩니다. - 논리 프로세서가
Enclave모드에 있는 동안VM Exit가 발생한 경우 이 필드의 bit 27 은 1으로 설정됩니다. - 나머지 부분(bits 31:28, bits 26:16)은 0으로 설정됩니다.
[+] Exit Qualification
- 이 필드는 다음 원인들로 인해
VM Exit가 발생한 경우 추가 정보가 저장되며 원인에 따라 각 필드가 의미하는 바가 변경됩니다. 그 외의 원인의 경우 이 필드는 지워집니다.
- Debug Exception
- Page-Fault Exception
- start-up IPIs(SIPIs)
- I/O 명령 실행 직후 도착하는 System-Management Interrupts(SMIs)
- Task Switches
- INVEPT, INVLPG, INVPCID, INVVPID
- LGDT, LIDT, LLDT, LDT
- SGDT, SIDT, SLDT, STR
- VMCLEAR, VMPTRLD, VMPTRST, VMREAD, VMWRITE, VMXON
- WBINVD, WBNOINVD
- XRSTORS, XSAVES
- Control-Register Accesses
- MOV DR
- I/O Instruction
- MWAIT
- APIC-Access Page 에 대한 접근
- APIC-Write Emulation
- EOI Virtualization
- Page-Modification Log Full Event
- SPP(Sub-Page Permission) 관련 이벤트
-
Debug Exception: 추가 정보는 아래와 같이 예외에 대한 정보가 필드에 기록됩니다.
Page-Fault Exception: 페이지 오류를 일으킨 선형 주소가 포함됩니다.enclave모드에서 발생했다면 bits 11:0 은 0으로 설정됩니다.start-up IPI(SIPI): bits 7:0 에는SIPI벡터 정보가 포함되며 bits 63:8 은 0으로 설정됩니다.-
Task Switch: 아래와 같이 인코딩 된task switch에 대한 세부 정보가 기록됩니다.
INVLPG: 피연산자의 선형 주소가 포함됩니다.INVEPT, INVPCID, INVVPID, LGDT, LIDT, LLDT, LTR, SGDT, SIDT, SLDT, STR, VMCLEAR, VMPTRLD, VMPTRST, VMREAD, VMWRITE, VMXON, XRTORS, XSAVES: 명령의 변위(displacement) 값을 기록합니다.-
Control-Register Access: 아래와 같이 액세스에 대한 정보가 기록됩니다.
-
MOV DR: 아래와 같이 명령어에 대한 정보가 기록됩니다.
-
I/O Instruction: 아래와 같이 명령어에 대한 정보가 기록됩니다.
MWAIT:Address-range monitoring하드웨어가 준비되었는지에 대한 여부를 나타내는 값이 포함됩니다. 0과 1로 설정됩니다.WBINVD, WBNOINVD:Basic Reason를 사용합니다.WBINVD의 경우 0이고WBNOINVD는 1입니다.-
APIC-access page:APIC-access에 대한 정보를 포함하고 있으며 아래와 같습니다. 해당 유형의 상세 내용은 생략합니다.
-
EPT Violation:EPT Violation을 유발하는 액세스에 대한 정보가 포함되어 있으며 아래와 같습니다.
- 해당 표에서 알 수 있듯이
Second_mode-based execute control for EPT제어 비트에 따라 다릅니다. Read-Modify-Write작업의 결과로 발생하는EPT Violation은 bit 1을 1로 설정합니다. bit 0도 설정하는지에 대한 여부는 구현에 따라 다르며 다양한 종류의Read-Modify-Write작업에 따라 다를 수 있습니다.- bit 16 은 명령 실행이 비동기적이고 이벤트 전달 파트가 아닌 특정 액세스에 대해 설정됩니다. 여기에는
Intel PT용TAPT및EPT-friendly향상 기능이 있는 프로세서의PEBS와 관련된 접근이 포함됩니다. EPT에 대한accessed and dirty flag가 활성화 된 경우(EPTP_enables accessed and dirty flags)guest paging-structure에 대한 프로세서 액세스는EPT Violation과 관련하여write로 처리됩니다. 이러한 접근으로 인해EPT Violation이 발생하면 프로세서는 bit 0, bit 1 을 1으로 설정합니다.EPT Violation을 일으키는 액세스의 게스트 물리 주소를 변환하는 데 사용되는EPT Paging-structure엔트리가 없으면 bits 5:3 은 0으로 설정됩니다.VMM은IA32_VMX_EPT_VPID_CAP MSR을 참조하여EPT Violation에 대한VM-exit information지원 여부를 결정할 수 있습니다.
- 해당 표에서 알 수 있듯이
EOI Virtualization: bits 7:0 은EOI Virtualization에 의해 해제 된 가상 인터럽트의 벡터로 설정됩니다.APIC-write: bits 11:0 은VM Exit를 발생시킨write액세스의 페이지 오프셋으로 설정됩니다.Page-Modification Log-Full Event: bit 12는NMI unblocking due to IRET를 보고합니다.SSP-Related Event: bit 11 은 이벤트 유형을 나타냅니다. bit 0은SSP misconfiguration을 나타내고 bit 1은SSP miss를 나타냅니다.
[+] Guest Linear Address
일부 VM Exit 의 경우 이 필드는 VM Exit 와 관련된 선형 주소를 수신합니다. 필드는 아래와 같은 VM Exit 발생에 대해 설정됩니다.
LMSW명령의 피연산자를 메모리로 실행하려는 시도는VM Exit발생합니다. 이러한 경우 이 필드(게스트 선형 주소)는 해당 피연산자의 선형 주소를 받습니다.INS,OUTS와 관련된 세그먼트가 사용 가능한 경우에 명령을 실행하면VM Exit가 발생합니다.ES는INS와 관련된 세그먼트이며OUTS의 경우DS입니다.INS의 경우 선형 주소는 관련된 세그먼트 주소에(E)DI를 더한 값 이며,OUTS의 경우(E)SI를 더한 값 입니다.
Exit Qualification필드의 bit 7을 설정하는EPT Violation으로 인해VM Exit가 발생합니다.(위의 표 참조) 선형 주소는EPT Violation을 일으킨 게스트 물리 주소로 변환될 수 있습니다. 대안으로 선형 주소의 변환은EPT Violation을 발생 시킨 페이징 구조 엔트리를 참조할 수 있습니다.
[+] Guest-Physical Address
EPT Violation, EPT Misconfiguration, SSP-Related Event 로 인한 VM Exit 의 경우 이 필드는 발생시킨 게스트의 물리 주소를 수신합니다. 다른 모든 VM Exit 의 경우 이 필드는 정의되지 않습니다.
[-] Information for VM Exits Due to Vectored Events
※ 참고 : 링크
다음 이벤트로 인한 VM Exit 에 대한 정보를 포함하는 필드입니다. 필드의 경우 VM-Exit Interruption-Information, VM-Exit Interruption Error Code 가 사용됩니다.
Exceptions(INT3, INT0, INT1, BOUND, UD0, UD1, UD2 포함)
VM-Exit Control 내 "acknowledge interrupt on exit" 비트가 1인 동안 발생하는 외부 인터럽트
Non-maskable 인터럽트(NMIs)
해당 섹션에서는 이러한 필드의 자세한 내용에 대해 알아보겠습니다.
[+] VM-Exit Interruption Information

다음 항목들은 이벤트 별로 VM Exit 에 대해 이 필드에 어떻게 기록되는가에 대한 방법을 설명합니다.
- 예외의 경우 bits 7:0 은 예외 벡터(최대 31, 예약된 22-31 포함)를 수신합니다.
NMI의 경우 bits 7:0은 2로 설정됩니다.externl interrupt의 경우 bits 7:0은 벡터를 수신합니다. - bits 10:8 은
Not used값이 아닌 값으로 설정됩니다.hardware exception은 다음을 제외한 모든 예외를 포함합니다.INT1명령에 의해 생성된debug exception. 이는privileged software exception입니다.(다른debug exception은Enclave모드에서INT1의 실행으로 발생한 것과 같이hardware exception으로 간주합니다.)breakpoint exception,overflow exception. 이는software exception입니다.Enclave모드에서 발생하는breakpoint exception은hardware exception으로 간주합니다.BOUND-range exceeded exception(#BR)및UD0, UD1, UD2에 의해 생성된invalid-opcode exception은hardware exception입니다.
- bit 11은
VM Exit가 스택에 오류 코드를 전달했을 때 해당 오류가hardware exception으로 발생한 경우 1으로 설정됩니다. 논리 프로세서가read-address mode(CR0.PE = 0)에 있는 동안VM Exit가 발생한 경우 해당 비트는 0으로 설정됩니다. bit 11 이 1으로 설정되면 오류 코드가VM-exit interruption error code에 기록됩니다. - bit 12는
NMI unblocking due to IRET를 보고합니다.VM Exit가double-fault로 인한 경우 이 비트의 값은 정의되지 않습니다. - bits 30:13 은 항상 0으로 설정됩니다.
- bit 31 은 항상 1으로 설정됩니다.
이와 다른 VM Exit(VMExit_acknowledge interrupt on exit 제어 비트가 0일 때 external interrupt 포함)의 경우 해당 필드는 유효하지 않은 것으로 표시(bit 31 을 0으로 설정)되고 필드의 나머지 부분은 정의되지 않습니다.
[+] VM-Exit Interruption Error Code
VM-exit interruption information field 에서 bit 31(Valid), bit 11(Error Code Valid)이 모두 1로 설정되는 VM Exit 가 발생하는 경우 해당 필드는 IDT 를 통하여 VM Exit 의 원인이 되는 이벤트가 정상적으로 전달된 경우 스택에 푸시된 오류 코드를 수신하여 기록합니다.
[-] Information About NMI Unblocking Due to IRET
IRET 명령을 실행하는 동안 fault, EPT Violation, Page-Modification Log-Full Event, SPP-Related Event 와 같은 이유로 인해 VM Exit 가 발생할 수 있습니다.
NMI 가 차단되는 동안에 시작되는 IRET 실행은 fault 또는 VM Exit 가 발생하더라도 NMI 에 대한 차단을 해제합니다. 이러한 VM Exit 에 의해 저장된 상태는 NMI 가 차단되지 않았음을 나타냅니다.
위의 내용에 의해 발생한 VM Exit 가 발생하는 경우 NMI unblocking due to IRET 비트를 저장하여 VMM 에 더 많은 정보를 제공합니다.
그 외의 내용에 대해서는 생략하겠습니다.
[-] Information for VM Exits During Event Delivery
※ 참고 : 링크
IDT-Vectoring Information, IDT-Vectoring Error Code 필드가 포함됩니다.

IDT 를 통해 이벤트를 전달하는 동안 다음 경우 중 하나로 인해 발생하는 VM Exit 에 대한 정보를 포함하는 필드입니다.
- 이벤트 전달 중에 오류가 발생하여
VM Exit가 발생한 경우(Exception bitmap에서 오류와 관련된 비트가 1으로 설정되기 때문) Task Switch는IDT의Task Gate를 통해 호출됩니다.Task Switch의 초기 검사를 통과한 후에Task Switch로 인한VM Exit가 발생한 경우- 이벤트 전달로 인해
APIC-access VM Exit가 발생한 경우 - 이벤트 전달 중
EPT Violation,EPT Misconfiguration,Page-Modification Log-Full Event,SPP-Related Event로 인한VM Exit가 발생한 경우
이 필드는 VM Entries -2- 챕터에서 VM Exits During Event Injection 섹션에 설명된 내용에 따라 VM Exit 가 발생하는 경우에 사용됩니다.
아래의 상황의 경우에는 이벤트 전달 중 VM Exit 가 발생한 것으로 간주하지 않습니다.
- 기존 이벤트로 인해
VM Exit가 직접 발생합니다.(ex. 기존의 이벤트가NMI이고Pin_NMI exiting제어가 1이기 때문에) - 기존 이벤트가
VM Exit를 직접 발생시키는double-fault예외를 발생시킵니다. - 이벤트 전달에 의해 호출된 핸들러의 첫 번째 명령어를 가져온(fetching) 결과로 인해
VM Exit가 발생했습니다. Triple-fault로 인해VM Exit가 발생했습니다.
아래의 항목들은 필드의 사용에 대한 자세한 설명입니다.
[+] IDT-Vectoring Information
- 예외 전달 중에
VM Exit가 발생한 경우 bits 7:0은 예외 벡터(최대 31)을 수신합니다.NMI전달 중VM Exit가 발생하면 bits 7:0은 2로 설정되며external interrupt전달 중에 발생하면 벡터를 수신합니다. - bits 10:8 은
VM Exit가 발생할 때 전달되고 있던 이벤트의 유형을 나타내도록 설정됩니다.hardware exception의 경우 다음을 제외한 모든 예외를 포함합니다.INT1명령에 의해 생성된debug exception은software exception유형 입니다.INT3명령에 의해 생성된debug exception및INTO명령에 의해 생성된overflow exception은software exception유형 입니다.
- 스택에 오류 코드를 전달했을 때
hardware exception이 전달되는 동안VM Exit가 발생한 경우 bit 11 은 1으로 설정됩니다. 논리 프로세서가Real-address mode에 있는 동안VM Exit가 발생한 경우 이 비트는 항상 0 입니다. bit 11이 1으로 설정된 경우 오류 코드가IDT-Vectoring error code필드에 배치됩니다. - bit 12 는 정의되지 않았습니다.
- bit 30:13 은 항상 0으로 설정됩니다.
- bit 31 은 항상 1으로 설정됩니다.
- 위의 작성된
VM Exit와 다른 경우 bit 31(Valid)는 0으로 설정되고 나머지 필드는 정의되지 않습니다.
[+] IDT-Vectoring Error Code
IDT-Vectoring Information 필드 내 bit 31(Valid)와 bit 11(Error Code Valid), 두 개의 비트가 모두 1로 설정되는 VM Exit 의 경우 이 필드는 VM Exit 발생 시 IDT를 통해 전달된 이벤트에 의해 스택에 푸시된 오류 코드를 수신합니다.
[-] Information for VM Exits Due to Instruction Execution
※ 참고 : 링크
VM-Exit Instruction Length, VM-Exit Instruction Information, I/O RCX, RSI, RDI, RIP 필드가 포함됩니다.(VM-Exit Instruction Length 의 경우 software interrupt 또는 software exception 이 전달되는 동안 발생하는 VM Exit 에서도 사용됩니다.)
[+] VM-Exit Instruction Length
해당 필드는 아래 항목의 경우에 사용됩니다.
- 무조건
VM Exit를 유발 시키는 명령어(참고 : 링크) 중 하나라도 실행하려는 시도 또는VM-execution controls기반 조건에 따라VM Exit가 발생하는 경우(참고 : 링크) software exception(INT3또는INTO실행에 의해 생성된 예외) 또는privileged software exception으로 인한VM Exit의 경우software interrupt,privileged software exception,software exception전달 중 발생한 오류로 인한VM Exit의 경우- 명령 실행을 통한
Task Switch에 영향을 미치려는 시도로 인한VM Exit의 경우 APIC-access VM Exit및EPT Violation,Page-Modification Log-Full Event,software interrupt,privileged software exception,software exception전달 중 발생한SSP-Related Event로 인한VM Exit의 경우- 다음 중 하나에 해당하여 실패되는
VMFUNC실행으로 인한VM Exit의 경우EAX가 0으로VM Function이 활성화되지 않음을 나타냅니다.(참고 : 링크)EAX가 0이고ECX가 512보다 크거나 같거나ECX값이 유효하지 않은EPTPT값을 선택했습니다.
위의 모든 경우에 이 필드는 실행부터 VM Exit 까지 이어진 명령(명령 접두사 포함)의 바이트(1-15) 길이를 수신합니다.
만약 기존의 이벤트가 VM Entry 의 파트로 주입된 경우 이 필드는 VM-entry instruction length 값을 기록합니다.
[+] VM-Exit Instruction Information
해당 필드는 VM Exit 를 발생시킨 명령어에 따라 다른 의미를 가집니다. 아래는 각 명령에 따른 필드입니다.
-
INS, OUTS
-
INVEPT, INVPCID, INVVPID
-
LIDT, LGDT, SIDT, SGDT
-
LLDT, LTR, SLDT, STR
-
RDRAND, RDSEED, TPAUSE, UMWAIT
-
VMCLEAR, VMPTRLD, VMPTRST, VMXON, XRSTORS, XAVES
-
VMREAD, VMWRITE
-
LOADIWKEY
-
I/O RCX, RSI, RDI, RIP- 이러한 필드는 I/O 명령어 폐기 직후에 도착하는
SMI로 인한SMM VM Exit를 제외하고 정의되지 않습니다. I/O 명령이 시작되기 전의RCX, RSI, RDI, RIP의 값입니다.(64 bits)
- 이러한 필드는 I/O 명령어 폐기 직후에 도착하는
[0x02] Misc Information
[-] Exceptions and Interrupts Table
Intel SDM Vol.1 6.5.1 Call and Return Operation for Interrupt or Exception Handling Procedures

[-] VMX Basic Exit Reasons
Intel SDM Vol.3D Appendix C



[0x03] Conclusion
이번 내용에서는 VM Exit 의 다양한 원인을 기록하는 필드에 대해 확인하였습니다. 마찬가지로 내용이 많아 두 개의 파트로 나누었습니다.
다음 파트에서는 게스트 상태 영역에 저장되는 다양한 내용들과 호스트 상태로부터 로드, MSR 로드 등에 대해 알아보겠습니다.
진행될수록 유사한 내용들이 반복되는 경우가 많습니다. 다만 그로 인해 초기 번역 내용에 대해 수정되는 내용들이 많습니다.
작성할 때는 이해가 제대로 되지 않았는데 이해가 된 경우가 그렇습니다.
[0x04] Reference
- Intel 64 and IA-32 Architectures Software Developer’s Manual