[0x00] Concept
이전 챕터에 이어서 VMCS Data
기준으로 VM Entry
에서 발생하는 여러가지 검사와 동작에 대해 알아보겠습니다.
[0x01] Loading MSRs
VM Entry
는 VM-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 APIC
가x2APIC mode
에 있을 때 인덱싱된MSR
이APIC register
에 대한 접근을 허용하는 값을 의미합니다. - bits 31:0 의 값은
SMM
에서만 쓸 수 있으며,VM Entry
가SMM
에서 시작되지 않았음을 의미합니다. - bits 31:0 의 값은 각 모델별 이유로 인해
VM Entry
에 로드될 수 없는MSR
을 나타냅니다. 프로세서는 일반적으로WRMSR
에 의해 기록될 수 있는 경우에도 특정MSR
의 로드를 방지할 수 있습니다. - bits 63:32 는 0이 아닙니다.
- bits 31:0 으로 인덱싱 된
MSR
에 bits 127:64 를 쓰려고 시도하면CPL = 0
인WRMSR
을 통해 실행 된 경우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 Entry
는 TAPT
를 사용하여 EPT Violation
으로 인해 버퍼링된 트레이스 데이터가 손실되는 것을 방지합니다.
TAPT
는 IA32_RTIT_CTL.TraceEn = 1
이고, Second_Intel PT uses guest physical address
제어 비트가 1인 경우에만 사용됩니다.
TAPT
는 EPT Violation
, EPT Misconfiguration
, Page-Modification Log-Full Event
, APIC Access
로 인해 VM Exit
를 발생시킬 수 있습니다.
VM Entry
중에 TAPT
의 결과로 인해 이러한 VM Exit
가 발생하면 VM Entry
가 완료된 후(게스트 컨텍스트) VMX non-root operation
에서 발생한 것 처럼 동작합니다.
또한 VM Entry
는 VM-entry interruption-information field
의 Valid
비트가 1인 경우에도 Event Injection
을 수행하지 않습니다.
이러한 VM Exit
는 VM-entry interruption-information
, VM-entry exception error code
필드의 내용을 각 IDT-vectoring error code field
에 저장합니다.
(참고 : 링크)
[0x03] Event Injection
(참고 : 링크)
VM-entry interruption-information field
내 Valid
비트가 1인 경우 Vm Entry
는 게스트 상태의 모든 구성 요소가 로드된 후, 그리고 VM-execution control fields
가 설정된 후 이벤트가 전달되거나 보류(pending)됩니다.
VM-entry interrution-information field
내Interruption Type
이 아래와 같은 경우 아래에 설명(Vectored-Event Injection
)대로 이벤트가 전달됩니다.- 0(
external interrupt
) - 3(
hardware exception
) - 4(
software interrupt
) - 5(
privileged software exception
) - 6(
software exception
)
- 0(
VM-entry interruption-information field
내Interruption Type
이 7(other event
)이고,Vector
필드가 0이면VM Entry
후에MTF VM Exit
가 보류됩니다.
[-] Vectored-Event Injection
VM Entry
는 VM Entry
에 의해 설정된 게스트 컨텍스트 내에서 주입된 벡터화 된 이벤트(Vectored-Event
)를 제공합니다.
이것은 게스트 상태의 모든 구성 요소가 로드되고 VM-execution controls field
가 모두 설정된 다음에 이벤트가 전달됨을 의미합니다.
이벤트는 VM-entry interruption-information field
내 vector
를 이용하여 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 Interrupt
가virtual-8086
(RFLAGS.VM = 1
)모드인 게스트에 주입되는 경우RFLAGS
의 푸시된 값은 수정될 수 있습니다.RFLAGS
가 스택에 푸시된 후RFLAGS
레지스터의 값은IDT
를 통해 이벤트를 전달할 때 정상적으로 수정됩니다.- 스택에 푸시되는
IP(Instruction Pointer)
는 이벤트 유형 및 이벤트 전달 중 중첩된 예외가 발생하는지 여부에 따라 달라집니다. (다음 설명에 작성 될Current Guest RIP
라는 용어는 게스트 상태 영역에서 로드할 값을 나타냅니다. 이하 “현재 게스트 RIP”) 푸시된 값(Instruction Pointer
)은 아래와 같이 결정됩니다.VM Entry
가Interruption Type
의 값이external interrupt
,NMI
,hardware exception
유형인 이벤트를 성공적으로 주입되면(중첩된 예외 없이) 현재 게스트 RIP 가 스택에 푸시됩니다.VM Entry
가Interruption 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
,DR7
및IA32_DEBUGCTL MSR
은 이벤트에 벡터 1(debug exception
)이 있더라도 이벤트 주입에 의해 수정되지 않습니다.VM Entry
가software interrupt
를 주입하고 게스트가virtual-8086
모드에 있는 경우RFLAGS.IOPL(I/O Privilege Level) < 3
이기 때문에 #GP가 발생할 수 없습니다.VMM
은 이벤트를 주입하기 전에RFLAGS.IOPL
을 확인하고 원하는 경우software interrupt
대신 #GP 를 삽입해야 합니다.VM Entry
가software interrupt
를 주입하고 게스트가virtual-8086 mode extension
과 함께virtual-8086
모드에 있는 경우(RFLAGS.VM = 1, CR4.VME = 1
), 이벤트 전달은 다음과 같이TSS
의software interrupt redirection bitmap
에 기반한VME-Based Interrupt Redirection
의 적용을 받습니다. (CR4.VME == Virtual Mode Extension
으로CR4.VMXE
와 다릅니다.)- 이 내용은 해당 챕터에서 생략합니다.
VM Entry
가Non-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
의 벡터가IDT
의task gate
를 식별하면 시도된task switch
가VMX 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 Entry
는 CR0.PE = 0
으로 로드되는 경우, 주입 된 vectored event
는 Real-Address Mode
에서 수행되는 것 처럼 전달됩니다.
특히 VM Entry
는 VM-entry interruption-information field
내 vector
를 이용하여 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 field
내 interruption type
의 값이 7(other event
)이고 vector
필드가 0인 경우 VM Entry
는 MTF VM Exit
가 다음에 오는 명령 경계에서 보류되도록 합니다. 이는 PR_monitor trap flag
가 0인 경우에도 해당됩니다.
[0x04] Special Features Of VM Entry
VM Entry
에 대한 다양한 기능에 대해 자세하게 설명합니다. VM Entry
는 Vectoring
되었다 라는 용어를 사용합니다. 이 용어는 다음의 조건임을 의미합니다.
VM-entry interruption-information field
내valid
비트가 1로 설정되어 있습니다.VM-entry interruption-information field
내interruption type
의 값이 아래의 유형 중 하나입니다.- 0(
external interrupt
), 2(non-maskable interrupt
), 3(hardware exception
), 4(software interrupt
), 5(privileged software exception
), 6(software exception
)
- 0(
[-] Interruptibility State
게스트 상태 영역에서 Non-Register State
로 분류되는 이 상태 필드(interruptibility-state field
)는 STI
에 의한 차단, MOV SS
에 의한 차단, NMI
에 의한 차단을 제어하는 비트가 포함되어 있습니다.
이러한 필드는 다음과 같이 VM Entry
후 이벤트 차단에 영향을 줍니다.
VM Entry
가Vectoring
된 경우interruptibility-state field
의 내용과 관계없이VM Entry
다음에 오는STI
또는MOV SS
에 의한 차단이 발생하지 않습니다.VM Entry
가Vectoring
되지 않은 경우는 아래의 내용이 적용됩니다.- 이벤트는
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 Entry
후NMI
차단에 영향을 미치지 않습니다.NMI
는VMX non-root operation
에서 차단되지 않습니다. - 비트 값은
VM Entry
후virtual-NMI
의 차단 여부를 결정합니다. 해당 비트(bit 3)가 1이면VM Entry
후virtual-NMI
의 차단이 적용됩니다. 비트가 0이면VM Entry
에NMI
를 주입하지 않는 한virtual-NMI
에 대한 차단은 없습니다.
- 비트 값은
Pin_NMI exiting
제어가 0이면Pin_virtual NMIs
또한 0이어야 합니다.
SMI(System-Management Interrupt)
차단은 아래의 내용에 따라 결정됩니다.VM Entry
가SMM
에서 실행되지 않은 경우SMI
차단은VM Entry
에 의해 변경되지 않습니다.VM Entry
가SMM
에서 실행된 경우interruptibility-state field
의 bit 2가 1이면VM Entry
후에SMI
가 차단됩니다.
[-] Activity State
게스트 상태 영역의 Non-Register State
에 해당하는 Activity State
는 VM Entry
후 논리 프로세서가 Active
상태인지 또는 식별된 inactive
상태 중 하나(HLT
, Shutdown
, Wait-for-SIPI
)에 있는지에 대해 확인할 수 있습니다.
(참고 : 링크)
이 필드의 사용은 다음에 따라 결정됩니다.
VM Entry
가Vectoring
된 경우 논리 프로세서는VM Entry
후에Active
상태 입니다.VM Entry
가Vectoring
되지 않은 경우 논리 프로세서는 게스트 상태 영역에 지정된Activity State
에 따라VM Entry
를 끝냅니다.VM Entry
이inactive
상태의 논리 프로세서로 끝나는 경우VM Entry
는Activity State
가Active
상태로 입력될 때 일반적으로 생성되는 특별한Bus Cycle
을 생성합니다.VM Entry
가shutdown
상태의 논리 프로세서로 끝나고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 Entry
는software interrupt
또는software exception
중 하나의 유형으로Vectoring
됩니다.VM Entry
가Vectoring
되지 않고activity-state field
가shutdown
또는wait-for-SIPI
를 나타냅니다.
위의 항목 중 해당되지 않는 경우 pending debug exceptions field
는 게스트에 대해 보류 중인 debug exception
을 지정합니다. BS
비트(bit 14) 또는 enable-breakpoint
비트(bit 12)가 1인 경우 유효한 상태의 보류 중인 debug exception
이 존재합니다. 보류 중인 debug exception
이 있는 경우 아래와 같이 처리됩니다.
VM Entry
가Vectoring
되지 않은 경우 보류 중인debug exception
은 게스트 실행에서 정상적으로 발생한 것처럼 처리됩니다.- 논리 프로세서가 이러한 예외를 차단하지 않는 경우(
interruptibility-state field
내blocking by MOV SS
가 0인 상태)VM Entry
후debug exception
이 전달됩니다. - 논리 프로세서가 이러한 예외를 차단하는 경우(
blocking by MOV SS
가 1인 상태) 보류 중인debug exception
은 일반적인 경우와 같이 보류 상태로 유지되거나 손실됩니다.
- 논리 프로세서가 이러한 예외를 차단하지 않는 경우(
VM Entry
가Vectoring
된 경우 다음 내용이 적용됩니다.- 주입을 위한
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 exception
이 VM Entry
후에 전달되면 traps on the previous instruction
의 우선 순위가 있습니다.(Intel SDM Vol.3A Section 6.9
)
VM Entry
후에 전달된 보류 중인 debug exception
은 Exception Bitmap
에서 bit 1(#DB)이 1인 경우 VM Exit
가 발생합니다. VM Exit
가 발생하지 않으면 DR6
는 정상적으로 업데이트 됩니다.
[-] VMX-Preemption Timer
Pin_activate VMX-preemption timer
제어가 1인 경우 VM Entry
는 VMX-preemption timer-value field
값의 unsigned
값으로 VMX-preemption timer
를 시작합니다.
VMX-preemption timer
는 VM 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
)
이러한 이유로 실패로 인한 처리는 아래의 순서에 따라 처리됩니다.
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
실패
- 33 : 잘못된 게스트 상태로 인한
- Bit 31 (VM-entry failure)
- 1 : VM-entry failure
- 나머지 비트는 모두 0으로 설정
- Bits 15:0 (basic exit reason)
Exit Qualification
- 잘못된 게스트 상태로 인한
VM Entry
실패입니다. 대부분의 경우exit qualification
은 0으로 설정되며 값이 존재하는 경우에는 다음과 같이 0이 아닌 값이 사용됩니다.- 1 : Not used
- 2 :
PDPTE
로드 문제로 인해 실패했습니다. - 3 :
interruptibility-state field
의STI
차단 비트를 통해 이벤트를 차단하는 게스트에NMI
를 주입하려는 시도로 인해 실패했습니다. - 4 : 잘못된
VMCS Link Pointer
로 인해 실패했습니다.
- 잘못된 게스트 상태로 인한
- 프로세서 상태는
VM Exit
에서 수행되는 것 처럼 로드됩니다. 결과가CR4.PAE & CR0.PG & ~IA32_EFER.LMA = 1
인 경우PDPTE
를 확인하고 로드할 수 있습니다. interruptibility-state field
의NMI
차단 상태는VM Entry
이전의 상태입니다.MSR
은VM-exit MSR-load
영역에 지정된 대로 로드됩니다.
위의 프로세스는 VM Exit
의 프로세스와 유사하지만 이러한 VM Entry
실패에 대해 VM Exit
중에 수행되는 많은 단계가 발생하지는 않으며 아래와 같은 차이가 있습니다.
- 대부분의
VM-exit information fields
가 업데이트 되지 않습니다. VM-entry interruption-information field
내valid
비트가 지워지지 않습니다.- 게스트 상태 영역이 변경되지 않습니다.
VM-exit MSR-store
영역에MSR
이 저장되지 않습니다.
[0x06] Conclusion
VM Entry
파트가 모두 마무리 되었습니다. 아직도 명확히 이해가 되지 않는 부분도 있지만 처음보단 꽤 많은 용어들과 친숙해졌습니다.
[0x07] Reference
- Intel 64 and IA-32 Architectures Software Developer’s Manual