Changeset 97054 in vbox for trunk/src/VBox
- Timestamp:
- Oct 7, 2022 11:09:55 PM (2 years ago)
- svn:sync-xref-src-repo-rev:
- 154003
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/VMXAllTemplate.cpp.h
r97053 r97054 1361 1361 { 1362 1362 uint32_t const fVmcsFieldsRead = pVmxTransient->fVmcsFieldsRead; 1363 int rc;1364 1363 1365 1364 if ( (a_fReadMask & HMVMX_READ_EXIT_QUALIFICATION) 1366 1365 && !(fVmcsFieldsRead & HMVMX_READ_EXIT_QUALIFICATION)) 1367 1366 { 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); 1369 1368 AssertRC(rc); 1370 1369 } … … 1372 1371 && !(fVmcsFieldsRead & HMVMX_READ_EXIT_INSTR_LEN)) 1373 1372 { 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); 1375 1374 AssertRC(rc); 1376 1375 } … … 1378 1377 && !(fVmcsFieldsRead & HMVMX_READ_EXIT_INSTR_INFO)) 1379 1378 { 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); 1381 1380 AssertRC(rc); 1382 1381 } … … 1384 1383 && !(fVmcsFieldsRead & HMVMX_READ_IDT_VECTORING_INFO)) 1385 1384 { 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); 1387 1386 AssertRC(rc); 1388 1387 } … … 1390 1389 && !(fVmcsFieldsRead & HMVMX_READ_IDT_VECTORING_ERROR_CODE)) 1391 1390 { 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); 1393 1392 AssertRC(rc); 1394 1393 } … … 1396 1395 && !(fVmcsFieldsRead & HMVMX_READ_EXIT_INTERRUPTION_INFO)) 1397 1396 { 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); 1399 1398 AssertRC(rc); 1400 1399 } … … 1402 1401 && !(fVmcsFieldsRead & HMVMX_READ_EXIT_INTERRUPTION_ERROR_CODE)) 1403 1402 { 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); 1405 1404 AssertRC(rc); 1406 1405 } … … 1408 1407 && !(fVmcsFieldsRead & HMVMX_READ_GUEST_LINEAR_ADDR)) 1409 1408 { 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); 1411 1410 AssertRC(rc); 1412 1411 } … … 1414 1413 && !(fVmcsFieldsRead & HMVMX_READ_GUEST_PHYSICAL_ADDR)) 1415 1414 { 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); 1417 1416 AssertRC(rc); 1418 1417 } … … 1440 1439 if (RT_LIKELY(!(pVmxTransient->fVmcsFieldsRead & a_fReadMask))) 1441 1440 { 1442 int rc;1443 1441 if (a_fReadMask & HMVMX_READ_EXIT_QUALIFICATION) 1444 1442 { 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); 1446 1444 AssertRC(rc); 1447 1445 } 1448 1446 if (a_fReadMask & HMVMX_READ_EXIT_INSTR_LEN) 1449 1447 { 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); 1451 1449 AssertRC(rc); 1452 1450 } 1453 1451 if (a_fReadMask & HMVMX_READ_EXIT_INSTR_INFO) 1454 1452 { 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); 1456 1454 AssertRC(rc); 1457 1455 } 1458 1456 if (a_fReadMask & HMVMX_READ_IDT_VECTORING_INFO) 1459 1457 { 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); 1461 1459 AssertRC(rc); 1462 1460 } 1463 1461 if (a_fReadMask & HMVMX_READ_IDT_VECTORING_ERROR_CODE) 1464 1462 { 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); 1466 1464 AssertRC(rc); 1467 1465 } 1468 1466 if (a_fReadMask & HMVMX_READ_EXIT_INTERRUPTION_INFO) 1469 1467 { 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); 1471 1469 AssertRC(rc); 1472 1470 } 1473 1471 if (a_fReadMask & HMVMX_READ_EXIT_INTERRUPTION_ERROR_CODE) 1474 1472 { 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); 1476 1474 AssertRC(rc); 1477 1475 } 1478 1476 if (a_fReadMask & HMVMX_READ_GUEST_LINEAR_ADDR) 1479 1477 { 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); 1481 1479 AssertRC(rc); 1482 1480 } 1483 1481 if (a_fReadMask & HMVMX_READ_GUEST_PHYSICAL_ADDR) 1484 1482 { 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); 1486 1484 AssertRC(rc); 1487 1485 } … … 5844 5842 static int vmxHCAdvanceGuestRip(PVMCPUCC pVCpu, PVMXTRANSIENT pVmxTransient) 5845 5843 { 5846 vmxHCRead ExitInstrLenVmcs(pVCpu, pVmxTransient);5844 vmxHCReadToTransientSlow<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 5847 5845 int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, CPUMCTX_EXTRN_RIP | CPUMCTX_EXTRN_RFLAGS); 5848 5846 AssertRCReturn(rc, rc); … … 6490 6488 { 6491 6489 HMVMX_VALIDATE_EXIT_XCPT_HANDLER_PARAMS(pVCpu, pVmxTransient); 6492 vmxHCRead ExitQualVmcs(pVCpu, pVmxTransient);6490 vmxHCReadToTransient<HMVMX_READ_EXIT_QUALIFICATION>(pVCpu, pVmxTransient); 6493 6491 6494 6492 #ifndef IN_NEM_DARWIN … … 6765 6763 * Get the DR6-like values from the Exit qualification and pass it to DBGF for processing. 6766 6764 */ 6767 vmxHCRead ExitQualVmcs(pVCpu, pVmxTransient);6765 vmxHCReadToTransient<HMVMX_READ_EXIT_QUALIFICATION>(pVCpu, pVmxTransient); 6768 6766 6769 6767 /* Refer Intel spec. Table 27-1. "Exit Qualifications for debug exceptions" for the format. */ … … 7213 7211 STAM_PROFILE_ADV_START(&VCPU_2_VMXSTATS(pVCpu).StatExitXcptNmi, y3); 7214 7212 7215 vmxHCRead ExitIntInfoVmcs(pVCpu, pVmxTransient);7213 vmxHCReadToTransient<HMVMX_READ_EXIT_INTERRUPTION_INFO>(pVCpu, pVmxTransient); 7216 7214 7217 7215 uint32_t const uExitIntType = VMX_EXIT_INT_INFO_TYPE(pVmxTransient->uExitIntInfo); … … 7259 7257 { 7260 7258 NOREF(uVector); 7261 #ifdef HMVMX_WITH_CONDENSED_VMREADS7262 7259 vmxHCReadToTransient< HMVMX_READ_EXIT_INTERRUPTION_ERROR_CODE 7263 7260 | HMVMX_READ_EXIT_INSTR_LEN 7264 7261 | HMVMX_READ_IDT_VECTORING_INFO 7265 7262 | HMVMX_READ_IDT_VECTORING_ERROR_CODE>(pVCpu, pVmxTransient); 7266 #else7267 vmxHCReadExitIntErrorCodeVmcs(pVCpu, pVmxTransient);7268 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);7269 vmxHCReadIdtVectoringInfoVmcs(pVCpu, pVmxTransient);7270 vmxHCReadIdtVectoringErrorCodeVmcs(pVCpu, pVmxTransient);7271 #endif7272 7263 rcStrict = vmxHCExitXcpt(pVCpu, pVmxTransient); 7273 7264 break; … … 7378 7369 */ 7379 7370 PVMXVMCSINFO pVmcsInfo = pVmxTransient->pVmcsInfo; 7380 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient); 7381 7371 vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 7382 7372 int rc = vmxHCImportGuestState(pVCpu, pVmcsInfo, IEM_CPUMCTX_EXTRN_EXEC_DECODED_NO_MEM_MASK); 7383 7373 AssertRCReturn(rc, rc); … … 7450 7440 7451 7441 PVMXVMCSINFO pVmcsInfo = pVmxTransient->pVmcsInfo; 7452 vmxHCRead ExitInstrLenVmcs(pVCpu, pVmxTransient);7442 vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 7453 7443 int rc = vmxHCImportGuestState(pVCpu, pVmcsInfo, IEM_CPUMCTX_EXTRN_MUST_MASK); 7454 7444 AssertRCReturn(rc, rc); … … 7480 7470 7481 7471 PVMXVMCSINFO pVmcsInfo = pVmxTransient->pVmcsInfo; 7482 vmxHCRead ExitInstrLenVmcs(pVCpu, pVmxTransient);7472 vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 7483 7473 int rc = vmxHCImportGuestState(pVCpu, pVmcsInfo, IEM_CPUMCTX_EXTRN_MUST_MASK | CPUMCTX_EXTRN_TSC_AUX); 7484 7474 AssertRCReturn(rc, rc); … … 7585 7575 7586 7576 PVMXVMCSINFO pVmcsInfo = pVmxTransient->pVmcsInfo; 7587 #ifdef HMVMX_WITH_CONDENSED_VMREADS7588 7577 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 7589 7578 | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 7590 #else7591 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);7592 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);7593 #endif7594 7579 int rc = vmxHCImportGuestState(pVCpu, pVmcsInfo, IEM_CPUMCTX_EXTRN_EXEC_DECODED_MEM_MASK); 7595 7580 AssertRCReturn(rc, rc); … … 7619 7604 7620 7605 PVMXVMCSINFO pVmcsInfo = pVmxTransient->pVmcsInfo; 7621 vmxHCRead ExitInstrLenVmcs(pVCpu, pVmxTransient);7606 vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 7622 7607 int rc = vmxHCImportGuestState(pVCpu, pVmcsInfo, IEM_CPUMCTX_EXTRN_EXEC_DECODED_MEM_MASK | CPUMCTX_EXTRN_DS); 7623 7608 AssertRCReturn(rc, rc); … … 7644 7629 7645 7630 PVMXVMCSINFO pVmcsInfo = pVmxTransient->pVmcsInfo; 7646 vmxHCRead ExitInstrLenVmcs(pVCpu, pVmxTransient);7631 vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 7647 7632 int rc = vmxHCImportGuestState(pVCpu, pVmcsInfo, IEM_CPUMCTX_EXTRN_EXEC_DECODED_NO_MEM_MASK); 7648 7633 AssertRCReturn(rc, rc); … … 7734 7719 7735 7720 PVMXVMCSINFO pVmcsInfo = pVmxTransient->pVmcsInfo; 7736 vmxHCRead ExitInstrLenVmcs(pVCpu, pVmxTransient);7721 vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 7737 7722 int rc = vmxHCImportGuestState(pVCpu, pVmcsInfo, IEM_CPUMCTX_EXTRN_MUST_MASK | CPUMCTX_EXTRN_CR4); 7738 7723 AssertRCReturn(rc, rc); … … 7767 7752 return VERR_EM_INTERPRETER; 7768 7753 #else 7769 # ifdef HMVMX_WITH_CONDENSED_VMREADS7770 7754 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 7771 7755 | HMVMX_READ_EXIT_INSTR_INFO 7772 7756 | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 7773 # else7774 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);7775 vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient);7776 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);7777 # endif7778 7757 int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, CPUMCTX_EXTRN_RSP | CPUMCTX_EXTRN_SREG_MASK 7779 7758 | IEM_CPUMCTX_EXTRN_EXEC_DECODED_MEM_MASK); … … 7825 7804 uint32_t fIntrState; 7826 7805 uint64_t u64Val; 7827 # ifdef HMVMX_WITH_CONDENSED_VMREADS7828 7806 vmxHCReadToTransient< HMVMX_READ_EXIT_INSTR_INFO 7829 7807 | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 7830 # else7831 vmxHCReadEntryIntInfoVmcs(pVCpu, pVmxTransient);7832 vmxHCReadEntryInstrLenVmcs(pVCpu, pVmxTransient);7833 # endif7834 7808 vmxHCReadEntryXcptErrorCodeVmcs(pVCpu, pVmxTransient); 7835 7809 … … 7973 7947 } 7974 7948 7975 vmxHCRead ExitInstrLenVmcs(pVCpu, pVmxTransient);7949 vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 7976 7950 int rc = vmxHCImportGuestState(pVCpu, pVmcsInfo, fImport); 7977 7951 AssertRCReturn(rc, rc); … … 8046 8020 8047 8021 PVMXVMCSINFO pVmcsInfo = pVmxTransient->pVmcsInfo; 8048 vmxHCRead ExitInstrLenVmcs(pVCpu, pVmxTransient);8022 vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 8049 8023 int rc = vmxHCImportGuestState(pVCpu, pVmcsInfo, fImport); 8050 8024 AssertRCReturn(rc, rc); … … 8219 8193 8220 8194 PVMXVMCSINFO pVmcsInfo = pVmxTransient->pVmcsInfo; 8221 # ifdef HMVMX_WITH_CONDENSED_VMREADS8222 8195 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 8223 8196 | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 8224 # else8225 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);8226 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);8227 # endif8228 8197 8229 8198 VBOXSTRICTRC rcStrict; … … 8363 8332 if (fMemOperand) 8364 8333 { 8365 vmxHCRead GuestLinearAddrVmcs(pVCpu, pVmxTransient);8334 vmxHCReadToTransient<HMVMX_READ_GUEST_LINEAR_ADDR>(pVCpu, pVmxTransient); 8366 8335 GCPtrEffDst = pVmxTransient->uGuestLinearAddr; 8367 8336 } … … 8400 8369 PCPUMCTX pCtx = &pVCpu->cpum.GstCtx; 8401 8370 PVMXVMCSINFO pVmcsInfo = pVmxTransient->pVmcsInfo; 8402 # ifdef HMVMX_WITH_CONDENSED_VMREADS8403 8371 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 8404 8372 | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 8405 # else8406 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);8407 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);8408 #endif8409 8373 int rc = vmxHCImportGuestState(pVCpu, pVmcsInfo, IEM_CPUMCTX_EXTRN_MUST_MASK | CPUMCTX_EXTRN_SREG_MASK 8410 8374 | CPUMCTX_EXTRN_EFER); … … 8459 8423 if (fInsOutsInfo) 8460 8424 { 8461 vmxHCRead ExitInstrInfoVmcs(pVCpu, pVmxTransient);8425 vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_INFO>(pVCpu, pVmxTransient); 8462 8426 AssertReturn(pVmxTransient->ExitInstrInfo.StrIo.u3AddrSize <= 2, VERR_VMX_IPE_3); 8463 8427 AssertCompile(IEMMODE_16BIT == 0 && IEMMODE_32BIT == 1 && IEMMODE_64BIT == 2); … … 8646 8610 8647 8611 /* Check if this task-switch occurred while delivery an event through the guest IDT. */ 8648 vmxHCRead ExitQualVmcs(pVCpu, pVmxTransient);8612 vmxHCReadToTransient<HMVMX_READ_EXIT_QUALIFICATION>(pVCpu, pVmxTransient); 8649 8613 if (VMX_EXIT_QUAL_TASK_SWITCH_TYPE(pVmxTransient->uExitQual) == VMX_EXIT_QUAL_TASK_SWITCH_TYPE_IDT) 8650 8614 { 8651 vmxHCRead IdtVectoringInfoVmcs(pVCpu, pVmxTransient);8615 vmxHCReadToTransient<HMVMX_READ_IDT_VECTORING_INFO>(pVCpu, pVmxTransient); 8652 8616 if (VMX_IDT_VECTORING_INFO_IS_VALID(pVmxTransient->uIdtVectoringInfo)) 8653 8617 { … … 8655 8619 if (VMX_IDT_VECTORING_INFO_IS_ERROR_CODE_VALID(pVmxTransient->uIdtVectoringInfo)) 8656 8620 { 8657 vmxHCRead IdtVectoringErrorCodeVmcs(pVCpu, pVmxTransient);8621 vmxHCReadToTransient<HMVMX_READ_IDT_VECTORING_ERROR_CODE>(pVCpu, pVmxTransient); 8658 8622 uErrCode = pVmxTransient->uIdtVectoringErrorCode; 8659 8623 } … … 8667 8631 GCPtrFaultAddress = 0; 8668 8632 8669 vmxHCRead ExitInstrLenVmcs(pVCpu, pVmxTransient);8633 vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 8670 8634 8671 8635 vmxHCSetPendingEvent(pVCpu, VMX_ENTRY_INT_INFO_FROM_EXIT_IDT_INFO(pVmxTransient->uIdtVectoringInfo), … … 8708 8672 STAM_COUNTER_INC(&VCPU_2_VMXSTATS(pVCpu).StatExitApicAccess); 8709 8673 8710 #ifdef HMVMX_WITH_CONDENSED_VMREADS8711 8674 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 8712 8675 | HMVMX_READ_EXIT_INSTR_LEN … … 8715 8678 | HMVMX_READ_IDT_VECTORING_INFO 8716 8679 | HMVMX_READ_IDT_VECTORING_ERROR_CODE>(pVCpu, pVmxTransient); 8717 #else8718 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);8719 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);8720 vmxHCReadExitIntInfoVmcs(pVCpu, pVmxTransient);8721 vmxHCReadExitIntErrorCodeVmcs(pVCpu, pVmxTransient);8722 vmxHCReadIdtVectoringInfoVmcs(pVCpu, pVmxTransient);8723 vmxHCReadIdtVectoringErrorCodeVmcs(pVCpu, pVmxTransient);8724 #endif8725 8680 8726 8681 /* … … 8849 8804 8850 8805 #ifdef VBOX_WITH_STATISTICS 8851 vmxHCRead ExitQualVmcs(pVCpu, pVmxTransient);8806 vmxHCReadToTransient<HMVMX_READ_EXIT_QUALIFICATION>(pVCpu, pVmxTransient); 8852 8807 if (VMX_EXIT_QUAL_DRX_DIRECTION(pVmxTransient->uExitQual) == VMX_EXIT_QUAL_DRX_DIRECTION_WRITE) 8853 8808 STAM_COUNTER_INC(&VCPU_2_VMXSTATS(pVCpu).StatExitDRxWrite); … … 8866 8821 */ 8867 8822 PCPUMCTX pCtx = &pVCpu->cpum.GstCtx; 8868 vmxHCRead ExitQualVmcs(pVCpu, pVmxTransient);8823 vmxHCReadToTransient<HMVMX_READ_EXIT_QUALIFICATION>(pVCpu, pVmxTransient); 8869 8824 int rc = vmxHCImportGuestState(pVCpu, pVmcsInfo, CPUMCTX_EXTRN_SREG_MASK | CPUMCTX_EXTRN_DR7); 8870 8825 AssertRCReturn(rc, rc); … … 8911 8866 Assert(pVCpu->CTX_SUFF(pVM)->hmr0.s.fNestedPaging); 8912 8867 8913 # ifdef HMVMX_WITH_CONDENSED_VMREADS8914 8868 vmxHCReadToTransient< HMVMX_READ_EXIT_INSTR_LEN 8915 8869 | HMVMX_READ_EXIT_INTERRUPTION_INFO … … 8918 8872 | HMVMX_READ_IDT_VECTORING_ERROR_CODE 8919 8873 | HMVMX_READ_GUEST_PHYSICAL_ADDR>(pVCpu, pVmxTransient); 8920 # else8921 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);8922 vmxHCReadExitIntInfoVmcs(pVCpu, pVmxTransient);8923 vmxHCReadExitIntErrorCodeVmcs(pVCpu, pVmxTransient);8924 vmxHCReadIdtVectoringInfoVmcs(pVCpu, pVmxTransient);8925 vmxHCReadIdtVectoringErrorCodeVmcs(pVCpu, pVmxTransient);8926 # endif8927 8874 8928 8875 /* … … 8960 8907 */ 8961 8908 PVMXVMCSINFO pVmcsInfo = pVmxTransient->pVmcsInfo; 8962 # ifndef HMVMX_WITH_CONDENSED_VMREADS8963 vmxHCReadGuestPhysicalAddrVmcs(pVCpu, pVmxTransient);8964 # endif8965 8909 int rc = vmxHCImportGuestState(pVCpu, pVmcsInfo, IEM_CPUMCTX_EXTRN_MUST_MASK); 8966 8910 AssertRCReturn(rc, rc); … … 9035 8979 Assert(pVCpu->CTX_SUFF(pVM)->hmr0.s.fNestedPaging); 9036 8980 9037 # ifdef HMVMX_WITH_CONDENSED_VMREADS9038 8981 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 9039 8982 | HMVMX_READ_EXIT_INSTR_LEN … … 9043 8986 | HMVMX_READ_IDT_VECTORING_ERROR_CODE 9044 8987 | HMVMX_READ_GUEST_PHYSICAL_ADDR>(pVCpu, pVmxTransient); 9045 # else9046 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);9047 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);9048 vmxHCReadExitIntInfoVmcs(pVCpu, pVmxTransient);9049 vmxHCReadExitIntErrorCodeVmcs(pVCpu, pVmxTransient);9050 vmxHCReadIdtVectoringInfoVmcs(pVCpu, pVmxTransient);9051 vmxHCReadIdtVectoringErrorCodeVmcs(pVCpu, pVmxTransient);9052 # endif9053 8988 9054 8989 /* … … 9072 9007 9073 9008 PVMXVMCSINFO pVmcsInfo = pVmxTransient->pVmcsInfo; 9074 # ifndef HMVMX_WITH_CONDENSED_VMREADS9075 vmxHCReadGuestPhysicalAddrVmcs(pVCpu, pVmxTransient);9076 # endif9077 9009 int rc = vmxHCImportGuestState(pVCpu, pVmcsInfo, IEM_CPUMCTX_EXTRN_MUST_MASK); 9078 9010 AssertRCReturn(rc, rc); … … 9118 9050 PVM pVM = pVCpu->CTX_SUFF(pVM); 9119 9051 uint64_t const uHostTsc = ASMReadTSC(); RT_NOREF(uHostTsc); 9120 vmxHCRead ExitQualVmcs(pVCpu, pVmxTransient);9121 vmxHCReadGuestPhysicalAddrVmcs(pVCpu, pVmxTransient);9052 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 9053 | HMVMX_READ_GUEST_PHYSICAL_ADDR>(pVCpu, pVmxTransient); 9122 9054 vmxHCImportGuestRip(pVCpu); 9123 9055 vmxHCImportGuestSegReg(pVCpu, X86_SREG_CS); … … 9200 9132 HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient); 9201 9133 9202 # ifdef HMVMX_WITH_CONDENSED_VMREADS9203 9134 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 9204 9135 | HMVMX_READ_EXIT_INSTR_INFO 9205 9136 | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 9206 # else9207 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);9208 vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient);9209 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);9210 # endif9211 9137 int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, CPUMCTX_EXTRN_RSP | CPUMCTX_EXTRN_SREG_MASK 9212 9138 | CPUMCTX_EXTRN_HWVIRT … … 9240 9166 /* Import the entire VMCS state for now as we would be switching VMCS on successful VMLAUNCH, 9241 9167 otherwise we could import just IEM_CPUMCTX_EXTRN_VMX_VMENTRY_MASK. */ 9242 vmxHCRead ExitInstrLenVmcs(pVCpu, pVmxTransient);9168 vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 9243 9169 int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, HMVMX_CPUMCTX_EXTRN_ALL); 9244 9170 AssertRCReturn(rc, rc); … … 9267 9193 HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient); 9268 9194 9269 # ifdef HMVMX_WITH_CONDENSED_VMREADS9270 9195 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 9271 9196 | HMVMX_READ_EXIT_INSTR_INFO 9272 9197 | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 9273 # else9274 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);9275 vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient);9276 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);9277 # endif9278 9198 int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, CPUMCTX_EXTRN_RSP | CPUMCTX_EXTRN_SREG_MASK 9279 9199 | CPUMCTX_EXTRN_HWVIRT … … 9305 9225 HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient); 9306 9226 9307 # ifdef HMVMX_WITH_CONDENSED_VMREADS9308 9227 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 9309 9228 | HMVMX_READ_EXIT_INSTR_INFO 9310 9229 | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 9311 # else9312 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);9313 vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient);9314 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);9315 #endif9316 9230 int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, CPUMCTX_EXTRN_RSP | CPUMCTX_EXTRN_SREG_MASK 9317 9231 | CPUMCTX_EXTRN_HWVIRT … … 9348 9262 * code elsewhere dares look at unsynced VMCS fields. 9349 9263 */ 9350 # ifdef HMVMX_WITH_CONDENSED_VMREADS9351 9264 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 9352 9265 | HMVMX_READ_EXIT_INSTR_INFO 9353 9266 | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 9354 # else9355 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);9356 vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient);9357 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);9358 # endif9359 9267 int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, CPUMCTX_EXTRN_RSP | CPUMCTX_EXTRN_SREG_MASK 9360 9268 | CPUMCTX_EXTRN_HWVIRT … … 9410 9318 /* Import the entire VMCS state for now as we would be switching VMCS on successful VMRESUME, 9411 9319 otherwise we could import just IEM_CPUMCTX_EXTRN_VMX_VMENTRY_MASK. */ 9412 vmxHCRead ExitInstrLenVmcs(pVCpu, pVmxTransient);9320 vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 9413 9321 int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, HMVMX_CPUMCTX_EXTRN_ALL); 9414 9322 AssertRCReturn(rc, rc); … … 9442 9350 * flags re-loading the entire shadow VMCS, we should save the entire shadow VMCS here. 9443 9351 */ 9444 # ifdef HMVMX_WITH_CONDENSED_VMREADS9445 9352 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 9446 9353 | HMVMX_READ_EXIT_INSTR_INFO 9447 9354 | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 9448 # else9449 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);9450 vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient);9451 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);9452 # endif9453 9355 int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, CPUMCTX_EXTRN_RSP | CPUMCTX_EXTRN_SREG_MASK 9454 9356 | CPUMCTX_EXTRN_HWVIRT … … 9481 9383 HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient); 9482 9384 9483 vmxHCRead ExitInstrLenVmcs(pVCpu, pVmxTransient);9385 vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 9484 9386 int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, CPUMCTX_EXTRN_CR4 9485 9387 | CPUMCTX_EXTRN_HWVIRT … … 9508 9410 HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient); 9509 9411 9510 # ifdef HMVMX_WITH_CONDENSED_VMREADS9511 9412 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 9512 9413 | HMVMX_READ_EXIT_INSTR_INFO 9513 9414 | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 9514 # else9515 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);9516 vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient);9517 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);9518 # endif9519 9415 int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, CPUMCTX_EXTRN_RSP | CPUMCTX_EXTRN_SREG_MASK 9520 9416 | CPUMCTX_EXTRN_HWVIRT … … 9546 9442 HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient); 9547 9443 9548 # ifdef HMVMX_WITH_CONDENSED_VMREADS9549 9444 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 9550 9445 | HMVMX_READ_EXIT_INSTR_INFO 9551 9446 | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 9552 # else9553 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);9554 vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient);9555 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);9556 # endif9557 9447 int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, CPUMCTX_EXTRN_RSP | CPUMCTX_EXTRN_SREG_MASK 9558 9448 | IEM_CPUMCTX_EXTRN_EXEC_DECODED_MEM_MASK); … … 9584 9474 HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient); 9585 9475 9586 # ifdef HMVMX_WITH_CONDENSED_VMREADS9587 9476 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 9588 9477 | HMVMX_READ_EXIT_INSTR_INFO 9589 9478 | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 9590 # else9591 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);9592 vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient);9593 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);9594 # endif9595 9479 int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, CPUMCTX_EXTRN_RSP | CPUMCTX_EXTRN_SREG_MASK 9596 9480 | IEM_CPUMCTX_EXTRN_EXEC_DECODED_MEM_MASK); … … 9633 9517 HMVMX_VALIDATE_NESTED_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient); 9634 9518 9635 vmxHCRead ExitIntInfoVmcs(pVCpu, pVmxTransient);9519 vmxHCReadToTransient<HMVMX_READ_EXIT_INTERRUPTION_INFO>(pVCpu, pVmxTransient); 9636 9520 9637 9521 uint64_t const uExitIntInfo = pVmxTransient->uExitIntInfo; … … 9660 9544 case VMX_EXIT_INT_INFO_TYPE_HW_XCPT: 9661 9545 { 9662 # ifdef HMVMX_WITH_CONDENSED_VMREADS9663 9546 vmxHCReadToTransient< HMVMX_READ_EXIT_INTERRUPTION_ERROR_CODE 9664 9547 | HMVMX_READ_EXIT_INSTR_LEN 9665 9548 | HMVMX_READ_IDT_VECTORING_INFO 9666 9549 | HMVMX_READ_IDT_VECTORING_ERROR_CODE>(pVCpu, pVmxTransient); 9667 # else9668 vmxHCReadExitIntErrorCodeVmcs(pVCpu, pVmxTransient);9669 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);9670 vmxHCReadIdtVectoringInfoVmcs(pVCpu, pVmxTransient);9671 vmxHCReadIdtVectoringErrorCodeVmcs(pVCpu, pVmxTransient);9672 # endif9673 9550 9674 9551 PCCPUMCTX pCtx = &pVCpu->cpum.GstCtx; … … 9676 9553 { 9677 9554 /* Exit qualification is required for debug and page-fault exceptions. */ 9678 vmxHCRead ExitQualVmcs(pVCpu, pVmxTransient);9555 vmxHCReadToTransient<HMVMX_READ_EXIT_QUALIFICATION>(pVCpu, pVmxTransient); 9679 9556 9680 9557 /* … … 9771 9648 HMVMX_VALIDATE_NESTED_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient); 9772 9649 9773 # ifdef HMVMX_WITH_CONDENSED_VMREADS9774 9650 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 9775 9651 | HMVMX_READ_EXIT_INSTR_LEN 9776 9652 | HMVMX_READ_IDT_VECTORING_INFO 9777 9653 | 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 9784 9655 VMXVEXITINFO const ExitInfo = VMXVEXITINFO_INIT_WITH_QUAL_AND_INSTR_LEN_FROM_TRANSIENT(pVmxTransient); 9785 9656 VMXVEXITEVENTINFO const ExitEventInfo = VMXVEXITEVENTINFO_INIT_ONLY_IDT(pVmxTransient->uIdtVectoringInfo, … … 9798 9669 if (CPUMIsGuestVmxProcCtlsSet(&pVCpu->cpum.GstCtx, VMX_PROC_CTLS_HLT_EXIT)) 9799 9670 { 9800 vmxHCRead ExitInstrLenVmcs(pVCpu, pVmxTransient);9671 vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 9801 9672 return IEMExecVmxVmexitInstr(pVCpu, pVmxTransient->uExitReason, pVmxTransient->cbExitInstr); 9802 9673 } … … 9814 9685 if (CPUMIsGuestVmxProcCtlsSet(&pVCpu->cpum.GstCtx, VMX_PROC_CTLS_INVLPG_EXIT)) 9815 9686 { 9816 # ifdef HMVMX_WITH_CONDENSED_VMREADS9817 9687 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 9818 9688 | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 9819 # else9820 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);9821 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);9822 # endif9823 9689 VMXVEXITINFO const ExitInfo = VMXVEXITINFO_INIT_WITH_QUAL_AND_INSTR_LEN_FROM_TRANSIENT(pVmxTransient); 9824 9690 return IEMExecVmxVmexitInstrWithInfo(pVCpu, &ExitInfo); … … 9837 9703 if (CPUMIsGuestVmxProcCtlsSet(&pVCpu->cpum.GstCtx, VMX_PROC_CTLS_RDPMC_EXIT)) 9838 9704 { 9839 vmxHCRead ExitInstrLenVmcs(pVCpu, pVmxTransient);9705 vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 9840 9706 return IEMExecVmxVmexitInstr(pVCpu, pVmxTransient->uExitReason, pVmxTransient->cbExitInstr); 9841 9707 } … … 9855 9721 || pVmxTransient->uExitReason == VMX_EXIT_VMWRITE); 9856 9722 9857 vmxHCRead ExitInstrInfoVmcs(pVCpu, pVmxTransient);9723 vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_INFO>(pVCpu, pVmxTransient); 9858 9724 9859 9725 uint8_t const iGReg = pVmxTransient->ExitInstrInfo.VmreadVmwrite.iReg2; … … 9867 9733 if (CPUMIsGuestVmxVmreadVmwriteInterceptSet(pVCpu, pVmxTransient->uExitReason, u64VmcsField)) 9868 9734 { 9869 # ifdef HMVMX_WITH_CONDENSED_VMREADS9870 9735 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 9871 9736 | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 9872 # else9873 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);9874 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);9875 # endif9876 9737 VMXVEXITINFO const ExitInfo = VMXVEXITINFO_INIT_WITH_QUAL_AND_INSTR_INFO_FROM_TRANSIENT(pVmxTransient); 9877 9738 return IEMExecVmxVmexitInstrWithInfo(pVCpu, &ExitInfo); … … 9893 9754 if (CPUMIsGuestVmxProcCtlsSet(&pVCpu->cpum.GstCtx, VMX_PROC_CTLS_RDTSC_EXIT)) 9894 9755 { 9895 vmxHCRead ExitInstrLenVmcs(pVCpu, pVmxTransient);9756 vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 9896 9757 return IEMExecVmxVmexitInstr(pVCpu, pVmxTransient->uExitReason, pVmxTransient->cbExitInstr); 9897 9758 } … … 9909 9770 HMVMX_VALIDATE_NESTED_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient); 9910 9771 9911 # ifdef HMVMX_WITH_CONDENSED_VMREADS9912 9772 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 9913 9773 | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 9914 # else9915 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);9916 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);9917 # endif9918 9774 9919 9775 VBOXSTRICTRC rcStrict; … … 10019 9875 if (fMemOperand) 10020 9876 { 10021 vmxHCRead GuestLinearAddrVmcs(pVCpu, pVmxTransient);9877 vmxHCReadToTransient<HMVMX_READ_GUEST_LINEAR_ADDR>(pVCpu, pVmxTransient); 10022 9878 GCPtrEffDst = pVmxTransient->uGuestLinearAddr; 10023 9879 } … … 10062 9918 if (CPUMIsGuestVmxProcCtlsSet(&pVCpu->cpum.GstCtx, VMX_PROC_CTLS_MOV_DR_EXIT)) 10063 9919 { 10064 # ifdef HMVMX_WITH_CONDENSED_VMREADS10065 9920 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 10066 9921 | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 10067 # else10068 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);10069 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);10070 # endif10071 9922 VMXVEXITINFO const ExitInfo = VMXVEXITINFO_INIT_WITH_QUAL_AND_INSTR_LEN_FROM_TRANSIENT(pVmxTransient); 10072 9923 return IEMExecVmxVmexitInstrWithInfo(pVCpu, &ExitInfo); … … 10084 9935 HMVMX_VALIDATE_NESTED_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient); 10085 9936 10086 vmxHCRead ExitQualVmcs(pVCpu, pVmxTransient);9937 vmxHCReadToTransient<HMVMX_READ_EXIT_QUALIFICATION>(pVCpu, pVmxTransient); 10087 9938 10088 9939 uint32_t const uIOPort = VMX_EXIT_QUAL_IO_PORT(pVmxTransient->uExitQual); … … 10104 9955 */ 10105 9956 PVMCC pVM = pVCpu->CTX_SUFF(pVM); 10106 vmxHCRead ExitInstrLenVmcs(pVCpu, pVmxTransient);9957 vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 10107 9958 10108 9959 /* Make sure we don't use stale/uninitialized VMX-transient info. below. */ … … 10114 9965 if (fIOString) 10115 9966 { 10116 vmxHCRead GuestLinearAddrVmcs(pVCpu, pVmxTransient);9967 vmxHCReadToTransient<HMVMX_READ_GUEST_LINEAR_ADDR>(pVCpu, pVmxTransient); 10117 9968 if (fVmxInsOutsInfo) 10118 9969 { 10119 9970 Assert(RT_BF_GET(g_HmMsrs.u.vmx.u64Basic, VMX_BF_BASIC_VMCS_INS_OUTS)); /* Paranoia. */ 10120 vmxHCRead ExitInstrInfoVmcs(pVCpu, pVmxTransient);9971 vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_INFO>(pVCpu, pVmxTransient); 10121 9972 } 10122 9973 } … … 10144 9995 if (fMsrpm & VMXMSRPM_EXIT_RD) 10145 9996 { 10146 vmxHCRead ExitInstrLenVmcs(pVCpu, pVmxTransient);9997 vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 10147 9998 return IEMExecVmxVmexitInstr(pVCpu, pVmxTransient->uExitReason, pVmxTransient->cbExitInstr); 10148 9999 } … … 10166 10017 if (fMsrpm & VMXMSRPM_EXIT_WR) 10167 10018 { 10168 vmxHCRead ExitInstrLenVmcs(pVCpu, pVmxTransient);10019 vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 10169 10020 return IEMExecVmxVmexitInstr(pVCpu, pVmxTransient->uExitReason, pVmxTransient->cbExitInstr); 10170 10021 } … … 10182 10033 if (CPUMIsGuestVmxProcCtlsSet(&pVCpu->cpum.GstCtx, VMX_PROC_CTLS_MWAIT_EXIT)) 10183 10034 { 10184 vmxHCRead ExitInstrLenVmcs(pVCpu, pVmxTransient);10035 vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 10185 10036 return IEMExecVmxVmexitInstr(pVCpu, pVmxTransient->uExitReason, pVmxTransient->cbExitInstr); 10186 10037 } … … 10198 10049 10199 10050 /** @todo NSTVMX: Should consider debugging nested-guests using VM debugger. */ 10200 vmxHCRead GuestPendingDbgXctps(pVCpu, pVmxTransient);10051 vmxHCReadToTransient<HMVMX_READ_GUEST_PENDING_DBG_XCPTS>(pVCpu, pVmxTransient); 10201 10052 VMXVEXITINFO const ExitInfo = VMXVEXITINFO_INIT_WITH_DBG_XCPTS_FROM_TRANSIENT(pVmxTransient); 10202 10053 return IEMExecVmxVmexitTrapLike(pVCpu, &ExitInfo); … … 10213 10064 if (CPUMIsGuestVmxProcCtlsSet(&pVCpu->cpum.GstCtx, VMX_PROC_CTLS_MONITOR_EXIT)) 10214 10065 { 10215 vmxHCRead ExitInstrLenVmcs(pVCpu, pVmxTransient);10066 vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 10216 10067 return IEMExecVmxVmexitInstr(pVCpu, pVmxTransient->uExitReason, pVmxTransient->cbExitInstr); 10217 10068 } … … 10235 10086 || CPUMIsGuestVmxProcCtls2Set(&pVCpu->cpum.GstCtx, VMX_PROC_CTLS2_PAUSE_LOOP_EXIT)) 10236 10087 { 10237 vmxHCRead ExitInstrLenVmcs(pVCpu, pVmxTransient);10088 vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 10238 10089 return IEMExecVmxVmexitInstr(pVCpu, pVmxTransient->uExitReason, pVmxTransient->cbExitInstr); 10239 10090 } … … 10252 10103 if (CPUMIsGuestVmxProcCtlsSet(&pVCpu->cpum.GstCtx, VMX_PROC_CTLS_USE_TPR_SHADOW)) 10253 10104 { 10254 vmxHCRead GuestPendingDbgXctps(pVCpu, pVmxTransient);10105 vmxHCReadToTransient<HMVMX_READ_GUEST_PENDING_DBG_XCPTS>(pVCpu, pVmxTransient); 10255 10106 VMXVEXITINFO const ExitInfo = VMXVEXITINFO_INIT_WITH_DBG_XCPTS_FROM_TRANSIENT(pVmxTransient); 10256 10107 return IEMExecVmxVmexitTrapLike(pVCpu, &ExitInfo); … … 10268 10119 HMVMX_VALIDATE_NESTED_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient); 10269 10120 10270 # ifdef HMVMX_WITH_CONDENSED_VMREADS10271 10121 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 10272 10122 | HMVMX_READ_EXIT_INSTR_LEN 10273 10123 | HMVMX_READ_IDT_VECTORING_INFO 10274 10124 | HMVMX_READ_IDT_VECTORING_ERROR_CODE>(pVCpu, pVmxTransient); 10275 # else10276 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);10277 vmxHCReadIdtVectoringInfoVmcs(pVCpu, pVmxTransient);10278 vmxHCReadIdtVectoringErrorCodeVmcs(pVCpu, pVmxTransient);10279 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);10280 # endif10281 10125 10282 10126 Assert(CPUMIsGuestVmxProcCtls2Set(&pVCpu->cpum.GstCtx, VMX_PROC_CTLS2_VIRT_APIC_ACCESS)); … … 10301 10145 10302 10146 Assert(CPUMIsGuestVmxProcCtls2Set(&pVCpu->cpum.GstCtx, VMX_PROC_CTLS2_APIC_REG_VIRT)); 10303 vmxHCRead ExitQualVmcs(pVCpu, pVmxTransient);10147 vmxHCReadToTransient<HMVMX_READ_EXIT_QUALIFICATION>(pVCpu, pVmxTransient); 10304 10148 return IEMExecVmxVmexit(pVCpu, pVmxTransient->uExitReason, pVmxTransient->uExitQual); 10305 10149 } … … 10315 10159 10316 10160 Assert(CPUMIsGuestVmxProcCtls2Set(&pVCpu->cpum.GstCtx, VMX_PROC_CTLS2_VIRT_INT_DELIVERY)); 10317 vmxHCRead ExitQualVmcs(pVCpu, pVmxTransient);10161 vmxHCReadToTransient<HMVMX_READ_EXIT_QUALIFICATION>(pVCpu, pVmxTransient); 10318 10162 return IEMExecVmxVmexit(pVCpu, pVmxTransient->uExitReason, pVmxTransient->uExitQual); 10319 10163 } … … 10330 10174 { 10331 10175 Assert(CPUMIsGuestVmxProcCtls2Set(&pVCpu->cpum.GstCtx, VMX_PROC_CTLS2_RDTSCP)); 10332 vmxHCRead ExitInstrLenVmcs(pVCpu, pVmxTransient);10176 vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 10333 10177 return IEMExecVmxVmexitInstr(pVCpu, pVmxTransient->uExitReason, pVmxTransient->cbExitInstr); 10334 10178 } … … 10346 10190 if (CPUMIsGuestVmxProcCtls2Set(&pVCpu->cpum.GstCtx, VMX_PROC_CTLS2_WBINVD_EXIT)) 10347 10191 { 10348 vmxHCRead ExitInstrLenVmcs(pVCpu, pVmxTransient);10192 vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 10349 10193 return IEMExecVmxVmexitInstr(pVCpu, pVmxTransient->uExitReason, pVmxTransient->cbExitInstr); 10350 10194 } … … 10363 10207 { 10364 10208 Assert(CPUMIsGuestVmxProcCtls2Set(&pVCpu->cpum.GstCtx, VMX_PROC_CTLS2_INVPCID)); 10365 # ifdef HMVMX_WITH_CONDENSED_VMREADS10366 10209 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 10367 10210 | HMVMX_READ_EXIT_INSTR_INFO 10368 10211 | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 10369 # else10370 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);10371 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);10372 vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient);10373 # endif10374 10212 VMXVEXITINFO const ExitInfo = VMXVEXITINFO_INIT_WITH_QUAL_AND_INSTR_INFO_FROM_TRANSIENT(pVmxTransient); 10375 10213 return IEMExecVmxVmexitInstrWithInfo(pVCpu, &ExitInfo); … … 10423 10261 #endif 10424 10262 10425 vmxHCRead ExitInstrLenVmcs(pVCpu, pVmxTransient);10263 vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 10426 10264 return IEMExecVmxVmexitInstr(pVCpu, pVmxTransient->uExitReason, pVmxTransient->cbExitInstr); 10427 10265 } … … 10473 10311 # endif 10474 10312 10475 # ifdef HMVMX_WITH_CONDENSED_VMREADS10476 10313 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 10477 10314 | HMVMX_READ_EXIT_INSTR_LEN 10478 10315 | HMVMX_READ_EXIT_INSTR_INFO>(pVCpu, pVmxTransient); 10479 # else10480 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);10481 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);10482 vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient);10483 # endif10484 10316 VMXVEXITINFO const ExitInfo = VMXVEXITINFO_INIT_WITH_QUAL_AND_INSTR_INFO_FROM_TRANSIENT(pVmxTransient); 10485 10317 return IEMExecVmxVmexitInstrWithInfo(pVCpu, &ExitInfo); … … 10507 10339 10508 10340 # ifdef DSL_IRQ_FIX_2 10509 # ifdef HMVMX_WITH_CONDENSED_VMREADS10510 10341 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 10511 10342 | HMVMX_READ_EXIT_INSTR_LEN … … 10515 10346 | HMVMX_READ_IDT_VECTORING_ERROR_CODE 10516 10347 | HMVMX_READ_GUEST_PHYSICAL_ADDR>(pVCpu, pVmxTransient); 10517 # else10518 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 # endif10526 10348 10527 10349 /* … … 10552 10374 if (fIsLinearAddrValid) 10553 10375 { 10554 vmxHCRead GuestLinearAddrVmcs(pVCpu, pVmxTransient);10376 vmxHCReadToTransient<HMVMX_READ_GUEST_LINEAR_ADDR>(pVCpu, pVmxTransient); 10555 10377 GCPtrNestedFault = pVmxTransient->uGuestLinearAddr; 10556 10378 } … … 10643 10465 AssertRCReturn(rc, rc); 10644 10466 10645 vmxHCRead GuestPhysicalAddrVmcs(pVCpu, pVmxTransient);10467 vmxHCReadToTransient<HMVMX_READ_GUEST_PHYSICAL_ADDR>(pVCpu, pVmxTransient); 10646 10468 10647 10469 PGMPTWALK Walk; … … 10658 10480 10659 10481 AssertMsg(Walk.fFailed & PGM_WALKFAIL_EPT_MISCONFIG, ("GCPhysNestedFault=%#RGp\n", GCPhysNestedFault)); 10660 # ifdef HMVMX_WITH_CONDENSED_VMREADS10661 10482 vmxHCReadToTransient< HMVMX_READ_IDT_VECTORING_INFO 10662 10483 | HMVMX_READ_IDT_VECTORING_ERROR_CODE>(pVCpu, pVmxTransient); 10663 # else10664 vmxHCReadIdtVectoringInfoVmcs(pVCpu, pVmxTransient);10665 vmxHCReadIdtVectoringErrorCodeVmcs(pVCpu, pVmxTransient);10666 # endif10667 10484 10668 10485 VMXVEXITEVENTINFO const ExitEventInfo = VMXVEXITEVENTINFO_INIT_ONLY_IDT(pVmxTransient->uIdtVectoringInfo, … … 11250 11067 if (VMX_EXIT_INT_INFO_IS_ERROR_CODE_VALID(pVmxTransient->uExitIntInfo)) 11251 11068 { 11252 vmxHCRead ExitIntErrorCodeVmcs(pVCpu, pVmxTransient);11069 vmxHCReadToTransient<HMVMX_READ_EXIT_INTERRUPTION_ERROR_CODE>(pVCpu, pVmxTransient); 11253 11070 uEventArg = pVmxTransient->uExitIntErrorCode; 11254 11071 } … … 11320 11137 case VMX_EXIT_VMXON: SET_BOTH(VMX_VMXON); break; 11321 11138 case VMX_EXIT_MOV_CRX: 11322 vmxHCRead ExitQualVmcs(pVCpu, pVmxTransient);11139 vmxHCReadToTransient<HMVMX_READ_EXIT_QUALIFICATION>(pVCpu, pVmxTransient); 11323 11140 if (VMX_EXIT_QUAL_CRX_ACCESS(pVmxTransient->uExitQual) == VMX_EXIT_QUAL_CRX_ACCESS_READ) 11324 11141 SET_BOTH(CRX_READ); … … 11328 11145 break; 11329 11146 case VMX_EXIT_MOV_DRX: 11330 vmxHCRead ExitQualVmcs(pVCpu, pVmxTransient);11147 vmxHCReadToTransient<HMVMX_READ_EXIT_QUALIFICATION>(pVCpu, pVmxTransient); 11331 11148 if ( VMX_EXIT_QUAL_DRX_DIRECTION(pVmxTransient->uExitQual) 11332 11149 == VMX_EXIT_QUAL_DRX_DIRECTION_READ) … … 11342 11159 case VMX_EXIT_PAUSE: SET_BOTH(PAUSE); break; 11343 11160 case VMX_EXIT_GDTR_IDTR_ACCESS: 11344 vmxHCRead ExitInstrInfoVmcs(pVCpu, pVmxTransient);11161 vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_INFO>(pVCpu, pVmxTransient); 11345 11162 switch (RT_BF_GET(pVmxTransient->ExitInstrInfo.u, VMX_BF_XDTR_INSINFO_INSTR_ID)) 11346 11163 { … … 11353 11170 11354 11171 case VMX_EXIT_LDTR_TR_ACCESS: 11355 vmxHCRead ExitInstrInfoVmcs(pVCpu, pVmxTransient);11172 vmxHCReadToTransient<HMVMX_READ_EXIT_INSTR_INFO>(pVCpu, pVmxTransient); 11356 11173 switch (RT_BF_GET(pVmxTransient->ExitInstrInfo.u, VMX_BF_YYTR_INSINFO_INSTR_ID)) 11357 11174 { … … 11411 11228 if (fDtrace1 || fDtrace2) 11412 11229 { 11413 vmxHCRead ExitQualVmcs(pVCpu, pVmxTransient);11230 vmxHCReadToTransient<HMVMX_READ_EXIT_QUALIFICATION>(pVCpu, pVmxTransient); 11414 11231 vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, HMVMX_CPUMCTX_EXTRN_ALL); 11415 11232 PCPUMCTX pCtx = &pVCpu->cpum.GstCtx; … … 11598 11415 else 11599 11416 { 11600 vmxHCRead ExitQualVmcs(pVCpu, pVmxTransient);11417 vmxHCReadToTransient<HMVMX_READ_EXIT_QUALIFICATION>(pVCpu, pVmxTransient); 11601 11418 int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, HMVMX_CPUMCTX_EXTRN_ALL); 11602 11419 AssertRC(rc); … … 11612 11429 else 11613 11430 { 11614 vmxHCRead ExitIntInfoVmcs(pVCpu, pVmxTransient);11431 vmxHCReadToTransient<HMVMX_READ_EXIT_INTERRUPTION_INFO>(pVCpu, pVmxTransient); 11615 11432 uint32_t const uIntType = VMX_EXIT_INT_INFO_TYPE(pVmxTransient->uExitIntInfo); 11616 11433 if (uIntType == VMX_EXIT_INT_INFO_TYPE_NMI) -
trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp
r97022 r97054 4166 4166 rc |= VMXReadVmcs32(VMX_VMCS32_RO_VM_INSTR_ERROR, &pVCpu->hm.s.vmx.LastError.u32InstrError); 4167 4167 AssertRC(rc); 4168 vmxHCRead ExitQualVmcs(pVCpu, pVmxTransient);4168 vmxHCReadToTransientSlow<HMVMX_READ_EXIT_QUALIFICATION>(pVCpu, pVmxTransient); 4169 4169 4170 4170 pVCpu->hm.s.vmx.LastError.idEnteredCpu = pVCpu->hmr0.s.idEnteredCpu;
Note:
See TracChangeset
for help on using the changeset viewer.