diff --git a/Sources/Asm.asm b/Sources/Asm.asm index 596c613..7083f92 100644 --- a/Sources/Asm.asm +++ b/Sources/Asm.asm @@ -181,17 +181,12 @@ VmxError: ; to do here is probably to call a C-function that does diagnostics ; like dumping VMCS. ; + pushf 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 sub rsp, 20h call HandleVmExitFailure + jmp $ AsmHypervisorEntryPoint endp ; diff --git a/Sources/HostMain.c b/Sources/HostMain.c index 63e40cf..b2790b2 100644 --- a/Sources/HostMain.c +++ b/Sources/HostMain.c @@ -849,7 +849,7 @@ HandleVmExit ( DumpGuestState(); DumpHostState(); DumpControl(); - LOG_DEBUG("VM-exit reason (Full) = %x", vmExitReason.Flags); + LOG_DEBUG("VM-exit reason (Full) = %08x", vmExitReason.Flags); MV_PANIC(); } @@ -894,7 +894,7 @@ typedef struct _EXCEPTION_STACK UINT64 ErrorCode; UINT64 Rip; UINT64 Cs; - UINT64 Rflags; + RFLAGS Rflags; } EXCEPTION_STACK; /*! @@ -917,16 +917,38 @@ HandleHostException ( DumpHostState(); DumpControl(); 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("RBX - %016llx, RSP - %016llx, RBP - %016llx", Stack->Rbx, 0ull, Stack->Rbp); 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("R11 - %016llx, R12 - %016llx, R13 - %016llx", Stack->R11, Stack->R12, Stack->R13); LOG_ERROR("R14 - %016llx, R15 - %016llx", Stack->R14, Stack->R15); + LOG_ERROR("CR2 - %016llx", __readcr2()); 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. @@ -935,20 +957,27 @@ HandleHostException ( */ VOID HandleVmExitFailure ( - _In_ CONST INITIAL_HYPERVISOR_STACK* Stack + _In_ CONST VMENTRY_FAILURE_STACK* Stack ) { VMX_ERROR_NUMBER vmxErrorNumber; VMX_VMEXIT_REASON vmExitReason; - UNREFERENCED_PARAMETER(Stack); - - vmxErrorNumber = (VMX_ERROR_NUMBER)VmxRead(VMCS_VM_INSTRUCTION_ERROR); 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(); DumpHostState(); 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(); } diff --git a/Sources/HostUtils.c b/Sources/HostUtils.c index 8f56c64..37138fe 100644 --- a/Sources/HostUtils.c +++ b/Sources/HostUtils.c @@ -27,17 +27,17 @@ DumpAccessRights ( VMX_SEGMENT_ACCESS_RIGHTS rights; rights.Flags = (UINT32)AccessRights; - LOG_ERROR(" - Type = %ul", rights.Type); - LOG_ERROR(" - S = %ul", rights.DescriptorType); - LOG_ERROR(" - DPL = %ul", rights.DescriptorPrivilegeLevel); - LOG_ERROR(" - P = %ul", rights.Present); - LOG_ERROR(" - Reserved1 = %ul", rights.Reserved1); - LOG_ERROR(" - Available = %ul", rights.AvailableBit); - LOG_ERROR(" - L = %ul", rights.LongMode); - LOG_ERROR(" - D/B = %ul", rights.DefaultBig); - LOG_ERROR(" - G = %ul", rights.Granularity); - LOG_ERROR(" - Unusable = %ul", rights.Unusable); - LOG_ERROR(" - Reserved2 = %ul", rights.Reserved2); + LOG_ERROR(" - Type = %u", rights.Type); + LOG_ERROR(" - S = %u", rights.DescriptorType); + LOG_ERROR(" - DPL = %u", rights.DescriptorPrivilegeLevel); + LOG_ERROR(" - P = %u", rights.Present); + LOG_ERROR(" - Reserved1 = %u", rights.Reserved1); + LOG_ERROR(" - Available = %u", rights.AvailableBit); + LOG_ERROR(" - L = %u", rights.LongMode); + LOG_ERROR(" - D/B = %u", rights.DefaultBig); + LOG_ERROR(" - G = %u", rights.Granularity); + LOG_ERROR(" - Unusable = %u", rights.Unusable); + LOG_ERROR(" - Reserved2 = %u", rights.Reserved2); } VOID @@ -287,7 +287,7 @@ VmxRead ( { MV_PANIC(); } - fieldValue = MAXUINT64; + fieldValue = 0; } return fieldValue; } diff --git a/Sources/HostUtils.h b/Sources/HostUtils.h index 0ffbf69..e6acba8 100644 --- a/Sources/HostUtils.h +++ b/Sources/HostUtils.h @@ -122,8 +122,8 @@ VmxWrite ( @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 - VMCS field is requested for read. + @return A value read from the VMCS. 0 is returned when a non-existent VMCS + field is requested for read. */ UINT64 VmxRead (