Changeset 80364 in vbox for trunk/src/VBox/VMM/VMMAll
- Timestamp:
- Aug 21, 2019 10:03:57 AM (6 years ago)
- svn:sync-xref-src-repo-rev:
- 132829
- Location:
- trunk/src/VBox/VMM/VMMAll
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/HMVMXAll.cpp
r80333 r80364 23 23 #define VMCPU_INCL_CPUM_GST_CTX 24 24 #include "HMInternal.h" 25 #include <VBox/vmm/hmvmxinline.h> 25 26 #include <VBox/vmm/vmcc.h> 26 27 #include <VBox/vmm/pdmapi.h> … … 393 394 394 395 /** 395 * Gets the description for a VMX abort reason.396 *397 * @returns The descriptive string.398 * @param enmAbort The VMX abort reason.399 */400 VMM_INT_DECL(const char *) HMGetVmxAbortDesc(VMXABORT enmAbort)401 {402 switch (enmAbort)403 {404 case VMXABORT_NONE: return "VMXABORT_NONE";405 case VMXABORT_SAVE_GUEST_MSRS: return "VMXABORT_SAVE_GUEST_MSRS";406 case VMXBOART_HOST_PDPTE: return "VMXBOART_HOST_PDPTE";407 case VMXABORT_CURRENT_VMCS_CORRUPT: return "VMXABORT_CURRENT_VMCS_CORRUPT";408 case VMXABORT_LOAD_HOST_MSR: return "VMXABORT_LOAD_HOST_MSR";409 case VMXABORT_MACHINE_CHECK_XCPT: return "VMXABORT_MACHINE_CHECK_XCPT";410 case VMXABORT_HOST_NOT_IN_LONG_MODE: return "VMXABORT_HOST_NOT_IN_LONG_MODE";411 default:412 break;413 }414 return "Unknown/invalid";415 }416 417 418 /**419 * Gets the description for a virtual VMCS state.420 *421 * @returns The descriptive string.422 * @param fVmcsState The virtual-VMCS state.423 */424 VMM_INT_DECL(const char *) HMGetVmxVmcsStateDesc(uint8_t fVmcsState)425 {426 switch (fVmcsState)427 {428 case VMX_V_VMCS_LAUNCH_STATE_CLEAR: return "Clear";429 case VMX_V_VMCS_LAUNCH_STATE_LAUNCHED: return "Launched";430 default: return "Unknown";431 }432 }433 434 435 /**436 * Gets the description for a VM-entry interruption information event type.437 *438 * @returns The descriptive string.439 * @param uType The event type.440 */441 VMM_INT_DECL(const char *) HMGetVmxEntryIntInfoTypeDesc(uint8_t uType)442 {443 switch (uType)444 {445 case VMX_ENTRY_INT_INFO_TYPE_EXT_INT: return "External Interrupt";446 case VMX_ENTRY_INT_INFO_TYPE_NMI: return "NMI";447 case VMX_ENTRY_INT_INFO_TYPE_HW_XCPT: return "Hardware Exception";448 case VMX_ENTRY_INT_INFO_TYPE_SW_INT: return "Software Interrupt";449 case VMX_ENTRY_INT_INFO_TYPE_PRIV_SW_XCPT: return "Priv. Software Exception";450 case VMX_ENTRY_INT_INFO_TYPE_SW_XCPT: return "Software Exception";451 case VMX_ENTRY_INT_INFO_TYPE_OTHER_EVENT: return "Other Event";452 default:453 break;454 }455 return "Unknown/invalid";456 }457 458 459 /**460 * Gets the description for a VM-exit interruption information event type.461 *462 * @returns The descriptive string.463 * @param uType The event type.464 */465 VMM_INT_DECL(const char *) HMGetVmxExitIntInfoTypeDesc(uint8_t uType)466 {467 switch (uType)468 {469 case VMX_EXIT_INT_INFO_TYPE_EXT_INT: return "External Interrupt";470 case VMX_EXIT_INT_INFO_TYPE_NMI: return "NMI";471 case VMX_EXIT_INT_INFO_TYPE_HW_XCPT: return "Hardware Exception";472 case VMX_EXIT_INT_INFO_TYPE_SW_INT: return "Software Interrupt";473 case VMX_EXIT_INT_INFO_TYPE_PRIV_SW_XCPT: return "Priv. Software Exception";474 case VMX_EXIT_INT_INFO_TYPE_SW_XCPT: return "Software Exception";475 default:476 break;477 }478 return "Unknown/invalid";479 }480 481 482 /**483 * Gets the description for an IDT-vectoring information event type.484 *485 * @returns The descriptive string.486 * @param uType The event type.487 */488 VMM_INT_DECL(const char *) HMGetVmxIdtVectoringInfoTypeDesc(uint8_t uType)489 {490 switch (uType)491 {492 case VMX_IDT_VECTORING_INFO_TYPE_EXT_INT: return "External Interrupt";493 case VMX_IDT_VECTORING_INFO_TYPE_NMI: return "NMI";494 case VMX_IDT_VECTORING_INFO_TYPE_HW_XCPT: return "Hardware Exception";495 case VMX_IDT_VECTORING_INFO_TYPE_SW_INT: return "Software Interrupt";496 case VMX_IDT_VECTORING_INFO_TYPE_PRIV_SW_XCPT: return "Priv. Software Exception";497 case VMX_IDT_VECTORING_INFO_TYPE_SW_XCPT: return "Software Exception";498 default:499 break;500 }501 return "Unknown/invalid";502 }503 504 505 /**506 396 * Checks if a code selector (CS) is suitable for execution using hardware-assisted 507 397 * VMX when unrestricted execution isn't available. … … 915 805 LogRel(("enmDiag = %u (%s)\n", pCtx->hwvirt.vmx.enmDiag, HMGetVmxDiagDesc(pCtx->hwvirt.vmx.enmDiag))); 916 806 LogRel(("uDiagAux = %#RX64\n", pCtx->hwvirt.vmx.uDiagAux)); 917 LogRel(("enmAbort = %u (%s)\n", pCtx->hwvirt.vmx.enmAbort, HMGetVmxAbortDesc(pCtx->hwvirt.vmx.enmAbort)));807 LogRel(("enmAbort = %u (%s)\n", pCtx->hwvirt.vmx.enmAbort, VMXGetAbortDesc(pCtx->hwvirt.vmx.enmAbort))); 918 808 LogRel(("uAbortAux = %u (%#x)\n", pCtx->hwvirt.vmx.uAbortAux, pCtx->hwvirt.vmx.uAbortAux)); 919 809 LogRel(("fInVmxRootMode = %RTbool\n", pCtx->hwvirt.vmx.fInVmxRootMode)); … … 933 823 LogRel(("%sHeader:\n", pszPrefix)); 934 824 LogRel((" %sVMCS revision id = %#RX32\n", pszPrefix, pVmcs->u32VmcsRevId)); 935 LogRel((" %sVMX-abort id = %#RX32 (%s)\n", pszPrefix, pVmcs->enmVmxAbort, HMGetVmxAbortDesc(pVmcs->enmVmxAbort)));936 LogRel((" %sVMCS state = %#x (%s)\n", pszPrefix, pVmcs->fVmcsState, HMGetVmxVmcsStateDesc(pVmcs->fVmcsState)));825 LogRel((" %sVMX-abort id = %#RX32 (%s)\n", pszPrefix, pVmcs->enmVmxAbort, VMXGetAbortDesc(pVmcs->enmVmxAbort))); 826 LogRel((" %sVMCS state = %#x (%s)\n", pszPrefix, pVmcs->fVmcsState, VMXGetVmcsStateDesc(pVmcs->fVmcsState))); 937 827 } 938 828 … … 963 853 uint8_t const uType = VMX_ENTRY_INT_INFO_TYPE(fInfo); 964 854 LogRel((" %sValid = %RTbool\n", pszPrefix, VMX_ENTRY_INT_INFO_IS_VALID(fInfo))); 965 LogRel((" %sType = %#x (%s)\n", pszPrefix, uType, HMGetVmxEntryIntInfoTypeDesc(uType)));855 LogRel((" %sType = %#x (%s)\n", pszPrefix, uType, VMXGetEntryIntInfoTypeDesc(uType))); 966 856 LogRel((" %sVector = %#x\n", pszPrefix, VMX_ENTRY_INT_INFO_VECTOR(fInfo))); 967 857 LogRel((" %sNMI-unblocking-IRET = %RTbool\n", pszPrefix, VMX_ENTRY_INT_INFO_IS_NMI_UNBLOCK_IRET(fInfo))); … … 1113 1003 uint8_t const uType = VMX_EXIT_INT_INFO_TYPE(fInfo); 1114 1004 LogRel((" %sValid = %RTbool\n", pszPrefix, VMX_EXIT_INT_INFO_IS_VALID(fInfo))); 1115 LogRel((" %sType = %#x (%s)\n", pszPrefix, uType, HMGetVmxExitIntInfoTypeDesc(uType)));1005 LogRel((" %sType = %#x (%s)\n", pszPrefix, uType, VMXGetExitIntInfoTypeDesc(uType))); 1116 1006 LogRel((" %sVector = %#x\n", pszPrefix, VMX_EXIT_INT_INFO_VECTOR(fInfo))); 1117 1007 LogRel((" %sNMI-unblocking-IRET = %RTbool\n", pszPrefix, VMX_EXIT_INT_INFO_IS_NMI_UNBLOCK_IRET(fInfo))); … … 1124 1014 uint8_t const uType = VMX_IDT_VECTORING_INFO_TYPE(fInfo); 1125 1015 LogRel((" %sValid = %RTbool\n", pszPrefix, VMX_IDT_VECTORING_INFO_IS_VALID(fInfo))); 1126 LogRel((" %sType = %#x (%s)\n", pszPrefix, uType, HMGetVmxIdtVectoringInfoTypeDesc(uType)));1016 LogRel((" %sType = %#x (%s)\n", pszPrefix, uType, VMXGetIdtVectoringInfoTypeDesc(uType))); 1127 1017 LogRel((" %sVector = %#x\n", pszPrefix, VMX_IDT_VECTORING_INFO_VECTOR(fInfo))); 1128 1018 LogRel((" %sError-code valid = %RTbool\n", pszPrefix, VMX_IDT_VECTORING_INFO_IS_ERROR_CODE_VALID(fInfo))); -
trunk/src/VBox/VMM/VMMAll/IEMAllCImplVmxInstr.cpp.h
r80268 r80364 1678 1678 * See Intel spec. 27.7 "VMX Aborts". 1679 1679 */ 1680 LogFunc(("enmAbort=%u (%s) -> RESET\n", enmAbort, HMGetVmxAbortDesc(enmAbort)));1680 LogFunc(("enmAbort=%u (%s) -> RESET\n", enmAbort, VMXGetAbortDesc(enmAbort))); 1681 1681 1682 1682 /* We don't support SMX yet. */ … … 6999 6999 * 7000 7000 * @param pVCpu The cross context virtual CPU structure. 7001 * @param pszInstr The VMX instruction name (for logging purposes). 7001 7002 * @param uEntryIntInfo The VM-entry interruption info. 7002 7003 * @param uErrCode The error code associated with the event if any. … … 7006 7007 * @param GCPtrFaultAddress The guest CR2 if this is a \#PF event. 7007 7008 */ 7008 IEM_STATIC void iemVmxVmentryInjectTrpmEvent(PVMCPUCC pVCpu, uint32_t uEntryIntInfo, uint32_t uErrCode, uint32_t cbInstr,7009 RTGCUINTPTR GCPtrFaultAddress)7009 IEM_STATIC void iemVmxVmentryInjectTrpmEvent(PVMCPUCC pVCpu, const char *pszInstr, uint32_t uEntryIntInfo, uint32_t uErrCode, 7010 uint32_t cbInstr, RTGCUINTPTR GCPtrFaultAddress) 7010 7011 { 7011 7012 Assert(VMX_ENTRY_INT_INFO_IS_VALID(uEntryIntInfo)); 7012 Assert(VMX_ENTRY_INT_INFO_TYPE(uEntryIntInfo) != VMX_ENTRY_INT_INFO_TYPE_OTHER_EVENT); 7013 7013 7014 uint8_t const uType = VMX_ENTRY_INT_INFO_TYPE(uEntryIntInfo); 7014 7015 uint8_t const uVector = VMX_ENTRY_INT_INFO_VECTOR(uEntryIntInfo); 7015 7016 TRPMEVENT const enmTrpmEvent = HMVmxEventTypeToTrpmEventType(uEntryIntInfo); 7016 7017 7018 Assert(uType != VMX_ENTRY_INT_INFO_TYPE_OTHER_EVENT); 7019 7017 7020 int rc = TRPMAssertTrap(pVCpu, uVector, enmTrpmEvent); 7018 7021 AssertRC(rc); 7022 Log(("%s: Injecting: vector=%#x type=%#x (%s)\n", pszInstr, uVector, uType, VMXGetEntryIntInfoTypeDesc(uType))); 7019 7023 7020 7024 if (VMX_ENTRY_INT_INFO_IS_ERROR_CODE_VALID(uEntryIntInfo)) 7025 { 7021 7026 TRPMSetErrorCode(pVCpu, uErrCode); 7027 Log(("%s: Injecting: err_code=%#x\n", pszInstr, uErrCode)); 7028 } 7022 7029 7023 7030 if (VMX_ENTRY_INT_INFO_IS_XCPT_PF(uEntryIntInfo)) 7031 { 7024 7032 TRPMSetFaultAddress(pVCpu, GCPtrFaultAddress); 7025 else 7026 { 7027 uint8_t const uType = VMX_ENTRY_INT_INFO_TYPE(uEntryIntInfo); 7033 Log(("%s: Injecting: fault_addr=%RGp\n", pszInstr, GCPtrFaultAddress)); 7034 } 7035 else 7036 { 7028 7037 if ( uType == VMX_ENTRY_INT_INFO_TYPE_SW_INT 7029 7038 || uType == VMX_ENTRY_INT_INFO_TYPE_SW_XCPT 7030 7039 || uType == VMX_ENTRY_INT_INFO_TYPE_PRIV_SW_XCPT) 7040 { 7031 7041 TRPMSetInstrLength(pVCpu, cbInstr); 7032 } 7042 Log(("%s: Injecting: instr_len=%u\n", pszInstr, cbInstr)); 7043 } 7044 } 7045 7046 NOREF(pszInstr); 7033 7047 } 7034 7048 … … 7065 7079 } 7066 7080 else 7067 iemVmxVmentryInjectTrpmEvent(pVCpu, uEntryIntInfo, pVmcs->u32EntryXcptErrCode, pVmcs->u32EntryInstrLen,7081 iemVmxVmentryInjectTrpmEvent(pVCpu, pszInstr, uEntryIntInfo, pVmcs->u32EntryXcptErrCode, pVmcs->u32EntryInstrLen, 7068 7082 pVCpu->cpum.GstCtx.cr2); 7069 7083 … … 7092 7106 | RT_BF_MAKE(VMX_BF_ENTRY_INT_INFO_TYPE, VMX_ENTRY_INT_INFO_TYPE_HW_XCPT) 7093 7107 | RT_BF_MAKE(VMX_BF_ENTRY_INT_INFO_VALID, 1); 7094 iemVmxVmentryInjectTrpmEvent(pVCpu, uDbgXcptInfo, 0 /* uErrCode */, pVmcs->u32EntryInstrLen,7108 iemVmxVmentryInjectTrpmEvent(pVCpu, pszInstr, uDbgXcptInfo, 0 /* uErrCode */, pVmcs->u32EntryInstrLen, 7095 7109 0 /* GCPtrFaultAddress */); 7096 7110 } … … 7381 7395 7382 7396 /* Finally, done. */ 7383 Log(("%s: cs:rip=%#04x:%#RX64\n", pszInstr, pVCpu->cpum.GstCtx.cs.Sel, pVCpu->cpum.GstCtx.rip)); 7397 Log(("%s: cs:rip=%#04x:%#RX64 cr3=%#RX64\n", pszInstr, pVCpu->cpum.GstCtx.cs.Sel, 7398 pVCpu->cpum.GstCtx.rip, pVCpu->cpum.GstCtx.cr3)); 7384 7399 return VINF_SUCCESS; 7385 7400 }
Note:
See TracChangeset
for help on using the changeset viewer.