Changeset 31720 in vbox
- Timestamp:
- Aug 17, 2010 11:37:35 AM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 64879
- Location:
- trunk/src/VBox/Additions/common
- Files:
-
- 4 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*/, -
trunk/src/VBox/Additions/common/VBoxGuestLib/GenericRequest.cpp
r29360 r31720 33 33 DECLVBGL(int) VbglGRVerify (const VMMDevRequestHeader *pReq, size_t cbReq) 34 34 { 35 size_t cbReqExpected; 36 35 37 if (!pReq || cbReq < sizeof (VMMDevRequestHeader)) 36 38 { … … 46 48 47 49 /* The request size must correspond to the request type. */ 48 size_tcbReqExpected = vmmdevGetRequestSize(pReq->requestType);50 cbReqExpected = vmmdevGetRequestSize(pReq->requestType); 49 51 50 52 if (cbReq < cbReqExpected) -
trunk/src/VBox/Additions/common/VBoxGuestLib/HGCMInternal.cpp
r30339 r31720 307 307 else 308 308 { 309 bool fCopyIn; 310 309 311 if (cb > VBGLR0_MAX_HGCM_USER_PARM) 310 312 { … … 337 339 * is probably going to be more massive than the current code, so 338 340 * it can wait till later. */ 339 bool fCopyIn =pSrcParm->type != VMMDevHGCMParmType_LinAddr_Out340 341 fCopyIn = pSrcParm->type != VMMDevHGCMParmType_LinAddr_Out 342 && pSrcParm->type != VMMDevHGCMParmType_LinAddr_Locked_Out; 341 343 if (cb <= PAGE_SIZE / 2 - 16) 342 344 { … … 813 815 if (cbOut) 814 816 { 817 int rc2; 815 818 Assert(pParmInfo->aLockBufs[iLockBuf].iParm == iParm); 816 intrc2 = RTR0MemUserCopyTo((RTR3PTR)pDstParm->u.Pointer.u.linearAddr,817 818 819 820 819 rc2 = RTR0MemUserCopyTo((RTR3PTR)pDstParm->u.Pointer.u.linearAddr, 820 pParmInfo->aLockBufs[iLockBuf].pvSmallBuf 821 ? pParmInfo->aLockBufs[iLockBuf].pvSmallBuf 822 : RTR0MemObjAddress(pParmInfo->aLockBufs[iLockBuf].hObj), 823 cbOut); 821 824 if (RT_FAILURE(rc2)) 822 825 return rc2; -
trunk/src/VBox/Additions/common/VBoxGuestLib/SysHlp.cpp
r28800 r31720 53 53 int vbglLockLinear (void **ppvCtx, void *pv, uint32_t u32Size, bool fWriteAccess, uint32_t fFlags) 54 54 { 55 int rc = VINF_SUCCESS; 55 int rc = VINF_SUCCESS; 56 RTR0MEMOBJ MemObj = NIL_RTR0MEMOBJ; 57 uint32_t fAccess = RTMEM_PROT_READ | (fWriteAccess ? RTMEM_PROT_WRITE : 0); 56 58 57 59 /* Zero size buffers shouldn't be locked. */ … … 106 108 * know they aren't pagable. 107 109 */ 108 RTR0MEMOBJ MemObj = NIL_RTR0MEMOBJ;109 uint32_t fAccess = RTMEM_PROT_READ | (fWriteAccess ? RTMEM_PROT_WRITE : 0);110 110 if ((fFlags & VBGLR0_HGCMCALL_F_MODE_MASK) == VBGLR0_HGCMCALL_F_USER) 111 111 rc = RTR0MemObjLockUser(&MemObj, (RTR3PTR)pv, u32Size, fAccess, NIL_RTR0PROCESS); … … 124 124 void vbglUnlockLinear (void *pvCtx, void *pv, uint32_t u32Size) 125 125 { 126 NOREF(pv);127 NOREF(u32Size);128 129 126 #ifdef RT_OS_WINDOWS 130 127 PMDL pMdl = (PMDL)pvCtx; … … 143 140 144 141 #endif 142 143 NOREF(pv); 144 NOREF(u32Size); 145 145 } 146 146
Note:
See TracChangeset
for help on using the changeset viewer.