Changeset 24740 in vbox for trunk/src/VBox
- Timestamp:
- Nov 17, 2009 9:44:14 PM (15 years ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/PDM.cpp
r24730 r24740 1135 1135 pDrvIns->pDrvReg->szDriverName, pDrvIns->iInstance, iLun, pszDeviceName, iDevInstance)); 1136 1136 pDrvIns->pDrvReg->pfnSuspend(pDrvIns); 1137 if (pDrvIns->Internal.s.pfnAsyncNotify) 1138 LogFlow(("PDMR3Suspend: Async notification started - driver '%s'/%d on LUN#%d of device '%s'/%d\n", 1139 pDrvIns->pDrvReg->szDriverName, pDrvIns->iInstance, iLun, pszDeviceName, iDevInstance)); 1137 1140 } 1138 1141 else if (pDrvIns->Internal.s.pfnAsyncNotify(pDrvIns)) … … 1171 1174 LogFlow(("PDMR3Suspend: Notifying - device '%s'/%d\n", pUsbIns->pUsbReg->szDeviceName, pUsbIns->iInstance)); 1172 1175 pUsbIns->pUsbReg->pfnVMSuspend(pUsbIns); 1176 if (pUsbIns->Internal.s.pfnAsyncNotify) 1177 LogFlow(("PDMR3Suspend: Async notification started - device '%s'/%d\n", pUsbIns->pUsbReg->szDeviceName, pUsbIns->iInstance)); 1173 1178 } 1174 1179 else if (pUsbIns->Internal.s.pfnAsyncNotify(pUsbIns)) … … 1204 1209 LogFlow(("PDMR3Suspend: Notifying - device '%s'/%d\n", pDevIns->pDevReg->szDeviceName, pDevIns->iInstance)); 1205 1210 pDevIns->pDevReg->pfnSuspend(pDevIns); 1211 if (pDevIns->Internal.s.pfnAsyncNotify) 1212 LogFlow(("PDMR3Suspend: Async notification started - device '%s'/%d\n", pDevIns->pDevReg->szDeviceName, pDevIns->iInstance)); 1206 1213 } 1207 1214 else if (pDevIns->Internal.s.pfnAsyncNotify(pDevIns)) … … 1241 1248 */ 1242 1249 unsigned cAsync; 1243 for ( ;;)1250 for (unsigned iLoop = 0; ; iLoop++) 1244 1251 { 1245 1252 /* … … 1293 1300 /** @todo This is utterly nuts and completely unsafe... will get back to it in a 1294 1301 * bit I hope... */ 1295 int rc = VMR3ReqProcessU(pVM->pUVM, VMCPUID_ANY); 1296 AssertReleaseRC(rc == VINF_SUCCESS); 1302 int rc = VMR3AsyncPdmNotificationWaitU(&pVM->pUVM->aCpus[0]); 1303 AssertReleaseMsg(rc == VINF_SUCCESS, ("%Rrc\n", rc)); 1304 rc = VMR3ReqProcessU(pVM->pUVM, VMCPUID_ANY); 1305 AssertReleaseMsg(rc == VINF_SUCCESS, ("%Rrc\n", rc)); 1306 rc = VMR3ReqProcessU(pVM->pUVM, 0/*idDstCpu*/); 1307 AssertReleaseMsg(rc == VINF_SUCCESS, ("%Rrc\n", rc)); 1297 1308 } 1298 1309 … … 1456 1467 pDrvIns->pDrvReg->szDriverName, pDrvIns->iInstance, iLun, pszDeviceName, iDevInstance)); 1457 1468 pDrvIns->pDrvReg->pfnPowerOff(pDrvIns); 1469 if (pDrvIns->Internal.s.pfnAsyncNotify) 1470 LogFlow(("PDMR3PowerOff: Async notification started - driver '%s'/%d on LUN#%d of device '%s'/%d\n", 1471 pDrvIns->pDrvReg->szDriverName, pDrvIns->iInstance, iLun, pszDeviceName, iDevInstance)); 1458 1472 } 1459 1473 else if (pDrvIns->Internal.s.pfnAsyncNotify(pDrvIns)) … … 1492 1506 LogFlow(("PDMR3PowerOff: Notifying - device '%s'/%d\n", pUsbIns->pUsbReg->szDeviceName, pUsbIns->iInstance)); 1493 1507 pUsbIns->pUsbReg->pfnVMPowerOff(pUsbIns); 1508 if (pUsbIns->Internal.s.pfnAsyncNotify) 1509 LogFlow(("PDMR3PowerOff: Async notification started - device '%s'/%d\n", pUsbIns->pUsbReg->szDeviceName, pUsbIns->iInstance)); 1494 1510 } 1495 1511 else if (pUsbIns->Internal.s.pfnAsyncNotify(pUsbIns)) … … 1525 1541 LogFlow(("PDMR3PowerOff: Notifying - device '%s'/%d\n", pDevIns->pDevReg->szDeviceName, pDevIns->iInstance)); 1526 1542 pDevIns->pDevReg->pfnPowerOff(pDevIns); 1543 if (pDevIns->Internal.s.pfnAsyncNotify) 1544 LogFlow(("PDMR3PowerOff: Async notification started - device '%s'/%d\n", pDevIns->pDevReg->szDeviceName, pDevIns->iInstance)); 1527 1545 } 1528 1546 else if (pDevIns->Internal.s.pfnAsyncNotify(pDevIns)) … … 1607 1625 /** @todo This is utterly nuts and completely unsafe... will get back to it in a 1608 1626 * bit I hope... */ 1609 int rc = VMR3ReqProcessU(pVM->pUVM, VMCPUID_ANY); 1610 AssertReleaseRC(rc == VINF_SUCCESS); 1627 int rc = VMR3AsyncPdmNotificationWaitU(&pVM->pUVM->aCpus[0]); 1628 AssertReleaseMsg(rc == VINF_SUCCESS, ("%Rrc\n", rc)); 1629 rc = VMR3ReqProcessU(pVM->pUVM, VMCPUID_ANY); 1630 AssertReleaseMsg(rc == VINF_SUCCESS, ("%Rrc\n", rc)); 1631 rc = VMR3ReqProcessU(pVM->pUVM, 0/*idDstCpu*/); 1632 AssertReleaseMsg(rc == VINF_SUCCESS, ("%Rrc\n", rc)); 1611 1633 } 1612 1634 -
trunk/src/VBox/VMM/PDMDevHlp.cpp
r24730 r24740 2335 2335 PDMDEV_ASSERT_DEVINS(pDevIns); 2336 2336 VM_ASSERT_EMT0(pDevIns->Internal.s.pVMR3); 2337 LogFlow(("pdmR3DevHlp_SetAsyncNotification: caller='%s'/%d: pfnAsyncNotify \n", pDevIns->pDevReg->szDeviceName, pDevIns->iInstance, pfnAsyncNotify));2337 LogFlow(("pdmR3DevHlp_SetAsyncNotification: caller='%s'/%d: pfnAsyncNotify=%p\n", pDevIns->pDevReg->szDeviceName, pDevIns->iInstance, pfnAsyncNotify)); 2338 2338 2339 2339 int rc = VINF_SUCCESS; … … 2354 2354 LogFlow(("pdmR3DevHlp_SetAsyncNotification: caller='%s'/%d: returns %Rrc\n", pDevIns->pDevReg->szDeviceName, pDevIns->iInstance, rc)); 2355 2355 return rc; 2356 } 2357 2358 2359 /** @copydoc PDMDEVHLPR3::pfnAsyncNotificationCompleted */ 2360 static DECLCALLBACK(void) pdmR3DevHlp_AsyncNotificationCompleted(PPDMDEVINS pDevIns) 2361 { 2362 PDMDEV_ASSERT_DEVINS(pDevIns); 2363 PVM pVM = pDevIns->Internal.s.pVMR3; 2364 2365 VMSTATE enmVMState = VMR3GetState(pVM); 2366 if ( enmVMState == VMSTATE_SUSPENDING 2367 || enmVMState == VMSTATE_SUSPENDING_EXT_LS 2368 || enmVMState == VMSTATE_SUSPENDING_LS 2369 || enmVMState == VMSTATE_POWERING_OFF 2370 || enmVMState == VMSTATE_POWERING_OFF_LS) 2371 { 2372 LogFlow(("pdmR3DevHlp_AsyncNotificationCompleted: caller='%s'/%d:\n", pDevIns->pDevReg->szDeviceName, pDevIns->iInstance)); 2373 VMR3AsyncPdmNotificationWakeupU(pVM->pUVM); 2374 } 2375 else 2376 LogFlow(("pdmR3DevHlp_AsyncNotificationCompleted: caller='%s'/%d: enmVMState=%d\n", pDevIns->pDevReg->szDeviceName, pDevIns->iInstance, enmVMState)); 2356 2377 } 2357 2378 … … 2866 2887 pdmR3DevHlp_PhysGCPtr2GCPhys, 2867 2888 pdmR3DevHlp_SetAsyncNotification, 2889 pdmR3DevHlp_AsyncNotificationCompleted, 2868 2890 0, 2869 2891 0, … … 3332 3354 pdmR3DevHlp_PhysGCPtr2GCPhys, 3333 3355 pdmR3DevHlp_SetAsyncNotification, 3356 pdmR3DevHlp_AsyncNotificationCompleted, 3334 3357 0, 3335 3358 0, -
trunk/src/VBox/VMM/PDMDriver.cpp
r24730 r24740 1046 1046 1047 1047 1048 /** @copydoc PDMDRVHLP::pfnAsyncNotificationCompleted */ 1049 static DECLCALLBACK(void) pdmR3DrvHlp_AsyncNotificationCompleted(PPDMDRVINS pDrvIns) 1050 { 1051 PDMDRV_ASSERT_DRVINS(pDrvIns); 1052 PVM pVM = pDrvIns->Internal.s.pVM; 1053 1054 VMSTATE enmVMState = VMR3GetState(pVM); 1055 if ( enmVMState == VMSTATE_SUSPENDING 1056 || enmVMState == VMSTATE_SUSPENDING_EXT_LS 1057 || enmVMState == VMSTATE_SUSPENDING_LS 1058 || enmVMState == VMSTATE_POWERING_OFF 1059 || enmVMState == VMSTATE_POWERING_OFF_LS) 1060 { 1061 LogFlow(("pdmR3DrvHlp_AsyncNotificationCompleted: caller='%s'/%d:\n", pDrvIns->pDrvReg->szDriverName, pDrvIns->iInstance)); 1062 VMR3AsyncPdmNotificationWakeupU(pVM->pUVM); 1063 } 1064 else 1065 LogFlow(("pdmR3DrvHlp_AsyncNotificationCompleted: caller='%s'/%d: enmVMState=%d\n", pDrvIns->pDrvReg->szDriverName, pDrvIns->iInstance, enmVMState)); 1066 } 1067 1068 1048 1069 /** @copydoc PDMDRVHLP::pfnPDMThreadCreate */ 1049 1070 static DECLCALLBACK(int) pdmR3DrvHlp_PDMThreadCreate(PPDMDRVINS pDrvIns, PPPDMTHREAD ppThread, void *pvUser, PFNPDMTHREADDRV pfnThread, … … 1114 1135 pdmR3DrvHlp_USBRegisterHub, 1115 1136 pdmR3DrvHlp_SetAsyncNotification, 1137 pdmR3DrvHlp_AsyncNotificationCompleted, 1116 1138 pdmR3DrvHlp_PDMThreadCreate, 1117 1139 #ifdef VBOX_WITH_PDM_ASYNC_COMPLETION -
trunk/src/VBox/VMM/VMEmt.cpp
r23190 r24740 1101 1101 1102 1102 /** 1103 * Interface that PDMR3Suspend, PDMR3PowerOff and PDMR3Reset uses when they wait 1104 * for the handling of asynchronous notifications to complete. 1105 * 1106 * @returns VINF_SUCCESS unless a fatal error occurred. In the latter 1107 * case an appropriate status code is returned. 1108 * @param pUVCpu Pointer to the user mode VMCPU structure. 1109 * @thread The emulation thread. 1110 */ 1111 VMMR3_INT_DECL(int) VMR3AsyncPdmNotificationWaitU(PUVMCPU pUVCpu) 1112 { 1113 LogFlow(("VMR3AsyncPdmNotificationWaitU:\n")); 1114 return VMR3WaitU(pUVCpu); 1115 } 1116 1117 1118 /** 1119 * Interface that PDM the helper asynchronous notification completed methods 1120 * uses for EMT0 when it is waiting inside VMR3AsyncPdmNotificationWaitU(). 1121 * 1122 * @param pUVM Pointer to the user mode VM structure. 1123 */ 1124 VMMR3_INT_DECL(void) VMR3AsyncPdmNotificationWakeupU(PUVM pUVM) 1125 { 1126 LogFlow(("VMR3AsyncPdmNotificationWakeupU:\n")); 1127 VM_FF_SET(pUVM->pVM, VM_FF_REQUEST); /* this will have to do for now. */ 1128 g_aHaltMethods[pUVM->vm.s.iHaltMethod].pfnNotifyCpuFF(&pUVM->aCpus[0], 0 /*fFlags*/); 1129 } 1130 1131 1132 /** 1103 1133 * Rendezvous callback that will be called once. 1104 1134 *
Note:
See TracChangeset
for help on using the changeset viewer.