IMG_VOID PDumpDeInit(IMG_VOID) { IMG_UINT32 i; DBGKM_CONNECT_NOTIFIER sConnectNotifier; for(i=0; i < PDUMP_NUM_STREAMS; i++) { gpfnDbgDrv->pfnDestroyStream(gsDBGPdumpState.psStream[i]); } if(gsDBGPdumpState.pszFile) { OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, SZ_FILENAME_SIZE_MAX, (IMG_PVOID) gsDBGPdumpState.pszFile, 0); gsDBGPdumpState.pszFile = IMG_NULL; } if(gsDBGPdumpState.pszScript) { OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, SZ_SCRIPT_SIZE_MAX, (IMG_PVOID) gsDBGPdumpState.pszScript, 0); gsDBGPdumpState.pszScript = IMG_NULL; } if(gsDBGPdumpState.pszMsg) { OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, SZ_MSG_SIZE_MAX, (IMG_PVOID) gsDBGPdumpState.pszMsg, 0); gsDBGPdumpState.pszMsg = IMG_NULL; } sConnectNotifier.pfnConnectNotifier = 0; gpfnDbgDrv->pfnSetConnectNotifier(sConnectNotifier); gpfnDbgDrv = IMG_NULL; }
/*! * \name PDumpOSDebugDriverWrite */ IMG_UINT32 PDumpOSDebugDriverWrite( PDBG_STREAM psStream, PDUMP_DDWMODE eDbgDrvWriteMode, IMG_UINT8 *pui8Data, IMG_UINT32 ui32BCount, IMG_UINT32 ui32Level, IMG_UINT32 ui32DbgDrvFlags) { switch(eDbgDrvWriteMode) { case PDUMP_WRITE_MODE_CONTINUOUS: PVR_UNREFERENCED_PARAMETER(ui32DbgDrvFlags); return gpfnDbgDrv->pfnDBGDrivWrite2(psStream, pui8Data, ui32BCount, ui32Level); case PDUMP_WRITE_MODE_LASTFRAME: return gpfnDbgDrv->pfnWriteLF(psStream, pui8Data, ui32BCount, ui32Level, ui32DbgDrvFlags); case PDUMP_WRITE_MODE_BINCM: PVR_UNREFERENCED_PARAMETER(ui32DbgDrvFlags); return gpfnDbgDrv->pfnWriteBINCM(psStream, pui8Data, ui32BCount, ui32Level); case PDUMP_WRITE_MODE_PERSISTENT: PVR_UNREFERENCED_PARAMETER(ui32DbgDrvFlags); return gpfnDbgDrv->pfnWritePersist(psStream, pui8Data, ui32BCount, ui32Level); default: PVR_UNREFERENCED_PARAMETER(ui32DbgDrvFlags); break; } return 0xFFFFFFFFU; }
static IMG_BOOL PDumpWriteILock(PDBG_STREAM psStream, IMG_UINT8 *pui8Data, IMG_UINT32 ui32Count, IMG_UINT32 ui32Flags) { IMG_UINT32 ui32Written = 0; if ((psStream == IMG_NULL) || PDumpSuspended() || ((ui32Flags & PDUMP_FLAGS_NEVER) != 0)) { PVR_DPF((PVR_DBG_MESSAGE, "PDumpWriteILock: Failed to write 0x%x bytes to stream 0x%x", ui32Count, (IMG_UINT32)psStream)); return IMG_TRUE; } if (psStream == gsDBGPdumpState.psStream[PDUMP_STREAM_PARAM2]) { IMG_UINT32 ui32ParamOutPos = gpfnDbgDrv->pfnGetStreamOffset(gsDBGPdumpState.psStream[PDUMP_STREAM_PARAM2]); if (ui32ParamOutPos + ui32Count > MAX_FILE_SIZE) { if ((gsDBGPdumpState.psStream[PDUMP_STREAM_SCRIPT2] && PDumpWriteString2("\r\n-- Splitting pdump output file\r\n\r\n", ui32Flags))) { DbgSetMarker(gsDBGPdumpState.psStream[PDUMP_STREAM_PARAM2], ui32ParamOutPos); gsDBGPdumpState.ui32ParamFileNum++; } } } ui32Written = DbgWrite(psStream, pui8Data, ui32Count, ui32Flags); if (ui32Written == 0xFFFFFFFF) { return IMG_FALSE; } return IMG_TRUE; }
IMG_VOID PDumpDeInit(IMG_VOID) { IMG_UINT32 i; for(i=0; i < PDUMP_NUM_STREAMS; i++) { gpfnDbgDrv->pfnDestroyStream(gsDBGPdumpState.psStream[i]); } if(gsDBGPdumpState.pszFile) { OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, SZ_FILENAME_SIZE_MAX, (IMG_PVOID) gsDBGPdumpState.pszFile, 0); gsDBGPdumpState.pszFile = IMG_NULL; } if(gsDBGPdumpState.pszScript) { OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, SZ_SCRIPT_SIZE_MAX, (IMG_PVOID) gsDBGPdumpState.pszScript, 0); gsDBGPdumpState.pszScript = IMG_NULL; } if(gsDBGPdumpState.pszMsg) { OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, SZ_MSG_SIZE_MAX, (IMG_PVOID) gsDBGPdumpState.pszMsg, 0); gsDBGPdumpState.pszMsg = IMG_NULL; } gpfnDbgDrv = IMG_NULL; }
/************************************************************************** * Function Name : PDumpIsCaptureFrameKM * Inputs : None * Outputs : None * Returns : True or false * Description : Tests whether the current frame is being pdumped **************************************************************************/ IMG_BOOL PDumpOSIsCaptureFrameKM(IMG_VOID) { if (PDumpSuspended()) { return IMG_FALSE; } return gpfnDbgDrv->pfnIsCaptureFrame(gsDBGPdumpState.psStream[PDUMP_STREAM_SCRIPT2], IMG_FALSE); }
static IMG_UINT32 DbgWrite(PDBG_STREAM psStream, IMG_UINT8 *pui8Data, IMG_UINT32 ui32BCount, IMG_UINT32 ui32Flags) { IMG_UINT32 ui32BytesWritten; if ((ui32Flags & PDUMP_FLAGS_CONTINUOUS) != 0) { if (((psStream->ui32CapMode & DEBUG_CAPMODE_FRAMED) != 0) && (psStream->ui32Start == 0xFFFFFFFFUL) && (psStream->ui32End == 0xFFFFFFFFUL) && psStream->bInitPhaseComplete) { ui32BytesWritten = ui32BCount; } else { ui32BytesWritten = gpfnDbgDrv->pfnDBGDrivWrite2(psStream, pui8Data, ui32BCount, 1); } } else { if (ui32Flags & PDUMP_FLAGS_LASTFRAME) { IMG_UINT32 ui32DbgFlags; ui32DbgFlags = 0; if (ui32Flags & PDUMP_FLAGS_RESETLFBUFFER) { ui32DbgFlags |= WRITELF_FLAGS_RESETBUF; } ui32BytesWritten = gpfnDbgDrv->pfnWriteLF(psStream, pui8Data, ui32BCount, 1, ui32DbgFlags); } else { ui32BytesWritten = gpfnDbgDrv->pfnWriteBINCM(psStream, pui8Data, ui32BCount, 1); } } return ui32BytesWritten; }
static IMG_BOOL PDumpWriteILock(PDBG_STREAM psStream, IMG_UINT8 *pui8Data, IMG_UINT32 ui32Count, IMG_UINT32 ui32Flags) { IMG_UINT32 ui32Written = 0; IMG_UINT32 ui32Off = 0; if ((psStream == IMG_NULL) || PDumpSuspended() || ((ui32Flags & PDUMP_FLAGS_NEVER) != 0)) { return IMG_TRUE; } if (psStream == gsDBGPdumpState.psStream[PDUMP_STREAM_PARAM2]) { IMG_UINT32 ui32ParamOutPos = gpfnDbgDrv->pfnGetStreamOffset(gsDBGPdumpState.psStream[PDUMP_STREAM_PARAM2]); if (ui32ParamOutPos + ui32Count > MAX_FILE_SIZE) { if ((gsDBGPdumpState.psStream[PDUMP_STREAM_SCRIPT2] && PDumpWriteString2("\r\n-- Splitting pdump output file\r\n\r\n", ui32Flags))) { DbgSetMarker(gsDBGPdumpState.psStream[PDUMP_STREAM_PARAM2], ui32ParamOutPos); gsDBGPdumpState.ui32ParamFileNum++; } } } while (((IMG_UINT32) ui32Count > 0) && (ui32Written != 0xFFFFFFFF)) { ui32Written = DbgWrite(psStream, &pui8Data[ui32Off], ui32Count, ui32Flags); if (ui32Written == 0) { OSReleaseThreadQuanta(); } if (ui32Written != 0xFFFFFFFF) { ui32Off += ui32Written; ui32Count -= ui32Written; } } if (ui32Written == 0xFFFFFFFF) { return IMG_FALSE; } return IMG_TRUE; }
/************************************************************************** * Function Name : PDumpStartInitPhaseKM * Inputs : None * Outputs : None * Returns : None * Description : Resume init phase state **************************************************************************/ PVRSRV_ERROR PDumpStartInitPhaseKM(IMG_VOID) { IMG_UINT32 i; if (gpfnDbgDrv) { PDUMPCOMMENT("Start Init Phase"); for(i=0; i < PDUMP_NUM_STREAMS; i++) { gpfnDbgDrv->pfnStartInitPhase(gsDBGPdumpState.psStream[i]); } } return PVRSRV_OK; }
/***************************************************************************** FUNCTION : DbgSetMarker PURPOSE : Sets the marker of the stream to split output files PARAMETERS : psStream - Stream pointer ui32Marker - Marker number to set RETURNS : None *****************************************************************************/ static IMG_VOID DbgSetMarker(PDBG_STREAM psStream, IMG_UINT32 ui32Marker) { gpfnDbgDrv->pfnSetMarker(psStream, ui32Marker); }
/***************************************************************************** FUNCTION : DbgSetFrame PURPOSE : Sets the frame in the stream PARAMETERS : psStream - Stream pointer ui32Frame - Frame number to set RETURNS : None *****************************************************************************/ static IMG_VOID DbgSetFrame(PDBG_STREAM psStream, IMG_UINT32 ui32Frame) { gpfnDbgDrv->pfnSetFrame(psStream, ui32Frame); }
/************************************************************************** * Function Name : PDumpIsLastCaptureFrameKM * Inputs : None * Outputs : None * Returns : True or false * Description : Tests whether the current frame is being pdumped **************************************************************************/ IMG_BOOL PDumpIsLastCaptureFrameKM(IMG_VOID) { return gpfnDbgDrv->pfnIsLastCaptureFrame(gsDBGPdumpState.psStream[PDUMP_STREAM_SCRIPT2]); }
/************************************************************************** * Function Name : PDumpInit * Outputs : None * Returns : * Description : Reset connection to vldbgdrv * Then try to connect to PDUMP streams **************************************************************************/ IMG_VOID PDumpInit(IMG_VOID) { IMG_UINT32 i; DBGKM_CONNECT_NOTIFIER sConnectNotifier; /* If we tried this earlier, then we might have connected to the driver * But if pdump.exe was running then the stream connected would fail */ if (!gpfnDbgDrv) { DBGDrvGetServiceTable(&gpfnDbgDrv); // If something failed then no point in trying to connect streams if (gpfnDbgDrv == IMG_NULL) { return; } /* * Pass the connection notify callback */ sConnectNotifier.pfnConnectNotifier = &PDumpConnectionNotify; gpfnDbgDrv->pfnSetConnectNotifier(sConnectNotifier); if(!gsDBGPdumpState.pszFile) { if(OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, SZ_FILENAME_SIZE_MAX, (IMG_PVOID *)&gsDBGPdumpState.pszFile, 0, "Filename string") != PVRSRV_OK) { goto init_failed; } } if(!gsDBGPdumpState.pszMsg) { if(OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, SZ_MSG_SIZE_MAX, (IMG_PVOID *)&gsDBGPdumpState.pszMsg, 0, "Message string") != PVRSRV_OK) { goto init_failed; } } if(!gsDBGPdumpState.pszScript) { if(OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, SZ_SCRIPT_SIZE_MAX, (IMG_PVOID *)&gsDBGPdumpState.pszScript, 0, "Script string") != PVRSRV_OK) { goto init_failed; } } for(i=0; i < PDUMP_NUM_STREAMS; i++) { gsDBGPdumpState.psStream[i] = gpfnDbgDrv->pfnCreateStream(pszStreamName[i], DEBUG_CAPMODE_FRAMED, DEBUG_OUTMODE_STREAMENABLE, 0, 10); gpfnDbgDrv->pfnSetCaptureMode(gsDBGPdumpState.psStream[i],DEBUG_CAPMODE_FRAMED,0xFFFFFFFF, 0xFFFFFFFF, 1); gpfnDbgDrv->pfnSetFrame(gsDBGPdumpState.psStream[i],0); } PDUMPCOMMENT("Driver Product Name: %s", VS_PRODUCT_NAME); PDUMPCOMMENT("Driver Product Version: %s (%s)", PVRVERSION_STRING, PVRVERSION_FAMILY); PDUMPCOMMENT("Start of Init Phase"); } return; init_failed: if(gsDBGPdumpState.pszFile) { OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, SZ_FILENAME_SIZE_MAX, (IMG_PVOID) gsDBGPdumpState.pszFile, 0); gsDBGPdumpState.pszFile = IMG_NULL; } if(gsDBGPdumpState.pszScript) { OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, SZ_SCRIPT_SIZE_MAX, (IMG_PVOID) gsDBGPdumpState.pszScript, 0); gsDBGPdumpState.pszScript = IMG_NULL; } if(gsDBGPdumpState.pszMsg) { OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, SZ_MSG_SIZE_MAX, (IMG_PVOID) gsDBGPdumpState.pszMsg, 0); gsDBGPdumpState.pszMsg = IMG_NULL; } /* * Remove the connection notify callback */ sConnectNotifier.pfnConnectNotifier = 0; gpfnDbgDrv->pfnSetConnectNotifier(sConnectNotifier); gpfnDbgDrv = IMG_NULL; }
/*! * \name PDumpOSGetStreamOffset */ IMG_UINT32 PDumpOSGetStreamOffset(IMG_UINT32 ePDumpStream) { PDBG_STREAM psStream = gsDBGPdumpState.psStream[ePDumpStream]; return gpfnDbgDrv->pfnGetStreamOffset(psStream); }
IMG_VOID PDumpInit(IMG_VOID) { IMG_UINT32 i; DBGKM_CONNECT_NOTIFIER sConnectNotifier; if (!gpfnDbgDrv) { DBGDrvGetServiceTable((IMG_VOID **)&gpfnDbgDrv); if (gpfnDbgDrv == IMG_NULL) { return; } sConnectNotifier.pfnConnectNotifier = &PDumpConnectionNotify; gpfnDbgDrv->pfnSetConnectNotifier(sConnectNotifier); if(!gsDBGPdumpState.pszFile) { if(OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, SZ_FILENAME_SIZE_MAX, (IMG_PVOID *)&gsDBGPdumpState.pszFile, 0, "Filename string") != PVRSRV_OK) { goto init_failed; } } if(!gsDBGPdumpState.pszMsg) { if(OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, SZ_MSG_SIZE_MAX, (IMG_PVOID *)&gsDBGPdumpState.pszMsg, 0, "Message string") != PVRSRV_OK) { goto init_failed; } } if(!gsDBGPdumpState.pszScript) { if(OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP, SZ_SCRIPT_SIZE_MAX, (IMG_PVOID *)&gsDBGPdumpState.pszScript, 0, "Script string") != PVRSRV_OK) { goto init_failed; } } for(i=0; i < PDUMP_NUM_STREAMS; i++) { gsDBGPdumpState.psStream[i] = gpfnDbgDrv->pfnCreateStream(pszStreamName[i], DEBUG_CAPMODE_FRAMED, DEBUG_OUTMODE_STREAMENABLE, 0, 10); gpfnDbgDrv->pfnSetCaptureMode(gsDBGPdumpState.psStream[i],DEBUG_CAPMODE_FRAMED,0xFFFFFFFF, 0xFFFFFFFF, 1); gpfnDbgDrv->pfnSetFrame(gsDBGPdumpState.psStream[i],0); } PDUMPCOMMENT("Driver Product Name: %s", VS_PRODUCT_NAME); PDUMPCOMMENT("Driver Product Version: %s (%s)", PVRVERSION_STRING, PVRVERSION_FILE); PDUMPCOMMENT("Start of Init Phase"); } return; init_failed: if(gsDBGPdumpState.pszFile) { OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, SZ_FILENAME_SIZE_MAX, (IMG_PVOID) gsDBGPdumpState.pszFile, 0); gsDBGPdumpState.pszFile = IMG_NULL; } if(gsDBGPdumpState.pszScript) { OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, SZ_SCRIPT_SIZE_MAX, (IMG_PVOID) gsDBGPdumpState.pszScript, 0); gsDBGPdumpState.pszScript = IMG_NULL; } if(gsDBGPdumpState.pszMsg) { OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, SZ_MSG_SIZE_MAX, (IMG_PVOID) gsDBGPdumpState.pszMsg, 0); gsDBGPdumpState.pszMsg = IMG_NULL; } sConnectNotifier.pfnConnectNotifier = 0; gpfnDbgDrv->pfnSetConnectNotifier(sConnectNotifier); gpfnDbgDrv = IMG_NULL; }
static IMG_UINT32 DbgGetFrame(PDBG_STREAM psStream) { return gpfnDbgDrv->pfnGetFrame(psStream); }