[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