IMG_INTERNAL PVRSRV_ERROR IMG_CALLCONV BridgeSyncPrimOpTake(IMG_HANDLE hBridge, IMG_HANDLE hServerCookie, IMG_UINT32 ui32ClientSyncCount, IMG_UINT32 *pui32Flags, IMG_UINT32 *pui32FenceValue, IMG_UINT32 *pui32UpdateValue, IMG_UINT32 ui32ServerSyncCount, IMG_UINT32 *pui32ServerFlags) { PVRSRV_ERROR eError; SERVER_OP_COOKIE * psServerCookieInt; PVR_UNREFERENCED_PARAMETER(hBridge); psServerCookieInt = (SERVER_OP_COOKIE *) hServerCookie; eError = PVRSRVSyncPrimOpTakeKM( psServerCookieInt, ui32ClientSyncCount, pui32Flags, pui32FenceValue, pui32UpdateValue, ui32ServerSyncCount, pui32ServerFlags); return eError; }
static IMG_INT PVRSRVBridgeSyncPrimOpTake(IMG_UINT32 ui32BridgeID, PVRSRV_BRIDGE_IN_SYNCPRIMOPTAKE *psSyncPrimOpTakeIN, PVRSRV_BRIDGE_OUT_SYNCPRIMOPTAKE *psSyncPrimOpTakeOUT, CONNECTION_DATA *psConnection) { SERVER_OP_COOKIE * psServerCookieInt = IMG_NULL; IMG_HANDLE hServerCookieInt2 = IMG_NULL; IMG_UINT32 *ui32FlagsInt = IMG_NULL; IMG_UINT32 *ui32FenceValueInt = IMG_NULL; IMG_UINT32 *ui32UpdateValueInt = IMG_NULL; IMG_UINT32 *ui32ServerFlagsInt = IMG_NULL; PVRSRV_BRIDGE_ASSERT_CMD(ui32BridgeID, PVRSRV_BRIDGE_SYNC_SYNCPRIMOPTAKE); if (psSyncPrimOpTakeIN->ui32ClientSyncCount != 0) { ui32FlagsInt = OSAllocMem(psSyncPrimOpTakeIN->ui32ClientSyncCount * sizeof(IMG_UINT32)); if (!ui32FlagsInt) { psSyncPrimOpTakeOUT->eError = PVRSRV_ERROR_OUT_OF_MEMORY; goto SyncPrimOpTake_exit; } } /* Copy the data over */ if ( !OSAccessOK(PVR_VERIFY_READ, (IMG_VOID*) psSyncPrimOpTakeIN->pui32Flags, psSyncPrimOpTakeIN->ui32ClientSyncCount * sizeof(IMG_UINT32)) || (OSCopyFromUser(NULL, ui32FlagsInt, psSyncPrimOpTakeIN->pui32Flags, psSyncPrimOpTakeIN->ui32ClientSyncCount * sizeof(IMG_UINT32)) != PVRSRV_OK) ) { psSyncPrimOpTakeOUT->eError = PVRSRV_ERROR_INVALID_PARAMS; goto SyncPrimOpTake_exit; } if (psSyncPrimOpTakeIN->ui32ClientSyncCount != 0) { ui32FenceValueInt = OSAllocMem(psSyncPrimOpTakeIN->ui32ClientSyncCount * sizeof(IMG_UINT32)); if (!ui32FenceValueInt) { psSyncPrimOpTakeOUT->eError = PVRSRV_ERROR_OUT_OF_MEMORY; goto SyncPrimOpTake_exit; } } /* Copy the data over */ if ( !OSAccessOK(PVR_VERIFY_READ, (IMG_VOID*) psSyncPrimOpTakeIN->pui32FenceValue, psSyncPrimOpTakeIN->ui32ClientSyncCount * sizeof(IMG_UINT32)) || (OSCopyFromUser(NULL, ui32FenceValueInt, psSyncPrimOpTakeIN->pui32FenceValue, psSyncPrimOpTakeIN->ui32ClientSyncCount * sizeof(IMG_UINT32)) != PVRSRV_OK) ) { psSyncPrimOpTakeOUT->eError = PVRSRV_ERROR_INVALID_PARAMS; goto SyncPrimOpTake_exit; } if (psSyncPrimOpTakeIN->ui32ClientSyncCount != 0) { ui32UpdateValueInt = OSAllocMem(psSyncPrimOpTakeIN->ui32ClientSyncCount * sizeof(IMG_UINT32)); if (!ui32UpdateValueInt) { psSyncPrimOpTakeOUT->eError = PVRSRV_ERROR_OUT_OF_MEMORY; goto SyncPrimOpTake_exit; } } /* Copy the data over */ if ( !OSAccessOK(PVR_VERIFY_READ, (IMG_VOID*) psSyncPrimOpTakeIN->pui32UpdateValue, psSyncPrimOpTakeIN->ui32ClientSyncCount * sizeof(IMG_UINT32)) || (OSCopyFromUser(NULL, ui32UpdateValueInt, psSyncPrimOpTakeIN->pui32UpdateValue, psSyncPrimOpTakeIN->ui32ClientSyncCount * sizeof(IMG_UINT32)) != PVRSRV_OK) ) { psSyncPrimOpTakeOUT->eError = PVRSRV_ERROR_INVALID_PARAMS; goto SyncPrimOpTake_exit; } if (psSyncPrimOpTakeIN->ui32ServerSyncCount != 0) { ui32ServerFlagsInt = OSAllocMem(psSyncPrimOpTakeIN->ui32ServerSyncCount * sizeof(IMG_UINT32)); if (!ui32ServerFlagsInt) { psSyncPrimOpTakeOUT->eError = PVRSRV_ERROR_OUT_OF_MEMORY; goto SyncPrimOpTake_exit; } } /* Copy the data over */ if ( !OSAccessOK(PVR_VERIFY_READ, (IMG_VOID*) psSyncPrimOpTakeIN->pui32ServerFlags, psSyncPrimOpTakeIN->ui32ServerSyncCount * sizeof(IMG_UINT32)) || (OSCopyFromUser(NULL, ui32ServerFlagsInt, psSyncPrimOpTakeIN->pui32ServerFlags, psSyncPrimOpTakeIN->ui32ServerSyncCount * sizeof(IMG_UINT32)) != PVRSRV_OK) ) { psSyncPrimOpTakeOUT->eError = PVRSRV_ERROR_INVALID_PARAMS; goto SyncPrimOpTake_exit; } { /* Look up the address from the handle */ psSyncPrimOpTakeOUT->eError = PVRSRVLookupHandle(psConnection->psHandleBase, (IMG_HANDLE *) &hServerCookieInt2, psSyncPrimOpTakeIN->hServerCookie, PVRSRV_HANDLE_TYPE_SERVER_OP_COOKIE); if(psSyncPrimOpTakeOUT->eError != PVRSRV_OK) { goto SyncPrimOpTake_exit; } /* Look up the data from the resman address */ psSyncPrimOpTakeOUT->eError = ResManFindPrivateDataByPtr(hServerCookieInt2, (IMG_VOID **) &psServerCookieInt); if(psSyncPrimOpTakeOUT->eError != PVRSRV_OK) { goto SyncPrimOpTake_exit; } } psSyncPrimOpTakeOUT->eError = PVRSRVSyncPrimOpTakeKM( psServerCookieInt, psSyncPrimOpTakeIN->ui32ClientSyncCount, ui32FlagsInt, ui32FenceValueInt, ui32UpdateValueInt, psSyncPrimOpTakeIN->ui32ServerSyncCount, ui32ServerFlagsInt); SyncPrimOpTake_exit: if (ui32FlagsInt) OSFreeMem(ui32FlagsInt); if (ui32FenceValueInt) OSFreeMem(ui32FenceValueInt); if (ui32UpdateValueInt) OSFreeMem(ui32UpdateValueInt); if (ui32ServerFlagsInt) OSFreeMem(ui32ServerFlagsInt); return 0; }