Changeset 72580 in vbox for trunk/src/VBox/VMM/VMMR3
- Timestamp:
- Jun 16, 2018 3:57:07 PM (7 years ago)
- svn:sync-xref-src-repo-rev:
- 123074
- Location:
- trunk/src/VBox/VMM/VMMR3
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR3/EM.cpp
r72579 r72580 149 149 } 150 150 151 LogRel(("EMR3Init: fRecompileUser=%RTbool fRecompileSupervisor=%RTbool fRawRing1Enabled=%RTbool fIemExecutesAll=%RTbool fGuruOnTripleFault=%RTbool\n", 152 pVM->fRecompileUser, pVM->fRecompileSupervisor, pVM->fRawRing1Enabled, pVM->em.s.fIemExecutesAll, pVM->em.s.fGuruOnTripleFault)); 151 /** 152 * @cfgm{/EM/ExitOptimizationEnabled, bool, true} 153 * Whether to try correlate exit history, detect hot spots and try optimize 154 * these using IEM if there are other exits close by. 155 */ 156 bool fExitOptimizationEnabled = true; 157 rc = CFGMR3QueryBoolDef(pCfgEM, "ExitOptimizationEnabled", &fExitOptimizationEnabled, true); 158 AssertLogRelRCReturn(rc, rc); 159 for (VMCPUID i = 0; i < pVM->cCpus; i++) 160 pVM->aCpus[i].em.s.fExitOptimizationEnabled = fExitOptimizationEnabled; 161 162 LogRel(("EMR3Init: fRecompileUser=%RTbool fRecompileSupervisor=%RTbool fRawRing1Enabled=%RTbool fIemExecutesAll=%RTbool fGuruOnTripleFault=%RTbool fExitOptimizationEnabled=%RTbool\n", 163 pVM->fRecompileUser, pVM->fRecompileSupervisor, pVM->fRawRing1Enabled, pVM->em.s.fIemExecutesAll, pVM->em.s.fGuruOnTripleFault, fExitOptimizationEnabled)); 153 164 154 165 #ifdef VBOX_WITH_REM … … 175 186 PVMCPU pVCpu = &pVM->aCpus[i]; 176 187 177 pVCpu->em.s.enmState = (i == 0) ? EMSTATE_NONE : EMSTATE_WAIT_SIPI; 178 pVCpu->em.s.enmPrevState = EMSTATE_NONE; 179 pVCpu->em.s.fForceRAW = false; 180 181 pVCpu->em.s.pCtx = CPUMQueryGuestCtxPtr(pVCpu); 188 pVCpu->em.s.enmState = i == 0 ? EMSTATE_NONE : EMSTATE_WAIT_SIPI; 189 pVCpu->em.s.enmPrevState = EMSTATE_NONE; 190 pVCpu->em.s.fForceRAW = false; 191 pVCpu->em.s.u64TimeSliceStart = 0; /* paranoia */ 192 pVCpu->em.s.idxContinueExitRec = UINT16_MAX; 193 194 pVCpu->em.s.pCtx = CPUMQueryGuestCtxPtr(pVCpu); 182 195 #ifdef VBOX_WITH_RAW_MODE 183 196 if (VM_IS_RAW_MODE_ENABLED(pVM)) … … 187 200 } 188 201 #endif 189 190 /* Force reset of the time slice. */191 pVCpu->em.s.u64TimeSliceStart = 0;192 202 193 203 # define EM_REG_COUNTER(a, b, c) \ … … 1774 1784 /* IOM has pending work (comitting an I/O or MMIO write). */ 1775 1785 if (VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_IOM)) 1786 { 1776 1787 rc = IOMR3ProcessForceFlag(pVM, pVCpu, rc); 1788 if (pVCpu->em.s.idxContinueExitRec >= RT_ELEMENTS(pVCpu->em.s.aExitRecords)) 1789 { /* half likely, or at least it's a line shorter. */ } 1790 else if (rc == VINF_SUCCESS) 1791 rc = VINF_EM_RESUME_R3_HISTORY_EXEC; 1792 else 1793 pVCpu->em.s.idxContinueExitRec = UINT16_MAX; 1794 } 1777 1795 1778 1796 #ifdef VBOX_WITH_RAW_MODE -
trunk/src/VBox/VMM/VMMR3/EMR3Nem.cpp
r72488 r72580 179 179 PCPUMCTX pCtx = pVCpu->em.s.pCtx; 180 180 #endif 181 int rc;182 181 NOREF(rcRC); 183 182 … … 199 198 */ 200 199 STAM_PROFILE_START(&pVCpu->em.s.StatIEMEmu, a); 201 CPUM_IMPORT_EXTRN_RET(pVCpu, IEM_CPUMCTX_EXTRN_MUST_MASK); 202 rc = VBOXSTRICTRC_TODO(IEMExecOne(pVCpu)); 200 201 VBOXSTRICTRC rcStrict; 202 uint32_t idxContinueExitRec = pVCpu->em.s.idxContinueExitRec; 203 RT_UNTRUSTED_NONVOLATILE_COPY_FENCE(); 204 if (idxContinueExitRec >= RT_ELEMENTS(pVCpu->em.s.aExitRecords)) 205 { 206 CPUM_IMPORT_EXTRN_RET(pVCpu, IEM_CPUMCTX_EXTRN_MUST_MASK); 207 rcStrict = IEMExecOne(pVCpu); 208 } 209 else 210 { 211 RT_UNTRUSTED_VALIDATED_FENCE(); 212 rcStrict = EMHistoryExec(pVCpu, &pVCpu->em.s.aExitRecords[idxContinueExitRec], 0); 213 LogFlow(("emR3NemExecuteInstruction: %Rrc (EMHistoryExec)\n", VBOXSTRICTRC_VAL(rcStrict))); 214 } 215 203 216 STAM_PROFILE_STOP(&pVCpu->em.s.StatIEMEmu, a); 204 217 205 if ( rc == VERR_IEM_ASPECT_NOT_IMPLEMENTED206 || rc == VERR_IEM_INSTR_NOT_IMPLEMENTED)218 if ( rcStrict == VERR_IEM_ASPECT_NOT_IMPLEMENTED 219 || rcStrict == VERR_IEM_INSTR_NOT_IMPLEMENTED) 207 220 { 208 221 #ifdef VBOX_WITH_REM … … 215 228 pVM->em.s.idLastRemCpu = pVCpu->idCpu; 216 229 217 rc = REMR3EmulateInstruction(pVM, pVCpu);230 rcStrict = REMR3EmulateInstruction(pVM, pVCpu); 218 231 EMRemUnlock(pVM); 219 232 STAM_PROFILE_STOP(&pVCpu->em.s.StatREMEmu, b); … … 222 235 #endif /* !VBOX_WITH_REM */ 223 236 } 224 return rc;237 return VBOXSTRICTRC_TODO(rcStrict); 225 238 } 226 239 … … 259 272 STAM_PROFILE_START(&pVCpu->em.s.StatIOEmu, a); 260 273 261 #if 0 262 PCPUMCTX pCtx = pVCpu->em.s.pCtx; 263 264 /* 265 * Try to restart the io instruction that was refused in ring-0. 266 */ 267 VBOXSTRICTRC rcStrict = HMR3RestartPendingIOInstr(pVM, pVCpu, pCtx); 268 if (IOM_SUCCESS(rcStrict)) 269 { 274 /* 275 * Hand it over to the interpreter. 276 */ 277 CPUM_IMPORT_EXTRN_RET(pVCpu, IEM_CPUMCTX_EXTRN_MUST_MASK); 278 VBOXSTRICTRC rcStrict; 279 uint32_t idxContinueExitRec = pVCpu->em.s.idxContinueExitRec; 280 RT_UNTRUSTED_NONVOLATILE_COPY_FENCE(); 281 if (idxContinueExitRec >= RT_ELEMENTS(pVCpu->em.s.aExitRecords)) 282 { 283 rcStrict = IEMExecOne(pVCpu); 284 LogFlow(("emR3NemExecuteIOInstruction: %Rrc (IEMExecOne)\n", VBOXSTRICTRC_VAL(rcStrict))); 285 STAM_COUNTER_INC(&pVCpu->em.s.CTX_SUFF(pStats)->StatIoIem); 286 } 287 else 288 { 289 RT_UNTRUSTED_VALIDATED_FENCE(); 290 rcStrict = EMHistoryExec(pVCpu, &pVCpu->em.s.aExitRecords[idxContinueExitRec], 0); 291 LogFlow(("emR3NemExecuteIOInstruction: %Rrc (EMHistoryExec)\n", VBOXSTRICTRC_VAL(rcStrict))); 270 292 STAM_COUNTER_INC(&pVCpu->em.s.CTX_SUFF(pStats)->StatIoRestarted); 271 STAM_PROFILE_STOP(&pVCpu->em.s.StatIOEmu, a); 272 return VBOXSTRICTRC_TODO(rcStrict); /* rip already updated. */ 273 } 274 AssertMsgReturn(rcStrict == VERR_NOT_FOUND, ("%Rrc\n", VBOXSTRICTRC_VAL(rcStrict)), 275 RT_SUCCESS_NP(rcStrict) ? VERR_IPE_UNEXPECTED_INFO_STATUS : VBOXSTRICTRC_TODO(rcStrict)); 276 #endif 277 278 /* 279 * Hand it over to the interpreter. 280 */ 281 CPUM_IMPORT_EXTRN_RET(pVCpu, IEM_CPUMCTX_EXTRN_MUST_MASK); 282 VBOXSTRICTRC rcStrict = IEMExecOne(pVCpu); 283 LogFlow(("emR3NemExecuteIOInstruction: %Rrc\n", VBOXSTRICTRC_VAL(rcStrict))); 284 STAM_COUNTER_INC(&pVCpu->em.s.CTX_SUFF(pStats)->StatIoIem); 293 } 285 294 286 295 STAM_PROFILE_STOP(&pVCpu->em.s.StatIOEmu, a);
Note:
See TracChangeset
for help on using the changeset viewer.