Changeset 31720 in vbox for trunk/src/VBox/Additions/common/VBoxGuest
- Timestamp:
- Aug 17, 2010 11:37:35 AM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 64879
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/common/VBoxGuest/VBoxGuest.cpp
r31517 r31720 1181 1181 VBoxGuestWaitEventInfo *pInfo, size_t *pcbDataReturned, bool fInterruptible) 1182 1182 { 1183 const uint32_t fReqEvents = pInfo->u32EventMaskIn; 1184 uint32_t fResEvents; 1185 int iEvent; 1186 int rc; 1187 RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER; 1188 PVBOXGUESTWAIT pWait; 1189 1183 1190 pInfo->u32EventFlagsOut = 0; 1184 1191 pInfo->u32Result = VBOXGUEST_WAITEVENT_ERROR; … … 1189 1196 * Copy and verify the input mask. 1190 1197 */ 1191 const uint32_t fReqEvents = pInfo->u32EventMaskIn; 1192 int iEvent = ASMBitFirstSetU32(fReqEvents) - 1; 1198 iEvent = ASMBitFirstSetU32(fReqEvents) - 1; 1193 1199 if (RT_UNLIKELY(iEvent < 0)) 1194 1200 { … … 1200 1206 * Check the condition up front, before doing the wait-for-event allocations. 1201 1207 */ 1202 RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER;1203 1208 RTSpinlockAcquireNoInts(pDevExt->EventSpinlock, &Tmp); 1204 intrc = WaitEventCheckCondition(pDevExt, pInfo, iEvent, fReqEvents, &Tmp);1209 rc = WaitEventCheckCondition(pDevExt, pInfo, iEvent, fReqEvents, &Tmp); 1205 1210 if (rc == VINF_SUCCESS) 1206 1211 return rc; … … 1214 1219 } 1215 1220 1216 PVBOXGUESTWAITpWait = VBoxGuestWaitAlloc(pDevExt, pSession);1221 pWait = VBoxGuestWaitAlloc(pDevExt, pSession); 1217 1222 if (!pWait) 1218 1223 return VERR_NO_MEMORY; … … 1254 1259 RTSpinlockAcquireNoInts(pDevExt->EventSpinlock, &Tmp); 1255 1260 VBoxGuestWaitUnlink(&pDevExt->WaitList, pWait); 1256 const uint32_tfResEvents = pWait->fResEvents;1261 fResEvents = pWait->fResEvents; 1257 1262 VBoxGuestWaitFreeLocked(pDevExt, pWait); 1258 1263 RTSpinlockReleaseNoInts(pDevExt->EventSpinlock, &Tmp); … … 1359 1364 VMMDevRequestHeader *pReqHdr, size_t cbData, size_t *pcbDataReturned) 1360 1365 { 1361 Log(("VBoxGuestCommonIOCtl: VMMREQUEST type %d\n", pReqHdr->requestType));1362 1363 1366 /* 1364 1367 * Validate the header and request size. … … 1367 1370 const uint32_t cbReq = pReqHdr->size; 1368 1371 const uint32_t cbMinSize = vmmdevGetRequestSize(enmType); 1372 int rc; 1373 VMMDevRequestHeader *pReqCopy; 1374 1375 Log(("VBoxGuestCommonIOCtl: VMMREQUEST type %d\n", pReqHdr->requestType)); 1376 1369 1377 if (cbReq < cbMinSize) 1370 1378 { … … 1379 1387 return VERR_INVALID_PARAMETER; 1380 1388 } 1381 intrc = VbglGRVerify(pReqHdr, cbData);1389 rc = VbglGRVerify(pReqHdr, cbData); 1382 1390 if (RT_FAILURE(rc)) 1383 1391 { … … 1394 1402 * it does makes things a bit simpler wrt to phys address.) 1395 1403 */ 1396 VMMDevRequestHeader *pReqCopy;1397 1404 rc = VbglGRAlloc(&pReqCopy, cbReq, enmType); 1398 1405 if (RT_FAILURE(rc)) … … 1461 1468 bool fInterruptible, uint32_t cMillies) 1462 1469 { 1470 int rc; 1463 1471 1464 1472 /* … … 1506 1514 RTSpinlockReleaseNoInts(pDevExt->EventSpinlock, &Tmp); 1507 1515 1508 int rc;1509 1516 if (fInterruptible) 1510 1517 rc = RTSemEventMultiWaitNoResume(pWait->Event, cMillies); … … 1565 1572 1566 1573 1567 static int VBoxGuestCommonIOCtl_HGCMConnect(PVBOXGUESTDEVEXT pDevExt, PVBOXGUESTSESSION pSession, VBoxGuestHGCMConnectInfo *pInfo, 1568 size_t *pcbDataReturned) 1569 { 1574 static int VBoxGuestCommonIOCtl_HGCMConnect(PVBOXGUESTDEVEXT pDevExt, PVBOXGUESTSESSION pSession, 1575 VBoxGuestHGCMConnectInfo *pInfo, size_t *pcbDataReturned) 1576 { 1577 int rc; 1578 1570 1579 /* 1571 1580 * The VbglHGCMConnect call will invoke the callback if the HGCM … … 1577 1586 ? pInfo->Loc.u.host.achName : "<not local host>")); 1578 1587 1579 intrc = VbglR0HGCMInternalConnect(pInfo, VBoxGuestHGCMAsyncWaitCallback, pDevExt, RT_INDEFINITE_WAIT);1588 rc = VbglR0HGCMInternalConnect(pInfo, VBoxGuestHGCMAsyncWaitCallback, pDevExt, RT_INDEFINITE_WAIT); 1580 1589 if (RT_SUCCESS(rc)) 1581 1590 { … … 1601 1610 { 1602 1611 static unsigned s_cErrors = 0; 1612 VBoxGuestHGCMDisconnectInfo Info; 1613 1603 1614 if (s_cErrors++ < 32) 1604 1615 LogRel(("VBoxGuestCommonIOCtl: HGCM_CONNECT: too many HGCMConnect calls for one session!\n")); 1605 1616 1606 VBoxGuestHGCMDisconnectInfo Info;1607 1617 Info.result = 0; 1608 1618 Info.u32ClientID = pInfo->u32ClientID; … … 1627 1637 unsigned i; 1628 1638 RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER; 1639 int rc; 1640 1629 1641 RTSpinlockAcquireNoInts(pDevExt->SessionSpinlock, &Tmp); 1630 1642 for (i = 0; i < RT_ELEMENTS(pSession->aHGCMClientIds); i++) … … 1649 1661 */ 1650 1662 Log(("VBoxGuestCommonIOCtl: HGCM_DISCONNECT: u32Client=%RX32\n", pInfo->u32ClientID)); 1651 intrc = VbglR0HGCMInternalDisconnect(pInfo, VBoxGuestHGCMAsyncWaitCallback, pDevExt, RT_INDEFINITE_WAIT);1663 rc = VbglR0HGCMInternalDisconnect(pInfo, VBoxGuestHGCMAsyncWaitCallback, pDevExt, RT_INDEFINITE_WAIT); 1652 1664 if (RT_SUCCESS(rc)) 1653 1665 { … … 1673 1685 size_t cbExtra, size_t cbData, size_t *pcbDataReturned) 1674 1686 { 1687 size_t cbActual; 1688 const uint32_t u32ClientId = pInfo->u32ClientID; 1689 unsigned i; 1690 int rc; 1691 RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER; 1692 uint32_t fFlags; 1693 1675 1694 /* 1676 1695 * Some more validations. … … 1681 1700 return VERR_INVALID_PARAMETER; 1682 1701 } 1683 size_t cbActual = cbExtra + sizeof(*pInfo); 1702 1703 cbActual = cbExtra + sizeof(*pInfo); 1684 1704 #ifdef RT_ARCH_AMD64 1685 1705 if (f32bit) … … 1698 1718 * Validate the client id. 1699 1719 */ 1700 const uint32_t u32ClientId = pInfo->u32ClientID;1701 unsigned i;1702 RTSPINLOCKTMP Tmp = RTSPINLOCKTMP_INITIALIZER;1703 1720 RTSpinlockAcquireNoInts(pDevExt->SessionSpinlock, &Tmp); 1704 1721 for (i = 0; i < RT_ELEMENTS(pSession->aHGCMClientIds); i++) … … 1721 1738 */ 1722 1739 Log(("VBoxGuestCommonIOCtl: HGCM_CALL: u32Client=%RX32\n", pInfo->u32ClientID)); 1723 int rc; 1724 uint32_t fFlags = pSession->R0Process == NIL_RTR0PROCESS ? VBGLR0_HGCMCALL_F_KERNEL : VBGLR0_HGCMCALL_F_USER; 1740 fFlags = pSession->R0Process == NIL_RTR0PROCESS ? VBGLR0_HGCMCALL_F_KERNEL : VBGLR0_HGCMCALL_F_USER; 1725 1741 #ifdef RT_ARCH_AMD64 1726 1742 if (f32bit) … … 1769 1785 { 1770 1786 int rc; 1787 VBoxGuestHGCMConnectInfo Info; 1788 1771 1789 Log(("VBoxGuestCommonIOCtl: CLIPBOARD_CONNECT: Current u32ClientId=%RX32\n", pDevExt->u32ClipboardClientId)); 1772 1773 1790 1774 1791 /* … … 1797 1814 * Try connect. 1798 1815 */ 1799 VBoxGuestHGCMConnectInfo Info;1800 1816 Info.Loc.type = VMMDevHGCMLoc_LocalHost_Existing; 1801 1817 strcpy(Info.Loc.u.host.achName, "VBoxSharedClipboard"); … … 1986 2002 void *pvData, size_t cbData, size_t *pcbDataReturned) 1987 2003 { 2004 int rc; 2005 1988 2006 Log(("VBoxGuestCommonIOCtl: iFunction=%#x pDevExt=%p pSession=%p pvData=%p cbData=%zu\n", 1989 2007 iFunction, pDevExt, pSession, pvData, cbData)); … … 2026 2044 * Deal with variably sized requests first. 2027 2045 */ 2028 intrc = VINF_SUCCESS;2046 rc = VINF_SUCCESS; 2029 2047 if (VBOXGUEST_IOCTL_STRIP_SIZE(iFunction) == VBOXGUEST_IOCTL_STRIP_SIZE(VBOXGUEST_IOCTL_VMMREQUEST(0))) 2030 2048 { … … 2038 2056 else if (VBOXGUEST_IOCTL_STRIP_SIZE(iFunction) == VBOXGUEST_IOCTL_STRIP_SIZE(VBOXGUEST_IOCTL_HGCM_CALL(0))) 2039 2057 { 2058 bool fInterruptible = pSession->R0Process != NIL_RTR0PROCESS; 2040 2059 CHECKRET_MIN_SIZE("HGCM_CALL", sizeof(VBoxGuestHGCMCallInfo)); 2041 bool fInterruptible = pSession->R0Process != NIL_RTR0PROCESS;2042 2060 rc = VBoxGuestCommonIOCtl_HGCMCall(pDevExt, pSession, (VBoxGuestHGCMCallInfo *)pvData, RT_INDEFINITE_WAIT, 2043 2061 fInterruptible, false /*f32bit*/, … … 2046 2064 else if (VBOXGUEST_IOCTL_STRIP_SIZE(iFunction) == VBOXGUEST_IOCTL_STRIP_SIZE(VBOXGUEST_IOCTL_HGCM_CALL_TIMED(0))) 2047 2065 { 2066 VBoxGuestHGCMCallInfoTimed *pInfo = (VBoxGuestHGCMCallInfoTimed *)pvData; 2048 2067 CHECKRET_MIN_SIZE("HGCM_CALL_TIMED", sizeof(VBoxGuestHGCMCallInfoTimed)); 2049 VBoxGuestHGCMCallInfoTimed *pInfo = (VBoxGuestHGCMCallInfoTimed *)pvData;2050 2068 rc = VBoxGuestCommonIOCtl_HGCMCall(pDevExt, pSession, &pInfo->info, pInfo->u32Timeout, 2051 2069 !!pInfo->fInterruptible || pSession->R0Process != NIL_RTR0PROCESS, … … 2056 2074 else if (VBOXGUEST_IOCTL_STRIP_SIZE(iFunction) == VBOXGUEST_IOCTL_STRIP_SIZE(VBOXGUEST_IOCTL_HGCM_CALL_32(0))) 2057 2075 { 2076 bool fInterruptible = pSession->R0Process != NIL_RTR0PROCESS; 2058 2077 CHECKRET_MIN_SIZE("HGCM_CALL", sizeof(VBoxGuestHGCMCallInfo)); 2059 bool fInterruptible = pSession->R0Process != NIL_RTR0PROCESS;2060 2078 rc = VBoxGuestCommonIOCtl_HGCMCall(pDevExt, pSession, (VBoxGuestHGCMCallInfo *)pvData, RT_INDEFINITE_WAIT, 2061 2079 fInterruptible, true /*f32bit*/,
Note:
See TracChangeset
for help on using the changeset viewer.