VirtualBox

Changeset 80364 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Aug 21, 2019 10:03:57 AM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
132829
Message:

VMM: Nested VMX: bugref:9180 Move some of the description functions into the inline header. Removed some temporary debugging nits.

Location:
trunk/src/VBox/VMM/VMMAll
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/HMVMXAll.cpp

    r80333 r80364  
    2323#define VMCPU_INCL_CPUM_GST_CTX
    2424#include "HMInternal.h"
     25#include <VBox/vmm/hmvmxinline.h>
    2526#include <VBox/vmm/vmcc.h>
    2627#include <VBox/vmm/pdmapi.h>
     
    393394
    394395/**
    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 /**
    506396 * Checks if a code selector (CS) is suitable for execution using hardware-assisted
    507397 * VMX when unrestricted execution isn't available.
     
    915805    LogRel(("enmDiag                    = %u (%s)\n",   pCtx->hwvirt.vmx.enmDiag, HMGetVmxDiagDesc(pCtx->hwvirt.vmx.enmDiag)));
    916806    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)));
    918808    LogRel(("uAbortAux                  = %u (%#x)\n",  pCtx->hwvirt.vmx.uAbortAux, pCtx->hwvirt.vmx.uAbortAux));
    919809    LogRel(("fInVmxRootMode             = %RTbool\n",   pCtx->hwvirt.vmx.fInVmxRootMode));
     
    933823        LogRel(("%sHeader:\n", pszPrefix));
    934824        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)));
    937827    }
    938828
     
    963853            uint8_t  const uType = VMX_ENTRY_INT_INFO_TYPE(fInfo);
    964854            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)));
    966856            LogRel(("    %sVector                     = %#x\n",      pszPrefix, VMX_ENTRY_INT_INFO_VECTOR(fInfo)));
    967857            LogRel(("    %sNMI-unblocking-IRET        = %RTbool\n",  pszPrefix, VMX_ENTRY_INT_INFO_IS_NMI_UNBLOCK_IRET(fInfo)));
     
    11131003            uint8_t  const uType = VMX_EXIT_INT_INFO_TYPE(fInfo);
    11141004            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)));
    11161006            LogRel(("    %sVector                     = %#x\n",      pszPrefix, VMX_EXIT_INT_INFO_VECTOR(fInfo)));
    11171007            LogRel(("    %sNMI-unblocking-IRET        = %RTbool\n",  pszPrefix, VMX_EXIT_INT_INFO_IS_NMI_UNBLOCK_IRET(fInfo)));
     
    11241014            uint8_t  const uType = VMX_IDT_VECTORING_INFO_TYPE(fInfo);
    11251015            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)));
    11271017            LogRel(("    %sVector                     = %#x\n",      pszPrefix, VMX_IDT_VECTORING_INFO_VECTOR(fInfo)));
    11281018            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  
    16781678     * See Intel spec. 27.7 "VMX Aborts".
    16791679     */
    1680     LogFunc(("enmAbort=%u (%s) -> RESET\n", enmAbort, HMGetVmxAbortDesc(enmAbort)));
     1680    LogFunc(("enmAbort=%u (%s) -> RESET\n", enmAbort, VMXGetAbortDesc(enmAbort)));
    16811681
    16821682    /* We don't support SMX yet. */
     
    69996999 *
    70007000 * @param   pVCpu               The cross context virtual CPU structure.
     7001 * @param   pszInstr            The VMX instruction name (for logging purposes).
    70017002 * @param   uEntryIntInfo       The VM-entry interruption info.
    70027003 * @param   uErrCode            The error code associated with the event if any.
     
    70067007 * @param   GCPtrFaultAddress   The guest CR2 if this is a \#PF event.
    70077008 */
    7008 IEM_STATIC void iemVmxVmentryInjectTrpmEvent(PVMCPUCC pVCpu, uint32_t uEntryIntInfo, uint32_t uErrCode, uint32_t cbInstr,
    7009                                             RTGCUINTPTR GCPtrFaultAddress)
     7009IEM_STATIC void iemVmxVmentryInjectTrpmEvent(PVMCPUCC pVCpu, const char *pszInstr, uint32_t uEntryIntInfo, uint32_t uErrCode,
     7010                                             uint32_t cbInstr, RTGCUINTPTR GCPtrFaultAddress)
    70107011{
    70117012    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);
    70147015    uint8_t const   uVector      = VMX_ENTRY_INT_INFO_VECTOR(uEntryIntInfo);
    70157016    TRPMEVENT const enmTrpmEvent = HMVmxEventTypeToTrpmEventType(uEntryIntInfo);
    70167017
     7018    Assert(uType != VMX_ENTRY_INT_INFO_TYPE_OTHER_EVENT);
     7019
    70177020    int rc = TRPMAssertTrap(pVCpu, uVector, enmTrpmEvent);
    70187021    AssertRC(rc);
     7022    Log(("%s: Injecting: vector=%#x type=%#x (%s)\n", pszInstr, uVector, uType, VMXGetEntryIntInfoTypeDesc(uType)));
    70197023
    70207024    if (VMX_ENTRY_INT_INFO_IS_ERROR_CODE_VALID(uEntryIntInfo))
     7025    {
    70217026        TRPMSetErrorCode(pVCpu, uErrCode);
     7027        Log(("%s: Injecting: err_code=%#x\n", pszInstr, uErrCode));
     7028    }
    70227029
    70237030    if (VMX_ENTRY_INT_INFO_IS_XCPT_PF(uEntryIntInfo))
     7031    {
    70247032        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    {
    70287037        if (   uType == VMX_ENTRY_INT_INFO_TYPE_SW_INT
    70297038            || uType == VMX_ENTRY_INT_INFO_TYPE_SW_XCPT
    70307039            || uType == VMX_ENTRY_INT_INFO_TYPE_PRIV_SW_XCPT)
     7040        {
    70317041            TRPMSetInstrLength(pVCpu, cbInstr);
    7032     }
     7042            Log(("%s: Injecting: instr_len=%u\n", pszInstr, cbInstr));
     7043        }
     7044    }
     7045
     7046    NOREF(pszInstr);
    70337047}
    70347048
     
    70657079        }
    70667080        else
    7067             iemVmxVmentryInjectTrpmEvent(pVCpu, uEntryIntInfo, pVmcs->u32EntryXcptErrCode, pVmcs->u32EntryInstrLen,
     7081            iemVmxVmentryInjectTrpmEvent(pVCpu, pszInstr, uEntryIntInfo, pVmcs->u32EntryXcptErrCode, pVmcs->u32EntryInstrLen,
    70687082                                         pVCpu->cpum.GstCtx.cr2);
    70697083
     
    70927106                                        | RT_BF_MAKE(VMX_BF_ENTRY_INT_INFO_TYPE,   VMX_ENTRY_INT_INFO_TYPE_HW_XCPT)
    70937107                                        | 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,
    70957109                                         0 /* GCPtrFaultAddress */);
    70967110        }
     
    73817395
    73827396                                /* 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));
    73847399                                return VINF_SUCCESS;
    73857400                            }
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette