Minor changes
This commit is contained in:
@@ -181,17 +181,12 @@ VmxError:
|
|||||||
; to do here is probably to call a C-function that does diagnostics
|
; to do here is probably to call a C-function that does diagnostics
|
||||||
; like dumping VMCS.
|
; like dumping VMCS.
|
||||||
;
|
;
|
||||||
|
pushf
|
||||||
PUSHAQ
|
PUSHAQ
|
||||||
sub rsp, 68h
|
|
||||||
movaps xmmword ptr [rsp + 0h], xmm0
|
|
||||||
movaps xmmword ptr [rsp + 10h], xmm1
|
|
||||||
movaps xmmword ptr [rsp + 20h], xmm2
|
|
||||||
movaps xmmword ptr [rsp + 30h], xmm3
|
|
||||||
movaps xmmword ptr [rsp + 40h], xmm4
|
|
||||||
movaps xmmword ptr [rsp + 50h], xmm5
|
|
||||||
mov rcx, rsp
|
mov rcx, rsp
|
||||||
sub rsp, 20h
|
sub rsp, 20h
|
||||||
call HandleVmExitFailure
|
call HandleVmExitFailure
|
||||||
|
jmp $
|
||||||
AsmHypervisorEntryPoint endp
|
AsmHypervisorEntryPoint endp
|
||||||
|
|
||||||
;
|
;
|
||||||
|
|||||||
@@ -849,7 +849,7 @@ HandleVmExit (
|
|||||||
DumpGuestState();
|
DumpGuestState();
|
||||||
DumpHostState();
|
DumpHostState();
|
||||||
DumpControl();
|
DumpControl();
|
||||||
LOG_DEBUG("VM-exit reason (Full) = %x", vmExitReason.Flags);
|
LOG_DEBUG("VM-exit reason (Full) = %08x", vmExitReason.Flags);
|
||||||
MV_PANIC();
|
MV_PANIC();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -894,7 +894,7 @@ typedef struct _EXCEPTION_STACK
|
|||||||
UINT64 ErrorCode;
|
UINT64 ErrorCode;
|
||||||
UINT64 Rip;
|
UINT64 Rip;
|
||||||
UINT64 Cs;
|
UINT64 Cs;
|
||||||
UINT64 Rflags;
|
RFLAGS Rflags;
|
||||||
} EXCEPTION_STACK;
|
} EXCEPTION_STACK;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -917,16 +917,38 @@ HandleHostException (
|
|||||||
DumpHostState();
|
DumpHostState();
|
||||||
DumpControl();
|
DumpControl();
|
||||||
LOG_ERROR("Exception or interrupt 0x%llx(0x%llx)", Stack->InterruptNumber, Stack->ErrorCode);
|
LOG_ERROR("Exception or interrupt 0x%llx(0x%llx)", Stack->InterruptNumber, Stack->ErrorCode);
|
||||||
LOG_ERROR("RIP - %016llx, CS - %016llx, RFLAGS - %016llx", Stack->Rip, Stack->Cs, Stack->Rflags);
|
LOG_ERROR("RIP - %016llx, CS - %016llx, RFLAGS - %016llx", Stack->Rip, Stack->Cs, Stack->Rflags.Flags);
|
||||||
LOG_ERROR("RAX - %016llx, RCX - %016llx, RDX - %016llx", Stack->Rax, Stack->Rcx, Stack->Rdx);
|
LOG_ERROR("RAX - %016llx, RCX - %016llx, RDX - %016llx", Stack->Rax, Stack->Rcx, Stack->Rdx);
|
||||||
LOG_ERROR("RBX - %016llx, RSP - %016llx, RBP - %016llx", Stack->Rbx, 0ull, Stack->Rbp);
|
LOG_ERROR("RBX - %016llx, RSP - %016llx, RBP - %016llx", Stack->Rbx, 0ull, Stack->Rbp);
|
||||||
LOG_ERROR("RSI - %016llx, RDI - %016llx", Stack->Rsi, Stack->Rdi);
|
LOG_ERROR("RSI - %016llx, RDI - %016llx", Stack->Rsi, Stack->Rdi);
|
||||||
LOG_ERROR("R8 - %016llx, R9 - %016llx, R10 - %016llx", Stack->R8, Stack->R9, Stack->R10);
|
LOG_ERROR("R8 - %016llx, R9 - %016llx, R10 - %016llx", Stack->R8, Stack->R9, Stack->R10);
|
||||||
LOG_ERROR("R11 - %016llx, R12 - %016llx, R13 - %016llx", Stack->R11, Stack->R12, Stack->R13);
|
LOG_ERROR("R11 - %016llx, R12 - %016llx, R13 - %016llx", Stack->R11, Stack->R12, Stack->R13);
|
||||||
LOG_ERROR("R14 - %016llx, R15 - %016llx", Stack->R14, Stack->R15);
|
LOG_ERROR("R14 - %016llx, R15 - %016llx", Stack->R14, Stack->R15);
|
||||||
|
LOG_ERROR("CR2 - %016llx", __readcr2());
|
||||||
MV_PANIC();
|
MV_PANIC();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct _VMENTRY_FAILURE_STACK
|
||||||
|
{
|
||||||
|
UINT64 R15;
|
||||||
|
UINT64 R14;
|
||||||
|
UINT64 R13;
|
||||||
|
UINT64 R12;
|
||||||
|
UINT64 R11;
|
||||||
|
UINT64 R10;
|
||||||
|
UINT64 R9;
|
||||||
|
UINT64 R8;
|
||||||
|
UINT64 Rdi;
|
||||||
|
UINT64 Rsi;
|
||||||
|
UINT64 Rbp;
|
||||||
|
UINT64 Rbx;
|
||||||
|
UINT64 Rdx;
|
||||||
|
UINT64 Rcx;
|
||||||
|
UINT64 Rax;
|
||||||
|
RFLAGS Rflags;
|
||||||
|
} VMENTRY_FAILURE_STACK;
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@brief Handles error occurred on attempt to exit to the guest.
|
@brief Handles error occurred on attempt to exit to the guest.
|
||||||
|
|
||||||
@@ -935,20 +957,27 @@ HandleHostException (
|
|||||||
*/
|
*/
|
||||||
VOID
|
VOID
|
||||||
HandleVmExitFailure (
|
HandleVmExitFailure (
|
||||||
_In_ CONST INITIAL_HYPERVISOR_STACK* Stack
|
_In_ CONST VMENTRY_FAILURE_STACK* Stack
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
VMX_ERROR_NUMBER vmxErrorNumber;
|
VMX_ERROR_NUMBER vmxErrorNumber;
|
||||||
VMX_VMEXIT_REASON vmExitReason;
|
VMX_VMEXIT_REASON vmExitReason;
|
||||||
|
|
||||||
UNREFERENCED_PARAMETER(Stack);
|
|
||||||
|
|
||||||
vmxErrorNumber = (VMX_ERROR_NUMBER)VmxRead(VMCS_VM_INSTRUCTION_ERROR);
|
|
||||||
vmExitReason.Flags = (UINT32)VmxRead(VMCS_EXIT_REASON);
|
vmExitReason.Flags = (UINT32)VmxRead(VMCS_EXIT_REASON);
|
||||||
|
if (Stack->Rflags.ZeroFlag != FALSE)
|
||||||
|
{
|
||||||
|
vmxErrorNumber = (VMX_ERROR_NUMBER)VmxRead(VMCS_VM_INSTRUCTION_ERROR);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vmxErrorNumber = 0;
|
||||||
|
}
|
||||||
|
|
||||||
DumpGuestState();
|
DumpGuestState();
|
||||||
DumpHostState();
|
DumpHostState();
|
||||||
DumpControl();
|
DumpControl();
|
||||||
LOG_ERROR("VM-exit reason (full) = %x, Error = %ul", vmExitReason.Flags, vmxErrorNumber);
|
LOG_ERROR("VM-exit reason (full) = %08x, Error = %u",
|
||||||
|
vmExitReason.Flags,
|
||||||
|
vmxErrorNumber);
|
||||||
MV_PANIC();
|
MV_PANIC();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,17 +27,17 @@ DumpAccessRights (
|
|||||||
VMX_SEGMENT_ACCESS_RIGHTS rights;
|
VMX_SEGMENT_ACCESS_RIGHTS rights;
|
||||||
|
|
||||||
rights.Flags = (UINT32)AccessRights;
|
rights.Flags = (UINT32)AccessRights;
|
||||||
LOG_ERROR(" - Type = %ul", rights.Type);
|
LOG_ERROR(" - Type = %u", rights.Type);
|
||||||
LOG_ERROR(" - S = %ul", rights.DescriptorType);
|
LOG_ERROR(" - S = %u", rights.DescriptorType);
|
||||||
LOG_ERROR(" - DPL = %ul", rights.DescriptorPrivilegeLevel);
|
LOG_ERROR(" - DPL = %u", rights.DescriptorPrivilegeLevel);
|
||||||
LOG_ERROR(" - P = %ul", rights.Present);
|
LOG_ERROR(" - P = %u", rights.Present);
|
||||||
LOG_ERROR(" - Reserved1 = %ul", rights.Reserved1);
|
LOG_ERROR(" - Reserved1 = %u", rights.Reserved1);
|
||||||
LOG_ERROR(" - Available = %ul", rights.AvailableBit);
|
LOG_ERROR(" - Available = %u", rights.AvailableBit);
|
||||||
LOG_ERROR(" - L = %ul", rights.LongMode);
|
LOG_ERROR(" - L = %u", rights.LongMode);
|
||||||
LOG_ERROR(" - D/B = %ul", rights.DefaultBig);
|
LOG_ERROR(" - D/B = %u", rights.DefaultBig);
|
||||||
LOG_ERROR(" - G = %ul", rights.Granularity);
|
LOG_ERROR(" - G = %u", rights.Granularity);
|
||||||
LOG_ERROR(" - Unusable = %ul", rights.Unusable);
|
LOG_ERROR(" - Unusable = %u", rights.Unusable);
|
||||||
LOG_ERROR(" - Reserved2 = %ul", rights.Reserved2);
|
LOG_ERROR(" - Reserved2 = %u", rights.Reserved2);
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
@@ -287,7 +287,7 @@ VmxRead (
|
|||||||
{
|
{
|
||||||
MV_PANIC();
|
MV_PANIC();
|
||||||
}
|
}
|
||||||
fieldValue = MAXUINT64;
|
fieldValue = 0;
|
||||||
}
|
}
|
||||||
return fieldValue;
|
return fieldValue;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -122,8 +122,8 @@ VmxWrite (
|
|||||||
|
|
||||||
@param[in] Field - A VMCS field to read a value from.
|
@param[in] Field - A VMCS field to read a value from.
|
||||||
|
|
||||||
@return A value read from the VMCS. MAXUINT64 is returned when a non-existent
|
@return A value read from the VMCS. 0 is returned when a non-existent VMCS
|
||||||
VMCS field is requested for read.
|
field is requested for read.
|
||||||
*/
|
*/
|
||||||
UINT64
|
UINT64
|
||||||
VmxRead (
|
VmxRead (
|
||||||
|
|||||||
Reference in New Issue
Block a user