VM Entries -2-

[0x00] Concept

이전 챕터에 이어서 VMCS Data 기준으로 VM Entry 에서 발생하는 여러가지 검사와 동작에 대해 알아보겠습니다.

[0x01] Loading MSRs

VM EntryVM-entry MSR-load area 에서 MSR 을 로드합니다. (참고 : 링크)

해당 영역의 각 엔트리(VM-entry MSR-load count 값까지)은 WRMSR 에 의해 기록되는 bits 127:64 의 내용과 함께 bits 31:0으로 인덱싱 된 MSR 을 로드하여 순서대로 처리됩니다.

다음과 같은 경우 엔트리에 대한 처리가 실패하는 것에 대한 내용입니다.

  • bits 31:0 의 값이 C0000100h (IA32_FS_BASE MSR) 또는 C00000101h(IA32_GS_BASE MSR) 입니다.
  • bits 31:8 의 값이 8이며 이는 Local APICx2APIC mode 에 있을 때 인덱싱된 MSRAPIC register 에 대한 접근을 허용하는 값을 의미합니다.
  • bits 31:0 의 값은 SMM 에서만 쓸 수 있으며, VM EntrySMM 에서 시작되지 않았음을 의미합니다.
  • bits 31:0 의 값은 각 모델별 이유로 인해 VM Entry 에 로드될 수 없는 MSR을 나타냅니다. 프로세서는 일반적으로 WRMSR 에 의해 기록될 수 있는 경우에도 특정 MSR 의 로드를 방지할 수 있습니다.
  • bits 63:32 는 0이 아닙니다.
  • bits 31:0 으로 인덱싱 된 MSR 에 bits 127:64 를 쓰려고 시도하면 CPL = 0WRMSR 을 통해 실행 된 경우 general-protection exception 이 발생합니다.

MSR-load area 의 모든 엔트리에 대한 처리가 실패하면 VM Entry 가 실패합니다. 논리 프로세서는 VM Exit 와 마찬가지로 Host-State Area(이하 “호스트 상태 영역”)에서 상태를 로드하여 이러한 오류에 응답합니다.

[0x02] Trace-Address Pre-Translation(TAPT)

Second_Intel PT uses guest physical addresses 제어 비트가 1이면 Intel PT 에서 사용하는 주소가 게스트의 물리 주소로 처리되며 이를 위해 EPT 를 사용하여 물리 주소로 변환합니다.

VM EntryTAPT 를 사용하여 EPT Violation 으로 인해 버퍼링된 트레이스 데이터가 손실되는 것을 방지합니다.

TAPTIA32_RTIT_CTL.TraceEn = 1 이고, Second_Intel PT uses guest physical address 제어 비트가 1인 경우에만 사용됩니다.

TAPTEPT Violation, EPT Misconfiguration, Page-Modification Log-Full Event, APIC Access 로 인해 VM Exit 를 발생시킬 수 있습니다.

VM Entry 중에 TAPT 의 결과로 인해 이러한 VM Exit 가 발생하면 VM Entry 가 완료된 후(게스트 컨텍스트) VMX non-root operation 에서 발생한 것 처럼 동작합니다.

또한 VM EntryVM-entry interruption-information fieldValid 비트가 1인 경우에도 Event Injection 을 수행하지 않습니다.

이러한 VM ExitVM-entry interruption-information, VM-entry exception error code 필드의 내용을 각 IDT-vectoring error code field 에 저장합니다.

(참고 : 링크)

[0x03] Event Injection

(참고 : 링크)

VM-entry interruption-information fieldValid 비트가 1인 경우 Vm Entry 는 게스트 상태의 모든 구성 요소가 로드된 후, 그리고 VM-execution control fields 가 설정된 후 이벤트가 전달되거나 보류(pending)됩니다.

  • VM-entry interrution-information fieldInterruption Type 이 아래와 같은 경우 아래에 설명(Vectored-Event Injection)대로 이벤트가 전달됩니다.
    • 0(external interrupt)
    • 3(hardware exception)
    • 4(software interrupt)
    • 5(privileged software exception)
    • 6(software exception)
  • VM-entry interruption-information fieldInterruption Type이 7(other event)이고, Vector 필드가 0이면 VM Entry 후에 MTF VM Exit 가 보류됩니다.

[-] Vectored-Event Injection

VM EntryVM Entry 에 의해 설정된 게스트 컨텍스트 내에서 주입된 벡터화 된 이벤트(Vectored-Event)를 제공합니다.

이것은 게스트 상태의 모든 구성 요소가 로드되고 VM-execution controls field 가 모두 설정된 다음에 이벤트가 전달됨을 의미합니다.

이벤트는 VM-entry interruption-information fieldvector 를 이용하여 IDT 에서 설명자를 선택하여 전달합니다. (Event Injection 은 게스트 상태 영역에서 IDTR 을 로드한 후 발생하므로 게스트 IDT 입니다.)

이벤트 전달에서 중첩된 예외가 발생하면 해당 예외의 벡터를 사용하여 Exception bitmap 을 참조합니다.

  • 중첩된 예외에 대한 비트가 0이면 중첩된 예외가 정상적으로 전달됩니다. 중첩된 예외인 경우 IDT 를 통해 전달됩니다. 원인이 되거나 Page-Fault인 경우 전달 중 중첩된 예외가 발생한 이벤트의 특성에 따라 Double Fault 가 발생할 수 있습니다.
  • 중첩된 예외에 대한 비트가 1이면 VM Exit 가 발생합니다. 이에 대한 자세한 내용은 아래 VM Exits During Event Injection 에서 다룹니다.

[+] Details of Vectored-Event Injection

Event-Injection 과정은 VM-entry interruption-information field, VM-entry exception error-code field, VM-entry instruction-length field 에 의해 제어됩니다.

다음 항목은 Event-Injection Process에 대한 세부 정보입니다.

  • RFLAGS 에 대해 스택에 푸시되는 값은 일반적으로 게스트 상태 영역에서 로드된 값입니다. RF 플래그에 푸시된 값은 전달되는 이벤트 유형에 따라 수정되지 않습니다. 그러나 Software Interruptvirtual-8086 (RFLAGS.VM = 1)모드인 게스트에 주입되는 경우 RFLAGS 의 푸시된 값은 수정될 수 있습니다. RFLAGS 가 스택에 푸시된 후 RFLAGS 레지스터의 값은 IDT 를 통해 이벤트를 전달할 때 정상적으로 수정됩니다.
  • 스택에 푸시되는 IP(Instruction Pointer) 는 이벤트 유형 및 이벤트 전달 중 중첩된 예외가 발생하는지 여부에 따라 달라집니다. (다음 설명에 작성 될 Current Guest RIP 라는 용어는 게스트 상태 영역에서 로드할 값을 나타냅니다. 이하 “현재 게스트 RIP”) 푸시된 값(Instruction Pointer)은 아래와 같이 결정됩니다.
    • VM EntryInterruption Type 의 값이 external interrupt, NMI, hardware exception 유형인 이벤트를 성공적으로 주입되면(중첩된 예외 없이) 현재 게스트 RIP 가 스택에 푸시됩니다.
    • VM EntryInterruption Type 의 값이 software interrupt, privileged software exception, software exception 유형인 이벤트를 성공적으로 주입하게 되면(중첩된 예외 없이) 현재 게스트 RIP 는 VM-entry instruction length 값 만큼 증가합니다.
    • 이벤트를 주입하는 동안 VM Entry 에서 예외가 발생하고 해당 예외로 인해 VM Exit 가 발생하지 않은 경우, 이벤트 유형이나 VM-entry instruction length 에 관계없이 현재 게스트 RIP 가 스택에 푸시됩니다. 발생한 예외로 인해 RIP 를 저장하는 VM Exit가 발생하는 경우 저장된 RIP 의 값은 현재 게스트 RIP 값 입니다.
  • VM-entry interruption-information field 내 bit 11(deliver-error-code)이 설정된 경우(Error Code : deliver) 예외를 전달 중에 오류 코드가 푸시되므로 VM-entry exception error-code field 의 내용이 푸시됩니다.
  • DR6, DR7IA32_DEBUGCTL MSR 은 이벤트에 벡터 1(debug exception)이 있더라도 이벤트 주입에 의해 수정되지 않습니다.
  • VM Entrysoftware interrupt 를 주입하고 게스트가 virtual-8086 모드에 있는 경우 RFLAGS.IOPL(I/O Privilege Level) < 3 이기 때문에 #GP가 발생할 수 없습니다. VMM 은 이벤트를 주입하기 전에 RFLAGS.IOPL 을 확인하고 원하는 경우 software interrupt 대신 #GP 를 삽입해야 합니다.
  • VM Entrysoftware interrupt 를 주입하고 게스트가 virtual-8086 mode extension 과 함께 virtual-8086 모드에 있는 경우(RFLAGS.VM = 1, CR4.VME = 1), 이벤트 전달은 다음과 같이 TSSsoftware interrupt redirection bitmap 에 기반한 VME-Based Interrupt Redirection 의 적용을 받습니다. (CR4.VME == Virtual Mode Extension 으로 CR4.VMXE 와 다릅니다.)
    • 이 내용은 해당 챕터에서 생략합니다.
  • VM EntryNon-Maskable Interrupt(NMI) 를 주입하고 Pin_virtual NMIs 제어 비트가 1인 경우 VM Entry 후에 virtual-NMI blocking 이 적용됩니다.
  • Last-Exception Record MSR(LER)IA32_DEBUGCTL MSR 에서 LBR(Last Branch Record) 비트의 설정을 기반으로 업데이트될 수 있습니다. 일반적으로 전달되기 전에 LBR 비트를 지우는 debug exception 과 같은 이벤트는 VM-entry event injection 의 파트로 LER 을 업데이트하지 않을 수 있습니다.
  • 이벤트 주입에서 중첩된 예외가 발생하면, 이에 대한 오류 코드에서 bit 0(EXT, External event) 의 값이 아래와 같이 결정됩니다. (오류 코드에 대한 필드의 자세한 내용은 Intel SDM Vol.3A 6.13 Error Code 에서 살펴볼 수 있습니다.)

    • 주입되는 이벤트의 Interruption Type 의 값이 external interrupt, NMI, hardware exception, privileged software exception이고 중첩된 예외가 발생한 경우(double fault 는 발생하지 않음) 해당 예외에 대한 오류 코드의 EXT 비트는 1로 설정됩니다.
    • 주입되는 이벤트의 Interruption Type 의 값이 software interrupt, software exception 이고 중첩된 예외가 발생한 경우에는 해당 예외에 대한 오류 코드의 EXT 비트는 0으로 지워집니다.
    • 이벤트가 전달에서 중첩된 예외가 발생하고 해당 예외의 전달에서 다른 예외가 발생하는 경우에는 해당 예외에 대한 오류코드의 EXT 비트는 1으로 설정됩니다.
    • double fault 가 발생하는 경우 오류코드는 0000h 이므로 EXT 비트는 0으로 지워집니다.

[+] VM Exits During Event Injection

이벤트가 주입되면 VM-execution contorls 의 설정과 관계없이 VM Exit 가 곧장 발생하지 않습니다. 예를 들어 Pin_NMI exiting 제어 비트를 1으로 설정하여도 NMI 주입으로 인해 VM Exit 가 발생하지 않습니다.

하지만 아래와 같은 Event-Delivery Process 로 인해 VM Exit 가 발생할 수 있습니다.

  • VM-entry interruption-information field 의 벡터가 IDTtask gate 를 식별하면 시도된 task switchVMX non-root operation 에서 정상 실행 중 주입된 이벤트가 발생한 것과 마찬가지로 VM Exit 가 발생할 수 있습니다.
  • 이벤트 전달에서 중첩된 예외가 발생하면 Exception bitmap 의 내용에 따라 VM Exit 가 발생할 수 있습니다.
  • 이벤트 전달에서 중첩된 예외로 인해 double-fault exception(중첩된 예외로 인해)이 생성된 경우 논리 프로세서는 double-fault handler 를 호출하는 동안 또 다른 중첩된 예외가 발생합니다. 이 예외는 Exception bitmap 으로 인해 VM Exit 가 발생하지 않으며, 삼중 오류(triple fault) 로 인해 VM Exit 가 발생합니다.
  • 이벤트 전달에서 double-fault exception 을 주입하고 Exception bitmap 으로 인해 VM Exit 가 발생하지 않는 중첩된 예외가 발생하는 경우에는 삼중 오류로 인한 VM Exit 가 발생합니다.
  • Second_virtualize APIC accesses 제어 비트가 1이고 이벤트 전달에서 APIC-access page 를 생성하는 경우 VM Exit 가 발생할 수 있습니다.

Event-Delivery Process 로 인해 VM Exit 가 발생하는 경우 VMX non-root operation 에서 정상 실행 중에 이벤트 주입이 발생한 것과 마찬가지로 VM Exit 전의 프로세서 상태가 결정됩니다. 주입된 이벤트가 VM Exit 를 발생시키는 Task Gate 에 직접 액세스하거나 첫 번째 중첩된 예외가 발생하여 VM Exit 가 발생하는 경우 주입된 이벤트에 대한 정보는 IDT-vectoring information field 에 기록됩니다.

[+] Event Injection for VM Entries to Real-Address Mode

VM EntryCR0.PE = 0 으로 로드되는 경우, 주입 된 vectored eventReal-Address Mode 에서 수행되는 것 처럼 전달됩니다.

특히 VM EntryVM-entry interruption-information fieldvector 를 이용하여 IDTR.base 의 선형 주소에 있는 interrupt-vector table 에서 4바이트 엔트리를 선택합니다.

VM Entry 후에 CR0.PE = 0 이 될 경우 VM-entry interruption-information field 는 0이어야 하기 때문에, CR0.PE = 0 으로 주입된 벡터 이벤트는 스택에 푸시하지 않습니다. 이는 Real-address mode 에서의 이벤트 전달과 일치합니다.

[-] Injection of Pending MTF VM Exits

VM-entry interruption-information fieldinterruption type 의 값이 7(other event)이고 vector 필드가 0인 경우 VM EntryMTF VM Exit 가 다음에 오는 명령 경계에서 보류되도록 합니다. 이는 PR_monitor trap flag 가 0인 경우에도 해당됩니다.

[0x04] Special Features Of VM Entry

VM Entry 에 대한 다양한 기능에 대해 자세하게 설명합니다. VM EntryVectoring 되었다 라는 용어를 사용합니다. 이 용어는 다음의 조건임을 의미합니다.

  • VM-entry interruption-information fieldvalid 비트가 1로 설정되어 있습니다.
  • VM-entry interruption-information fieldinterruption type 의 값이 아래의 유형 중 하나입니다.
    • 0(external interrupt), 2(non-maskable interrupt), 3(hardware exception), 4(software interrupt), 5(privileged software exception), 6(software exception)

[-] Interruptibility State

게스트 상태 영역에서 Non-Register State 로 분류되는 이 상태 필드(interruptibility-state field)는 STI 에 의한 차단, MOV SS 에 의한 차단, NMI 에 의한 차단을 제어하는 비트가 포함되어 있습니다.

이러한 필드는 다음과 같이 VM Entry 후 이벤트 차단에 영향을 줍니다.

  • VM EntryVectoring 된 경우 interruptibility-state field 의 내용과 관계없이 VM Entry 다음에 오는 STI 또는 MOV SS 에 의한 차단이 발생하지 않습니다.
  • VM EntryVectoring 되지 않은 경우는 아래의 내용이 적용됩니다.
    • 이벤트는 interruptibility-state field 의 bit 0(Block STI)이 1인 경우에만 STI 에 의해 차단됩니다. 이러한 차단은 게스트가 하나의 명령을 실행하거나 예외를 발생시킨 후에 지워집니다.
    • 이벤트는 interruptibility-state field 의 bit 1(Block MOV SS)이 1인 경우에만 MOV SS 에 의해 차단됩니다. 이는 보류 중인 debug exception 처리에 영향을 미칠 수 있습니다.
  • NMI 의 차단은 아래 내용에 따라 결정됩니다.
    • Pin_virtual NMIs 제어가 0이면 interruptibility-state field 의 bit 3(Block NMI)이 1인 경우에만 NMI가 차단됩니다. Pin_NMI exiting 제어가 0이면 IRET 명령이 실행되면 차단이 제거됩니다.
    • 다음은 Pin_virtual NMIs 제어가 1인 경우 interruptibility-state field 에서 bit 3의 사용에 대해 설명합니다.
      • 비트 값은 VM EntryNMI 차단에 영향을 미치지 않습니다. NMIVMX non-root operation 에서 차단되지 않습니다.
      • 비트 값은 VM Entryvirtual-NMI 의 차단 여부를 결정합니다. 해당 비트(bit 3)가 1이면 VM Entryvirtual-NMI 의 차단이 적용됩니다. 비트가 0이면 VM EntryNMI를 주입하지 않는 한 virtual-NMI 에 대한 차단은 없습니다.
    • Pin_NMI exiting 제어가 0이면 Pin_virtual NMIs 또한 0이어야 합니다.
  • SMI(System-Management Interrupt) 차단은 아래의 내용에 따라 결정됩니다.
    • VM EntrySMM 에서 실행되지 않은 경우 SMI 차단은 VM Entry 에 의해 변경되지 않습니다.
    • VM EntrySMM 에서 실행된 경우 interruptibility-state field 의 bit 2가 1이면 VM Entry 후에 SMI 가 차단됩니다.

[-] Activity State

게스트 상태 영역의 Non-Register State 에 해당하는 Activity StateVM Entry 후 논리 프로세서가 Active 상태인지 또는 식별된 inactive 상태 중 하나(HLT, Shutdown, Wait-for-SIPI)에 있는지에 대해 확인할 수 있습니다.

(참고 : 링크)

이 필드의 사용은 다음에 따라 결정됩니다.

  • VM EntryVectoring 된 경우 논리 프로세서는 VM Entry 후에 Active 상태 입니다.
  • VM EntryVectoring 되지 않은 경우 논리 프로세서는 게스트 상태 영역에 지정된 Activity State 에 따라 VM Entry 를 끝냅니다. VM Entryinactive 상태의 논리 프로세서로 끝나는 경우 VM EntryActivity StateActive 상태로 입력될 때 일반적으로 생성되는 특별한 Bus Cycle 을 생성합니다. VM Entryshutdown 상태의 논리 프로세서로 끝나고 SMX Operation 에 있는 경우 Intel TXT shutdown 컨디션이 발생합니다. 사용된 오류 코드는 Legacy Shutdown 을 나타내는 0000h 가 됩니다.
  • 일부 Activity State 는 특정 이벤트를 무조건 차단합니다. 프로세서를 표시된 상태로 만드는 VM Entry 후에는 다음 차단이 적용됩니다.
    • Active 상태는 start-up IPIs(SIPIs) 를 차단합니다. SIPIs 는 논리 프로세서가 Active 상태이고 VMX non-root operation 에 있는 동안 삭제되고 VM Exit 가 발생하지 않습니다.
    • HLT 상태는 SIPIs 를 차단합니다. SIPIs 는 논리 프로세서가 HLT 상태이고 VMX non-root operation 에 있는 동안 삭제되고 VM Exit 가 발생하지 않습니다.
    • Shutdown 상태는 외부 인터럽트(external interrupt), SIPIs 를 차단합니다. 논리 프로세서가 Shutdown 상태이고 VMX non-root operation 에 있는 동안 Pin_external-interrupt exiting 제어가 1인 경우에도 VM Exit 가 발생하지 않으며 SIPIs 는 삭제되며 VM Exit 가 발생하지 않습니다.
    • Wait-For-SIPI 상태는 external interrupt, NMI, INIT signals, SMI(system management interrupt) 를 차단합니다. 이러한 이벤트는 논리 프로세서가 wait-for-SIPI 상태이고 VMX non-root operation 에 있는 동안 VM Exit 가 발생하지 않습니다.

[-] Delivery of Pending Debug Exceptions after VM Entry

게스트 상태 영역의 Non-Register State 에 해당하는 Pending Debug Exception 필드는 아직 전달되지 않은 debug exception 이 있는지 여부를 나타냅니다.

다음 중 하나라도 해당되면 VM Entry 후 전달되지 않은 debug exception 이 존재하지 않습니다.

  • VM Entry 는 해당하는 interruption type(external interrupt, NMI, hardware exception, privileged software exception) 중 하나의 유형으로 Vectoring 됩니다.
  • interruptibility-state field 는 bit 1(block MOV SS)가 0이며 VM Entrysoftware interrupt 또는 software exception 중 하나의 유형으로 Vectoring 됩니다.
  • VM EntryVectoring 되지 않고 activity-state fieldshutdown 또는 wait-for-SIPI 를 나타냅니다.

위의 항목 중 해당되지 않는 경우 pending debug exceptions field 는 게스트에 대해 보류 중인 debug exception 을 지정합니다. BS 비트(bit 14) 또는 enable-breakpoint 비트(bit 12)가 1인 경우 유효한 상태의 보류 중인 debug exception 이 존재합니다. 보류 중인 debug exception 이 있는 경우 아래와 같이 처리됩니다.

  • VM EntryVectoring 되지 않은 경우 보류 중인 debug exception 은 게스트 실행에서 정상적으로 발생한 것처럼 처리됩니다.
    • 논리 프로세서가 이러한 예외를 차단하지 않는 경우(interruptibility-state fieldblocking by MOV SS 가 0인 상태) VM Entrydebug exception 이 전달됩니다.
    • 논리 프로세서가 이러한 예외를 차단하는 경우(blocking by MOV SS 가 1인 상태) 보류 중인 debug exception 은 일반적인 경우와 같이 보류 상태로 유지되거나 손실됩니다.
  • VM EntryVectoring 된 경우 다음 내용이 적용됩니다.
    • 주입을 위한 software interrupt , 벡터 3(#BP) 이나 벡터 4(#OF)를 포함한 software exception ,벡터 1(#DB)를 포함한 privileged software exception 의 경우 보류 중인 debug exception 은 원래대로 처리됩니다. debug trap 이 발생한 MOV SS 이후에 해당 명령어(INT1, INT3, INTO)가 실행된 경우 게스트 실행에서 정상적으로 발생한 것 처럼 처리됩니다.
    • 벡터 3, 4 이외의 벡터로 software interrupt 를 주입하는 경우 보류 중인 debug exception 은 손실되거나 주입 후에 전달될 수 있습니다.

유효한 보류 중인 debug exception 이 없으면(위의 내용에 따른) VM Entry 후 보류 중인 debug exception 이 전달되지 않습니다.

보류 중인 debug exceptionVM Entry 후에 전달되면 traps on the previous instruction 의 우선 순위가 있습니다.(Intel SDM Vol.3A Section 6.9)

VM Entry 후에 전달된 보류 중인 debug exceptionException Bitmap 에서 bit 1(#DB)이 1인 경우 VM Exit 가 발생합니다. VM Exit 가 발생하지 않으면 DR6 는 정상적으로 업데이트 됩니다.

[-] VMX-Preemption Timer

Pin_activate VMX-preemption timer 제어가 1인 경우 VM EntryVMX-preemption timer-value field 값의 unsigned 값으로 VMX-preemption timer 를 시작합니다.

VMX-preemption timerVM Entry 중에 만료될 수있습니다.(ex. VMX-preemption timer-value 필드의 값이 0인 경우)

이런 상황이 발생하면 VM Exit 는 이벤트 주입 후와 VM Entry 다음에 오는 명령 실행 전에 정상적인 우선 순위로 발생합니다. 예를 들어 VM Entry 에 의해 설정된 보류 중인 debug exception 은 타이머로 인한 VM Exit 보다 우선 시 됩니다.

그 외 Interrupt-Window Exiting, Virtual-Interrupt Delivery, NMI-Window Exiting, VM Exits Include by the TPR threshold 에 대한 설명은 생략합니다.

[0x05] VM-Entry Failures During or After Loading Guest State

게스트 상태 영역 검사로 인한 VM Entry 실패, 식별된 MSR 로딩 중 실패는 VM Entry 에서 이전에 발생한 것과 다르게 처리됩니다. (참고 : 링크 및 해당 포스트 Loading MSR)

이러한 이유로 실패로 인한 처리는 아래의 순서에 따라 처리됩니다.

  1. VM Entry 실패에 대한 정보는 VM-exit information field 에 기록됩니다.(참고 링크)
    • Exit Reason
      • Bits 15:0 (basic exit reason)
        • 33 : 잘못된 게스트 상태로 인한 VM Entry 실패
        • 34 : MSR 로딩 중 VM Entry 실패
        • 41 : machine-check 이벤트로 인한 VM Entry 실패
      • Bit 31 (VM-entry failure)
        • 1 : VM-entry failure
      • 나머지 비트는 모두 0으로 설정
    • Exit Qualification
      • 잘못된 게스트 상태로 인한 VM Entry 실패입니다. 대부분의 경우 exit qualification 은 0으로 설정되며 값이 존재하는 경우에는 다음과 같이 0이 아닌 값이 사용됩니다.
        • 1 : Not used
        • 2 : PDPTE 로드 문제로 인해 실패했습니다.
        • 3 : interruptibility-state fieldSTI 차단 비트를 통해 이벤트를 차단하는 게스트에 NMI 를 주입하려는 시도로 인해 실패했습니다.
        • 4 : 잘못된 VMCS Link Pointer 로 인해 실패했습니다.
  2. 프로세서 상태는 VM Exit 에서 수행되는 것 처럼 로드됩니다. 결과가 CR4.PAE & CR0.PG & ~IA32_EFER.LMA = 1 인 경우 PDPTE 를 확인하고 로드할 수 있습니다.
  3. interruptibility-state fieldNMI 차단 상태는 VM Entry 이전의 상태입니다.
  4. MSRVM-exit MSR-load 영역에 지정된 대로 로드됩니다.

위의 프로세스는 VM Exit 의 프로세스와 유사하지만 이러한 VM Entry 실패에 대해 VM Exit 중에 수행되는 많은 단계가 발생하지는 않으며 아래와 같은 차이가 있습니다.

  • 대부분의 VM-exit information fields 가 업데이트 되지 않습니다.
  • VM-entry interruption-information fieldvalid 비트가 지워지지 않습니다.
  • 게스트 상태 영역이 변경되지 않습니다.
  • VM-exit MSR-store 영역에 MSR 이 저장되지 않습니다.

[0x06] Conclusion

VM Entry 파트가 모두 마무리 되었습니다. 아직도 명확히 이해가 되지 않는 부분도 있지만 처음보단 꽤 많은 용어들과 친숙해졌습니다.

[0x07] Reference

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