Changeset 60888 in vbox
- Timestamp:
- May 9, 2016 11:58:46 AM (9 years ago)
- svn:sync-xref-src-repo-rev:
- 107100
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/IEMAll.cpp
r60882 r60888 4567 4567 #else 4568 4568 Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(IEMCPU_TO_VMCPU(pIemCpu), pSReg)); 4569 #endif 4570 return pSReg; 4571 } 4572 4573 4574 /** 4575 * Ensures that the given hidden segment register is up to date. 4576 * 4577 * @returns Hidden register reference. 4578 * @param pIemCpu The per CPU data. 4579 * @param pSReg The segment register. 4580 */ 4581 IEM_STATIC PCPUMSELREG iemSRegUpdateHid(PIEMCPU pIemCpu, PCPUMSELREG pSReg) 4582 { 4583 #ifdef VBOX_WITH_RAW_MODE_NOT_R0 4584 if (!CPUMSELREG_ARE_HIDDEN_PARTS_VALID(IEMCPU_TO_VMCPU(pIemCpu), pSReg)) 4585 CPUMGuestLazyLoadHiddenSelectorReg(IEMCPU_TO_VMCPU(pIemCpu), pSReg); 4586 #else 4587 Assert(CPUMSELREG_ARE_HIDDEN_PARTS_VALID(IEMCPU_TO_VMCPU(pIemCpu), pSReg)); 4588 NOREF(pIemCpu); 4569 4589 #endif 4570 4590 return pSReg; … … 10443 10463 * Performs the post-execution verfication checks. 10444 10464 */ 10445 IEM_STATIC void iemExecVerificationModeCheck(PIEMCPU pIemCpu)10465 IEM_STATIC VBOXSTRICTRC iemExecVerificationModeCheck(PIEMCPU pIemCpu, VBOXSTRICTRC rcStrictIem) 10446 10466 { 10447 10467 if (!IEM_VERIFICATION_ENABLED(pIemCpu)) 10448 return ;10468 return rcStrictIem; 10449 10469 10450 10470 /* … … 10503 10523 fRem = true; 10504 10524 } 10525 10526 # if 1 /* Skip unimplemented instructions for now. */ 10527 if (rcStrictIem == VERR_IEM_INSTR_NOT_IMPLEMENTED) 10528 { 10529 pIemCpu->CTX_SUFF(pCtx) = pOrgCtx; 10530 if (rc == VINF_EM_DBG_STEPPED) 10531 return VINF_SUCCESS; 10532 return rc; 10533 } 10534 # endif 10505 10535 10506 10536 /* … … 10725 10755 DBGFR3Info(pVM->pUVM, "cpumguest", "verbose", NULL); 10726 10756 RTAssertMsg1(NULL, __LINE__, __FILE__, __FUNCTION__); 10727 iemVerifyAssertMsg2(pIemCpu);10728 10757 RTAssertPanic(); 10758 static bool volatile s_fEnterDebugger = true; 10759 if (s_fEnterDebugger) 10760 DBGFSTOP(pVM); 10761 10762 # if 1 /* Ignore unimplemented instructions for now. */ 10763 if (rcStrictIem == VERR_IEM_INSTR_NOT_IMPLEMENTED) 10764 rcStrictIem = VINF_SUCCESS; 10765 # endif 10729 10766 } 10730 10767 # undef CHECK_FIELD … … 10822 10859 } 10823 10860 pIemCpu->CTX_SUFF(pCtx) = pOrgCtx; 10861 10862 return rcStrictIem; 10824 10863 } 10825 10864 … … 11075 11114 11076 11115 #if defined(IEM_VERIFICATION_MODE_FULL) && defined(IN_RING3) 11077 iemExecVerificationModeSetup(pIemCpu); 11116 if (++pIemCpu->cVerifyDepth == 1) 11117 iemExecVerificationModeSetup(pIemCpu); 11078 11118 #endif 11079 11119 #ifdef LOG_ENABLED … … 11093 11133 * Assert some sanity. 11094 11134 */ 11095 iemExecVerificationModeCheck(pIemCpu); 11135 if (pIemCpu->cVerifyDepth == 1) 11136 rcStrict = iemExecVerificationModeCheck(pIemCpu, rcStrict); 11137 pIemCpu->cVerifyDepth--; 11096 11138 #endif 11097 11139 #ifdef IN_RC … … 11255 11297 * Assert some sanity. 11256 11298 */ 11257 iemExecVerificationModeCheck(pIemCpu);11299 rcStrict = iemExecVerificationModeCheck(pIemCpu, rcStrict); 11258 11300 #endif 11259 11301 -
trunk/src/VBox/VMM/VMMAll/IEMAllCImplStrInstr.cpp.h
r60871 r60888 69 69 */ 70 70 #ifdef IN_RC 71 # define IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(a_pVM, a_pVCpu, a_ fEflags) \71 # define IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(a_pVM, a_pVCpu, a_pIemCpu, a_fEflags) \ 72 72 do { \ 73 if (RT_LIKELY( !VMCPU_FF_IS_PENDING(a_pVCpu, (a_fEflags) & X86_EFL_IF ? VMCPU_FF_YIELD_REPSTR_MASK \ 74 : VMCPU_FF_YIELD_REPSTR_NOINT_MASK) \ 75 && !VM_FF_IS_PENDING(a_pVM, VM_FF_YIELD_REPSTR_MASK))) \ 73 if (RT_LIKELY( ( !VMCPU_FF_IS_PENDING(a_pVCpu, (a_fEflags) & X86_EFL_IF ? VMCPU_FF_YIELD_REPSTR_MASK \ 74 : VMCPU_FF_YIELD_REPSTR_NOINT_MASK) \ 75 && !VM_FF_IS_PENDING(a_pVM, VM_FF_YIELD_REPSTR_MASK) ) \ 76 || IEM_VERIFICATION_ENABLED(a_pIemCpu) )) \ 76 77 { \ 77 78 RTCCUINTREG fSavedFlags = ASMGetFlags(); \ … … 83 84 } \ 84 85 } \ 85 else return VINF_SUCCESS; \ 86 else \ 87 { \ 88 LogFlow(("%s: Leaving early (outer)! ffcpu=%#x ffvm=%#x\n", \ 89 __FUNCTION__, (a_pVCpu)->fLocalForcedActions, (a_pVM)->fGlobalForcedActions)); \ 90 return VINF_SUCCESS; \ 91 } \ 86 92 } while (0) 87 93 #else 88 # define IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(a_pVM, a_pVCpu, a_ fEflags) \94 # define IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(a_pVM, a_pVCpu, a_pIemCpu, a_fEflags) \ 89 95 do { \ 90 if (RT_LIKELY( !VMCPU_FF_IS_PENDING(a_pVCpu, (a_fEflags) & X86_EFL_IF ? VMCPU_FF_YIELD_REPSTR_MASK \ 91 : VMCPU_FF_YIELD_REPSTR_NOINT_MASK) \ 92 && !VM_FF_IS_PENDING(a_pVM, VM_FF_YIELD_REPSTR_MASK))) \ 96 if (RT_LIKELY( ( !VMCPU_FF_IS_PENDING(a_pVCpu, (a_fEflags) & X86_EFL_IF ? VMCPU_FF_YIELD_REPSTR_MASK \ 97 : VMCPU_FF_YIELD_REPSTR_NOINT_MASK) \ 98 && !VM_FF_IS_PENDING(a_pVM, VM_FF_YIELD_REPSTR_MASK) ) \ 99 || IEM_VERIFICATION_ENABLED(a_pIemCpu) )) \ 93 100 { /* probable */ } \ 94 else return VINF_SUCCESS; \ 101 else \ 102 { \ 103 LogFlow(("%s: Leaving early (outer)! ffcpu=%#x ffvm=%#x\n", \ 104 __FUNCTION__, (a_pVCpu)->fLocalForcedActions, (a_pVM)->fGlobalForcedActions)); \ 105 return VINF_SUCCESS; \ 106 } \ 95 107 } while (0) 96 108 #endif 97 98 109 99 110 /** @def IEM_CHECK_FF_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN … … 102 113 * don't miss out on important stuff that happened while processing a word. 103 114 */ 104 #define IEM_CHECK_FF_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(a_pVM, a_pVCpu, a_ fExitExpr) \115 #define IEM_CHECK_FF_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(a_pVM, a_pVCpu, a_pIemCpu, a_fExitExpr) \ 105 116 do { \ 106 117 if (RT_LIKELY( ( !VMCPU_FF_IS_PENDING(a_pVCpu, VMCPU_FF_HIGH_PRIORITY_POST_REPSTR_MASK) \ 107 118 && !VM_FF_IS_PENDING(a_pVM, VM_FF_HIGH_PRIORITY_POST_REPSTR_MASK)) \ 108 || (a_fExitExpr))) \ 119 || (a_fExitExpr) \ 120 || IEM_VERIFICATION_ENABLED(a_pIemCpu) )) \ 109 121 { /* very likely */ } \ 110 else return VINF_SUCCESS; \ 122 else \ 123 { \ 124 LogFlow(("%s: Leaving early (inner)! ffcpu=%#x ffvm=%#x\n", \ 125 __FUNCTION__, (a_pVCpu)->fLocalForcedActions, (a_pVM)->fGlobalForcedActions)); \ 126 return VINF_SUCCESS; \ 127 } \ 111 128 } while (0) 112 129 … … 138 155 139 156 uint64_t uSrc2Base; 140 rcStrict = iemMemSegCheckReadAccessEx(pIemCpu, &pCtx->es, X86_SREG_ES, &uSrc2Base);157 rcStrict = iemMemSegCheckReadAccessEx(pIemCpu, iemSRegUpdateHid(pIemCpu, &pCtx->es), X86_SREG_ES, &uSrc2Base); 141 158 if (rcStrict != VINF_SUCCESS) 142 159 return rcStrict; … … 232 249 || !(uEFlags & X86_EFL_ZF)) 233 250 break; 234 IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, uEFlags);251 IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, uEFlags); 235 252 continue; 236 253 } … … 271 288 || !(uEFlags & X86_EFL_ZF)) 272 289 break; 273 IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, uEFlags);290 IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, uEFlags); 274 291 } 275 292 … … 308 325 309 326 uint64_t uSrc2Base; 310 rcStrict = iemMemSegCheckReadAccessEx(pIemCpu, &pCtx->es, X86_SREG_ES, &uSrc2Base);327 rcStrict = iemMemSegCheckReadAccessEx(pIemCpu, iemSRegUpdateHid(pIemCpu, &pCtx->es), X86_SREG_ES, &uSrc2Base); 311 328 if (rcStrict != VINF_SUCCESS) 312 329 return rcStrict; … … 402 419 || (uEFlags & X86_EFL_ZF)) 403 420 break; 404 IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, uEFlags);421 IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, uEFlags); 405 422 continue; 406 423 } … … 441 458 || (uEFlags & X86_EFL_ZF)) 442 459 break; 443 IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, uEFlags);460 IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, uEFlags); 444 461 } 445 462 … … 472 489 473 490 uint64_t uBaseAddr; 474 VBOXSTRICTRC rcStrict = iemMemSegCheckReadAccessEx(pIemCpu, &pCtx->es, X86_SREG_ES, &uBaseAddr);491 VBOXSTRICTRC rcStrict = iemMemSegCheckReadAccessEx(pIemCpu, iemSRegUpdateHid(pIemCpu, &pCtx->es), X86_SREG_ES, &uBaseAddr); 475 492 if (rcStrict != VINF_SUCCESS) 476 493 return rcStrict; … … 540 557 if (!(uVirtAddr & (OP_SIZE - 1))) 541 558 { 542 IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, uEFlags);559 IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, uEFlags); 543 560 continue; 544 561 } … … 574 591 || !(uEFlags & X86_EFL_ZF)) 575 592 break; 576 IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, uEFlags);593 IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, uEFlags); 577 594 } 578 595 … … 605 622 606 623 uint64_t uBaseAddr; 607 VBOXSTRICTRC rcStrict = iemMemSegCheckReadAccessEx(pIemCpu, &pCtx->es, X86_SREG_ES, &uBaseAddr);624 VBOXSTRICTRC rcStrict = iemMemSegCheckReadAccessEx(pIemCpu, iemSRegUpdateHid(pIemCpu, &pCtx->es), X86_SREG_ES, &uBaseAddr); 608 625 if (rcStrict != VINF_SUCCESS) 609 626 return rcStrict; … … 673 690 if (!(uVirtAddr & (OP_SIZE - 1))) 674 691 { 675 IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, uEFlags);692 IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, uEFlags); 676 693 continue; 677 694 } … … 706 723 || (uEFlags & X86_EFL_ZF)) 707 724 break; 708 IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, uEFlags);725 IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, uEFlags); 709 726 } 710 727 … … 745 762 746 763 uint64_t uDstBase; 747 rcStrict = iemMemSegCheckWriteAccessEx(pIemCpu, &pCtx->es, X86_SREG_ES, &uDstBase);764 rcStrict = iemMemSegCheckWriteAccessEx(pIemCpu, iemSRegUpdateHid(pIemCpu, &pCtx->es), X86_SREG_ES, &uDstBase); 748 765 if (rcStrict != VINF_SUCCESS) 749 766 return rcStrict; … … 849 866 if (uCounterReg == 0) 850 867 break; 851 IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, p Ctx->eflags.u);868 IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, pCtx->eflags.u); 852 869 continue; 853 870 } … … 875 892 pCtx->ADDR_rCX = --uCounterReg; 876 893 cLeftPage--; 877 IEM_CHECK_FF_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, uCounterReg == 0);894 IEM_CHECK_FF_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, uCounterReg == 0); 878 895 } while ((int32_t)cLeftPage > 0); 879 896 … … 883 900 if (uCounterReg == 0) 884 901 break; 885 IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, p Ctx->eflags.u);902 IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, pCtx->eflags.u); 886 903 } 887 904 … … 914 931 915 932 uint64_t uBaseAddr; 916 VBOXSTRICTRC rcStrict = iemMemSegCheckWriteAccessEx(pIemCpu, &pCtx->es, X86_SREG_ES, &uBaseAddr);933 VBOXSTRICTRC rcStrict = iemMemSegCheckWriteAccessEx(pIemCpu, iemSRegUpdateHid(pIemCpu, &pCtx->es), X86_SREG_ES, &uBaseAddr); 917 934 if (rcStrict != VINF_SUCCESS) 918 935 return rcStrict; … … 989 1006 if (!(uVirtAddr & (OP_SIZE - 1))) 990 1007 { 991 IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, p Ctx->eflags.u);1008 IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, pCtx->eflags.u); 992 1009 continue; 993 1010 } … … 1017 1034 if (uCounterReg == 0) 1018 1035 break; 1019 IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, p Ctx->eflags.u);1036 IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, pCtx->eflags.u); 1020 1037 } 1021 1038 … … 1107 1124 if (!(uVirtAddr & (OP_SIZE - 1))) 1108 1125 { 1109 IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, p Ctx->eflags.u);1126 IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, pCtx->eflags.u); 1110 1127 continue; 1111 1128 } … … 1144 1161 if (uCounterReg == 0) 1145 1162 break; 1146 IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, p Ctx->eflags.u);1163 IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, pCtx->eflags.u); 1147 1164 } 1148 1165 … … 1337 1354 1338 1355 uint64_t uBaseAddr; 1339 rcStrict = iemMemSegCheckWriteAccessEx(pIemCpu, &pCtx->es, X86_SREG_ES, &uBaseAddr);1356 rcStrict = iemMemSegCheckWriteAccessEx(pIemCpu, iemSRegUpdateHid(pIemCpu, &pCtx->es), X86_SREG_ES, &uBaseAddr); 1340 1357 if (rcStrict != VINF_SUCCESS) 1341 1358 return rcStrict; … … 1416 1433 if (!(uVirtAddr & (OP_SIZE - 1))) 1417 1434 { 1418 IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, p Ctx->eflags.u);1435 IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, pCtx->eflags.u); 1419 1436 continue; 1420 1437 } … … 1483 1500 return rcStrict; 1484 1501 } 1485 IEM_CHECK_FF_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, uCounterReg == 0);1502 IEM_CHECK_FF_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, uCounterReg == 0); 1486 1503 } while ((int32_t)cLeftPage > 0); 1487 1504 … … 1492 1509 if (uCounterReg == 0) 1493 1510 break; 1494 IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, p Ctx->eflags.u);1511 IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, pCtx->eflags.u); 1495 1512 } 1496 1513 … … 1671 1688 if (!(uVirtAddr & (OP_SIZE - 1))) 1672 1689 { 1673 IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, p Ctx->eflags.u);1690 IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, pCtx->eflags.u); 1674 1691 continue; 1675 1692 } … … 1715 1732 return rcStrict; 1716 1733 } 1717 IEM_CHECK_FF_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, uCounterReg == 0);1734 IEM_CHECK_FF_HIGH_PRIORITY_POST_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, uCounterReg == 0); 1718 1735 } while ((int32_t)cLeftPage > 0); 1719 1736 … … 1724 1741 if (uCounterReg == 0) 1725 1742 break; 1726 IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, p Ctx->eflags.u);1743 IEM_CHECK_FF_YIELD_REPSTR_MAYBE_RETURN(pVM, pVCpu, pIemCpu, pCtx->eflags.u); 1727 1744 } 1728 1745 -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h
r60776 r60888 1695 1695 1696 1696 /** Opcode 0x0f 0x28. */ 1697 FNIEMOP_STUB(iemOp_movaps_Vps_Wps__movapd_Vpd_Wpd); 1697 FNIEMOP_STUB(iemOp_movaps_Vps_Wps__movapd_Vpd_Wpd); // NEXT - win2k 1698 1698 /** Opcode 0x0f 0x29. */ 1699 FNIEMOP_STUB(iemOp_movaps_Wps_Vps__movapd_Wpd_Vpd); 1699 FNIEMOP_STUB(iemOp_movaps_Wps_Vps__movapd_Wpd_Vpd); // NEXT - win2k 1700 1700 /** Opcode 0x0f 0x2a. */ 1701 1701 FNIEMOP_STUB(iemOp_cvtpi2ps_Vps_Qpi__cvtpi2pd_Vpd_Qpi__cvtsi2ss_Vss_Ey__cvtsi2sd_Vsd_Ey); //NEXT -
trunk/src/VBox/VMM/include/IEMInternal.h
r60415 r60888 348 348 * CPUM doesn't yet reflect. */ 349 349 uint8_t uInjectCpl; 350 bool afAlignment2[3]; 350 /** To prevent EMR3HmSingleInstruction from triggering endless recursion via 351 * emR3ExecuteInstruction and iemExecVerificationModeCheck. */ 352 uint8_t cVerifyDepth; 353 bool afAlignment2[2]; 351 354 /** Mask of undefined eflags. 352 355 * The verifier will any difference in these flags. */
Note:
See TracChangeset
for help on using the changeset viewer.