VM Exits -1-

[0x00] Concept

VM Entries 챕터에서는 VM Entry 기준의 VMCS Data 에 대한 지침을 알아보았습니다.

이번에는 VM Exit 기준으로 그러한 지침을 알아보겠습니다.

우선 VM ExitVMX non-root operation 의 특정 명령 및 이벤트에 대한 응답으로 발생하며 아래와 같은 작업을 수행합니다.

  1. VM Exit 의 원인에 대한 정보는 VM-exit information field 에 기록되고 VM-entry control field 를 수정합니다.
  2. 프로세서 상태는 게스트 상태 영역에 저장됩니다.
  3. MSRVM-exit MSR-store 영역에 저장될 수 있습니다. 이 단계는 SMI, SMMdual-monitor 처리를 활성화 하는 SMM VM Exit 에 대해 수행되지 않습니다.
  4. 다음은 병렬로 처리되거나 임의의 순서로 수행될 수 있습니다.
    • 프로세서 상태는 부분적으로 호스트 상태 영역과 일부 VM-exit control 에서 로드됩니다.
    • Address-range monitoring 을 지웁니다.
  5. MSRVM-exit MSR-load 영역에서 로드될 수 있습니다.

[0x01] Recording VM-Exiting Information

VM ExitVM-exit information field 에 이유와 특성에 대한 정보를 기록하는 것으로 시작됩니다.

기록하는 것 외에도 VM-entry interruption-information 필드에서 valid 비트를 0으로 변경합니다. 또한 IA32_VMX_MISC MSR 의 bit 5가 1인 경우 IA32_EFER.LMA 의 값은 VM-entry controlIA-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 PTTAPTEPT-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으로 설정됩니다.
    • VMMIA32_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 가 발생합니다.
    • ESINS 와 관련된 세그먼트이며 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 exceptionEnclave 모드에서 INT1 의 실행으로 발생한 것과 같이 hardware exception 으로 간주합니다.)
    • breakpoint exception, overflow exception. 이는 software exception 입니다. Enclave 모드에서 발생하는 breakpoint exceptionhardware exception 으로 간주합니다.
    • BOUND-range exceeded exception(#BR)UD0, UD1, UD2 에 의해 생성된 invalid-opcode exceptionhardware 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 Exitdouble-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 SwitchIDTTask 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 exceptionsoftware exception 유형 입니다.
    • INT3 명령에 의해 생성된 debug exceptionINTO 명령에 의해 생성된 overflow exceptionsoftware 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 ExitEPT 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)

[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

  1. Intel 64 and IA-32 Architectures Software Developer’s Manual