VirtualBox

Changeset 97054 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Oct 7, 2022 11:09:55 PM (2 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
154003
Message:

VMM/HMVMXR0: Only use the template functions for reading into VMXTRANSIENT.

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

Legend:

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

    r97053 r97054  
    13611361    {
    13621362        uint32_t const fVmcsFieldsRead = pVmxTransient->fVmcsFieldsRead;
    1363         int            rc;
    13641363
    13651364        if (   (a_fReadMask      & HMVMX_READ_EXIT_QUALIFICATION)
    13661365            && !(fVmcsFieldsRead & HMVMX_READ_EXIT_QUALIFICATION))
    13671366        {
    1368             rc = VMX_VMCS_READ_NW(pVCpu, VMX_VMCS_RO_EXIT_QUALIFICATION,             &pVmxTransient->uExitQual);
     1367            int const rc = VMX_VMCS_READ_NW(pVCpu, VMX_VMCS_RO_EXIT_QUALIFICATION,          &pVmxTransient->uExitQual);
    13691368            AssertRC(rc);
    13701369        }
     
    13721371            && !(fVmcsFieldsRead & HMVMX_READ_EXIT_INSTR_LEN))
    13731372        {
    1374             rc = VMX_VMCS_READ_32(pVCpu, VMX_VMCS32_RO_EXIT_INSTR_LENGTH,            &pVmxTransient->cbExitInstr);
     1373            int const rc = VMX_VMCS_READ_32(pVCpu, VMX_VMCS32_RO_EXIT_INSTR_LENGTH,         &pVmxTransient->cbExitInstr);
    13751374            AssertRC(rc);
    13761375        }
     
    13781377            && !(fVmcsFieldsRead & HMVMX_READ_EXIT_INSTR_INFO))
    13791378        {
    1380             rc = VMX_VMCS_READ_32(pVCpu, VMX_VMCS32_RO_EXIT_INSTR_INFO,              &pVmxTransient->ExitInstrInfo.u);
     1379            int const rc = VMX_VMCS_READ_32(pVCpu, VMX_VMCS32_RO_EXIT_INSTR_INFO,           &pVmxTransient->ExitInstrInfo.u);
    13811380            AssertRC(rc);
    13821381        }
     
    13841383            && !(fVmcsFieldsRead & HMVMX_READ_IDT_VECTORING_INFO))
    13851384        {
    1386             rc = VMX_VMCS_READ_32(pVCpu, VMX_VMCS32_RO_IDT_VECTORING_INFO,           &pVmxTransient->uIdtVectoringInfo);
     1385            int const rc = VMX_VMCS_READ_32(pVCpu, VMX_VMCS32_RO_IDT_VECTORING_INFO,        &pVmxTransient->uIdtVectoringInfo);
    13871386            AssertRC(rc);
    13881387        }
     
    13901389            && !(fVmcsFieldsRead & HMVMX_READ_IDT_VECTORING_ERROR_CODE))
    13911390        {
    1392             rc = VMX_VMCS_READ_32(pVCpu, VMX_VMCS32_RO_IDT_VECTORING_ERROR_CODE,     &pVmxTransient->uIdtVectoringErrorCode);
     1391            int const rc = VMX_VMCS_READ_32(pVCpu, VMX_VMCS32_RO_IDT_VECTORING_ERROR_CODE,  &pVmxTransient->uIdtVectoringErrorCode);
    13931392            AssertRC(rc);
    13941393        }
     
    13961395            && !(fVmcsFieldsRead & HMVMX_READ_EXIT_INTERRUPTION_INFO))
    13971396        {
    1398             rc = VMX_VMCS_READ_32(pVCpu, VMX_VMCS32_RO_EXIT_INTERRUPTION_INFO,       &pVmxTransient->uExitIntInfo);
     1397            int const rc = VMX_VMCS_READ_32(pVCpu, VMX_VMCS32_RO_EXIT_INTERRUPTION_INFO,    &pVmxTransient->uExitIntInfo);
    13991398            AssertRC(rc);
    14001399        }
     
    14021401            && !(fVmcsFieldsRead & HMVMX_READ_EXIT_INTERRUPTION_ERROR_CODE))
    14031402        {
    1404             rc = VMX_VMCS_READ_32(pVCpu, VMX_VMCS32_RO_EXIT_INTERRUPTION_ERROR_CODE, &pVmxTransient->uExitIntErrorCode);
     1403            int const rc = VMX_VMCS_READ_32(pVCpu, VMX_VMCS32_RO_EXIT_INTERRUPTION_ERROR_CODE, &pVmxTransient->uExitIntErrorCode);
    14051404            AssertRC(rc);
    14061405        }
     
    14081407            && !(fVmcsFieldsRead & HMVMX_READ_GUEST_LINEAR_ADDR))
    14091408        {
    1410             rc = VMX_VMCS_READ_NW(pVCpu, VMX_VMCS_RO_GUEST_LINEAR_ADDR,              &pVmxTransient->uGuestLinearAddr);
     1409            int const rc = VMX_VMCS_READ_NW(pVCpu, VMX_VMCS_RO_GUEST_LINEAR_ADDR,           &pVmxTransient->uGuestLinearAddr);
    14111410            AssertRC(rc);
    14121411        }
     
    14141413            && !(fVmcsFieldsRead & HMVMX_READ_GUEST_PHYSICAL_ADDR))
    14151414        {
    1416             rc = VMX_VMCS_READ_64(pVCpu, VMX_VMCS64_RO_GUEST_PHYS_ADDR_FULL,         &pVmxTransient->uGuestPhysicalAddr);
     1415            int const rc = VMX_VMCS_READ_64(pVCpu, VMX_VMCS64_RO_GUEST_PHYS_ADDR_FULL,      &pVmxTransient->uGuestPhysicalAddr);
    14171416            AssertRC(rc);
    14181417        }
     
    14401439    if (RT_LIKELY(!(pVmxTransient->fVmcsFieldsRead & a_fReadMask)))
    14411440    {
    1442         int rc;
    14431441        if (a_fReadMask & HMVMX_READ_EXIT_QUALIFICATION)
    14441442        {
    1445             rc = VMX_VMCS_READ_NW(pVCpu, VMX_VMCS_RO_EXIT_QUALIFICATION,             &pVmxTransient->uExitQual);
     1443            int const rc = VMX_VMCS_READ_NW(pVCpu, VMX_VMCS_RO_EXIT_QUALIFICATION,          &pVmxTransient->uExitQual);
    14461444            AssertRC(rc);
    14471445        }
    14481446        if (a_fReadMask & HMVMX_READ_EXIT_INSTR_LEN)
    14491447        {
    1450             rc = VMX_VMCS_READ_32(pVCpu, VMX_VMCS32_RO_EXIT_INSTR_LENGTH,            &pVmxTransient->cbExitInstr);
     1448            int const rc = VMX_VMCS_READ_32(pVCpu, VMX_VMCS32_RO_EXIT_INSTR_LENGTH,         &pVmxTransient->cbExitInstr);
    14511449            AssertRC(rc);
    14521450        }
    14531451        if (a_fReadMask & HMVMX_READ_EXIT_INSTR_INFO)
    14541452        {
    1455             rc = VMX_VMCS_READ_32(pVCpu, VMX_VMCS32_RO_EXIT_INSTR_INFO,              &pVmxTransient->ExitInstrInfo.u);
     1453            int const rc = VMX_VMCS_READ_32(pVCpu, VMX_VMCS32_RO_EXIT_INSTR_INFO,           &pVmxTransient->ExitInstrInfo.u);
    14561454            AssertRC(rc);
    14571455        }
    14581456        if (a_fReadMask & HMVMX_READ_IDT_VECTORING_INFO)
    14591457        {
    1460             rc = VMX_VMCS_READ_32(pVCpu, VMX_VMCS32_RO_IDT_VECTORING_INFO,           &pVmxTransient->uIdtVectoringInfo);
     1458            int const rc = VMX_VMCS_READ_32(pVCpu, VMX_VMCS32_RO_IDT_VECTORING_INFO,        &pVmxTransient->uIdtVectoringInfo);
    14611459            AssertRC(rc);
    14621460        }
    14631461        if (a_fReadMask & HMVMX_READ_IDT_VECTORING_ERROR_CODE)
    14641462        {
    1465             rc = VMX_VMCS_READ_32(pVCpu, VMX_VMCS32_RO_IDT_VECTORING_ERROR_CODE,     &pVmxTransient->uIdtVectoringErrorCode);
     1463            int const rc = VMX_VMCS_READ_32(pVCpu, VMX_VMCS32_RO_IDT_VECTORING_ERROR_CODE,  &pVmxTransient->uIdtVectoringErrorCode);
    14661464            AssertRC(rc);
    14671465        }
    14681466        if (a_fReadMask & HMVMX_READ_EXIT_INTERRUPTION_INFO)
    14691467        {
    1470             rc = VMX_VMCS_READ_32(pVCpu, VMX_VMCS32_RO_EXIT_INTERRUPTION_INFO,       &pVmxTransient->uExitIntInfo);
     1468            int const rc = VMX_VMCS_READ_32(pVCpu, VMX_VMCS32_RO_EXIT_INTERRUPTION_INFO,    &pVmxTransient->uExitIntInfo);
    14711469            AssertRC(rc);
    14721470        }
    14731471        if (a_fReadMask & HMVMX_READ_EXIT_INTERRUPTION_ERROR_CODE)
    14741472        {
    1475             rc = VMX_VMCS_READ_32(pVCpu, VMX_VMCS32_RO_EXIT_INTERRUPTION_ERROR_CODE, &pVmxTransient->uExitIntErrorCode);
     1473            int const rc = VMX_VMCS_READ_32(pVCpu, VMX_VMCS32_RO_EXIT_INTERRUPTION_ERROR_CODE, &pVmxTransient->uExitIntErrorCode);
    14761474            AssertRC(rc);
    14771475        }
    14781476        if (a_fReadMask & HMVMX_READ_GUEST_LINEAR_ADDR)
    14791477        {
    1480             rc = VMX_VMCS_READ_NW(pVCpu, VMX_VMCS_RO_GUEST_LINEAR_ADDR,              &pVmxTransient->uGuestLinearAddr);
     1478            int const rc = VMX_VMCS_READ_NW(pVCpu, VMX_VMCS_RO_GUEST_LINEAR_ADDR,           &pVmxTransient->uGuestLinearAddr);
    14811479            AssertRC(rc);
    14821480        }
    14831481        if (a_fReadMask & HMVMX_READ_GUEST_PHYSICAL_ADDR)
    14841482        {
    1485             rc = VMX_VMCS_READ_64(pVCpu, VMX_VMCS64_RO_GUEST_PHYS_ADDR_FULL,         &pVmxTransient->uGuestPhysicalAddr);
     1483            int const rc = VMX_VMCS_READ_64(pVCpu, VMX_VMCS64_RO_GUEST_PHYS_ADDR_FULL,      &pVmxTransient->uGuestPhysicalAddr);
    14861484            AssertRC(rc);
    14871485        }
     
    58445842static int vmxHCAdvanceGuestRip(PVMCPUCC pVCpu, PVMXTRANSIENT pVmxTransient)
    58455843{
    5846     vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
     5844    vmxHCReadToTransientSlow<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    58475845    int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, CPUMCTX_EXTRN_RIP | CPUMCTX_EXTRN_RFLAGS);
    58485846    AssertRCReturn(rc, rc);
     
    64906488{
    64916489    HMVMX_VALIDATE_EXIT_XCPT_HANDLER_PARAMS(pVCpu, pVmxTransient);
    6492     vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
     6490    vmxHCReadToTransient<HMVMX_READ_EXIT_QUALIFICATION>(pVCpu, pVmxTransient);
    64936491
    64946492#ifndef IN_NEM_DARWIN
     
    67656763     * Get the DR6-like values from the Exit qualification and pass it to DBGF for processing.
    67666764     */
    6767     vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
     6765    vmxHCReadToTransient<HMVMX_READ_EXIT_QUALIFICATION>(pVCpu, pVmxTransient);
    67686766
    67696767    /* Refer Intel spec. Table 27-1. "Exit Qualifications for debug exceptions" for the format. */
     
    72137211    STAM_PROFILE_ADV_START(&VCPU_2_VMXSTATS(pVCpu).StatExitXcptNmi, y3);
    72147212
    7215     vmxHCReadExitIntInfoVmcs(pVCpu, pVmxTransient);
     7213    vmxHCReadToTransient<HMVMX_READ_EXIT_INTERRUPTION_INFO>(pVCpu, pVmxTransient);
    72167214
    72177215    uint32_t const uExitIntType = VMX_EXIT_INT_INFO_TYPE(pVmxTransient->uExitIntInfo);
     
    72597257        {
    72607258            NOREF(uVector);
    7261 #ifdef HMVMX_WITH_CONDENSED_VMREADS
    72627259            vmxHCReadToTransient<  HMVMX_READ_EXIT_INTERRUPTION_ERROR_CODE
    72637260                                 | HMVMX_READ_EXIT_INSTR_LEN
    72647261                                 | HMVMX_READ_IDT_VECTORING_INFO
    72657262                                 | HMVMX_READ_IDT_VECTORING_ERROR_CODE>(pVCpu, pVmxTransient);
    7266 #else
    7267             vmxHCReadExitIntErrorCodeVmcs(pVCpu, pVmxTransient);
    7268             vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
    7269             vmxHCReadIdtVectoringInfoVmcs(pVCpu, pVmxTransient);
    7270             vmxHCReadIdtVectoringErrorCodeVmcs(pVCpu, pVmxTransient);
    7271 #endif
    72727263            rcStrict = vmxHCExitXcpt(pVCpu, pVmxTransient);
    72737264            break;
     
    73787369     */
    73797370    PVMXVMCSINFO pVmcsInfo = pVmxTransient->pVmcsInfo;
    7380     vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
    7381 
     7371    vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    73827372    int rc = vmxHCImportGuestState(pVCpu, pVmcsInfo, IEM_CPUMCTX_EXTRN_EXEC_DECODED_NO_MEM_MASK);
    73837373    AssertRCReturn(rc, rc);
     
    74507440
    74517441    PVMXVMCSINFO pVmcsInfo = pVmxTransient->pVmcsInfo;
    7452     vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
     7442    vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    74537443    int rc = vmxHCImportGuestState(pVCpu, pVmcsInfo, IEM_CPUMCTX_EXTRN_MUST_MASK);
    74547444    AssertRCReturn(rc, rc);
     
    74807470
    74817471    PVMXVMCSINFO pVmcsInfo = pVmxTransient->pVmcsInfo;
    7482     vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
     7472    vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    74837473    int rc = vmxHCImportGuestState(pVCpu, pVmcsInfo, IEM_CPUMCTX_EXTRN_MUST_MASK | CPUMCTX_EXTRN_TSC_AUX);
    74847474    AssertRCReturn(rc, rc);
     
    75857575
    75867576    PVMXVMCSINFO pVmcsInfo = pVmxTransient->pVmcsInfo;
    7587 #ifdef HMVMX_WITH_CONDENSED_VMREADS
    75887577    vmxHCReadToTransient<  HMVMX_READ_EXIT_QUALIFICATION
    75897578                         | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    7590 #else
    7591     vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
    7592     vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
    7593 #endif
    75947579    int rc = vmxHCImportGuestState(pVCpu, pVmcsInfo, IEM_CPUMCTX_EXTRN_EXEC_DECODED_MEM_MASK);
    75957580    AssertRCReturn(rc, rc);
     
    76197604
    76207605    PVMXVMCSINFO pVmcsInfo = pVmxTransient->pVmcsInfo;
    7621     vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
     7606    vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    76227607    int rc = vmxHCImportGuestState(pVCpu, pVmcsInfo, IEM_CPUMCTX_EXTRN_EXEC_DECODED_MEM_MASK | CPUMCTX_EXTRN_DS);
    76237608    AssertRCReturn(rc, rc);
     
    76447629
    76457630    PVMXVMCSINFO pVmcsInfo = pVmxTransient->pVmcsInfo;
    7646     vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
     7631    vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    76477632    int rc = vmxHCImportGuestState(pVCpu, pVmcsInfo, IEM_CPUMCTX_EXTRN_EXEC_DECODED_NO_MEM_MASK);
    76487633    AssertRCReturn(rc, rc);
     
    77347719
    77357720    PVMXVMCSINFO pVmcsInfo = pVmxTransient->pVmcsInfo;
    7736     vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
     7721    vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    77377722    int rc = vmxHCImportGuestState(pVCpu, pVmcsInfo, IEM_CPUMCTX_EXTRN_MUST_MASK | CPUMCTX_EXTRN_CR4);
    77387723    AssertRCReturn(rc, rc);
     
    77677752    return VERR_EM_INTERPRETER;
    77687753#else
    7769 # ifdef HMVMX_WITH_CONDENSED_VMREADS
    77707754    vmxHCReadToTransient<  HMVMX_READ_EXIT_QUALIFICATION
    77717755                         | HMVMX_READ_EXIT_INSTR_INFO
    77727756                         | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    7773 # else
    7774     vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
    7775     vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient);
    7776     vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
    7777 # endif
    77787757    int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, CPUMCTX_EXTRN_RSP | CPUMCTX_EXTRN_SREG_MASK
    77797758                                                                    | IEM_CPUMCTX_EXTRN_EXEC_DECODED_MEM_MASK);
     
    78257804    uint32_t fIntrState;
    78267805    uint64_t u64Val;
    7827 # ifdef HMVMX_WITH_CONDENSED_VMREADS
    78287806    vmxHCReadToTransient<  HMVMX_READ_EXIT_INSTR_INFO
    78297807                         | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    7830 # else
    7831     vmxHCReadEntryIntInfoVmcs(pVCpu, pVmxTransient);
    7832     vmxHCReadEntryInstrLenVmcs(pVCpu, pVmxTransient);
    7833 # endif
    78347808    vmxHCReadEntryXcptErrorCodeVmcs(pVCpu, pVmxTransient);
    78357809
     
    79737947    }
    79747948
    7975     vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
     7949    vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    79767950    int rc = vmxHCImportGuestState(pVCpu, pVmcsInfo, fImport);
    79777951    AssertRCReturn(rc, rc);
     
    80468020
    80478021    PVMXVMCSINFO pVmcsInfo = pVmxTransient->pVmcsInfo;
    8048     vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
     8022    vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    80498023    int rc = vmxHCImportGuestState(pVCpu, pVmcsInfo, fImport);
    80508024    AssertRCReturn(rc, rc);
     
    82198193
    82208194    PVMXVMCSINFO pVmcsInfo = pVmxTransient->pVmcsInfo;
    8221 # ifdef HMVMX_WITH_CONDENSED_VMREADS
    82228195    vmxHCReadToTransient<  HMVMX_READ_EXIT_QUALIFICATION
    82238196                         | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    8224 # else
    8225     vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
    8226     vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
    8227 # endif
    82288197
    82298198    VBOXSTRICTRC rcStrict;
     
    83638332            if (fMemOperand)
    83648333            {
    8365                 vmxHCReadGuestLinearAddrVmcs(pVCpu, pVmxTransient);
     8334                vmxHCReadToTransient<HMVMX_READ_GUEST_LINEAR_ADDR>(pVCpu, pVmxTransient);
    83668335                GCPtrEffDst = pVmxTransient->uGuestLinearAddr;
    83678336            }
     
    84008369    PCPUMCTX pCtx = &pVCpu->cpum.GstCtx;
    84018370    PVMXVMCSINFO pVmcsInfo = pVmxTransient->pVmcsInfo;
    8402 # ifdef HMVMX_WITH_CONDENSED_VMREADS
    84038371    vmxHCReadToTransient<  HMVMX_READ_EXIT_QUALIFICATION
    84048372                         | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    8405 # else
    8406     vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
    8407     vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
    8408 #endif
    84098373    int rc = vmxHCImportGuestState(pVCpu, pVmcsInfo, IEM_CPUMCTX_EXTRN_MUST_MASK | CPUMCTX_EXTRN_SREG_MASK
    84108374                                                     | CPUMCTX_EXTRN_EFER);
     
    84598423            if (fInsOutsInfo)
    84608424            {
    8461                 vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient);
     8425                vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_INFO>(pVCpu, pVmxTransient);
    84628426                AssertReturn(pVmxTransient->ExitInstrInfo.StrIo.u3AddrSize <= 2, VERR_VMX_IPE_3);
    84638427                AssertCompile(IEMMODE_16BIT == 0 && IEMMODE_32BIT == 1 && IEMMODE_64BIT == 2);
     
    86468610
    86478611    /* Check if this task-switch occurred while delivery an event through the guest IDT. */
    8648     vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
     8612    vmxHCReadToTransient<HMVMX_READ_EXIT_QUALIFICATION>(pVCpu, pVmxTransient);
    86498613    if (VMX_EXIT_QUAL_TASK_SWITCH_TYPE(pVmxTransient->uExitQual) == VMX_EXIT_QUAL_TASK_SWITCH_TYPE_IDT)
    86508614    {
    8651         vmxHCReadIdtVectoringInfoVmcs(pVCpu, pVmxTransient);
     8615        vmxHCReadToTransient<HMVMX_READ_IDT_VECTORING_INFO>(pVCpu, pVmxTransient);
    86528616        if (VMX_IDT_VECTORING_INFO_IS_VALID(pVmxTransient->uIdtVectoringInfo))
    86538617        {
     
    86558619            if (VMX_IDT_VECTORING_INFO_IS_ERROR_CODE_VALID(pVmxTransient->uIdtVectoringInfo))
    86568620            {
    8657                 vmxHCReadIdtVectoringErrorCodeVmcs(pVCpu, pVmxTransient);
     8621                vmxHCReadToTransient<HMVMX_READ_IDT_VECTORING_ERROR_CODE>(pVCpu, pVmxTransient);
    86588622                uErrCode = pVmxTransient->uIdtVectoringErrorCode;
    86598623            }
     
    86678631                GCPtrFaultAddress = 0;
    86688632
    8669             vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
     8633            vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    86708634
    86718635            vmxHCSetPendingEvent(pVCpu, VMX_ENTRY_INT_INFO_FROM_EXIT_IDT_INFO(pVmxTransient->uIdtVectoringInfo),
     
    87088672    STAM_COUNTER_INC(&VCPU_2_VMXSTATS(pVCpu).StatExitApicAccess);
    87098673
    8710 #ifdef HMVMX_WITH_CONDENSED_VMREADS
    87118674    vmxHCReadToTransient<  HMVMX_READ_EXIT_QUALIFICATION
    87128675                         | HMVMX_READ_EXIT_INSTR_LEN
     
    87158678                         | HMVMX_READ_IDT_VECTORING_INFO
    87168679                         | HMVMX_READ_IDT_VECTORING_ERROR_CODE>(pVCpu, pVmxTransient);
    8717 #else
    8718     vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
    8719     vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
    8720     vmxHCReadExitIntInfoVmcs(pVCpu, pVmxTransient);
    8721     vmxHCReadExitIntErrorCodeVmcs(pVCpu, pVmxTransient);
    8722     vmxHCReadIdtVectoringInfoVmcs(pVCpu, pVmxTransient);
    8723     vmxHCReadIdtVectoringErrorCodeVmcs(pVCpu, pVmxTransient);
    8724 #endif
    87258680
    87268681    /*
     
    88498804
    88508805#ifdef VBOX_WITH_STATISTICS
    8851             vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
     8806            vmxHCReadToTransient<HMVMX_READ_EXIT_QUALIFICATION>(pVCpu, pVmxTransient);
    88528807            if (VMX_EXIT_QUAL_DRX_DIRECTION(pVmxTransient->uExitQual) == VMX_EXIT_QUAL_DRX_DIRECTION_WRITE)
    88538808                STAM_COUNTER_INC(&VCPU_2_VMXSTATS(pVCpu).StatExitDRxWrite);
     
    88668821     */
    88678822    PCPUMCTX pCtx = &pVCpu->cpum.GstCtx;
    8868     vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
     8823    vmxHCReadToTransient<HMVMX_READ_EXIT_QUALIFICATION>(pVCpu, pVmxTransient);
    88698824    int rc = vmxHCImportGuestState(pVCpu, pVmcsInfo, CPUMCTX_EXTRN_SREG_MASK | CPUMCTX_EXTRN_DR7);
    88708825    AssertRCReturn(rc, rc);
     
    89118866    Assert(pVCpu->CTX_SUFF(pVM)->hmr0.s.fNestedPaging);
    89128867
    8913 # ifdef HMVMX_WITH_CONDENSED_VMREADS
    89148868    vmxHCReadToTransient<  HMVMX_READ_EXIT_INSTR_LEN
    89158869                         | HMVMX_READ_EXIT_INTERRUPTION_INFO
     
    89188872                         | HMVMX_READ_IDT_VECTORING_ERROR_CODE
    89198873                         | HMVMX_READ_GUEST_PHYSICAL_ADDR>(pVCpu, pVmxTransient);
    8920 # else
    8921     vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
    8922     vmxHCReadExitIntInfoVmcs(pVCpu, pVmxTransient);
    8923     vmxHCReadExitIntErrorCodeVmcs(pVCpu, pVmxTransient);
    8924     vmxHCReadIdtVectoringInfoVmcs(pVCpu, pVmxTransient);
    8925     vmxHCReadIdtVectoringErrorCodeVmcs(pVCpu, pVmxTransient);
    8926 # endif
    89278874
    89288875    /*
     
    89608907     */
    89618908    PVMXVMCSINFO pVmcsInfo = pVmxTransient->pVmcsInfo;
    8962 # ifndef HMVMX_WITH_CONDENSED_VMREADS
    8963     vmxHCReadGuestPhysicalAddrVmcs(pVCpu, pVmxTransient);
    8964 # endif
    89658909    int rc = vmxHCImportGuestState(pVCpu, pVmcsInfo, IEM_CPUMCTX_EXTRN_MUST_MASK);
    89668910    AssertRCReturn(rc, rc);
     
    90358979    Assert(pVCpu->CTX_SUFF(pVM)->hmr0.s.fNestedPaging);
    90368980
    9037 # ifdef HMVMX_WITH_CONDENSED_VMREADS
    90388981    vmxHCReadToTransient<  HMVMX_READ_EXIT_QUALIFICATION
    90398982                         | HMVMX_READ_EXIT_INSTR_LEN
     
    90438986                         | HMVMX_READ_IDT_VECTORING_ERROR_CODE
    90448987                         | HMVMX_READ_GUEST_PHYSICAL_ADDR>(pVCpu, pVmxTransient);
    9045 # else
    9046     vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
    9047     vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
    9048     vmxHCReadExitIntInfoVmcs(pVCpu, pVmxTransient);
    9049     vmxHCReadExitIntErrorCodeVmcs(pVCpu, pVmxTransient);
    9050     vmxHCReadIdtVectoringInfoVmcs(pVCpu, pVmxTransient);
    9051     vmxHCReadIdtVectoringErrorCodeVmcs(pVCpu, pVmxTransient);
    9052 # endif
    90538988
    90548989    /*
     
    90729007
    90739008    PVMXVMCSINFO pVmcsInfo = pVmxTransient->pVmcsInfo;
    9074 # ifndef HMVMX_WITH_CONDENSED_VMREADS
    9075     vmxHCReadGuestPhysicalAddrVmcs(pVCpu, pVmxTransient);
    9076 # endif
    90779009    int rc = vmxHCImportGuestState(pVCpu, pVmcsInfo, IEM_CPUMCTX_EXTRN_MUST_MASK);
    90789010    AssertRCReturn(rc, rc);
     
    91189050    PVM pVM = pVCpu->CTX_SUFF(pVM);
    91199051    uint64_t const uHostTsc = ASMReadTSC(); RT_NOREF(uHostTsc);
    9120     vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
    9121     vmxHCReadGuestPhysicalAddrVmcs(pVCpu, pVmxTransient);
     9052    vmxHCReadToTransient<  HMVMX_READ_EXIT_QUALIFICATION
     9053                         | HMVMX_READ_GUEST_PHYSICAL_ADDR>(pVCpu, pVmxTransient);
    91229054    vmxHCImportGuestRip(pVCpu);
    91239055    vmxHCImportGuestSegReg(pVCpu, X86_SREG_CS);
     
    92009132    HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient);
    92019133
    9202 # ifdef HMVMX_WITH_CONDENSED_VMREADS
    92039134    vmxHCReadToTransient<  HMVMX_READ_EXIT_QUALIFICATION
    92049135                         | HMVMX_READ_EXIT_INSTR_INFO
    92059136                         | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    9206 # else
    9207     vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
    9208     vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient);
    9209     vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
    9210 # endif
    92119137    int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, CPUMCTX_EXTRN_RSP | CPUMCTX_EXTRN_SREG_MASK
    92129138                                                                    | CPUMCTX_EXTRN_HWVIRT
     
    92409166    /* Import the entire VMCS state for now as we would be switching VMCS on successful VMLAUNCH,
    92419167       otherwise we could import just IEM_CPUMCTX_EXTRN_VMX_VMENTRY_MASK. */
    9242     vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
     9168    vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    92439169    int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, HMVMX_CPUMCTX_EXTRN_ALL);
    92449170    AssertRCReturn(rc, rc);
     
    92679193    HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient);
    92689194
    9269 # ifdef HMVMX_WITH_CONDENSED_VMREADS
    92709195    vmxHCReadToTransient<  HMVMX_READ_EXIT_QUALIFICATION
    92719196                         | HMVMX_READ_EXIT_INSTR_INFO
    92729197                         | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    9273 # else
    9274     vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
    9275     vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient);
    9276     vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
    9277 # endif
    92789198    int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, CPUMCTX_EXTRN_RSP | CPUMCTX_EXTRN_SREG_MASK
    92799199                                                                    | CPUMCTX_EXTRN_HWVIRT
     
    93059225    HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient);
    93069226
    9307 # ifdef HMVMX_WITH_CONDENSED_VMREADS
    93089227    vmxHCReadToTransient<  HMVMX_READ_EXIT_QUALIFICATION
    93099228                         | HMVMX_READ_EXIT_INSTR_INFO
    93109229                         | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    9311 # else
    9312     vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
    9313     vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient);
    9314     vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
    9315 #endif
    93169230    int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, CPUMCTX_EXTRN_RSP | CPUMCTX_EXTRN_SREG_MASK
    93179231                                                                    | CPUMCTX_EXTRN_HWVIRT
     
    93489262     * code elsewhere dares look at unsynced VMCS fields.
    93499263     */
    9350 # ifdef HMVMX_WITH_CONDENSED_VMREADS
    93519264    vmxHCReadToTransient<  HMVMX_READ_EXIT_QUALIFICATION
    93529265                         | HMVMX_READ_EXIT_INSTR_INFO
    93539266                         | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    9354 # else
    9355     vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
    9356     vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient);
    9357     vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
    9358 # endif
    93599267    int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, CPUMCTX_EXTRN_RSP | CPUMCTX_EXTRN_SREG_MASK
    93609268                                                                    | CPUMCTX_EXTRN_HWVIRT
     
    94109318    /* Import the entire VMCS state for now as we would be switching VMCS on successful VMRESUME,
    94119319       otherwise we could import just IEM_CPUMCTX_EXTRN_VMX_VMENTRY_MASK. */
    9412     vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
     9320    vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    94139321    int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, HMVMX_CPUMCTX_EXTRN_ALL);
    94149322    AssertRCReturn(rc, rc);
     
    94429350     * flags re-loading the entire shadow VMCS, we should save the entire shadow VMCS here.
    94439351     */
    9444 # ifdef HMVMX_WITH_CONDENSED_VMREADS
    94459352    vmxHCReadToTransient<  HMVMX_READ_EXIT_QUALIFICATION
    94469353                         | HMVMX_READ_EXIT_INSTR_INFO
    94479354                         | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    9448 # else
    9449     vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
    9450     vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient);
    9451     vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
    9452 # endif
    94539355    int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, CPUMCTX_EXTRN_RSP | CPUMCTX_EXTRN_SREG_MASK
    94549356                                                                    | CPUMCTX_EXTRN_HWVIRT
     
    94819383    HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient);
    94829384
    9483     vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
     9385    vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    94849386    int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, CPUMCTX_EXTRN_CR4
    94859387                                                                    | CPUMCTX_EXTRN_HWVIRT
     
    95089410    HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient);
    95099411
    9510 # ifdef HMVMX_WITH_CONDENSED_VMREADS
    95119412    vmxHCReadToTransient<  HMVMX_READ_EXIT_QUALIFICATION
    95129413                         | HMVMX_READ_EXIT_INSTR_INFO
    95139414                         | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    9514 # else
    9515     vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
    9516     vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient);
    9517     vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
    9518 # endif
    95199415    int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, CPUMCTX_EXTRN_RSP | CPUMCTX_EXTRN_SREG_MASK
    95209416                                                                    | CPUMCTX_EXTRN_HWVIRT
     
    95469442    HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient);
    95479443
    9548 # ifdef HMVMX_WITH_CONDENSED_VMREADS
    95499444    vmxHCReadToTransient<  HMVMX_READ_EXIT_QUALIFICATION
    95509445                         | HMVMX_READ_EXIT_INSTR_INFO
    95519446                         | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    9552 # else
    9553     vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
    9554     vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient);
    9555     vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
    9556 # endif
    95579447    int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, CPUMCTX_EXTRN_RSP | CPUMCTX_EXTRN_SREG_MASK
    95589448                                                                    | IEM_CPUMCTX_EXTRN_EXEC_DECODED_MEM_MASK);
     
    95849474    HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient);
    95859475
    9586 # ifdef HMVMX_WITH_CONDENSED_VMREADS
    95879476    vmxHCReadToTransient<  HMVMX_READ_EXIT_QUALIFICATION
    95889477                         | HMVMX_READ_EXIT_INSTR_INFO
    95899478                         | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    9590 # else
    9591     vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
    9592     vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient);
    9593     vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
    9594 # endif
    95959479    int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, CPUMCTX_EXTRN_RSP | CPUMCTX_EXTRN_SREG_MASK
    95969480                                                                    | IEM_CPUMCTX_EXTRN_EXEC_DECODED_MEM_MASK);
     
    96339517    HMVMX_VALIDATE_NESTED_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient);
    96349518
    9635     vmxHCReadExitIntInfoVmcs(pVCpu, pVmxTransient);
     9519    vmxHCReadToTransient<HMVMX_READ_EXIT_INTERRUPTION_INFO>(pVCpu, pVmxTransient);
    96369520
    96379521    uint64_t const uExitIntInfo = pVmxTransient->uExitIntInfo;
     
    96609544        case VMX_EXIT_INT_INFO_TYPE_HW_XCPT:
    96619545        {
    9662 # ifdef HMVMX_WITH_CONDENSED_VMREADS
    96639546            vmxHCReadToTransient<  HMVMX_READ_EXIT_INTERRUPTION_ERROR_CODE
    96649547                                 | HMVMX_READ_EXIT_INSTR_LEN
    96659548                                 | HMVMX_READ_IDT_VECTORING_INFO
    96669549                                 | HMVMX_READ_IDT_VECTORING_ERROR_CODE>(pVCpu, pVmxTransient);
    9667 # else
    9668             vmxHCReadExitIntErrorCodeVmcs(pVCpu, pVmxTransient);
    9669             vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
    9670             vmxHCReadIdtVectoringInfoVmcs(pVCpu, pVmxTransient);
    9671             vmxHCReadIdtVectoringErrorCodeVmcs(pVCpu, pVmxTransient);
    9672 # endif
    96739550
    96749551            PCCPUMCTX pCtx = &pVCpu->cpum.GstCtx;
     
    96769553            {
    96779554                /* Exit qualification is required for debug and page-fault exceptions. */
    9678                 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
     9555                vmxHCReadToTransient<HMVMX_READ_EXIT_QUALIFICATION>(pVCpu, pVmxTransient);
    96799556
    96809557                /*
     
    97719648    HMVMX_VALIDATE_NESTED_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient);
    97729649
    9773 # ifdef HMVMX_WITH_CONDENSED_VMREADS
    97749650    vmxHCReadToTransient<  HMVMX_READ_EXIT_QUALIFICATION
    97759651                         | HMVMX_READ_EXIT_INSTR_LEN
    97769652                         | HMVMX_READ_IDT_VECTORING_INFO
    97779653                         | HMVMX_READ_IDT_VECTORING_ERROR_CODE>(pVCpu, pVmxTransient);
    9778 # else
    9779     vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
    9780     vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
    9781     vmxHCReadIdtVectoringInfoVmcs(pVCpu, pVmxTransient);
    9782     vmxHCReadIdtVectoringErrorCodeVmcs(pVCpu, pVmxTransient);
    9783 # endif
     9654
    97849655    VMXVEXITINFO const      ExitInfo      = VMXVEXITINFO_INIT_WITH_QUAL_AND_INSTR_LEN_FROM_TRANSIENT(pVmxTransient);
    97859656    VMXVEXITEVENTINFO const ExitEventInfo = VMXVEXITEVENTINFO_INIT_ONLY_IDT(pVmxTransient->uIdtVectoringInfo,
     
    97989669    if (CPUMIsGuestVmxProcCtlsSet(&pVCpu->cpum.GstCtx, VMX_PROC_CTLS_HLT_EXIT))
    97999670    {
    9800         vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
     9671        vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    98019672        return IEMExecVmxVmexitInstr(pVCpu, pVmxTransient->uExitReason, pVmxTransient->cbExitInstr);
    98029673    }
     
    98149685    if (CPUMIsGuestVmxProcCtlsSet(&pVCpu->cpum.GstCtx, VMX_PROC_CTLS_INVLPG_EXIT))
    98159686    {
    9816 # ifdef HMVMX_WITH_CONDENSED_VMREADS
    98179687        vmxHCReadToTransient<  HMVMX_READ_EXIT_QUALIFICATION
    98189688                             | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    9819 # else
    9820         vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
    9821         vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
    9822 # endif
    98239689        VMXVEXITINFO const ExitInfo = VMXVEXITINFO_INIT_WITH_QUAL_AND_INSTR_LEN_FROM_TRANSIENT(pVmxTransient);
    98249690        return IEMExecVmxVmexitInstrWithInfo(pVCpu, &ExitInfo);
     
    98379703    if (CPUMIsGuestVmxProcCtlsSet(&pVCpu->cpum.GstCtx, VMX_PROC_CTLS_RDPMC_EXIT))
    98389704    {
    9839         vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
     9705        vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    98409706        return IEMExecVmxVmexitInstr(pVCpu, pVmxTransient->uExitReason, pVmxTransient->cbExitInstr);
    98419707    }
     
    98559721           || pVmxTransient->uExitReason == VMX_EXIT_VMWRITE);
    98569722
    9857     vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient);
     9723    vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_INFO>(pVCpu, pVmxTransient);
    98589724
    98599725    uint8_t const iGReg = pVmxTransient->ExitInstrInfo.VmreadVmwrite.iReg2;
     
    98679733    if (CPUMIsGuestVmxVmreadVmwriteInterceptSet(pVCpu, pVmxTransient->uExitReason, u64VmcsField))
    98689734    {
    9869 # ifdef HMVMX_WITH_CONDENSED_VMREADS
    98709735        vmxHCReadToTransient<  HMVMX_READ_EXIT_QUALIFICATION
    98719736                             | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    9872 # else
    9873         vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
    9874         vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
    9875 # endif
    98769737        VMXVEXITINFO const ExitInfo = VMXVEXITINFO_INIT_WITH_QUAL_AND_INSTR_INFO_FROM_TRANSIENT(pVmxTransient);
    98779738        return IEMExecVmxVmexitInstrWithInfo(pVCpu, &ExitInfo);
     
    98939754    if (CPUMIsGuestVmxProcCtlsSet(&pVCpu->cpum.GstCtx, VMX_PROC_CTLS_RDTSC_EXIT))
    98949755    {
    9895         vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
     9756        vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    98969757        return IEMExecVmxVmexitInstr(pVCpu, pVmxTransient->uExitReason, pVmxTransient->cbExitInstr);
    98979758    }
     
    99099770    HMVMX_VALIDATE_NESTED_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient);
    99109771
    9911 # ifdef HMVMX_WITH_CONDENSED_VMREADS
    99129772    vmxHCReadToTransient<  HMVMX_READ_EXIT_QUALIFICATION
    99139773                         | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    9914 # else
    9915     vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
    9916     vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
    9917 # endif
    99189774
    99199775    VBOXSTRICTRC rcStrict;
     
    100199875            if (fMemOperand)
    100209876            {
    10021                 vmxHCReadGuestLinearAddrVmcs(pVCpu, pVmxTransient);
     9877                vmxHCReadToTransient<HMVMX_READ_GUEST_LINEAR_ADDR>(pVCpu, pVmxTransient);
    100229878                GCPtrEffDst = pVmxTransient->uGuestLinearAddr;
    100239879            }
     
    100629918    if (CPUMIsGuestVmxProcCtlsSet(&pVCpu->cpum.GstCtx, VMX_PROC_CTLS_MOV_DR_EXIT))
    100639919    {
    10064 # ifdef HMVMX_WITH_CONDENSED_VMREADS
    100659920        vmxHCReadToTransient<  HMVMX_READ_EXIT_QUALIFICATION
    100669921                             | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    10067 # else
    10068         vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
    10069         vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
    10070 # endif
    100719922        VMXVEXITINFO const ExitInfo = VMXVEXITINFO_INIT_WITH_QUAL_AND_INSTR_LEN_FROM_TRANSIENT(pVmxTransient);
    100729923        return IEMExecVmxVmexitInstrWithInfo(pVCpu, &ExitInfo);
     
    100849935    HMVMX_VALIDATE_NESTED_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient);
    100859936
    10086     vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
     9937    vmxHCReadToTransient<HMVMX_READ_EXIT_QUALIFICATION>(pVCpu, pVmxTransient);
    100879938
    100889939    uint32_t const uIOPort = VMX_EXIT_QUAL_IO_PORT(pVmxTransient->uExitQual);
     
    101049955         */
    101059956        PVMCC pVM = pVCpu->CTX_SUFF(pVM);
    10106         vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
     9957        vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    101079958
    101089959        /* Make sure we don't use stale/uninitialized VMX-transient info. below. */
     
    101149965        if (fIOString)
    101159966        {
    10116             vmxHCReadGuestLinearAddrVmcs(pVCpu, pVmxTransient);
     9967            vmxHCReadToTransient<HMVMX_READ_GUEST_LINEAR_ADDR>(pVCpu, pVmxTransient);
    101179968            if (fVmxInsOutsInfo)
    101189969            {
    101199970                Assert(RT_BF_GET(g_HmMsrs.u.vmx.u64Basic, VMX_BF_BASIC_VMCS_INS_OUTS)); /* Paranoia. */
    10120                 vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient);
     9971                vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_INFO>(pVCpu, pVmxTransient);
    101219972            }
    101229973        }
     
    101449995    if (fMsrpm & VMXMSRPM_EXIT_RD)
    101459996    {
    10146         vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
     9997        vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    101479998        return IEMExecVmxVmexitInstr(pVCpu, pVmxTransient->uExitReason, pVmxTransient->cbExitInstr);
    101489999    }
     
    1016610017    if (fMsrpm & VMXMSRPM_EXIT_WR)
    1016710018    {
    10168         vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
     10019        vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    1016910020        return IEMExecVmxVmexitInstr(pVCpu, pVmxTransient->uExitReason, pVmxTransient->cbExitInstr);
    1017010021    }
     
    1018210033    if (CPUMIsGuestVmxProcCtlsSet(&pVCpu->cpum.GstCtx, VMX_PROC_CTLS_MWAIT_EXIT))
    1018310034    {
    10184         vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
     10035        vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    1018510036        return IEMExecVmxVmexitInstr(pVCpu, pVmxTransient->uExitReason, pVmxTransient->cbExitInstr);
    1018610037    }
     
    1019810049
    1019910050    /** @todo NSTVMX: Should consider debugging nested-guests using VM debugger. */
    10200     vmxHCReadGuestPendingDbgXctps(pVCpu, pVmxTransient);
     10051    vmxHCReadToTransient<HMVMX_READ_GUEST_PENDING_DBG_XCPTS>(pVCpu, pVmxTransient);
    1020110052    VMXVEXITINFO const ExitInfo = VMXVEXITINFO_INIT_WITH_DBG_XCPTS_FROM_TRANSIENT(pVmxTransient);
    1020210053    return IEMExecVmxVmexitTrapLike(pVCpu, &ExitInfo);
     
    1021310064    if (CPUMIsGuestVmxProcCtlsSet(&pVCpu->cpum.GstCtx, VMX_PROC_CTLS_MONITOR_EXIT))
    1021410065    {
    10215         vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
     10066        vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    1021610067        return IEMExecVmxVmexitInstr(pVCpu, pVmxTransient->uExitReason, pVmxTransient->cbExitInstr);
    1021710068    }
     
    1023510086        || CPUMIsGuestVmxProcCtls2Set(&pVCpu->cpum.GstCtx, VMX_PROC_CTLS2_PAUSE_LOOP_EXIT))
    1023610087    {
    10237         vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
     10088        vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    1023810089        return IEMExecVmxVmexitInstr(pVCpu, pVmxTransient->uExitReason, pVmxTransient->cbExitInstr);
    1023910090    }
     
    1025210103    if (CPUMIsGuestVmxProcCtlsSet(&pVCpu->cpum.GstCtx, VMX_PROC_CTLS_USE_TPR_SHADOW))
    1025310104    {
    10254         vmxHCReadGuestPendingDbgXctps(pVCpu, pVmxTransient);
     10105        vmxHCReadToTransient<HMVMX_READ_GUEST_PENDING_DBG_XCPTS>(pVCpu, pVmxTransient);
    1025510106        VMXVEXITINFO const ExitInfo = VMXVEXITINFO_INIT_WITH_DBG_XCPTS_FROM_TRANSIENT(pVmxTransient);
    1025610107        return IEMExecVmxVmexitTrapLike(pVCpu, &ExitInfo);
     
    1026810119    HMVMX_VALIDATE_NESTED_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient);
    1026910120
    10270 # ifdef HMVMX_WITH_CONDENSED_VMREADS
    1027110121    vmxHCReadToTransient<  HMVMX_READ_EXIT_QUALIFICATION
    1027210122                         | HMVMX_READ_EXIT_INSTR_LEN
    1027310123                         | HMVMX_READ_IDT_VECTORING_INFO
    1027410124                         | HMVMX_READ_IDT_VECTORING_ERROR_CODE>(pVCpu, pVmxTransient);
    10275 # else
    10276     vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
    10277     vmxHCReadIdtVectoringInfoVmcs(pVCpu, pVmxTransient);
    10278     vmxHCReadIdtVectoringErrorCodeVmcs(pVCpu, pVmxTransient);
    10279     vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
    10280 # endif
    1028110125
    1028210126    Assert(CPUMIsGuestVmxProcCtls2Set(&pVCpu->cpum.GstCtx, VMX_PROC_CTLS2_VIRT_APIC_ACCESS));
     
    1030110145
    1030210146    Assert(CPUMIsGuestVmxProcCtls2Set(&pVCpu->cpum.GstCtx, VMX_PROC_CTLS2_APIC_REG_VIRT));
    10303     vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
     10147    vmxHCReadToTransient<HMVMX_READ_EXIT_QUALIFICATION>(pVCpu, pVmxTransient);
    1030410148    return IEMExecVmxVmexit(pVCpu, pVmxTransient->uExitReason, pVmxTransient->uExitQual);
    1030510149}
     
    1031510159
    1031610160    Assert(CPUMIsGuestVmxProcCtls2Set(&pVCpu->cpum.GstCtx, VMX_PROC_CTLS2_VIRT_INT_DELIVERY));
    10317     vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
     10161    vmxHCReadToTransient<HMVMX_READ_EXIT_QUALIFICATION>(pVCpu, pVmxTransient);
    1031810162    return IEMExecVmxVmexit(pVCpu, pVmxTransient->uExitReason, pVmxTransient->uExitQual);
    1031910163}
     
    1033010174    {
    1033110175        Assert(CPUMIsGuestVmxProcCtls2Set(&pVCpu->cpum.GstCtx, VMX_PROC_CTLS2_RDTSCP));
    10332         vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
     10176        vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    1033310177        return IEMExecVmxVmexitInstr(pVCpu, pVmxTransient->uExitReason, pVmxTransient->cbExitInstr);
    1033410178    }
     
    1034610190    if (CPUMIsGuestVmxProcCtls2Set(&pVCpu->cpum.GstCtx, VMX_PROC_CTLS2_WBINVD_EXIT))
    1034710191    {
    10348         vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
     10192        vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    1034910193        return IEMExecVmxVmexitInstr(pVCpu, pVmxTransient->uExitReason, pVmxTransient->cbExitInstr);
    1035010194    }
     
    1036310207    {
    1036410208        Assert(CPUMIsGuestVmxProcCtls2Set(&pVCpu->cpum.GstCtx, VMX_PROC_CTLS2_INVPCID));
    10365 # ifdef HMVMX_WITH_CONDENSED_VMREADS
    1036610209        vmxHCReadToTransient<  HMVMX_READ_EXIT_QUALIFICATION
    1036710210                             | HMVMX_READ_EXIT_INSTR_INFO
    1036810211                             | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    10369 # else
    10370         vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
    10371         vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
    10372         vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient);
    10373 # endif
    1037410212        VMXVEXITINFO const ExitInfo = VMXVEXITINFO_INIT_WITH_QUAL_AND_INSTR_INFO_FROM_TRANSIENT(pVmxTransient);
    1037510213        return IEMExecVmxVmexitInstrWithInfo(pVCpu, &ExitInfo);
     
    1042310261#endif
    1042410262
    10425     vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
     10263    vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient);
    1042610264    return IEMExecVmxVmexitInstr(pVCpu, pVmxTransient->uExitReason, pVmxTransient->cbExitInstr);
    1042710265}
     
    1047310311# endif
    1047410312
    10475 # ifdef HMVMX_WITH_CONDENSED_VMREADS
    1047610313    vmxHCReadToTransient<  HMVMX_READ_EXIT_QUALIFICATION
    1047710314                         | HMVMX_READ_EXIT_INSTR_LEN
    1047810315                         | HMVMX_READ_EXIT_INSTR_INFO>(pVCpu, pVmxTransient);
    10479 # else
    10480     vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
    10481     vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
    10482     vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient);
    10483 # endif
    1048410316    VMXVEXITINFO const ExitInfo = VMXVEXITINFO_INIT_WITH_QUAL_AND_INSTR_INFO_FROM_TRANSIENT(pVmxTransient);
    1048510317    return IEMExecVmxVmexitInstrWithInfo(pVCpu, &ExitInfo);
     
    1050710339
    1050810340#  ifdef DSL_IRQ_FIX_2
    10509 #   ifdef HMVMX_WITH_CONDENSED_VMREADS
    1051010341        vmxHCReadToTransient<  HMVMX_READ_EXIT_QUALIFICATION
    1051110342                             | HMVMX_READ_EXIT_INSTR_LEN
     
    1051510346                             | HMVMX_READ_IDT_VECTORING_ERROR_CODE
    1051610347                             | HMVMX_READ_GUEST_PHYSICAL_ADDR>(pVCpu, pVmxTransient);
    10517 #   else
    10518         vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
    10519         vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
    10520         vmxHCReadExitIntInfoVmcs(pVCpu, pVmxTransient);
    10521         vmxHCReadExitIntErrorCodeVmcs(pVCpu, pVmxTransient);
    10522         vmxHCReadIdtVectoringInfoVmcs(pVCpu, pVmxTransient);
    10523         vmxHCReadIdtVectoringErrorCodeVmcs(pVCpu, pVmxTransient);
    10524         vmxHCReadGuestPhysicalAddrVmcs(pVCpu, pVmxTransient);
    10525 #   endif
    1052610348
    1052710349        /*
     
    1055210374        if (fIsLinearAddrValid)
    1055310375        {
    10554             vmxHCReadGuestLinearAddrVmcs(pVCpu, pVmxTransient);
     10376            vmxHCReadToTransient<HMVMX_READ_GUEST_LINEAR_ADDR>(pVCpu, pVmxTransient);
    1055510377            GCPtrNestedFault = pVmxTransient->uGuestLinearAddr;
    1055610378        }
     
    1064310465        AssertRCReturn(rc, rc);
    1064410466
    10645         vmxHCReadGuestPhysicalAddrVmcs(pVCpu, pVmxTransient);
     10467        vmxHCReadToTransient<HMVMX_READ_GUEST_PHYSICAL_ADDR>(pVCpu, pVmxTransient);
    1064610468
    1064710469        PGMPTWALK Walk;
     
    1065810480
    1065910481        AssertMsg(Walk.fFailed & PGM_WALKFAIL_EPT_MISCONFIG, ("GCPhysNestedFault=%#RGp\n", GCPhysNestedFault));
    10660 #  ifdef HMVMX_WITH_CONDENSED_VMREADS
    1066110482        vmxHCReadToTransient<  HMVMX_READ_IDT_VECTORING_INFO
    1066210483                             | HMVMX_READ_IDT_VECTORING_ERROR_CODE>(pVCpu, pVmxTransient);
    10663 #  else
    10664         vmxHCReadIdtVectoringInfoVmcs(pVCpu, pVmxTransient);
    10665         vmxHCReadIdtVectoringErrorCodeVmcs(pVCpu, pVmxTransient);
    10666 #  endif
    1066710484
    1066810485        VMXVEXITEVENTINFO const ExitEventInfo = VMXVEXITEVENTINFO_INIT_ONLY_IDT(pVmxTransient->uIdtVectoringInfo,
     
    1125011067                        if (VMX_EXIT_INT_INFO_IS_ERROR_CODE_VALID(pVmxTransient->uExitIntInfo))
    1125111068                        {
    11252                             vmxHCReadExitIntErrorCodeVmcs(pVCpu, pVmxTransient);
     11069                            vmxHCReadToTransient<HMVMX_READ_EXIT_INTERRUPTION_ERROR_CODE>(pVCpu, pVmxTransient);
    1125311070                            uEventArg = pVmxTransient->uExitIntErrorCode;
    1125411071                        }
     
    1132011137        case VMX_EXIT_VMXON:            SET_BOTH(VMX_VMXON); break;
    1132111138        case VMX_EXIT_MOV_CRX:
    11322             vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
     11139            vmxHCReadToTransient<HMVMX_READ_EXIT_QUALIFICATION>(pVCpu, pVmxTransient);
    1132311140            if (VMX_EXIT_QUAL_CRX_ACCESS(pVmxTransient->uExitQual) == VMX_EXIT_QUAL_CRX_ACCESS_READ)
    1132411141                SET_BOTH(CRX_READ);
     
    1132811145            break;
    1132911146        case VMX_EXIT_MOV_DRX:
    11330             vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
     11147            vmxHCReadToTransient<HMVMX_READ_EXIT_QUALIFICATION>(pVCpu, pVmxTransient);
    1133111148            if (   VMX_EXIT_QUAL_DRX_DIRECTION(pVmxTransient->uExitQual)
    1133211149                == VMX_EXIT_QUAL_DRX_DIRECTION_READ)
     
    1134211159        case VMX_EXIT_PAUSE:            SET_BOTH(PAUSE); break;
    1134311160        case VMX_EXIT_GDTR_IDTR_ACCESS:
    11344             vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient);
     11161            vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_INFO>(pVCpu, pVmxTransient);
    1134511162            switch (RT_BF_GET(pVmxTransient->ExitInstrInfo.u, VMX_BF_XDTR_INSINFO_INSTR_ID))
    1134611163            {
     
    1135311170
    1135411171        case VMX_EXIT_LDTR_TR_ACCESS:
    11355             vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient);
     11172            vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_INFO>(pVCpu, pVmxTransient);
    1135611173            switch (RT_BF_GET(pVmxTransient->ExitInstrInfo.u, VMX_BF_YYTR_INSINFO_INSTR_ID))
    1135711174            {
     
    1141111228    if (fDtrace1 || fDtrace2)
    1141211229    {
    11413         vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
     11230        vmxHCReadToTransient<HMVMX_READ_EXIT_QUALIFICATION>(pVCpu, pVmxTransient);
    1141411231        vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, HMVMX_CPUMCTX_EXTRN_ALL);
    1141511232        PCPUMCTX pCtx = &pVCpu->cpum.GstCtx;
     
    1159811415    else
    1159911416    {
    11600         vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
     11417        vmxHCReadToTransient<HMVMX_READ_EXIT_QUALIFICATION>(pVCpu, pVmxTransient);
    1160111418        int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, HMVMX_CPUMCTX_EXTRN_ALL);
    1160211419        AssertRC(rc);
     
    1161211429    else
    1161311430    {
    11614         vmxHCReadExitIntInfoVmcs(pVCpu, pVmxTransient);
     11431        vmxHCReadToTransient<HMVMX_READ_EXIT_INTERRUPTION_INFO>(pVCpu, pVmxTransient);
    1161511432        uint32_t const uIntType = VMX_EXIT_INT_INFO_TYPE(pVmxTransient->uExitIntInfo);
    1161611433        if (uIntType == VMX_EXIT_INT_INFO_TYPE_NMI)
  • trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp

    r97022 r97054  
    41664166            rc    |= VMXReadVmcs32(VMX_VMCS32_RO_VM_INSTR_ERROR, &pVCpu->hm.s.vmx.LastError.u32InstrError);
    41674167            AssertRC(rc);
    4168             vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
     4168            vmxHCReadToTransientSlow<HMVMX_READ_EXIT_QUALIFICATION>(pVCpu, pVmxTransient);
    41694169
    41704170            pVCpu->hm.s.vmx.LastError.idEnteredCpu = pVCpu->hmr0.s.idEnteredCpu;
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