Changeset 88346 in vbox
- Timestamp:
- Apr 1, 2021 1:16:25 PM (4 years ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR0/VMMR0.cpp
r88344 r88346 601 601 } 602 602 603 #if 0 /** @todo brokensee oem2 ticket 40 */603 #if 0 /** @todo temporarily disabled, see oem2 ticket 40 */ 604 604 605 605 /** … … 644 644 else if (VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_INTERRUPT_SMI)) 645 645 { 646 Log12(("vmmR0DoHaltInterrupt: CPU%d failed #3\n", pVCpu->idCpu)); 646 647 return VINF_EM_HALT; 647 648 } … … 654 655 { 655 656 /** @todo later. */ 657 Log12(("vmmR0DoHaltInterrupt: CPU%d failed #2 (uMWait=%u enmInt=%d)\n", pVCpu->idCpu, uMWait, enmInterruptibility)); 656 658 return VINF_EM_HALT; 657 659 } … … 667 669 * here before injecting the virtual interrupt. See emR3ForcedActions 668 670 * for details. */ 671 Log12(("vmmR0DoHaltInterrupt: CPU%d failed #1 (uMWait=%u enmInt=%d)\n", pVCpu->idCpu, uMWait, enmInterruptibility)); 669 672 return VINF_EM_HALT; 670 673 } … … 674 677 { 675 678 STAM_REL_COUNTER_INC(&pVCpu->vmm.s.StatR0HaltExec); 679 Log11(("vmmR0DoHaltInterrupt: CPU%d success VINF_SUCCESS (UNHALT)\n", pVCpu->idCpu)); 676 680 return VINF_SUCCESS; 677 681 } … … 679 683 { 680 684 STAM_REL_COUNTER_INC(&pVCpu->vmm.s.StatR0HaltExec); 685 Log11(("vmmR0DoHaltInterrupt: CPU%d success VINF_SUCCESS (uMWait=%u > 1)\n", pVCpu->idCpu, uMWait)); 681 686 return VINF_SUCCESS; 682 687 } 683 688 689 Log12(("vmmR0DoHaltInterrupt: CPU%d failed #0 (uMWait=%u enmInt=%d)\n", pVCpu->idCpu, uMWait, enmInterruptibility)); 684 690 return VINF_EM_HALT; 685 691 } … … 850 856 uint64_t const u64EndSchedHalt = RTTimeNanoTS(); 851 857 uint64_t const cNsElapsedSchedHalt = u64EndSchedHalt - u64StartSchedHalt; 858 Log10(("vmmR0DoHalt: CPU%d: halted %llu ns\n", pGVCpu->idCpu, cNsElapsedSchedHalt)); 852 859 853 860 VMCPU_CMPXCHG_STATE(pGVCpu, VMCPUSTATE_STARTED, VMCPUSTATE_STARTED_HALTED); … … 878 885 return vmmR0DoHaltInterrupt(pGVCpu, uMWait, enmInterruptibility); 879 886 } 887 Log12(("vmmR0DoHalt: CPU%d post #2 - No pending interrupt\n", pGVCpu->idCpu)); 880 888 } 889 else 890 Log12(("vmmR0DoHalt: CPU%d post #1 - Pending FF\n", pGVCpu->idCpu)); 881 891 } 892 else 893 Log12(("vmmR0DoHalt: CPU%d GVMMR0SchedHalt failed: %Rrc\n", pGVCpu->idCpu, rc)); 882 894 } 883 895 else 896 { 884 897 VMCPU_CMPXCHG_STATE(pGVCpu, VMCPUSTATE_STARTED, VMCPUSTATE_STARTED_HALTED); 898 Log12(("vmmR0DoHalt: CPU%d failed #4 - Pending FF\n", pGVCpu->idCpu)); 899 } 885 900 } 901 else 902 Log12(("vmmR0DoHalt: CPU%d failed #3 - enmState=%d\n", pGVCpu->idCpu, VMCPU_GET_STATE(pGVCpu))); 886 903 } 904 else 905 Log12(("vmmR0DoHalt: CPU%d failed #2 - Pending FF\n", pGVCpu->idCpu)); 887 906 } 888 907 } 889 } 908 else 909 Log12(("vmmR0DoHalt: CPU%d failed #1 - Pending FF\n", pGVCpu->idCpu)); 910 } 911 else 912 Log12(("vmmR0DoHalt: CPU%d failed #0 - fMayHaltInRing0=%d TRPMHasTrap=%d enmInt=%d uMWait=%u\n", 913 pGVCpu->idCpu, pGVCpu->vmm.s.fMayHaltInRing0, TRPMHasTrap(pGVCpu), enmInterruptibility, uMWait)); 914 890 915 return VINF_EM_HALT; 891 916 } … … 1491 1516 vmmR0RecordRC(pGVM, pGVCpu, rc); 1492 1517 #endif 1493 #if 0 /** @todo brokensee oem2 ticket 40 */1518 #if 0 /** @todo temporarily disabled, see oem2 ticket 40 */ 1494 1519 /* 1495 1520 * If this is a halt. -
trunk/src/VBox/VMM/VMMR3/VMEmt.cpp
r86118 r88346 1253 1253 static DECLCALLBACK(VBOXSTRICTRC) vmR3SetHaltMethodCallback(PVM pVM, PVMCPU pVCpu, void *pvUser) 1254 1254 { 1255 PUVM pUVM = pVM->pUVM; 1256 uintptr_t i = (uintptr_t)pvUser; 1255 PUVM pUVM = pVM->pUVM; 1256 int rc = VINF_SUCCESS; 1257 uintptr_t i = (uintptr_t)pvUser; 1257 1258 Assert(i < RT_ELEMENTS(g_aHaltMethods)); 1258 NOREF(pVCpu); 1259 1260 /* 1261 * Terminate the old one. 1262 */ 1263 if ( pUVM->vm.s.enmHaltMethod != VMHALTMETHOD_INVALID 1264 && g_aHaltMethods[pUVM->vm.s.iHaltMethod].pfnTerm) 1265 { 1266 g_aHaltMethods[pUVM->vm.s.iHaltMethod].pfnTerm(pUVM); 1267 pUVM->vm.s.enmHaltMethod = VMHALTMETHOD_INVALID; 1268 } 1269 1270 /* Assert that the failure fallback is where we expect. */ 1271 Assert(g_aHaltMethods[0].enmHaltMethod == VMHALTMETHOD_BOOTSTRAP); 1272 Assert(!g_aHaltMethods[0].pfnTerm && !g_aHaltMethods[0].pfnInit); 1273 1274 /* 1275 * Init the new one. 1276 */ 1277 int rc = VINF_SUCCESS; 1278 memset(&pUVM->vm.s.Halt, 0, sizeof(pUVM->vm.s.Halt)); 1279 if (g_aHaltMethods[i].pfnInit) 1280 { 1281 rc = g_aHaltMethods[i].pfnInit(pUVM); 1282 if (RT_FAILURE(rc)) 1283 { 1284 /* Fall back on the bootstrap method. This requires no 1285 init/term (see assertion above), and will always work. */ 1286 AssertLogRelRC(rc); 1287 i = 0; 1288 } 1289 } 1290 1291 /* 1292 * Commit it. 1293 */ 1294 pUVM->vm.s.enmHaltMethod = g_aHaltMethods[i].enmHaltMethod; 1295 ASMAtomicWriteU32(&pUVM->vm.s.iHaltMethod, i); 1296 1259 1260 /* 1261 * Main job is done once on EMT0 (it goes thru here first). 1262 */ 1263 if (pVCpu->idCpu == 0) 1264 { 1265 /* 1266 * Terminate the old one. 1267 */ 1268 if ( pUVM->vm.s.enmHaltMethod != VMHALTMETHOD_INVALID 1269 && g_aHaltMethods[pUVM->vm.s.iHaltMethod].pfnTerm) 1270 { 1271 g_aHaltMethods[pUVM->vm.s.iHaltMethod].pfnTerm(pUVM); 1272 pUVM->vm.s.enmHaltMethod = VMHALTMETHOD_INVALID; 1273 } 1274 1275 /* Assert that the failure fallback is where we expect. */ 1276 Assert(g_aHaltMethods[0].enmHaltMethod == VMHALTMETHOD_BOOTSTRAP); 1277 Assert(!g_aHaltMethods[0].pfnTerm && !g_aHaltMethods[0].pfnInit); 1278 1279 /* 1280 * Init the new one. 1281 */ 1282 memset(&pUVM->vm.s.Halt, 0, sizeof(pUVM->vm.s.Halt)); 1283 if (g_aHaltMethods[i].pfnInit) 1284 { 1285 rc = g_aHaltMethods[i].pfnInit(pUVM); 1286 if (RT_FAILURE(rc)) 1287 { 1288 /* Fall back on the bootstrap method. This requires no 1289 init/term (see assertion above), and will always work. */ 1290 AssertLogRelRC(rc); 1291 i = 0; 1292 } 1293 } 1294 1295 /* 1296 * Commit it. 1297 */ 1298 pUVM->vm.s.enmHaltMethod = g_aHaltMethods[i].enmHaltMethod; 1299 ASMAtomicWriteU32(&pUVM->vm.s.iHaltMethod, i); 1300 } 1301 else 1302 i = pUVM->vm.s.iHaltMethod; 1303 1304 /* 1305 * All EMTs must update their ring-0 halt configuration. 1306 */ 1297 1307 VMMR3SetMayHaltInRing0(pVCpu, g_aHaltMethods[i].fMayHaltInRing0, 1298 1308 g_aHaltMethods[i].enmHaltMethod == VMHALTMETHOD_GLOBAL_1 … … 1351 1361 * This needs to be done while the other EMTs are not sleeping or otherwise messing around. 1352 1362 */ 1353 return VMMR3EmtRendezvous(pVM, VMMEMTRENDEZVOUS_FLAGS_TYPE_ ONCE, vmR3SetHaltMethodCallback, (void *)(uintptr_t)i);1363 return VMMR3EmtRendezvous(pVM, VMMEMTRENDEZVOUS_FLAGS_TYPE_ASCENDING, vmR3SetHaltMethodCallback, (void *)(uintptr_t)i); 1354 1364 } 1355 1365 -
trunk/src/VBox/VMM/VMMR3/VMM.cpp
r88344 r88346 2134 2134 VMMR3_INT_DECL(void) VMMR3SetMayHaltInRing0(PVMCPU pVCpu, bool fMayHaltInRing0, uint32_t cNsSpinBlockThreshold) 2135 2135 { 2136 LogFlow(("VMMR3SetMayHaltInRing0(#%u, %d, %u)\n", pVCpu->idCpu, fMayHaltInRing0, cNsSpinBlockThreshold)); 2136 2137 pVCpu->vmm.s.fMayHaltInRing0 = fMayHaltInRing0; 2137 2138 pVCpu->vmm.s.cNsSpinBlockThreshold = cNsSpinBlockThreshold;
Note:
See TracChangeset
for help on using the changeset viewer.