Changeset 97053 in vbox
- Timestamp:
- Oct 7, 2022 9:59:10 PM (2 years ago)
- svn:sync-xref-src-repo-rev:
- 154002
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/VMXAllTemplate.cpp.h
r97041 r97053 39 39 #endif 40 40 41 /** Enables condensing of VMREAD instructions, see vmxHCReadToTransient(). */ 42 #define HMVMX_WITH_CONDENSED_VMREADS 41 43 42 44 /** Use the function table. */ … … 1341 1343 } 1342 1344 } 1345 1346 1347 /** 1348 * Reads VMCS fields into the VMXTRANSIENT structure, slow path version. 1349 * 1350 * Don't call directly unless the it's likely that some or all of the fields 1351 * given in @a a_fReadMask have already been read. 1352 * 1353 * @tparam a_fReadMask The fields to read. 1354 * @param pVCpu The cross context virtual CPU structure. 1355 * @param pVmxTransient The VMX-transient structure. 1356 */ 1357 template<uint32_t const a_fReadMask> 1358 static void vmxHCReadToTransientSlow(PVMCPUCC pVCpu, PVMXTRANSIENT pVmxTransient) 1359 { 1360 if ((pVmxTransient->fVmcsFieldsRead & a_fReadMask) != a_fReadMask) 1361 { 1362 uint32_t const fVmcsFieldsRead = pVmxTransient->fVmcsFieldsRead; 1363 int rc; 1364 1365 if ( (a_fReadMask & HMVMX_READ_EXIT_QUALIFICATION) 1366 && !(fVmcsFieldsRead & HMVMX_READ_EXIT_QUALIFICATION)) 1367 { 1368 rc = VMX_VMCS_READ_NW(pVCpu, VMX_VMCS_RO_EXIT_QUALIFICATION, &pVmxTransient->uExitQual); 1369 AssertRC(rc); 1370 } 1371 if ( (a_fReadMask & HMVMX_READ_EXIT_INSTR_LEN) 1372 && !(fVmcsFieldsRead & HMVMX_READ_EXIT_INSTR_LEN)) 1373 { 1374 rc = VMX_VMCS_READ_32(pVCpu, VMX_VMCS32_RO_EXIT_INSTR_LENGTH, &pVmxTransient->cbExitInstr); 1375 AssertRC(rc); 1376 } 1377 if ( (a_fReadMask & HMVMX_READ_EXIT_INSTR_INFO) 1378 && !(fVmcsFieldsRead & HMVMX_READ_EXIT_INSTR_INFO)) 1379 { 1380 rc = VMX_VMCS_READ_32(pVCpu, VMX_VMCS32_RO_EXIT_INSTR_INFO, &pVmxTransient->ExitInstrInfo.u); 1381 AssertRC(rc); 1382 } 1383 if ( (a_fReadMask & HMVMX_READ_IDT_VECTORING_INFO) 1384 && !(fVmcsFieldsRead & HMVMX_READ_IDT_VECTORING_INFO)) 1385 { 1386 rc = VMX_VMCS_READ_32(pVCpu, VMX_VMCS32_RO_IDT_VECTORING_INFO, &pVmxTransient->uIdtVectoringInfo); 1387 AssertRC(rc); 1388 } 1389 if ( (a_fReadMask & HMVMX_READ_IDT_VECTORING_ERROR_CODE) 1390 && !(fVmcsFieldsRead & HMVMX_READ_IDT_VECTORING_ERROR_CODE)) 1391 { 1392 rc = VMX_VMCS_READ_32(pVCpu, VMX_VMCS32_RO_IDT_VECTORING_ERROR_CODE, &pVmxTransient->uIdtVectoringErrorCode); 1393 AssertRC(rc); 1394 } 1395 if ( (a_fReadMask & HMVMX_READ_EXIT_INTERRUPTION_INFO) 1396 && !(fVmcsFieldsRead & HMVMX_READ_EXIT_INTERRUPTION_INFO)) 1397 { 1398 rc = VMX_VMCS_READ_32(pVCpu, VMX_VMCS32_RO_EXIT_INTERRUPTION_INFO, &pVmxTransient->uExitIntInfo); 1399 AssertRC(rc); 1400 } 1401 if ( (a_fReadMask & HMVMX_READ_EXIT_INTERRUPTION_ERROR_CODE) 1402 && !(fVmcsFieldsRead & HMVMX_READ_EXIT_INTERRUPTION_ERROR_CODE)) 1403 { 1404 rc = VMX_VMCS_READ_32(pVCpu, VMX_VMCS32_RO_EXIT_INTERRUPTION_ERROR_CODE, &pVmxTransient->uExitIntErrorCode); 1405 AssertRC(rc); 1406 } 1407 if ( (a_fReadMask & HMVMX_READ_GUEST_LINEAR_ADDR) 1408 && !(fVmcsFieldsRead & HMVMX_READ_GUEST_LINEAR_ADDR)) 1409 { 1410 rc = VMX_VMCS_READ_NW(pVCpu, VMX_VMCS_RO_GUEST_LINEAR_ADDR, &pVmxTransient->uGuestLinearAddr); 1411 AssertRC(rc); 1412 } 1413 if ( (a_fReadMask & HMVMX_READ_GUEST_PHYSICAL_ADDR) 1414 && !(fVmcsFieldsRead & HMVMX_READ_GUEST_PHYSICAL_ADDR)) 1415 { 1416 rc = VMX_VMCS_READ_64(pVCpu, VMX_VMCS64_RO_GUEST_PHYS_ADDR_FULL, &pVmxTransient->uGuestPhysicalAddr); 1417 AssertRC(rc); 1418 } 1419 1420 pVmxTransient->fVmcsFieldsRead |= a_fReadMask; 1421 } 1422 } 1423 1424 1425 /** 1426 * Reads VMCS fields into the VMXTRANSIENT structure. 1427 * 1428 * This optimizes for the case where none of @a a_fReadMask has been read yet, 1429 * generating an optimized read sequences w/o any conditionals between in 1430 * non-strict builds. 1431 * 1432 * @tparam a_fReadMask The fields to read. One or more of the 1433 * HMVMX_READ_XXX fields ORed together. 1434 * @param pVCpu The cross context virtual CPU structure. 1435 * @param pVmxTransient The VMX-transient structure. 1436 */ 1437 template<uint32_t const a_fReadMask> 1438 DECLINLINE(void) vmxHCReadToTransient(PVMCPUCC pVCpu, PVMXTRANSIENT pVmxTransient) 1439 { 1440 if (RT_LIKELY(!(pVmxTransient->fVmcsFieldsRead & a_fReadMask))) 1441 { 1442 int rc; 1443 if (a_fReadMask & HMVMX_READ_EXIT_QUALIFICATION) 1444 { 1445 rc = VMX_VMCS_READ_NW(pVCpu, VMX_VMCS_RO_EXIT_QUALIFICATION, &pVmxTransient->uExitQual); 1446 AssertRC(rc); 1447 } 1448 if (a_fReadMask & HMVMX_READ_EXIT_INSTR_LEN) 1449 { 1450 rc = VMX_VMCS_READ_32(pVCpu, VMX_VMCS32_RO_EXIT_INSTR_LENGTH, &pVmxTransient->cbExitInstr); 1451 AssertRC(rc); 1452 } 1453 if (a_fReadMask & HMVMX_READ_EXIT_INSTR_INFO) 1454 { 1455 rc = VMX_VMCS_READ_32(pVCpu, VMX_VMCS32_RO_EXIT_INSTR_INFO, &pVmxTransient->ExitInstrInfo.u); 1456 AssertRC(rc); 1457 } 1458 if (a_fReadMask & HMVMX_READ_IDT_VECTORING_INFO) 1459 { 1460 rc = VMX_VMCS_READ_32(pVCpu, VMX_VMCS32_RO_IDT_VECTORING_INFO, &pVmxTransient->uIdtVectoringInfo); 1461 AssertRC(rc); 1462 } 1463 if (a_fReadMask & HMVMX_READ_IDT_VECTORING_ERROR_CODE) 1464 { 1465 rc = VMX_VMCS_READ_32(pVCpu, VMX_VMCS32_RO_IDT_VECTORING_ERROR_CODE, &pVmxTransient->uIdtVectoringErrorCode); 1466 AssertRC(rc); 1467 } 1468 if (a_fReadMask & HMVMX_READ_EXIT_INTERRUPTION_INFO) 1469 { 1470 rc = VMX_VMCS_READ_32(pVCpu, VMX_VMCS32_RO_EXIT_INTERRUPTION_INFO, &pVmxTransient->uExitIntInfo); 1471 AssertRC(rc); 1472 } 1473 if (a_fReadMask & HMVMX_READ_EXIT_INTERRUPTION_ERROR_CODE) 1474 { 1475 rc = VMX_VMCS_READ_32(pVCpu, VMX_VMCS32_RO_EXIT_INTERRUPTION_ERROR_CODE, &pVmxTransient->uExitIntErrorCode); 1476 AssertRC(rc); 1477 } 1478 if (a_fReadMask & HMVMX_READ_GUEST_LINEAR_ADDR) 1479 { 1480 rc = VMX_VMCS_READ_NW(pVCpu, VMX_VMCS_RO_GUEST_LINEAR_ADDR, &pVmxTransient->uGuestLinearAddr); 1481 AssertRC(rc); 1482 } 1483 if (a_fReadMask & HMVMX_READ_GUEST_PHYSICAL_ADDR) 1484 { 1485 rc = VMX_VMCS_READ_64(pVCpu, VMX_VMCS64_RO_GUEST_PHYS_ADDR_FULL, &pVmxTransient->uGuestPhysicalAddr); 1486 AssertRC(rc); 1487 } 1488 1489 pVmxTransient->fVmcsFieldsRead |= a_fReadMask; 1490 } 1491 else 1492 vmxHCReadToTransientSlow<a_fReadMask>(pVCpu, pVmxTransient); 1493 } 1494 1343 1495 1344 1496 #ifdef HMVMX_ALWAYS_SAVE_RO_GUEST_STATE … … 7107 7259 { 7108 7260 NOREF(uVector); 7261 #ifdef HMVMX_WITH_CONDENSED_VMREADS 7262 vmxHCReadToTransient< HMVMX_READ_EXIT_INTERRUPTION_ERROR_CODE 7263 | HMVMX_READ_EXIT_INSTR_LEN 7264 | HMVMX_READ_IDT_VECTORING_INFO 7265 | HMVMX_READ_IDT_VECTORING_ERROR_CODE>(pVCpu, pVmxTransient); 7266 #else 7109 7267 vmxHCReadExitIntErrorCodeVmcs(pVCpu, pVmxTransient); 7110 7268 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient); 7111 7269 vmxHCReadIdtVectoringInfoVmcs(pVCpu, pVmxTransient); 7112 7270 vmxHCReadIdtVectoringErrorCodeVmcs(pVCpu, pVmxTransient); 7113 7271 #endif 7114 7272 rcStrict = vmxHCExitXcpt(pVCpu, pVmxTransient); 7115 7273 break; … … 7427 7585 7428 7586 PVMXVMCSINFO pVmcsInfo = pVmxTransient->pVmcsInfo; 7587 #ifdef HMVMX_WITH_CONDENSED_VMREADS 7588 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 7589 | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 7590 #else 7429 7591 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient); 7430 7592 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient); 7593 #endif 7431 7594 int rc = vmxHCImportGuestState(pVCpu, pVmcsInfo, IEM_CPUMCTX_EXTRN_EXEC_DECODED_MEM_MASK); 7432 7595 AssertRCReturn(rc, rc); … … 7604 7767 return VERR_EM_INTERPRETER; 7605 7768 #else 7769 # ifdef HMVMX_WITH_CONDENSED_VMREADS 7770 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 7771 | HMVMX_READ_EXIT_INSTR_INFO 7772 | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 7773 # else 7606 7774 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient); 7607 7775 vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient); 7608 7776 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient); 7777 # endif 7609 7778 int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, CPUMCTX_EXTRN_RSP | CPUMCTX_EXTRN_SREG_MASK 7610 7779 | IEM_CPUMCTX_EXTRN_EXEC_DECODED_MEM_MASK); … … 7656 7825 uint32_t fIntrState; 7657 7826 uint64_t u64Val; 7827 # ifdef HMVMX_WITH_CONDENSED_VMREADS 7828 vmxHCReadToTransient< HMVMX_READ_EXIT_INSTR_INFO 7829 | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 7830 # else 7658 7831 vmxHCReadEntryIntInfoVmcs(pVCpu, pVmxTransient); 7832 vmxHCReadEntryInstrLenVmcs(pVCpu, pVmxTransient); 7833 # endif 7659 7834 vmxHCReadEntryXcptErrorCodeVmcs(pVCpu, pVmxTransient); 7660 vmxHCReadEntryInstrLenVmcs(pVCpu, pVmxTransient);7661 7835 7662 7836 Log4(("uInvalidReason %u\n", uInvalidReason)); … … 8045 8219 8046 8220 PVMXVMCSINFO pVmcsInfo = pVmxTransient->pVmcsInfo; 8221 # ifdef HMVMX_WITH_CONDENSED_VMREADS 8222 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 8223 | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 8224 # else 8047 8225 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient); 8048 8226 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient); 8227 # endif 8049 8228 8050 8229 VBOXSTRICTRC rcStrict; … … 8221 8400 PCPUMCTX pCtx = &pVCpu->cpum.GstCtx; 8222 8401 PVMXVMCSINFO pVmcsInfo = pVmxTransient->pVmcsInfo; 8402 # ifdef HMVMX_WITH_CONDENSED_VMREADS 8403 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 8404 | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 8405 # else 8223 8406 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient); 8224 8407 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient); 8408 #endif 8225 8409 int rc = vmxHCImportGuestState(pVCpu, pVmcsInfo, IEM_CPUMCTX_EXTRN_MUST_MASK | CPUMCTX_EXTRN_SREG_MASK 8226 8410 | CPUMCTX_EXTRN_EFER); … … 8486 8670 8487 8671 vmxHCSetPendingEvent(pVCpu, VMX_ENTRY_INT_INFO_FROM_EXIT_IDT_INFO(pVmxTransient->uIdtVectoringInfo), 8488 8672 pVmxTransient->cbExitInstr, uErrCode, GCPtrFaultAddress); 8489 8673 8490 8674 Log4Func(("Pending event. uIntType=%#x uVector=%#x\n", VMX_IDT_VECTORING_INFO_TYPE(pVmxTransient->uIdtVectoringInfo), … … 8524 8708 STAM_COUNTER_INC(&VCPU_2_VMXSTATS(pVCpu).StatExitApicAccess); 8525 8709 8710 #ifdef HMVMX_WITH_CONDENSED_VMREADS 8711 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 8712 | HMVMX_READ_EXIT_INSTR_LEN 8713 | HMVMX_READ_EXIT_INTERRUPTION_INFO 8714 | HMVMX_READ_EXIT_INTERRUPTION_ERROR_CODE 8715 | HMVMX_READ_IDT_VECTORING_INFO 8716 | HMVMX_READ_IDT_VECTORING_ERROR_CODE>(pVCpu, pVmxTransient); 8717 #else 8718 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient); 8719 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient); 8526 8720 vmxHCReadExitIntInfoVmcs(pVCpu, pVmxTransient); 8527 8721 vmxHCReadExitIntErrorCodeVmcs(pVCpu, pVmxTransient); 8528 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);8529 8722 vmxHCReadIdtVectoringInfoVmcs(pVCpu, pVmxTransient); 8530 8723 vmxHCReadIdtVectoringErrorCodeVmcs(pVCpu, pVmxTransient); 8724 #endif 8531 8725 8532 8726 /* … … 8551 8745 /* IOMMIOPhysHandler() below may call into IEM, save the necessary state. */ 8552 8746 PVMXVMCSINFO pVmcsInfo = pVmxTransient->pVmcsInfo; 8553 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);8554 8747 int rc = vmxHCImportGuestState(pVCpu, pVmcsInfo, IEM_CPUMCTX_EXTRN_MUST_MASK); 8555 8748 AssertRCReturn(rc, rc); … … 8718 8911 Assert(pVCpu->CTX_SUFF(pVM)->hmr0.s.fNestedPaging); 8719 8912 8913 # ifdef HMVMX_WITH_CONDENSED_VMREADS 8914 vmxHCReadToTransient< HMVMX_READ_EXIT_INSTR_LEN 8915 | HMVMX_READ_EXIT_INTERRUPTION_INFO 8916 | HMVMX_READ_EXIT_INTERRUPTION_ERROR_CODE 8917 | HMVMX_READ_IDT_VECTORING_INFO 8918 | HMVMX_READ_IDT_VECTORING_ERROR_CODE 8919 | HMVMX_READ_GUEST_PHYSICAL_ADDR>(pVCpu, pVmxTransient); 8920 # else 8921 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient); 8720 8922 vmxHCReadExitIntInfoVmcs(pVCpu, pVmxTransient); 8721 8923 vmxHCReadExitIntErrorCodeVmcs(pVCpu, pVmxTransient); 8722 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);8723 8924 vmxHCReadIdtVectoringInfoVmcs(pVCpu, pVmxTransient); 8724 8925 vmxHCReadIdtVectoringErrorCodeVmcs(pVCpu, pVmxTransient); 8926 # endif 8725 8927 8726 8928 /* … … 8740 8942 { 8741 8943 STAM_COUNTER_INC(&VCPU_2_VMXSTATS(pVCpu).StatInjectInterpret); 8742 # ifdef VBOX_WITH_NESTED_HWVIRT_VMX8944 # ifdef VBOX_WITH_NESTED_HWVIRT_VMX 8743 8945 /** @todo NSTVMX: Think about how this should be handled. */ 8744 8946 if (pVmxTransient->fIsNestedGuest) 8745 8947 return VERR_VMX_IPE_3; 8746 # endif8948 # endif 8747 8949 return VINF_EM_RAW_INJECT_TRPM_EVENT; 8748 8950 } … … 8758 8960 */ 8759 8961 PVMXVMCSINFO pVmcsInfo = pVmxTransient->pVmcsInfo; 8962 # ifndef HMVMX_WITH_CONDENSED_VMREADS 8760 8963 vmxHCReadGuestPhysicalAddrVmcs(pVCpu, pVmxTransient); 8964 # endif 8761 8965 int rc = vmxHCImportGuestState(pVCpu, pVmcsInfo, IEM_CPUMCTX_EXTRN_MUST_MASK); 8762 8966 AssertRCReturn(rc, rc); … … 8831 9035 Assert(pVCpu->CTX_SUFF(pVM)->hmr0.s.fNestedPaging); 8832 9036 9037 # ifdef HMVMX_WITH_CONDENSED_VMREADS 9038 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 9039 | HMVMX_READ_EXIT_INSTR_LEN 9040 | HMVMX_READ_EXIT_INTERRUPTION_INFO 9041 | HMVMX_READ_EXIT_INTERRUPTION_ERROR_CODE 9042 | HMVMX_READ_IDT_VECTORING_INFO 9043 | HMVMX_READ_IDT_VECTORING_ERROR_CODE 9044 | HMVMX_READ_GUEST_PHYSICAL_ADDR>(pVCpu, pVmxTransient); 9045 # else 8833 9046 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient); 9047 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient); 8834 9048 vmxHCReadExitIntInfoVmcs(pVCpu, pVmxTransient); 8835 9049 vmxHCReadExitIntErrorCodeVmcs(pVCpu, pVmxTransient); 8836 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);8837 9050 vmxHCReadIdtVectoringInfoVmcs(pVCpu, pVmxTransient); 8838 9051 vmxHCReadIdtVectoringErrorCodeVmcs(pVCpu, pVmxTransient); 9052 # endif 8839 9053 8840 9054 /* … … 8858 9072 8859 9073 PVMXVMCSINFO pVmcsInfo = pVmxTransient->pVmcsInfo; 9074 # ifndef HMVMX_WITH_CONDENSED_VMREADS 8860 9075 vmxHCReadGuestPhysicalAddrVmcs(pVCpu, pVmxTransient); 9076 # endif 8861 9077 int rc = vmxHCImportGuestState(pVCpu, pVmcsInfo, IEM_CPUMCTX_EXTRN_MUST_MASK); 8862 9078 AssertRCReturn(rc, rc); … … 8896 9112 return VINF_SUCCESS; 8897 9113 } 8898 #else 9114 Log4Func(("EPT return to ring-3 rcStrict=%Rrc\n", VBOXSTRICTRC_VAL(rcStrict))); 9115 return rcStrict; 9116 9117 #else /* IN_NEM_DARWIN */ 8899 9118 PVM pVM = pVCpu->CTX_SUFF(pVM); 8900 9119 uint64_t const uHostTsc = ASMReadTSC(); RT_NOREF(uHostTsc); … … 8966 9185 8967 9186 ASMAtomicUoOrU64(&VCPU_2_VMXSTATE(pVCpu).fCtxChanged, HM_CHANGED_ALL_GUEST); 8968 #endif 8969 8970 Log4Func(("EPT return to ring-3 rcStrict2=%Rrc\n", VBOXSTRICTRC_VAL(rcStrict))); 9187 9188 Log4Func(("EPT return rcStrict=%Rrc\n", VBOXSTRICTRC_VAL(rcStrict))); 8971 9189 return rcStrict; 9190 #endif /* IN_NEM_DARWIN */ 8972 9191 } 8973 9192 … … 8981 9200 HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient); 8982 9201 9202 # ifdef HMVMX_WITH_CONDENSED_VMREADS 9203 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 9204 | HMVMX_READ_EXIT_INSTR_INFO 9205 | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 9206 # else 8983 9207 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient); 8984 9208 vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient); 8985 9209 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient); 9210 # endif 8986 9211 int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, CPUMCTX_EXTRN_RSP | CPUMCTX_EXTRN_SREG_MASK 8987 9212 | CPUMCTX_EXTRN_HWVIRT … … 9042 9267 HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient); 9043 9268 9269 # ifdef HMVMX_WITH_CONDENSED_VMREADS 9270 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 9271 | HMVMX_READ_EXIT_INSTR_INFO 9272 | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 9273 # else 9044 9274 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient); 9045 9275 vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient); 9046 9276 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient); 9277 # endif 9047 9278 int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, CPUMCTX_EXTRN_RSP | CPUMCTX_EXTRN_SREG_MASK 9048 9279 | CPUMCTX_EXTRN_HWVIRT … … 9074 9305 HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient); 9075 9306 9307 # ifdef HMVMX_WITH_CONDENSED_VMREADS 9308 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 9309 | HMVMX_READ_EXIT_INSTR_INFO 9310 | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 9311 # else 9076 9312 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient); 9077 9313 vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient); 9078 9314 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient); 9315 #endif 9079 9316 int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, CPUMCTX_EXTRN_RSP | CPUMCTX_EXTRN_SREG_MASK 9080 9317 | CPUMCTX_EXTRN_HWVIRT … … 9111 9348 * code elsewhere dares look at unsynced VMCS fields. 9112 9349 */ 9350 # ifdef HMVMX_WITH_CONDENSED_VMREADS 9351 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 9352 | HMVMX_READ_EXIT_INSTR_INFO 9353 | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 9354 # else 9113 9355 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient); 9114 9356 vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient); 9115 9357 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient); 9358 # endif 9116 9359 int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, CPUMCTX_EXTRN_RSP | CPUMCTX_EXTRN_SREG_MASK 9117 9360 | CPUMCTX_EXTRN_HWVIRT … … 9199 9442 * flags re-loading the entire shadow VMCS, we should save the entire shadow VMCS here. 9200 9443 */ 9444 # ifdef HMVMX_WITH_CONDENSED_VMREADS 9445 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 9446 | HMVMX_READ_EXIT_INSTR_INFO 9447 | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 9448 # else 9201 9449 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient); 9202 9450 vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient); 9203 9451 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient); 9452 # endif 9204 9453 int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, CPUMCTX_EXTRN_RSP | CPUMCTX_EXTRN_SREG_MASK 9205 9454 | CPUMCTX_EXTRN_HWVIRT … … 9259 9508 HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient); 9260 9509 9510 # ifdef HMVMX_WITH_CONDENSED_VMREADS 9511 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 9512 | HMVMX_READ_EXIT_INSTR_INFO 9513 | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 9514 # else 9261 9515 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient); 9262 9516 vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient); 9263 9517 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient); 9518 # endif 9264 9519 int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, CPUMCTX_EXTRN_RSP | CPUMCTX_EXTRN_SREG_MASK 9265 9520 | CPUMCTX_EXTRN_HWVIRT … … 9291 9546 HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient); 9292 9547 9548 # ifdef HMVMX_WITH_CONDENSED_VMREADS 9549 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 9550 | HMVMX_READ_EXIT_INSTR_INFO 9551 | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 9552 # else 9293 9553 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient); 9294 9554 vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient); 9295 9555 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient); 9556 # endif 9296 9557 int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, CPUMCTX_EXTRN_RSP | CPUMCTX_EXTRN_SREG_MASK 9297 9558 | IEM_CPUMCTX_EXTRN_EXEC_DECODED_MEM_MASK); … … 9323 9584 HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient); 9324 9585 9586 # ifdef HMVMX_WITH_CONDENSED_VMREADS 9587 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 9588 | HMVMX_READ_EXIT_INSTR_INFO 9589 | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 9590 # else 9325 9591 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient); 9326 9592 vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient); 9327 9593 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient); 9594 # endif 9328 9595 int rc = vmxHCImportGuestState(pVCpu, pVmxTransient->pVmcsInfo, CPUMCTX_EXTRN_RSP | CPUMCTX_EXTRN_SREG_MASK 9329 9596 | IEM_CPUMCTX_EXTRN_EXEC_DECODED_MEM_MASK); … … 9393 9660 case VMX_EXIT_INT_INFO_TYPE_HW_XCPT: 9394 9661 { 9662 # ifdef HMVMX_WITH_CONDENSED_VMREADS 9663 vmxHCReadToTransient< HMVMX_READ_EXIT_INTERRUPTION_ERROR_CODE 9664 | HMVMX_READ_EXIT_INSTR_LEN 9665 | HMVMX_READ_IDT_VECTORING_INFO 9666 | HMVMX_READ_IDT_VECTORING_ERROR_CODE>(pVCpu, pVmxTransient); 9667 # else 9395 9668 vmxHCReadExitIntErrorCodeVmcs(pVCpu, pVmxTransient); 9396 9669 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient); 9397 9670 vmxHCReadIdtVectoringInfoVmcs(pVCpu, pVmxTransient); 9398 9671 vmxHCReadIdtVectoringErrorCodeVmcs(pVCpu, pVmxTransient); 9672 # endif 9399 9673 9400 9674 PCCPUMCTX pCtx = &pVCpu->cpum.GstCtx; 9401 bool const fIntercept = CPUMIsGuestVmxXcptInterceptSet(pCtx, VMX_EXIT_INT_INFO_VECTOR(uExitIntInfo), 9402 pVmxTransient->uExitIntErrorCode); 9403 if (fIntercept) 9675 if (CPUMIsGuestVmxXcptInterceptSet(pCtx, VMX_EXIT_INT_INFO_VECTOR(uExitIntInfo), pVmxTransient->uExitIntErrorCode)) 9404 9676 { 9405 9677 /* Exit qualification is required for debug and page-fault exceptions. */ … … 9499 9771 HMVMX_VALIDATE_NESTED_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient); 9500 9772 9773 # ifdef HMVMX_WITH_CONDENSED_VMREADS 9774 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 9775 | HMVMX_READ_EXIT_INSTR_LEN 9776 | HMVMX_READ_IDT_VECTORING_INFO 9777 | HMVMX_READ_IDT_VECTORING_ERROR_CODE>(pVCpu, pVmxTransient); 9778 # else 9501 9779 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient); 9502 9780 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient); 9503 9781 vmxHCReadIdtVectoringInfoVmcs(pVCpu, pVmxTransient); 9504 9782 vmxHCReadIdtVectoringErrorCodeVmcs(pVCpu, pVmxTransient); 9505 9783 # endif 9506 9784 VMXVEXITINFO const ExitInfo = VMXVEXITINFO_INIT_WITH_QUAL_AND_INSTR_LEN_FROM_TRANSIENT(pVmxTransient); 9507 9785 VMXVEXITEVENTINFO const ExitEventInfo = VMXVEXITEVENTINFO_INIT_ONLY_IDT(pVmxTransient->uIdtVectoringInfo, … … 9536 9814 if (CPUMIsGuestVmxProcCtlsSet(&pVCpu->cpum.GstCtx, VMX_PROC_CTLS_INVLPG_EXIT)) 9537 9815 { 9816 # ifdef HMVMX_WITH_CONDENSED_VMREADS 9817 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 9818 | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 9819 # else 9538 9820 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient); 9539 9821 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient); 9540 9822 # endif 9541 9823 VMXVEXITINFO const ExitInfo = VMXVEXITINFO_INIT_WITH_QUAL_AND_INSTR_LEN_FROM_TRANSIENT(pVmxTransient); 9542 9824 return IEMExecVmxVmexitInstrWithInfo(pVCpu, &ExitInfo); … … 9585 9867 if (CPUMIsGuestVmxVmreadVmwriteInterceptSet(pVCpu, pVmxTransient->uExitReason, u64VmcsField)) 9586 9868 { 9869 # ifdef HMVMX_WITH_CONDENSED_VMREADS 9870 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 9871 | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 9872 # else 9587 9873 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient); 9588 9874 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient); 9589 9875 # endif 9590 9876 VMXVEXITINFO const ExitInfo = VMXVEXITINFO_INIT_WITH_QUAL_AND_INSTR_INFO_FROM_TRANSIENT(pVmxTransient); 9591 9877 return IEMExecVmxVmexitInstrWithInfo(pVCpu, &ExitInfo); … … 9623 9909 HMVMX_VALIDATE_NESTED_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient); 9624 9910 9911 # ifdef HMVMX_WITH_CONDENSED_VMREADS 9912 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 9913 | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 9914 # else 9625 9915 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient); 9626 9916 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient); 9917 # endif 9627 9918 9628 9919 VBOXSTRICTRC rcStrict; … … 9771 10062 if (CPUMIsGuestVmxProcCtlsSet(&pVCpu->cpum.GstCtx, VMX_PROC_CTLS_MOV_DR_EXIT)) 9772 10063 { 10064 # ifdef HMVMX_WITH_CONDENSED_VMREADS 10065 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 10066 | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 10067 # else 9773 10068 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient); 9774 10069 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient); 9775 10070 # endif 9776 10071 VMXVEXITINFO const ExitInfo = VMXVEXITINFO_INIT_WITH_QUAL_AND_INSTR_LEN_FROM_TRANSIENT(pVmxTransient); 9777 10072 return IEMExecVmxVmexitInstrWithInfo(pVCpu, &ExitInfo); … … 9973 10268 HMVMX_VALIDATE_NESTED_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient); 9974 10269 10270 # ifdef HMVMX_WITH_CONDENSED_VMREADS 10271 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 10272 | HMVMX_READ_EXIT_INSTR_LEN 10273 | HMVMX_READ_IDT_VECTORING_INFO 10274 | HMVMX_READ_IDT_VECTORING_ERROR_CODE>(pVCpu, pVmxTransient); 10275 # else 9975 10276 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient); 9976 10277 vmxHCReadIdtVectoringInfoVmcs(pVCpu, pVmxTransient); 9977 10278 vmxHCReadIdtVectoringErrorCodeVmcs(pVCpu, pVmxTransient); 9978 10279 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient); 10280 # endif 9979 10281 9980 10282 Assert(CPUMIsGuestVmxProcCtls2Set(&pVCpu->cpum.GstCtx, VMX_PROC_CTLS2_VIRT_APIC_ACCESS)); … … 10061 10363 { 10062 10364 Assert(CPUMIsGuestVmxProcCtls2Set(&pVCpu->cpum.GstCtx, VMX_PROC_CTLS2_INVPCID)); 10365 # ifdef HMVMX_WITH_CONDENSED_VMREADS 10366 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 10367 | HMVMX_READ_EXIT_INSTR_INFO 10368 | HMVMX_READ_EXIT_INSTR_LEN>(pVCpu, pVmxTransient); 10369 # else 10063 10370 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient); 10064 10371 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient); 10065 10372 vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient); 10066 10373 # endif 10067 10374 VMXVEXITINFO const ExitInfo = VMXVEXITINFO_INIT_WITH_QUAL_AND_INSTR_INFO_FROM_TRANSIENT(pVmxTransient); 10068 10375 return IEMExecVmxVmexitInstrWithInfo(pVCpu, &ExitInfo); … … 10166 10473 # endif 10167 10474 10475 # ifdef HMVMX_WITH_CONDENSED_VMREADS 10476 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 10477 | HMVMX_READ_EXIT_INSTR_LEN 10478 | HMVMX_READ_EXIT_INSTR_INFO>(pVCpu, pVmxTransient); 10479 # else 10168 10480 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient); 10169 10481 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient); 10170 10482 vmxHCReadExitInstrInfoVmcs(pVCpu, pVmxTransient); 10171 10483 # endif 10172 10484 VMXVEXITINFO const ExitInfo = VMXVEXITINFO_INIT_WITH_QUAL_AND_INSTR_INFO_FROM_TRANSIENT(pVmxTransient); 10173 10485 return IEMExecVmxVmexitInstrWithInfo(pVCpu, &ExitInfo); … … 10194 10506 AssertRCReturn(rc, rc); 10195 10507 10508 # ifdef DSL_IRQ_FIX_2 10509 # ifdef HMVMX_WITH_CONDENSED_VMREADS 10510 vmxHCReadToTransient< HMVMX_READ_EXIT_QUALIFICATION 10511 | HMVMX_READ_EXIT_INSTR_LEN 10512 | HMVMX_READ_EXIT_INTERRUPTION_INFO 10513 | HMVMX_READ_EXIT_INTERRUPTION_ERROR_CODE 10514 | HMVMX_READ_IDT_VECTORING_INFO 10515 | HMVMX_READ_IDT_VECTORING_ERROR_CODE 10516 | HMVMX_READ_GUEST_PHYSICAL_ADDR>(pVCpu, pVmxTransient); 10517 # else 10196 10518 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient); 10197 vmxHCReadGuestPhysicalAddrVmcs(pVCpu, pVmxTransient); 10198 # ifdef DSL_IRQ_FIX_2 10519 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient); 10199 10520 vmxHCReadExitIntInfoVmcs(pVCpu, pVmxTransient); 10200 10521 vmxHCReadExitIntErrorCodeVmcs(pVCpu, pVmxTransient); 10201 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);10202 10522 vmxHCReadIdtVectoringInfoVmcs(pVCpu, pVmxTransient); 10203 10523 vmxHCReadIdtVectoringErrorCodeVmcs(pVCpu, pVmxTransient); 10524 vmxHCReadGuestPhysicalAddrVmcs(pVCpu, pVmxTransient); 10525 # endif 10204 10526 10205 10527 /* … … 10218 10540 bool const fClearEventOnForward = VCPU_2_VMXSTATE(pVCpu).Event.fPending; /* paranoia. should not inject events below. */ 10219 10541 # else 10542 vmxHCReadExitQualVmcs(pVCpu, pVmxTransient); 10543 vmxHCReadGuestPhysicalAddrVmcs(pVCpu, pVmxTransient); 10220 10544 VBOXSTRICTRC rcStrict; 10221 10545 # endif … … 10274 10598 } 10275 10599 10600 # ifndef DSL_IRQ_FIX_2 10276 10601 vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient); 10277 10602 vmxHCReadIdtVectoringInfoVmcs(pVCpu, pVmxTransient); 10278 10603 vmxHCReadIdtVectoringErrorCodeVmcs(pVCpu, pVmxTransient); 10279 # ifdef DSL_IRQ_FIX_210604 # else 10280 10605 if (fClearEventOnForward) 10281 10606 VCPU_2_VMXSTATE(pVCpu).Event.fPending = false; … … 10333 10658 10334 10659 AssertMsg(Walk.fFailed & PGM_WALKFAIL_EPT_MISCONFIG, ("GCPhysNestedFault=%#RGp\n", GCPhysNestedFault)); 10660 # ifdef HMVMX_WITH_CONDENSED_VMREADS 10661 vmxHCReadToTransient< HMVMX_READ_IDT_VECTORING_INFO 10662 | HMVMX_READ_IDT_VECTORING_ERROR_CODE>(pVCpu, pVmxTransient); 10663 # else 10335 10664 vmxHCReadIdtVectoringInfoVmcs(pVCpu, pVmxTransient); 10336 10665 vmxHCReadIdtVectoringErrorCodeVmcs(pVCpu, pVmxTransient); 10666 # endif 10337 10667 10338 10668 VMXVEXITEVENTINFO const ExitEventInfo = VMXVEXITEVENTINFO_INIT_ONLY_IDT(pVmxTransient->uIdtVectoringInfo,
Note:
See TracChangeset
for help on using the changeset viewer.