summaryrefslogtreecommitdiffstats
path: root/pvr-source/services4/srvkm/common/pdump_common.c
diff options
context:
space:
mode:
Diffstat (limited to 'pvr-source/services4/srvkm/common/pdump_common.c')
-rwxr-xr-xpvr-source/services4/srvkm/common/pdump_common.c2967
1 files changed, 0 insertions, 2967 deletions
diff --git a/pvr-source/services4/srvkm/common/pdump_common.c b/pvr-source/services4/srvkm/common/pdump_common.c
deleted file mode 100755
index 2d96dc3..0000000
--- a/pvr-source/services4/srvkm/common/pdump_common.c
+++ /dev/null
@@ -1,2967 +0,0 @@
-/*************************************************************************/ /*!
-@Title Common PDump functions
-@Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved
-@License Dual MIT/GPLv2
-
-The contents of this file are subject to the MIT license as set out below.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-Alternatively, the contents of this file may be used under the terms of
-the GNU General Public License Version 2 ("GPL") in which case the provisions
-of GPL are applicable instead of those above.
-
-If you wish to allow use of your version of this file only under the terms of
-GPL, and not to allow others to use your version of this file under the terms
-of the MIT license, indicate your decision by deleting the provisions above
-and replace them with the notice and other provisions required by GPL as set
-out in the file called "GPL-COPYING" included in this distribution. If you do
-not delete the provisions above, a recipient may use your version of this file
-under the terms of either the MIT license or GPL.
-
-This License is also included in this distribution in the file called
-"MIT-COPYING".
-
-EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS
-PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/ /**************************************************************************/
-
-#if defined(PDUMP)
-#include <stdarg.h>
-
-#include "services_headers.h"
-#include "perproc.h"
-
-/* pdump headers */
-#include "pdump_km.h"
-#include "pdump_int.h"
-
-/* Allow temporary buffer size override */
-#if !defined(PDUMP_TEMP_BUFFER_SIZE)
-#define PDUMP_TEMP_BUFFER_SIZE (64 * 1024U)
-#endif
-
-/* DEBUG */
-#if 1
-#define PDUMP_DBG(a) PDumpOSDebugPrintf (a)
-#else
-#define PDUMP_DBG(a)
-#endif
-
-
-#define PTR_PLUS(t, p, x) ((t)(((IMG_CHAR *)(p)) + (x)))
-#define VPTR_PLUS(p, x) PTR_PLUS(IMG_VOID *, p, x)
-#define VPTR_INC(p, x) ((p) = VPTR_PLUS(p, x))
-#define MAX_PDUMP_MMU_CONTEXTS (32)
-static IMG_VOID *gpvTempBuffer = IMG_NULL;
-static IMG_HANDLE ghTempBufferBlockAlloc;
-static IMG_UINT16 gui16MMUContextUsage = 0;
-
-#if defined(PDUMP_DEBUG_OUTFILES)
-/* counter increments each time debug write is called */
-IMG_UINT32 g_ui32EveryLineCounter = 1U;
-#endif
-
-#ifdef INLINE_IS_PRAGMA
-#pragma inline(_PDumpIsPersistent)
-#endif
-static INLINE
-IMG_BOOL _PDumpIsPersistent(IMG_VOID)
-{
- PVRSRV_PER_PROCESS_DATA* psPerProc = PVRSRVFindPerProcessData();
-
- if(psPerProc == IMG_NULL)
- {
- /* only occurs early in driver init, and init phase is already persistent */
- return IMG_FALSE;
- }
- return psPerProc->bPDumpPersistent;
-}
-
-#if defined(SUPPORT_PDUMP_MULTI_PROCESS)
-
-
-static INLINE
-IMG_BOOL _PDumpIsProcessActive(IMG_VOID)
-{
- PVRSRV_PER_PROCESS_DATA* psPerProc = PVRSRVFindPerProcessData();
- if(psPerProc == IMG_NULL)
- {
- /* FIXME: kernel process logs some comments when kernel module is
- * loaded, want to keep those.
- */
- return IMG_TRUE;
- }
- return psPerProc->bPDumpActive;
-}
-
-#endif /* SUPPORT_PDUMP_MULTI_PROCESS */
-
-#if defined(PDUMP_DEBUG_OUTFILES)
-static INLINE
-IMG_UINT32 _PDumpGetPID(IMG_VOID)
-{
- PVRSRV_PER_PROCESS_DATA* psPerProc = PVRSRVFindPerProcessData();
- if(psPerProc == IMG_NULL)
- {
- /* Kernel PID */
- return 0;
- }
- return psPerProc->ui32PID;
-}
-#endif /* PDUMP_DEBUG_OUTFILES */
-
-/**************************************************************************
- * Function Name : GetTempBuffer
- * Inputs : None
- * Outputs : None
- * Returns : Temporary buffer address, or IMG_NULL
- * Description : Get temporary buffer address.
-**************************************************************************/
-static IMG_VOID *GetTempBuffer(IMG_VOID)
-{
- /*
- * Allocate the temporary buffer, it it hasn't been allocated already.
- * Return the address of the temporary buffer, or IMG_NULL if it
- * couldn't be allocated.
- * It is expected that the buffer will be allocated once, at driver
- * load time, and left in place until the driver unloads.
- */
-
- if (gpvTempBuffer == IMG_NULL)
- {
- PVRSRV_ERROR eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
- PDUMP_TEMP_BUFFER_SIZE,
- &gpvTempBuffer,
- &ghTempBufferBlockAlloc,
- "PDUMP Temporary Buffer");
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR, "GetTempBuffer: OSAllocMem failed: %d", eError));
- }
- }
-
- return gpvTempBuffer;
-}
-
-static IMG_VOID FreeTempBuffer(IMG_VOID)
-{
-
- if (gpvTempBuffer != IMG_NULL)
- {
- PVRSRV_ERROR eError = OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
- PDUMP_TEMP_BUFFER_SIZE,
- gpvTempBuffer,
- ghTempBufferBlockAlloc);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR, "FreeTempBuffer: OSFreeMem failed: %d", eError));
- }
- else
- {
- gpvTempBuffer = IMG_NULL;
- }
- }
-}
-
-IMG_VOID PDumpInitCommon(IMG_VOID)
-{
- /* Allocate temporary buffer for copying from user space */
- (IMG_VOID) GetTempBuffer();
-
- /* Call environment specific PDump initialisation */
- PDumpInit();
-}
-
-IMG_VOID PDumpDeInitCommon(IMG_VOID)
-{
- /* Free temporary buffer */
- FreeTempBuffer();
-
- /* Call environment specific PDump Deinitialisation */
- PDumpDeInit();
-}
-
-IMG_BOOL PDumpIsSuspended(IMG_VOID)
-{
- return PDumpOSIsSuspended();
-}
-
-IMG_BOOL PDumpIsCaptureFrameKM(IMG_VOID)
-{
-#if defined(SUPPORT_PDUMP_MULTI_PROCESS)
- if( _PDumpIsProcessActive() )
- {
- return PDumpOSIsCaptureFrameKM();
- }
- return IMG_FALSE;
-#else
- return PDumpOSIsCaptureFrameKM();
-#endif
-}
-
-PVRSRV_ERROR PDumpSetFrameKM(IMG_UINT32 ui32Frame)
-{
-#if defined(SUPPORT_PDUMP_MULTI_PROCESS)
- if( _PDumpIsProcessActive() )
- {
- return PDumpOSSetFrameKM(ui32Frame);
- }
- return PVRSRV_OK;
-#else
- return PDumpOSSetFrameKM(ui32Frame);
-#endif
-}
-
-/**************************************************************************
- * Function Name : PDumpRegWithFlagsKM
- * Inputs : pszPDumpDevName, Register offset, and value to write
- * Outputs : None
- * Returns : PVRSRV_ERROR
- * Description : Create a PDUMP string, which represents a register write
-**************************************************************************/
-PVRSRV_ERROR PDumpRegWithFlagsKM(IMG_CHAR *pszPDumpRegName,
- IMG_UINT32 ui32Reg,
- IMG_UINT32 ui32Data,
- IMG_UINT32 ui32Flags)
-{
- PVRSRV_ERROR eErr;
- PDUMP_GET_SCRIPT_STRING()
- PDUMP_DBG(("PDumpRegWithFlagsKM"));
-
- eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "WRW :%s:0x%08X 0x%08X\r\n",
- pszPDumpRegName, ui32Reg, ui32Data);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, ui32Flags);
-
- return PVRSRV_OK;
-}
-
-/**************************************************************************
- * Function Name : PDumpRegKM
- * Inputs : Register offset, and value to write
- * Outputs : None
- * Returns : PVRSRV_ERROR
- * Description : Create a PDUMP string, which represents a register write
-**************************************************************************/
-PVRSRV_ERROR PDumpRegKM(IMG_CHAR *pszPDumpRegName,
- IMG_UINT32 ui32Reg,
- IMG_UINT32 ui32Data)
-{
- return PDumpRegWithFlagsKM(pszPDumpRegName, ui32Reg, ui32Data, PDUMP_FLAGS_CONTINUOUS);
-}
-
-/**************************************************************************
- * Function Name : PDumpRegPolWithFlagsKM
- * Inputs : Description of what this register read is trying to do
- * pszPDumpDevName
- * Register offset
- * expected value
- * mask for that value
- * Outputs : None
- * Returns : None
- * Description : Create a PDUMP string which represents a register read
- * with the expected value
-**************************************************************************/
-PVRSRV_ERROR PDumpRegPolWithFlagsKM(IMG_CHAR *pszPDumpRegName,
- IMG_UINT32 ui32RegAddr,
- IMG_UINT32 ui32RegValue,
- IMG_UINT32 ui32Mask,
- IMG_UINT32 ui32Flags,
- PDUMP_POLL_OPERATOR eOperator)
-{
- /* Timings correct for linux and XP */
- #define POLL_DELAY 1000U
- #define POLL_COUNT_LONG (2000000000U / POLL_DELAY)
- #define POLL_COUNT_SHORT (1000000U / POLL_DELAY)
-
- PVRSRV_ERROR eErr;
- IMG_UINT32 ui32PollCount;
-
- PDUMP_GET_SCRIPT_STRING();
- PDUMP_DBG(("PDumpRegPolWithFlagsKM"));
- if ( _PDumpIsPersistent() )
- {
- /* Don't pdump-poll if the process is persistent */
- return PVRSRV_OK;
- }
-
- ui32PollCount = POLL_COUNT_LONG;
-
- eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "POL :%s:0x%08X 0x%08X 0x%08X %d %u %d\r\n",
- pszPDumpRegName, ui32RegAddr, ui32RegValue,
- ui32Mask, eOperator, ui32PollCount, POLL_DELAY);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, ui32Flags);
-
- return PVRSRV_OK;
-}
-
-
-/**************************************************************************
- * Function Name : PDumpRegPol
- * Inputs : Description of what this register read is trying to do
- * pszPDumpDevName
- Register offset
- * expected value
- * mask for that value
- * Outputs : None
- * Returns : None
- * Description : Create a PDUMP string which represents a register read
- * with the expected value
-**************************************************************************/
-PVRSRV_ERROR PDumpRegPolKM(IMG_CHAR *pszPDumpRegName, IMG_UINT32 ui32RegAddr, IMG_UINT32 ui32RegValue, IMG_UINT32 ui32Mask, PDUMP_POLL_OPERATOR eOperator)
-{
- return PDumpRegPolWithFlagsKM(pszPDumpRegName, ui32RegAddr, ui32RegValue, ui32Mask, PDUMP_FLAGS_CONTINUOUS, eOperator);
-}
-
-/**************************************************************************
- * Function Name : PDumpMallocPages
- * Inputs : psDevID, ui32DevVAddr, pvLinAddr, ui32NumBytes, hOSMemHandle
- * : hUniqueTag
- * Outputs : None
- * Returns : None
- * Description : Malloc memory pages
-
-FIXME: This function assumes pvLinAddr is the address of the start of the
-block for this hOSMemHandle.
-If this isn't true, the call to PDumpOSCPUVAddrToDevPAddr below will be
-incorrect. (Consider using OSMemHandleToCPUPAddr() instead?)
-The only caller at the moment is in buffer_manager.c, which does the right
-thing.
-**************************************************************************/
-PVRSRV_ERROR PDumpMallocPages (PVRSRV_DEVICE_IDENTIFIER *psDevID,
- IMG_UINT32 ui32DevVAddr,
- IMG_CPU_VIRTADDR pvLinAddr,
- IMG_HANDLE hOSMemHandle,
- IMG_UINT32 ui32NumBytes,
- IMG_UINT32 ui32PageSize,
- IMG_BOOL bShared,
- IMG_HANDLE hUniqueTag)
-{
- PVRSRV_ERROR eErr;
- IMG_PUINT8 pui8LinAddr;
- IMG_UINT32 ui32Offset;
- IMG_UINT32 ui32NumPages;
- IMG_DEV_PHYADDR sDevPAddr;
- IMG_UINT32 ui32Page;
- IMG_UINT32 ui32Flags = PDUMP_FLAGS_CONTINUOUS;
-
- PDUMP_GET_SCRIPT_STRING();
-#if defined(SUPPORT_PDUMP_MULTI_PROCESS)
- /* Always dump physical pages backing a shared allocation */
- ui32Flags |= ( _PDumpIsPersistent() || bShared ) ? PDUMP_FLAGS_PERSISTENT : 0;
-#else
- PVR_UNREFERENCED_PARAMETER(bShared);
- ui32Flags |= ( _PDumpIsPersistent() ) ? PDUMP_FLAGS_PERSISTENT : 0;
-#endif
-
- /* However, lin addr is only required in non-linux OSes */
-#if !defined(LINUX)
- PVR_ASSERT(((IMG_UINTPTR_T)pvLinAddr & HOST_PAGEMASK) == 0);
-#endif
-
- PVR_ASSERT(((IMG_UINT32) ui32DevVAddr & HOST_PAGEMASK) == 0);
- PVR_ASSERT(((IMG_UINT32) ui32NumBytes & HOST_PAGEMASK) == 0);
-
- /*
- Write a comment to the PDump2 script streams indicating the memory allocation
- */
- eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "-- MALLOC :%s:VA_%08X 0x%08X %u\r\n",
- psDevID->pszPDumpDevName, ui32DevVAddr, ui32NumBytes, ui32PageSize);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, ui32Flags);
-
- /*
- Write to the MMU script stream indicating the memory allocation
- */
- pui8LinAddr = (IMG_PUINT8) pvLinAddr;
- ui32Offset = 0;
- ui32NumPages = ui32NumBytes / ui32PageSize;
- while (ui32NumPages)
- {
- ui32NumPages--;
-
- /* See FIXME in function header.
- * Currently: linux pdump uses OSMemHandle and Offset
- * other OSes use the LinAddr.
- */
- /* Calculate the device physical address for this page */
- PDumpOSCPUVAddrToDevPAddr(psDevID->eDeviceType,
- hOSMemHandle,
- ui32Offset,
- pui8LinAddr,
- ui32PageSize,
- &sDevPAddr);
- ui32Page = (IMG_UINT32)(sDevPAddr.uiAddr / ui32PageSize);
- /* increment kernel virtual address */
- pui8LinAddr += ui32PageSize;
- ui32Offset += ui32PageSize;
-
- eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "MALLOC :%s:PA_%08X%08X %u %u 0x%08X\r\n",
- psDevID->pszPDumpDevName,
- (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag,
- ui32Page * ui32PageSize,
- ui32PageSize,
- ui32PageSize,
- ui32Page * ui32PageSize);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, ui32Flags);
- }
- return PVRSRV_OK;
-}
-
-
-/**************************************************************************
- * Function Name : PDumpMallocPageTable
- * Inputs : psDevId, pvLinAddr, ui32NumBytes, hUniqueTag
- * Outputs : None
- * Returns : None
- * Description : Malloc memory page table
-**************************************************************************/
-PVRSRV_ERROR PDumpMallocPageTable (PVRSRV_DEVICE_IDENTIFIER *psDevId,
- IMG_HANDLE hOSMemHandle,
- IMG_UINT32 ui32Offset,
- IMG_CPU_VIRTADDR pvLinAddr,
- IMG_UINT32 ui32PTSize,
- IMG_UINT32 ui32Flags,
- IMG_HANDLE hUniqueTag)
-{
- PVRSRV_ERROR eErr;
- IMG_DEV_PHYADDR sDevPAddr;
-
- PDUMP_GET_SCRIPT_STRING();
-
- PVR_ASSERT(((IMG_UINTPTR_T)pvLinAddr & (ui32PTSize - 1)) == 0);
- ui32Flags |= PDUMP_FLAGS_CONTINUOUS;
- ui32Flags |= ( _PDumpIsPersistent() ) ? PDUMP_FLAGS_PERSISTENT : 0;
-
- /*
- Write a comment to the PDump2 script streams indicating the memory allocation
- */
- eErr = PDumpOSBufprintf(hScript,
- ui32MaxLen,
- "-- MALLOC :%s:PAGE_TABLE 0x%08X %u\r\n",
- psDevId->pszPDumpDevName,
- ui32PTSize,
- ui32PTSize);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, ui32Flags);
-
- /*
- Write to the MMU script stream indicating the memory allocation
- */
- // FIXME: we'll never need more than a 4k page for a pagetable
- // fixing to 1 page for now.
- // note: when the mmu code supports packed pagetables the PTs
- // will be as small as 16bytes
-
- PDumpOSCPUVAddrToDevPAddr(psDevId->eDeviceType,
- hOSMemHandle, /* um - does this mean the pvLinAddr would be ignored? Is that safe? */
- ui32Offset,
- (IMG_PUINT8) pvLinAddr,
- ui32PTSize,
- &sDevPAddr);
-
- eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "MALLOC :%s:PA_%08X%08X 0x%X %u 0x%08X\r\n",
- psDevId->pszPDumpDevName,
- (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag,
- sDevPAddr.uiAddr,
- ui32PTSize,//size
- ui32PTSize,//alignment
- sDevPAddr.uiAddr);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, ui32Flags);
-
- return PVRSRV_OK;
-}
-
-/**************************************************************************
- * Function Name : PDumpFreePages
- * Inputs : psBMHeap, sDevVAddr, ui32NumBytes, hUniqueTag,
- bInterLeaved
- * Outputs : None
- * Returns : None
- * Description : Free memory pages
-**************************************************************************/
-PVRSRV_ERROR PDumpFreePages (BM_HEAP *psBMHeap,
- IMG_DEV_VIRTADDR sDevVAddr,
- IMG_UINT32 ui32NumBytes,
- IMG_UINT32 ui32PageSize,
- IMG_HANDLE hUniqueTag,
- IMG_BOOL bInterleaved,
- IMG_BOOL bSparse)
-{
- PVRSRV_ERROR eErr;
- IMG_UINT32 ui32NumPages, ui32PageCounter;
- IMG_DEV_PHYADDR sDevPAddr;
- IMG_UINT32 ui32Flags = PDUMP_FLAGS_CONTINUOUS;
- PVRSRV_DEVICE_NODE *psDeviceNode;
-
- PDUMP_GET_SCRIPT_STRING();
-
- PVR_ASSERT(((IMG_UINT32) sDevVAddr.uiAddr & (ui32PageSize - 1)) == 0);
- PVR_ASSERT(((IMG_UINT32) ui32NumBytes & (ui32PageSize - 1)) == 0);
-
- psDeviceNode = psBMHeap->pBMContext->psDeviceNode;
- ui32Flags |= ( _PDumpIsPersistent() ) ? PDUMP_FLAGS_PERSISTENT : 0;
-
- /*
- Write a comment to the PDUMP2 script streams indicating the memory free
- */
- eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "-- FREE :%s:VA_%08X\r\n",
- psDeviceNode->sDevId.pszPDumpDevName, sDevVAddr.uiAddr);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
-
-#if defined(SUPPORT_PDUMP_MULTI_PROCESS)
- /* if we're dumping a shared heap, need to ensure phys allocation
- * is freed even if this app isn't the one marked for pdumping
- */
- {
- PVRSRV_DEVICE_NODE *psDeviceNode = psBMHeap->pBMContext->psDeviceNode;
-
- if( psDeviceNode->pfnMMUIsHeapShared(psBMHeap->pMMUHeap) )
- {
- ui32Flags |= PDUMP_FLAGS_PERSISTENT;
- }
- }
-#endif
- PDumpOSWriteString2(hScript, ui32Flags);
-
- /*
- Write to the MMU script stream indicating the memory free
- */
- ui32NumPages = ui32NumBytes / ui32PageSize;
- for (ui32PageCounter = 0; ui32PageCounter < ui32NumPages; ui32PageCounter++)
- {
- if (!bInterleaved || (ui32PageCounter % 2) == 0)
- {
- sDevPAddr = psDeviceNode->pfnMMUGetPhysPageAddr(psBMHeap->pMMUHeap, sDevVAddr);
-
- /* With sparse mappings we expect spaces */
- if (bSparse && (sDevPAddr.uiAddr == 0))
- {
- continue;
- }
-
- PVR_ASSERT(sDevPAddr.uiAddr != 0);
-
- eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "FREE :%s:PA_%08X%08X\r\n",
- psDeviceNode->sDevId.pszPDumpDevName, (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag, sDevPAddr.uiAddr);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, ui32Flags);
- }
- else
- {
- /* Gap pages in an interleaved allocation should be ignored. */
- }
-
- sDevVAddr.uiAddr += ui32PageSize;
- }
- return PVRSRV_OK;
-}
-
-/**************************************************************************
- * Function Name : PDumpFreePageTable
- * Inputs : psDevID, pvLinAddr, ui32NumBytes, hUniqueTag
- * Outputs : None
- * Returns : None
- * Description : Free memory page table
-**************************************************************************/
-PVRSRV_ERROR PDumpFreePageTable (PVRSRV_DEVICE_IDENTIFIER *psDevID,
- IMG_HANDLE hOSMemHandle,
- IMG_CPU_VIRTADDR pvLinAddr,
- IMG_UINT32 ui32PTSize,
- IMG_UINT32 ui32Flags,
- IMG_HANDLE hUniqueTag)
-{
- PVRSRV_ERROR eErr;
- IMG_DEV_PHYADDR sDevPAddr;
-
- PDUMP_GET_SCRIPT_STRING();
-
- PVR_UNREFERENCED_PARAMETER(ui32PTSize);
- ui32Flags |= PDUMP_FLAGS_CONTINUOUS;
- ui32Flags |= ( _PDumpIsPersistent() ) ? PDUMP_FLAGS_PERSISTENT : 0;
-
- /* override QAC warning about wrap around */
- PVR_ASSERT(((IMG_UINTPTR_T)pvLinAddr & (ui32PTSize-1UL)) == 0); /* PRQA S 3382 */
-
- /*
- Write a comment to the PDUMP2 script streams indicating the memory free
- */
- eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "-- FREE :%s:PAGE_TABLE\r\n", psDevID->pszPDumpDevName);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, ui32Flags);
-
- /*
- Write to the MMU script stream indicating the memory free
- */
- // FIXME: we'll never need more than a 4k page for a pagetable
- // fixing to 1 page for now.
- // note: when the mmu code supports packed pagetables the PTs
- // will be as small as 16bytes
-
- PDumpOSCPUVAddrToDevPAddr(psDevID->eDeviceType,
- hOSMemHandle, /* um - does this mean the pvLinAddr would be ignored? Is that safe? */
- 0,
- (IMG_PUINT8) pvLinAddr,
- ui32PTSize,
- &sDevPAddr);
-
- {
- eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "FREE :%s:PA_%08X%08X\r\n",
- psDevID->pszPDumpDevName,
- (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag,
- sDevPAddr.uiAddr);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, ui32Flags);
- }
-
- return PVRSRV_OK;
-}
-
-/**************************************************************************
- * Function Name : PDumpPDRegWithFlags
- * Inputs : psMMUAttrib
- * : ui32Reg
- * : ui32Data
- * : hUniqueTag
- * Outputs : None
- * Returns : None
- * Description : Kernel Services internal pdump memory API
- * Used for registers specifying physical addresses
- e.g. MMU page directory register
-**************************************************************************/
-PVRSRV_ERROR PDumpPDRegWithFlags(PDUMP_MMU_ATTRIB *psMMUAttrib,
- IMG_UINT32 ui32Reg,
- IMG_UINT32 ui32Data,
- IMG_UINT32 ui32Flags,
- IMG_HANDLE hUniqueTag)
-{
- PVRSRV_ERROR eErr;
- IMG_CHAR *pszRegString;
- PDUMP_GET_SCRIPT_STRING()
-
- if(psMMUAttrib->pszPDRegRegion != IMG_NULL)
- {
- pszRegString = psMMUAttrib->pszPDRegRegion;
- }
- else
- {
- pszRegString = psMMUAttrib->sDevId.pszPDumpRegName;
- }
-
- /*
- Write to the MMU script stream indicating the physical page directory
- */
-#if defined(SGX_FEATURE_36BIT_MMU)
- eErr = PDumpOSBufprintf(hScript, ui32MaxLen,
- "WRW :%s:$1 :%s:PA_%08X%08X:0x0\r\n",
- psMMUAttrib->sDevId.pszPDumpDevName,
- psMMUAttrib->sDevId.pszPDumpDevName,
- (IMG_UINT32)hUniqueTag,
- (ui32Data & psMMUAttrib->ui32PDEMask) << psMMUAttrib->ui32PDEAlignShift);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, ui32Flags);
- eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "SHR :%s:$1 :%s:$1 0x4\r\n",
- psMMUAttrib->sDevId.pszPDumpDevName,
- psMMUAttrib->sDevId.pszPDumpDevName);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, ui32Flags);
- eErr = PDumpOSBufprintf(hScript, ui32MaxLen,
- "WRW :%s:0x%08X: %s:$1\r\n",
- pszRegString,
- ui32Reg,
- psMMUAttrib->sDevId.pszPDumpDevName);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, ui32Flags);
-#else
- eErr = PDumpOSBufprintf(hScript,
- ui32MaxLen,
- "WRW :%s:0x%08X :%s:PA_%08X%08X:0x%08X\r\n",
- pszRegString,
- ui32Reg,
- psMMUAttrib->sDevId.pszPDumpDevName,
- (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag,
- (ui32Data & psMMUAttrib->ui32PDEMask) << psMMUAttrib->ui32PDEAlignShift,
- ui32Data & ~psMMUAttrib->ui32PDEMask);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, ui32Flags);
-#endif
- return PVRSRV_OK;
-}
-
-/**************************************************************************
- * Function Name : PDumpPDReg
- * Inputs : psMMUAttrib
- : ui32Reg
- * : ui32Data
- * : hUniqueTag
- * Outputs : None
- * Returns : PVRSRV_ERROR
- * Description : Kernel Services internal pdump memory API
- * Used for registers specifying physical addresses
- e.g. MMU page directory register
-**************************************************************************/
-PVRSRV_ERROR PDumpPDReg (PDUMP_MMU_ATTRIB *psMMUAttrib,
- IMG_UINT32 ui32Reg,
- IMG_UINT32 ui32Data,
- IMG_HANDLE hUniqueTag)
-{
- return PDumpPDRegWithFlags(psMMUAttrib, ui32Reg, ui32Data, PDUMP_FLAGS_CONTINUOUS, hUniqueTag);
-}
-
-/**************************************************************************
- * Function Name : PDumpMemPolKM
- * Inputs : psMemInfo
- * : ui32Offset
- * : ui32Value
- * : ui32Mask
- * : eOperator
- * : ui32Flags
- * : hUniqueTag
- * Outputs : None
- * Returns : PVRSRV_ERROR
- * Description : Implements Client pdump memory poll API
-**************************************************************************/
-PVRSRV_ERROR PDumpMemPolKM(PVRSRV_KERNEL_MEM_INFO *psMemInfo,
- IMG_UINT32 ui32Offset,
- IMG_UINT32 ui32Value,
- IMG_UINT32 ui32Mask,
- PDUMP_POLL_OPERATOR eOperator,
- IMG_UINT32 ui32Flags,
- IMG_HANDLE hUniqueTag)
-{
- #define MEMPOLL_DELAY (1000)
- #define MEMPOLL_COUNT (2000000000 / MEMPOLL_DELAY)
-
- PVRSRV_ERROR eErr;
- IMG_UINT32 ui32PageOffset;
- IMG_UINT8 *pui8LinAddr;
- IMG_DEV_PHYADDR sDevPAddr;
- IMG_DEV_VIRTADDR sDevVPageAddr;
- PDUMP_MMU_ATTRIB *psMMUAttrib;
-
- PDUMP_GET_SCRIPT_STRING();
-
- if (PDumpOSIsSuspended())
- {
- return PVRSRV_OK;
- }
-
- if ( _PDumpIsPersistent() )
- {
- /* Don't pdump-poll if the process is persistent */
- return PVRSRV_OK;
- }
-
- /* Check the offset and size don't exceed the bounds of the allocation */
- PVR_ASSERT((ui32Offset + sizeof(IMG_UINT32)) <= psMemInfo->uAllocSize);
-
- psMMUAttrib = ((BM_BUF*)psMemInfo->sMemBlk.hBuffer)->pMapping->pBMHeap->psMMUAttrib;
-
- /*
- Write a comment to the PDump2 script streams indicating the virtual memory pol
- */
- eErr = PDumpOSBufprintf(hScript,
- ui32MaxLen,
- "-- POL :%s:VA_%08X 0x%08X 0x%08X %d %d %d\r\n",
- psMMUAttrib->sDevId.pszPDumpDevName,
- psMemInfo->sDevVAddr.uiAddr + ui32Offset,
- ui32Value,
- ui32Mask,
- eOperator,
- MEMPOLL_COUNT,
- MEMPOLL_DELAY);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, ui32Flags);
-
-
- pui8LinAddr = psMemInfo->pvLinAddrKM;
-
- /* Advance address by offset */
- pui8LinAddr += ui32Offset;
-
- /*
- query the buffer manager for the physical pages that back the
- virtual address
- */
- PDumpOSCPUVAddrToPhysPages(psMemInfo->sMemBlk.hOSMemHandle,
- ui32Offset,
- pui8LinAddr,
- psMMUAttrib->ui32DataPageMask,
- &ui32PageOffset);
-
- /* calculate the DevV page address */
- sDevVPageAddr.uiAddr = psMemInfo->sDevVAddr.uiAddr + ui32Offset - ui32PageOffset;
-
- PVR_ASSERT((sDevVPageAddr.uiAddr & psMMUAttrib->ui32DataPageMask) == 0);
-
- /* get the physical page address based on the device virtual address */
- BM_GetPhysPageAddr(psMemInfo, sDevVPageAddr, &sDevPAddr);
-
- /* convert DevP page address to byte address */
- sDevPAddr.uiAddr += ui32PageOffset;
-
- eErr = PDumpOSBufprintf(hScript,
- ui32MaxLen,
- "POL :%s:PA_%08X%08X:0x%08X 0x%08X 0x%08X %d %d %d\r\n",
- psMMUAttrib->sDevId.pszPDumpDevName,
- (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag,
- sDevPAddr.uiAddr & ~(psMMUAttrib->ui32DataPageMask),
- sDevPAddr.uiAddr & (psMMUAttrib->ui32DataPageMask),
- ui32Value,
- ui32Mask,
- eOperator,
- MEMPOLL_COUNT,
- MEMPOLL_DELAY);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, ui32Flags);
-
- return PVRSRV_OK;
-}
-
-/**************************************************************************
- * Function Name : _PDumpMemIntKM
- * Inputs : psMemInfo
- * : ui32Offset
- * : ui32Bytes
- * : ui32Flags
- * : hUniqueTag
- * Outputs : None
- * Returns : PVRSRV_ERROR
- * Description : Implements Client pdump mem API
-**************************************************************************/
-static PVRSRV_ERROR _PDumpMemIntKM(IMG_PVOID pvAltLinAddr,
- PVRSRV_KERNEL_MEM_INFO *psMemInfo,
- IMG_UINT32 ui32Offset,
- IMG_UINT32 ui32Bytes,
- IMG_UINT32 ui32Flags,
- IMG_HANDLE hUniqueTag)
-{
- PVRSRV_ERROR eErr;
- IMG_UINT32 ui32NumPages;
- IMG_UINT32 ui32PageByteOffset;
- IMG_UINT32 ui32BlockBytes;
- IMG_UINT8* pui8LinAddr;
- IMG_UINT8* pui8DataLinAddr = IMG_NULL;
- IMG_DEV_VIRTADDR sDevVPageAddr;
- IMG_DEV_VIRTADDR sDevVAddr;
- IMG_DEV_PHYADDR sDevPAddr;
- IMG_UINT32 ui32ParamOutPos;
- PDUMP_MMU_ATTRIB *psMMUAttrib;
- IMG_UINT32 ui32DataPageSize;
-
- PDUMP_GET_SCRIPT_AND_FILE_STRING();
-
- /* PRQA S 3415 1 */ /* side effects desired */
- if (ui32Bytes == 0 || PDumpOSIsSuspended())
- {
- return PVRSRV_OK;
- }
-
- psMMUAttrib = ((BM_BUF*)psMemInfo->sMemBlk.hBuffer)->pMapping->pBMHeap->psMMUAttrib;
-
- /*
- check the offset and size don't exceed the bounds of the allocation
- */
- PVR_ASSERT((ui32Offset + ui32Bytes) <= psMemInfo->uAllocSize);
-
- if (!PDumpOSJTInitialised())
- {
- return PVRSRV_ERROR_PDUMP_NOT_AVAILABLE;
- }
-
-#if defined(SUPPORT_PDUMP_MULTI_PROCESS)
- /* if we're dumping a shared heap, need to ensure phys allocation
- * is initialised even if this app isn't the one marked for pdumping
- */
- {
- BM_HEAP *pHeap = ((BM_BUF*)psMemInfo->sMemBlk.hBuffer)->pMapping->pBMHeap;
- PVRSRV_DEVICE_NODE *psDeviceNode = pHeap->pBMContext->psDeviceNode;
-
- if( psDeviceNode->pfnMMUIsHeapShared(pHeap->pMMUHeap) )
- {
- ui32Flags |= PDUMP_FLAGS_PERSISTENT;
- }
- }
-#endif
-
- /* setup memory addresses */
- if(pvAltLinAddr)
- {
- pui8DataLinAddr = pvAltLinAddr;
- }
- else if(psMemInfo->pvLinAddrKM)
- {
- pui8DataLinAddr = (IMG_UINT8 *)psMemInfo->pvLinAddrKM + ui32Offset;
- }
- pui8LinAddr = (IMG_UINT8 *)psMemInfo->pvLinAddrKM;
- sDevVAddr = psMemInfo->sDevVAddr;
-
- /* advance address by offset */
- sDevVAddr.uiAddr += ui32Offset;
- pui8LinAddr += ui32Offset;
-
- PVR_ASSERT(pui8DataLinAddr);
-
- PDumpOSCheckForSplitting(PDumpOSGetStream(PDUMP_STREAM_PARAM2), ui32Bytes, ui32Flags);
-
- ui32ParamOutPos = PDumpOSGetStreamOffset(PDUMP_STREAM_PARAM2);
-
- /*
- write the binary data up-front.
- */
- if(!PDumpOSWriteString(PDumpOSGetStream(PDUMP_STREAM_PARAM2),
- pui8DataLinAddr,
- ui32Bytes,
- ui32Flags))
- {
- return PVRSRV_ERROR_PDUMP_BUFFER_FULL;
- }
-
- if (PDumpOSGetParamFileNum() == 0)
- {
- eErr = PDumpOSSprintf(pszFileName, ui32MaxLenFileName, "%%0%%.prm");
- }
- else
- {
- eErr = PDumpOSSprintf(pszFileName, ui32MaxLenFileName, "%%0%%_%u.prm", PDumpOSGetParamFileNum());
- }
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
-
- /*
- Write a comment to the PDump2 script streams indicating the virtual memory load
- */
- eErr = PDumpOSBufprintf(hScript,
- ui32MaxLenScript,
- "-- LDB :%s:VA_%08X%08X:0x%08X 0x%08X 0x%08X %s\r\n",
- psMMUAttrib->sDevId.pszPDumpDevName,
- (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag,
- psMemInfo->sDevVAddr.uiAddr,
- ui32Offset,
- ui32Bytes,
- ui32ParamOutPos,
- pszFileName);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, ui32Flags);
-
- /*
- query the buffer manager for the physical pages that back the
- virtual address
- */
- PDumpOSCPUVAddrToPhysPages(psMemInfo->sMemBlk.hOSMemHandle,
- ui32Offset,
- pui8LinAddr,
- psMMUAttrib->ui32DataPageMask,
- &ui32PageByteOffset);
- ui32DataPageSize = psMMUAttrib->ui32DataPageMask + 1;
- ui32NumPages = (ui32PageByteOffset + ui32Bytes + psMMUAttrib->ui32DataPageMask) / ui32DataPageSize;
-
- while(ui32NumPages)
- {
- ui32NumPages--;
-
- /* calculate the DevV page address */
- sDevVPageAddr.uiAddr = sDevVAddr.uiAddr - ui32PageByteOffset;
-
- if (ui32DataPageSize <= PDUMP_TEMP_BUFFER_SIZE)
- {
- /* if a page fits within temp buffer, we should dump in page-aligned chunks. */
- PVR_ASSERT((sDevVPageAddr.uiAddr & psMMUAttrib->ui32DataPageMask) == 0);
- }
-
- /* get the physical page address based on the device virtual address */
- BM_GetPhysPageAddr(psMemInfo, sDevVPageAddr, &sDevPAddr);
-
- /* convert DevP page address to byte address */
- sDevPAddr.uiAddr += ui32PageByteOffset;
-
- /* how many bytes to dump from this page */
- if (ui32PageByteOffset + ui32Bytes > ui32DataPageSize)
- {
- /* dump up to the page boundary */
- ui32BlockBytes = ui32DataPageSize - ui32PageByteOffset;
- }
- else
- {
- /* dump what's left */
- ui32BlockBytes = ui32Bytes;
- }
-
- eErr = PDumpOSBufprintf(hScript,
- ui32MaxLenScript,
- "LDB :%s:PA_%08X%08X:0x%08X 0x%08X 0x%08X %s\r\n",
- psMMUAttrib->sDevId.pszPDumpDevName,
- (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag,
- sDevPAddr.uiAddr & ~(psMMUAttrib->ui32DataPageMask),
- sDevPAddr.uiAddr & (psMMUAttrib->ui32DataPageMask),
- ui32BlockBytes,
- ui32ParamOutPos,
- pszFileName);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, ui32Flags);
-
- /* update details for next page */
-
-#if defined(SGX_FEATURE_VARIABLE_MMU_PAGE_SIZE)
- /* page may be larger than pdump temporary buffer */
- ui32PageByteOffset = (ui32PageByteOffset + ui32BlockBytes) % ui32DataPageSize;
-#else
- /* page offset 0 after first page dump */
- ui32PageByteOffset = 0;
-#endif
- /* bytes left over */
- ui32Bytes -= ui32BlockBytes; /* PRQA S 3382 */ /* QAC missed MIN test */
- /* advance devVaddr */
- sDevVAddr.uiAddr += ui32BlockBytes;
- /* advance the cpuVaddr */
- pui8LinAddr += ui32BlockBytes;
- /* update the file write offset */
- ui32ParamOutPos += ui32BlockBytes;
- }
-
- return PVRSRV_OK;
-}
-
-/**************************************************************************
- * Function Name : PDumpMemKM
- * Inputs : psMemInfo
- * : ui32Offset
- * : ui32Bytes
- * : ui32Flags
- * : hUniqueTag
- * Outputs : None
- * Returns : PVRSRV_ERROR
- * Description : Implements Client pdump mem API
-**************************************************************************/
-PVRSRV_ERROR PDumpMemKM(IMG_PVOID pvAltLinAddr,
- PVRSRV_KERNEL_MEM_INFO *psMemInfo,
- IMG_UINT32 ui32Offset,
- IMG_UINT32 ui32Bytes,
- IMG_UINT32 ui32Flags,
- IMG_HANDLE hUniqueTag)
-{
- /*
- For now we don't support dumping sparse allocations that
- are from within the kernel, or are from UM but without a
- alternative linear address
- */
- PVR_ASSERT((psMemInfo->ui32Flags & PVRSRV_MEM_SPARSE) == 0);
-
- if (psMemInfo->ui32Flags & PVRSRV_MEM_SPARSE)
- {
- return PVRSRV_ERROR_INVALID_PARAMS;
- }
- else
- {
- return _PDumpMemIntKM(pvAltLinAddr,
- psMemInfo,
- ui32Offset,
- ui32Bytes,
- ui32Flags,
- hUniqueTag);
- }
-}
-
-PVRSRV_ERROR PDumpMemPDEntriesKM(PDUMP_MMU_ATTRIB *psMMUAttrib,
- IMG_HANDLE hOSMemHandle,
- IMG_CPU_VIRTADDR pvLinAddr,
- IMG_UINT32 ui32Bytes,
- IMG_UINT32 ui32Flags,
- IMG_BOOL bInitialisePages,
- IMG_HANDLE hUniqueTag1,
- IMG_HANDLE hUniqueTag2)
-{
- PDUMP_MMU_ATTRIB sMMUAttrib;
-
- /* Override the (variable) PT size since PDs are always 4K in size */
- sMMUAttrib = *psMMUAttrib;
- sMMUAttrib.ui32PTSize = (IMG_UINT32)HOST_PAGESIZE();
- return PDumpMemPTEntriesKM( &sMMUAttrib,
- hOSMemHandle,
- pvLinAddr,
- ui32Bytes,
- ui32Flags,
- bInitialisePages,
- hUniqueTag1,
- hUniqueTag2);
-}
-
-/**************************************************************************
- * Function Name : PDumpMemPTEntriesKM
- * Inputs : psMMUAttrib - MMU attributes for pdump
- * : pvLinAddr - CPU address of PT base
- * : ui32Bytes - size
- * : ui32Flags - pdump flags
- * : bInitialisePages - whether to initialise pages from file
- * : hUniqueTag1 - ID for PT physical page
- * : hUniqueTag2 - ID for target physical page (if !bInitialisePages)
- * Outputs : None
- * Returns : PVRSRV_ERROR
- * Description : Kernel Services internal pdump memory API
- * Used for memory without DevVAddress mappings
- e.g. MMU page tables
- FIXME: This function doesn't support non-4k data pages,
- e.g. dummy data page
-**************************************************************************/
-PVRSRV_ERROR PDumpMemPTEntriesKM(PDUMP_MMU_ATTRIB *psMMUAttrib,
- IMG_HANDLE hOSMemHandle,
- IMG_CPU_VIRTADDR pvLinAddr,
- IMG_UINT32 ui32Bytes,
- IMG_UINT32 ui32Flags,
- IMG_BOOL bInitialisePages,
- IMG_HANDLE hUniqueTag1,
- IMG_HANDLE hUniqueTag2)
-{
- PVRSRV_ERROR eErr;
- IMG_UINT32 ui32NumPages;
- IMG_UINT32 ui32PageOffset;
- IMG_UINT32 ui32BlockBytes;
- IMG_UINT8* pui8LinAddr;
- IMG_DEV_PHYADDR sDevPAddr;
- IMG_CPU_PHYADDR sCpuPAddr;
- IMG_UINT32 ui32Offset;
- IMG_UINT32 ui32ParamOutPos;
- IMG_UINT32 ui32PageMask; /* mask for the physical page backing the PT */
-
- PDUMP_GET_SCRIPT_AND_FILE_STRING();
- ui32Flags |= ( _PDumpIsPersistent() ) ? PDUMP_FLAGS_PERSISTENT : 0;
-
- if (PDumpOSIsSuspended())
- {
- return PVRSRV_OK;
- }
-
- if (!PDumpOSJTInitialised())
- {
- return PVRSRV_ERROR_PDUMP_NOT_AVAILABLE;
- }
-
- if (!pvLinAddr)
- {
- return PVRSRV_ERROR_INVALID_PARAMS;
- }
-
- PDumpOSCheckForSplitting(PDumpOSGetStream(PDUMP_STREAM_PARAM2), ui32Bytes, ui32Flags);
-
- ui32ParamOutPos = PDumpOSGetStreamOffset(PDUMP_STREAM_PARAM2);
-
- if (bInitialisePages)
- {
- /*
- write the binary data up-front
- Use the 'continuous' memory stream
- */
- if (!PDumpOSWriteString(PDumpOSGetStream(PDUMP_STREAM_PARAM2),
- pvLinAddr,
- ui32Bytes,
- ui32Flags | PDUMP_FLAGS_CONTINUOUS))
- {
- return PVRSRV_ERROR_PDUMP_BUFFER_FULL;
- }
-
- if (PDumpOSGetParamFileNum() == 0)
- {
- eErr = PDumpOSSprintf(pszFileName, ui32MaxLenFileName, "%%0%%.prm");
- }
- else
- {
- eErr = PDumpOSSprintf(pszFileName, ui32MaxLenFileName, "%%0%%_%u.prm", PDumpOSGetParamFileNum());
- }
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- }
-
- /*
- Mask for the physical page address backing the PT
- The PT size can be less than 4k with variable page size support
- The PD size is always 4k
- FIXME: This won't work for dumping the dummy data page
- */
- ui32PageMask = psMMUAttrib->ui32PTSize - 1;
-
- /*
- Write to the MMU script stream indicating the physical page table entries
- */
- /* physical pages that back the virtual address */
- ui32PageOffset = (IMG_UINT32)((IMG_UINTPTR_T)pvLinAddr & (psMMUAttrib->ui32PTSize - 1));
- ui32NumPages = (ui32PageOffset + ui32Bytes + psMMUAttrib->ui32PTSize - 1) / psMMUAttrib->ui32PTSize;
- pui8LinAddr = (IMG_UINT8*) pvLinAddr;
-
- while (ui32NumPages)
- {
- ui32NumPages--;
- /* FIXME: if we used OSMemHandleToCPUPAddr() here, we might be
- able to lose the lin addr arg. At least one thing that
- would need to be done here is to pass in an offset, as the
- calling function doesn't necessarily give us the lin addr
- of the start of the mem area. Probably best to keep the
- lin addr arg for now - but would be nice to remove the
- redundancy */
- sCpuPAddr = OSMapLinToCPUPhys(hOSMemHandle, pui8LinAddr);
- sDevPAddr = SysCpuPAddrToDevPAddr(psMMUAttrib->sDevId.eDeviceType, sCpuPAddr);
-
- /* how many bytes to dump from this page */
- if (ui32PageOffset + ui32Bytes > psMMUAttrib->ui32PTSize)
- {
- /* dump up to the page boundary */
- ui32BlockBytes = psMMUAttrib->ui32PTSize - ui32PageOffset;
- }
- else
- {
- /* dump what's left */
- ui32BlockBytes = ui32Bytes;
- }
-
- /*
- Write a comment to the MMU script stream indicating the page table load
- */
-
- if (bInitialisePages)
- {
- eErr = PDumpOSBufprintf(hScript,
- ui32MaxLenScript,
- "LDB :%s:PA_%08X%08X:0x%08X 0x%08X 0x%08X %s\r\n",
- psMMUAttrib->sDevId.pszPDumpDevName,
- (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag1,
- sDevPAddr.uiAddr & ~ui32PageMask,
- sDevPAddr.uiAddr & ui32PageMask,
- ui32BlockBytes,
- ui32ParamOutPos,
- pszFileName);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, ui32Flags | PDUMP_FLAGS_CONTINUOUS);
- }
- else
- {
- for (ui32Offset = 0; ui32Offset < ui32BlockBytes; ui32Offset += sizeof(IMG_UINT32))
- {
- IMG_UINT32 ui32PTE = *((IMG_UINT32 *)(IMG_UINTPTR_T)(pui8LinAddr + ui32Offset)); /* PRQA S 3305 */ /* strict pointer */
-
- if ((ui32PTE & psMMUAttrib->ui32PDEMask) != 0)
- {
- /* PT entry points to non-null page */
-#if defined(SGX_FEATURE_36BIT_MMU)
- eErr = PDumpOSBufprintf(hScript,
- ui32MaxLenScript,
- "WRW :%s:$1 :%s:PA_%08X%08X:0x0\r\n",
- psMMUAttrib->sDevId.pszPDumpDevName,
- psMMUAttrib->sDevId.pszPDumpDevName,
- (IMG_UINT32)hUniqueTag2,
- (ui32PTE & psMMUAttrib->ui32PDEMask) << psMMUAttrib->ui32PTEAlignShift);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, ui32Flags | PDUMP_FLAGS_CONTINUOUS);
- eErr = PDumpOSBufprintf(hScript, ui32MaxLenScript, "SHR :%s:$1 :%s:$1 0x4\r\n",
- psMMUAttrib->sDevId.pszPDumpDevName,
- psMMUAttrib->sDevId.pszPDumpDevName);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, ui32Flags | PDUMP_FLAGS_CONTINUOUS);
- eErr = PDumpOSBufprintf(hScript, ui32MaxLenScript, "OR :%s:$1 :%s:$1 0x%08X\r\n",
- psMMUAttrib->sDevId.pszPDumpDevName,
- psMMUAttrib->sDevId.pszPDumpDevName,
- ui32PTE & ~psMMUAttrib->ui32PDEMask);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, ui32Flags | PDUMP_FLAGS_CONTINUOUS);
- eErr = PDumpOSBufprintf(hScript,
- ui32MaxLenScript,
- "WRW :%s:PA_%08X%08X:0x%08X :%s:$1\r\n",
- psMMUAttrib->sDevId.pszPDumpDevName,
- (IMG_UINT32)hUniqueTag1,
- (sDevPAddr.uiAddr + ui32Offset) & ~ui32PageMask,
- (sDevPAddr.uiAddr + ui32Offset) & ui32PageMask,
- psMMUAttrib->sDevId.pszPDumpDevName);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, ui32Flags | PDUMP_FLAGS_CONTINUOUS);
-#else
- eErr = PDumpOSBufprintf(hScript,
- ui32MaxLenScript,
- "WRW :%s:PA_%08X%08X:0x%08X :%s:PA_%08X%08X:0x%08X\r\n",
- psMMUAttrib->sDevId.pszPDumpDevName,
- (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag1,
- (sDevPAddr.uiAddr + ui32Offset) & ~ui32PageMask,
- (sDevPAddr.uiAddr + ui32Offset) & ui32PageMask,
- psMMUAttrib->sDevId.pszPDumpDevName,
- (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag2,
- (ui32PTE & psMMUAttrib->ui32PDEMask) << psMMUAttrib->ui32PTEAlignShift,
- ui32PTE & ~psMMUAttrib->ui32PDEMask);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, ui32Flags | PDUMP_FLAGS_CONTINUOUS);
-#endif
- }
- else
- {
-#if !defined(FIX_HW_BRN_31620)
- PVR_ASSERT((ui32PTE & psMMUAttrib->ui32PTEValid) == 0UL);
-#endif
- eErr = PDumpOSBufprintf(hScript,
- ui32MaxLenScript,
- "WRW :%s:PA_%08X%08X:0x%08X 0x%08X%08X\r\n",
- psMMUAttrib->sDevId.pszPDumpDevName,
- (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag1,
- (sDevPAddr.uiAddr + ui32Offset) & ~ui32PageMask,
- (sDevPAddr.uiAddr + ui32Offset) & ui32PageMask,
- (ui32PTE << psMMUAttrib->ui32PTEAlignShift),
- (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag2);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, ui32Flags | PDUMP_FLAGS_CONTINUOUS);
- }
- }
- }
-
- /* update details for next page */
-
- /* page offset 0 after first page dump */
- ui32PageOffset = 0;
- /* bytes left over */
- ui32Bytes -= ui32BlockBytes;
- /* advance the cpuVaddr */
- pui8LinAddr += ui32BlockBytes;
- /* update the file write offset */
- ui32ParamOutPos += ui32BlockBytes;
- }
-
- return PVRSRV_OK;
-}
-
-PVRSRV_ERROR PDumpPDDevPAddrKM(PVRSRV_KERNEL_MEM_INFO *psMemInfo,
- IMG_UINT32 ui32Offset,
- IMG_DEV_PHYADDR sPDDevPAddr,
- IMG_HANDLE hUniqueTag1,
- IMG_HANDLE hUniqueTag2)
-{
- PVRSRV_ERROR eErr;
- IMG_UINT32 ui32PageByteOffset;
- IMG_DEV_VIRTADDR sDevVAddr;
- IMG_DEV_VIRTADDR sDevVPageAddr;
- IMG_DEV_PHYADDR sDevPAddr;
- IMG_UINT32 ui32Flags = PDUMP_FLAGS_CONTINUOUS;
- IMG_UINT32 ui32ParamOutPos;
- PDUMP_MMU_ATTRIB *psMMUAttrib;
- IMG_UINT32 ui32PageMask; /* mask for the physical page backing the PT */
-
- PDUMP_GET_SCRIPT_AND_FILE_STRING();
-
- if (!PDumpOSJTInitialised())
- {
- return PVRSRV_ERROR_PDUMP_NOT_AVAILABLE;
- }
-
- psMMUAttrib = ((BM_BUF*)psMemInfo->sMemBlk.hBuffer)->pMapping->pBMHeap->psMMUAttrib;
- ui32PageMask = psMMUAttrib->ui32PTSize - 1;
-
- ui32ParamOutPos = PDumpOSGetStreamOffset(PDUMP_STREAM_PARAM2);
-
- /* Write the PD phys addr to the param stream up front */
- if(!PDumpOSWriteString(PDumpOSGetStream(PDUMP_STREAM_PARAM2),
- (IMG_UINT8 *)&sPDDevPAddr,
- sizeof(IMG_DEV_PHYADDR),
- ui32Flags))
- {
- return PVRSRV_ERROR_PDUMP_BUFFER_FULL;
- }
-
- if (PDumpOSGetParamFileNum() == 0)
- {
- eErr = PDumpOSSprintf(pszFileName, ui32MaxLenFileName, "%%0%%.prm");
- }
- else
- {
- eErr = PDumpOSSprintf(pszFileName, ui32MaxLenFileName, "%%0%%_%u.prm", PDumpOSGetParamFileNum());
- }
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
-
- /* Write a comment indicating the PD phys addr write, so that the offsets
- * into the param stream increase in correspondence with the number of bytes
- * written. */
- eErr = PDumpOSBufprintf(hScript,
- ui32MaxLenScript,
- "-- LDB :%s:PA_0x%08X%08X:0x%08X 0x%08X 0x%08X %s\r\n",
- psMMUAttrib->sDevId.pszPDumpDevName,
- (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag1,
- sPDDevPAddr.uiAddr & ~ui32PageMask,
- sPDDevPAddr.uiAddr & ui32PageMask,
- sizeof(IMG_DEV_PHYADDR),
- ui32ParamOutPos,
- pszFileName);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, ui32Flags);
-
- sDevVAddr = psMemInfo->sDevVAddr;
- ui32PageByteOffset = sDevVAddr.uiAddr & ui32PageMask;
-
- sDevVPageAddr.uiAddr = sDevVAddr.uiAddr - ui32PageByteOffset;
- PVR_ASSERT((sDevVPageAddr.uiAddr & 0xFFF) == 0);
-
- BM_GetPhysPageAddr(psMemInfo, sDevVPageAddr, &sDevPAddr);
- sDevPAddr.uiAddr += ui32PageByteOffset + ui32Offset;
-
- if ((sPDDevPAddr.uiAddr & psMMUAttrib->ui32PDEMask) != 0UL)
- {
-#if defined(SGX_FEATURE_36BIT_MMU)
- eErr = PDumpOSBufprintf(hScript,
- ui32MaxLenScript,
- "WRW :%s:$1 :%s:PA_%08X%08X:0x0\r\n",
- psMMUAttrib->sDevId.pszPDumpDevName,
- psMMUAttrib->sDevId.pszPDumpDevName,
- (IMG_UINT32)hUniqueTag2,
- sPDDevPAddr.uiAddr);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, ui32Flags);
-
- eErr = PDumpOSBufprintf(hScript, ui32MaxLenScript, "AND :%s:$2 :%s:$1 0xFFFFFFFF\r\n",
- psMMUAttrib->sDevId.pszPDumpDevName,
- psMMUAttrib->sDevId.pszPDumpDevName);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, ui32Flags);
-
- eErr = PDumpOSBufprintf(hScript,
- ui32MaxLenScript,
- "WRW :%s:PA_%08X%08X:0x%08X :%s:$2\r\n",
- psMMUAttrib->sDevId.pszPDumpDevName,
- (IMG_UINT32)hUniqueTag1,
- (sDevPAddr.uiAddr) & ~(psMMUAttrib->ui32DataPageMask),
- (sDevPAddr.uiAddr) & (psMMUAttrib->ui32DataPageMask),
- psMMUAttrib->sDevId.pszPDumpDevName);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, ui32Flags);
-
- eErr = PDumpOSBufprintf(hScript, ui32MaxLenScript, "SHR :%s:$2 :%s:$1 0x20\r\n",
- psMMUAttrib->sDevId.pszPDumpDevName,
- psMMUAttrib->sDevId.pszPDumpDevName);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, ui32Flags);
-
- eErr = PDumpOSBufprintf(hScript,
- ui32MaxLenScript,
- "WRW :%s:PA_%08X%08X:0x%08X :%s:$2\r\n",
- psMMUAttrib->sDevId.pszPDumpDevName,
- (IMG_UINT32)hUniqueTag1,
- (sDevPAddr.uiAddr + 4) & ~(psMMUAttrib->ui32DataPageMask),
- (sDevPAddr.uiAddr + 4) & (psMMUAttrib->ui32DataPageMask),
- psMMUAttrib->sDevId.pszPDumpDevName);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, ui32Flags);
-#else
- eErr = PDumpOSBufprintf(hScript,
- ui32MaxLenScript,
- "WRW :%s:PA_%08X%08X:0x%08X :%s:PA_%08X%08X:0x%08X\r\n",
- psMMUAttrib->sDevId.pszPDumpDevName,
- (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag1,
- sDevPAddr.uiAddr & ~ui32PageMask,
- sDevPAddr.uiAddr & ui32PageMask,
- psMMUAttrib->sDevId.pszPDumpDevName,
- (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag2,
- sPDDevPAddr.uiAddr & psMMUAttrib->ui32PDEMask,
- sPDDevPAddr.uiAddr & ~psMMUAttrib->ui32PDEMask);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
-#endif
- }
- else
- {
- PVR_ASSERT(!(sDevPAddr.uiAddr & psMMUAttrib->ui32PTEValid));
- eErr = PDumpOSBufprintf(hScript,
- ui32MaxLenScript,
- "WRW :%s:PA_%08X%08X:0x%08X 0x%08X\r\n",
- psMMUAttrib->sDevId.pszPDumpDevName,
- (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag1,
- sDevPAddr.uiAddr & ~ui32PageMask,
- sDevPAddr.uiAddr & ui32PageMask,
- sPDDevPAddr.uiAddr);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- }
- PDumpOSWriteString2(hScript, ui32Flags);
-
- return PVRSRV_OK;
-}
-
-/**************************************************************************
- * Function Name : PDumpCommentKM
- * Inputs : pszComment, ui32Flags
- * Outputs : None
- * Returns : None
- * Description : Dumps a comment
-**************************************************************************/
-PVRSRV_ERROR PDumpCommentKM(IMG_CHAR *pszComment, IMG_UINT32 ui32Flags)
-{
- PVRSRV_ERROR eErr;
- IMG_CHAR pszCommentPrefix[] = "-- "; /* prefix for comments */
-#if defined(PDUMP_DEBUG_OUTFILES)
- IMG_CHAR pszTemp[256];
-#endif
- IMG_UINT32 ui32LenCommentPrefix;
- PDUMP_GET_SCRIPT_STRING();
- PDUMP_DBG(("PDumpCommentKM"));
-#if defined(PDUMP_DEBUG_OUTFILES)
- /* include comments in the "extended" init phase.
- * default is to ignore them.
- */
- ui32Flags |= ( _PDumpIsPersistent() ) ? PDUMP_FLAGS_PERSISTENT : 0;
-#endif
- /* Put \r \n sequence at the end if it isn't already there */
- PDumpOSVerifyLineEnding(pszComment, ui32MaxLen);
-
- /* Length of string excluding terminating NULL character */
- ui32LenCommentPrefix = PDumpOSBuflen(pszCommentPrefix, sizeof(pszCommentPrefix));
-
- /* Ensure output file is available for writing */
- /* FIXME: is this necessary? */
- if (!PDumpOSWriteString(PDumpOSGetStream(PDUMP_STREAM_SCRIPT2),
- (IMG_UINT8*)pszCommentPrefix,
- ui32LenCommentPrefix,
- ui32Flags))
- {
-#if defined(PDUMP_DEBUG_OUTFILES)
- if(ui32Flags & PDUMP_FLAGS_CONTINUOUS)
- {
- PVR_DPF((PVR_DBG_WARNING, "Incomplete comment, %d: %s (continuous set)",
- g_ui32EveryLineCounter, pszComment));
- return PVRSRV_ERROR_PDUMP_BUFFER_FULL;
- }
- else if(ui32Flags & PDUMP_FLAGS_PERSISTENT)
- {
- PVR_DPF((PVR_DBG_WARNING, "Incomplete comment, %d: %s (persistent set)",
- g_ui32EveryLineCounter, pszComment));
- return PVRSRV_ERROR_CMD_NOT_PROCESSED;
- }
- else
- {
- PVR_DPF((PVR_DBG_WARNING, "Incomplete comment, %d: %s",
- g_ui32EveryLineCounter, pszComment));
- return PVRSRV_ERROR_CMD_NOT_PROCESSED;
- }
-#else
- PVR_DPF((PVR_DBG_WARNING, "Incomplete comment, %s",
- pszComment));
- return PVRSRV_ERROR_CMD_NOT_PROCESSED;
-#endif
- }
-
-#if defined(PDUMP_DEBUG_OUTFILES)
- /* Prefix comment with PID and line number */
- eErr = PDumpOSSprintf(pszTemp, 256, "%d-%d %s",
- _PDumpGetPID(),
- g_ui32EveryLineCounter,
- pszComment);
-
- /* Append the comment to the script stream */
- eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "%s",
- pszTemp);
-#else
- eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "%s",
- pszComment);
-#endif
- if( (eErr != PVRSRV_OK) &&
- (eErr != PVRSRV_ERROR_PDUMP_BUF_OVERFLOW))
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, ui32Flags);
- return PVRSRV_OK;
-}
-
-/**************************************************************************
- * Function Name : PDumpCommentWithFlags
- * Inputs : psPDev - PDev for PDump device
- * : pszFormat - format string for comment
- * : ... - args for format string
- * Outputs : None
- * Returns : None
- * Description : PDumps a comments
-**************************************************************************/
-PVRSRV_ERROR PDumpCommentWithFlags(IMG_UINT32 ui32Flags, IMG_CHAR * pszFormat, ...)
-{
- PVRSRV_ERROR eErr;
- PDUMP_va_list ap;
- PDUMP_GET_MSG_STRING();
-
- /* Construct the string */
- PDUMP_va_start(ap, pszFormat);
- eErr = PDumpOSVSprintf(pszMsg, ui32MaxLen, pszFormat, ap);
- PDUMP_va_end(ap);
-
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- return PDumpCommentKM(pszMsg, ui32Flags);
-}
-
-/**************************************************************************
- * Function Name : PDumpComment
- * Inputs : psPDev - PDev for PDump device
- * : pszFormat - format string for comment
- * : ... - args for format string
- * Outputs : None
- * Returns : None
- * Description : PDumps a comments
-**************************************************************************/
-PVRSRV_ERROR PDumpComment(IMG_CHAR *pszFormat, ...)
-{
- PVRSRV_ERROR eErr;
- PDUMP_va_list ap;
- PDUMP_GET_MSG_STRING();
-
- /* Construct the string */
- PDUMP_va_start(ap, pszFormat);
- eErr = PDumpOSVSprintf(pszMsg, ui32MaxLen, pszFormat, ap);
- PDUMP_va_end(ap);
-
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- return PDumpCommentKM(pszMsg, PDUMP_FLAGS_CONTINUOUS);
-}
-
-/**************************************************************************
- * Function Name : PDumpDriverInfoKM
- * Inputs : pszString, ui32Flags
- * Outputs : None
- * Returns : None
- * Description : Dumps a comment
-**************************************************************************/
-PVRSRV_ERROR PDumpDriverInfoKM(IMG_CHAR *pszString, IMG_UINT32 ui32Flags)
-{
- PVRSRV_ERROR eErr;
- IMG_UINT32 ui32MsgLen;
- PDUMP_GET_MSG_STRING();
-
- /* Construct the string */
- eErr = PDumpOSSprintf(pszMsg, ui32MaxLen, "%s", pszString);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
-
- /* Put \r \n sequence at the end if it isn't already there */
- PDumpOSVerifyLineEnding(pszMsg, ui32MaxLen);
- ui32MsgLen = PDumpOSBuflen(pszMsg, ui32MaxLen);
-
- if (!PDumpOSWriteString(PDumpOSGetStream(PDUMP_STREAM_DRIVERINFO),
- (IMG_UINT8*)pszMsg,
- ui32MsgLen,
- ui32Flags))
- {
- if (ui32Flags & PDUMP_FLAGS_CONTINUOUS)
- {
- return PVRSRV_ERROR_PDUMP_BUFFER_FULL;
- }
- else
- {
- return PVRSRV_ERROR_CMD_NOT_PROCESSED;
- }
- }
- return PVRSRV_OK;
-}
-
-/*!
-******************************************************************************
-
- @Function PDumpBitmapKM
-
- @Description
-
- Dumps a bitmap from device memory to a file
-
- @Input psDevId
- @Input pszFileName
- @Input ui32FileOffset
- @Input ui32Width
- @Input ui32Height
- @Input ui32StrideInBytes
- @Input sDevBaseAddr
- @Input ui32Size
- @Input ePixelFormat
- @Input eMemFormat
- @Input ui32PDumpFlags
-
- @Return PVRSRV_ERROR :
-
-******************************************************************************/
-PVRSRV_ERROR PDumpBitmapKM( PVRSRV_DEVICE_NODE *psDeviceNode,
- IMG_CHAR *pszFileName,
- IMG_UINT32 ui32FileOffset,
- IMG_UINT32 ui32Width,
- IMG_UINT32 ui32Height,
- IMG_UINT32 ui32StrideInBytes,
- IMG_DEV_VIRTADDR sDevBaseAddr,
- IMG_HANDLE hDevMemContext,
- IMG_UINT32 ui32Size,
- PDUMP_PIXEL_FORMAT ePixelFormat,
- PDUMP_MEM_FORMAT eMemFormat,
- IMG_UINT32 ui32PDumpFlags)
-{
- PVRSRV_DEVICE_IDENTIFIER *psDevId = &psDeviceNode->sDevId;
- IMG_UINT32 ui32MMUContextID;
- PVRSRV_ERROR eErr;
- PDUMP_GET_SCRIPT_STRING();
-
- if ( _PDumpIsPersistent() )
- {
- return PVRSRV_OK;
- }
-
- PDumpCommentWithFlags(ui32PDumpFlags, "\r\n-- Dump bitmap of render\r\n");
-
- /* find MMU context ID */
- ui32MMUContextID = psDeviceNode->pfnMMUGetContextID( hDevMemContext );
-
- eErr = PDumpOSBufprintf(hScript,
- ui32MaxLen,
- "SII %s %s.bin :%s:v%x:0x%08X 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X\r\n",
- pszFileName,
- pszFileName,
- psDevId->pszPDumpDevName,
- ui32MMUContextID,
- sDevBaseAddr.uiAddr,
- ui32Size,
- ui32FileOffset,
- ePixelFormat,
- ui32Width,
- ui32Height,
- ui32StrideInBytes,
- eMemFormat);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
-
- PDumpOSWriteString2( hScript, ui32PDumpFlags);
- return PVRSRV_OK;
-}
-
-/*!
-******************************************************************************
-
- @Function PDumpReadRegKM
-
- @Description
-
- Dumps a read from a device register to a file
-
- @Input psConnection : connection info
- @Input pszFileName
- @Input ui32FileOffset
- @Input ui32Address
- @Input ui32Size
- @Input ui32PDumpFlags
-
- @Return PVRSRV_ERROR :
-
-******************************************************************************/
-PVRSRV_ERROR PDumpReadRegKM ( IMG_CHAR *pszPDumpRegName,
- IMG_CHAR *pszFileName,
- IMG_UINT32 ui32FileOffset,
- IMG_UINT32 ui32Address,
- IMG_UINT32 ui32Size,
- IMG_UINT32 ui32PDumpFlags)
-{
- PVRSRV_ERROR eErr;
- PDUMP_GET_SCRIPT_STRING();
-
- PVR_UNREFERENCED_PARAMETER(ui32Size);
-
- eErr = PDumpOSBufprintf(hScript,
- ui32MaxLen,
- "SAB :%s:0x%08X 0x%08X %s\r\n",
- pszPDumpRegName,
- ui32Address,
- ui32FileOffset,
- pszFileName);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
-
- PDumpOSWriteString2( hScript, ui32PDumpFlags);
-
- return PVRSRV_OK;
-}
-
-/*****************************************************************************
- @name PDumpTestNextFrame
- @brief Tests whether the next frame will be pdumped
- @param ui32CurrentFrame
- @return bFrameDumped
-*****************************************************************************/
-IMG_BOOL PDumpTestNextFrame(IMG_UINT32 ui32CurrentFrame)
-{
- IMG_BOOL bFrameDumped;
-
- /*
- Try dumping a string
- */
- (IMG_VOID) PDumpSetFrameKM(ui32CurrentFrame + 1);
- bFrameDumped = PDumpIsCaptureFrameKM();
- (IMG_VOID) PDumpSetFrameKM(ui32CurrentFrame);
-
- return bFrameDumped;
-}
-
-/*****************************************************************************
- @name PDumpSignatureRegister
- @brief Dumps a single signature register
- @param psDevId - device ID
- @param ui32Address - The register address
- @param ui32Size - The amount of data to be dumped in bytes
- @param pui32FileOffset - Offset of dump in output file
- @param ui32Flags - Flags
- @return none
-*****************************************************************************/
-static PVRSRV_ERROR PDumpSignatureRegister (PVRSRV_DEVICE_IDENTIFIER *psDevId,
- IMG_CHAR *pszFileName,
- IMG_UINT32 ui32Address,
- IMG_UINT32 ui32Size,
- IMG_UINT32 *pui32FileOffset,
- IMG_UINT32 ui32Flags)
-{
- PVRSRV_ERROR eErr;
- PDUMP_GET_SCRIPT_STRING();
-
- eErr = PDumpOSBufprintf(hScript,
- ui32MaxLen,
- "SAB :%s:0x%08X 0x%08X %s\r\n",
- psDevId->pszPDumpRegName,
- ui32Address,
- *pui32FileOffset,
- pszFileName);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
-
- PDumpOSWriteString2(hScript, ui32Flags);
- *pui32FileOffset += ui32Size;
- return PVRSRV_OK;
-}
-
-/*****************************************************************************
- @name PDumpRegisterRange
- @brief Dumps a list of signature registers to a file
- @param psDevId - device ID
- @param pszFileName - target filename for dump
- @param pui32Registers - register list
- @param ui32NumRegisters - number of regs to dump
- @param pui32FileOffset - file offset
- @param ui32Size - size of write in bytes
- @param ui32Flags - pdump flags
- @return none
- *****************************************************************************/
-static IMG_VOID PDumpRegisterRange(PVRSRV_DEVICE_IDENTIFIER *psDevId,
- IMG_CHAR *pszFileName,
- IMG_UINT32 *pui32Registers,
- IMG_UINT32 ui32NumRegisters,
- IMG_UINT32 *pui32FileOffset,
- IMG_UINT32 ui32Size,
- IMG_UINT32 ui32Flags)
-{
- IMG_UINT32 i;
- for (i = 0; i < ui32NumRegisters; i++)
- {
- PDumpSignatureRegister(psDevId, pszFileName, pui32Registers[i], ui32Size, pui32FileOffset, ui32Flags);
- }
-}
-
-/*****************************************************************************
- @name PDump3DSignatureRegisters
- @brief Dumps the signature registers for 3D modules...
- @param psDevId - device ID info
- @param pui32Registers - register list
- @param ui32NumRegisters - number of regs to dump
- @return Error
-*****************************************************************************/
-PVRSRV_ERROR PDump3DSignatureRegisters(PVRSRV_DEVICE_IDENTIFIER *psDevId,
- IMG_UINT32 ui32DumpFrameNum,
- IMG_BOOL bLastFrame,
- IMG_UINT32 *pui32Registers,
- IMG_UINT32 ui32NumRegisters)
-{
- PVRSRV_ERROR eErr;
- IMG_UINT32 ui32FileOffset, ui32Flags;
-
- PDUMP_GET_FILE_STRING();
-
- ui32Flags = bLastFrame ? PDUMP_FLAGS_LASTFRAME : 0;
- ui32FileOffset = 0;
-
- PDumpCommentWithFlags(ui32Flags, "\r\n-- Dump 3D signature registers\r\n");
- eErr = PDumpOSSprintf(pszFileName, ui32MaxLen, "out%u_3d.sig", ui32DumpFrameNum);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
-
- PDumpRegisterRange(psDevId,
- pszFileName,
- pui32Registers,
- ui32NumRegisters,
- &ui32FileOffset,
- sizeof(IMG_UINT32),
- ui32Flags);
-
- return PVRSRV_OK;
-}
-
-/*****************************************************************************
- @name PDumpTASignatureRegisters
- @brief Dumps the TA signature registers
- @param psDevId - device id info
- @param ui32DumpFrameNum - frame number
- @param ui32TAKickCount - TA kick counter
- @param bLastFrame
- @param pui32Registers - register list
- @param ui32NumRegisters - number of regs to dump
- @return Error
-*****************************************************************************/
-PVRSRV_ERROR PDumpTASignatureRegisters (PVRSRV_DEVICE_IDENTIFIER *psDevId,
- IMG_UINT32 ui32DumpFrameNum,
- IMG_UINT32 ui32TAKickCount,
- IMG_BOOL bLastFrame,
- IMG_UINT32 *pui32Registers,
- IMG_UINT32 ui32NumRegisters)
-{
- PVRSRV_ERROR eErr;
- IMG_UINT32 ui32FileOffset, ui32Flags;
-
- PDUMP_GET_FILE_STRING();
-
- ui32Flags = bLastFrame ? PDUMP_FLAGS_LASTFRAME : 0;
- ui32FileOffset = ui32TAKickCount * ui32NumRegisters * sizeof(IMG_UINT32);
-
- PDumpCommentWithFlags(ui32Flags, "\r\n-- Dump TA signature registers\r\n");
- eErr = PDumpOSSprintf(pszFileName, ui32MaxLen, "out%u_ta.sig", ui32DumpFrameNum);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
-
- PDumpRegisterRange(psDevId,
- pszFileName,
- pui32Registers,
- ui32NumRegisters,
- &ui32FileOffset,
- sizeof(IMG_UINT32),
- ui32Flags);
- return PVRSRV_OK;
-}
-
-/*****************************************************************************
- @name PDumpCounterRegisters
- @brief Dumps the performance counters
- @param psDevId - device id info
- @param ui32DumpFrameNum - frame number
- @param bLastFrame
- @param pui32Registers - register list
- @param ui32NumRegisters - number of regs to dump
- @return Error
-*****************************************************************************/
-PVRSRV_ERROR PDumpCounterRegisters (PVRSRV_DEVICE_IDENTIFIER *psDevId,
- IMG_UINT32 ui32DumpFrameNum,
- IMG_BOOL bLastFrame,
- IMG_UINT32 *pui32Registers,
- IMG_UINT32 ui32NumRegisters)
-{
- PVRSRV_ERROR eErr;
- IMG_UINT32 ui32FileOffset, ui32Flags;
-
- PDUMP_GET_FILE_STRING();
-
- ui32Flags = bLastFrame ? PDUMP_FLAGS_LASTFRAME : 0UL;
- ui32FileOffset = 0UL;
-
- PDumpCommentWithFlags(ui32Flags, "\r\n-- Dump counter registers\r\n");
- eErr = PDumpOSSprintf(pszFileName, ui32MaxLen, "out%u.perf", ui32DumpFrameNum);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
-
- PDumpRegisterRange(psDevId,
- pszFileName,
- pui32Registers,
- ui32NumRegisters,
- &ui32FileOffset,
- sizeof(IMG_UINT32),
- ui32Flags);
-
- return PVRSRV_OK;
-}
-
-/*****************************************************************************
- @name PDumpRegRead
- @brief Dump signature register read to script
- @param pszPDumpDevName - pdump device name
- @param ui32RegOffset - register offset
- @param ui32Flags - pdump flags
- @return Error
-*****************************************************************************/
-PVRSRV_ERROR PDumpRegRead(IMG_CHAR *pszPDumpRegName,
- const IMG_UINT32 ui32RegOffset,
- IMG_UINT32 ui32Flags)
-{
- PVRSRV_ERROR eErr;
- PDUMP_GET_SCRIPT_STRING();
-
- eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "RDW :%s:0x%X\r\n",
- pszPDumpRegName,
- ui32RegOffset);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, ui32Flags);
- return PVRSRV_OK;
-}
-
-/*****************************************************************************
- @name PDumpSaveMemKM
- @brief Save device memory to a file
- @param psDevId
- @param pszFileName
- @param ui32FileOffset
- @param sDevBaseAddr
- @param ui32Size
- @param ui32PDumpFlags
- @return Error
-*****************************************************************************/
-PVRSRV_ERROR PDumpSaveMemKM (PVRSRV_DEVICE_IDENTIFIER *psDevId,
- IMG_CHAR *pszFileName,
- IMG_UINT32 ui32FileOffset,
- IMG_DEV_VIRTADDR sDevBaseAddr,
- IMG_UINT32 ui32Size,
- IMG_UINT32 ui32MMUContextID,
- IMG_UINT32 ui32PDumpFlags)
-{
- PVRSRV_ERROR eErr;
- PDUMP_GET_SCRIPT_STRING();
-
- eErr = PDumpOSBufprintf(hScript,
- ui32MaxLen,
- "SAB :%s:v%x:0x%08X 0x%08X 0x%08X %s.bin\r\n",
- psDevId->pszPDumpDevName,
- ui32MMUContextID,
- sDevBaseAddr.uiAddr,
- ui32Size,
- ui32FileOffset,
- pszFileName);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
-
- PDumpOSWriteString2(hScript, ui32PDumpFlags);
- return PVRSRV_OK;
-}
-
-/*****************************************************************************
- @name PDumpCycleCountRegRead
- @brief Dump counter register read to script
- @param ui32RegOffset - register offset
- @param bLastFrame
- @return Error
-*****************************************************************************/
-PVRSRV_ERROR PDumpCycleCountRegRead(PVRSRV_DEVICE_IDENTIFIER *psDevId,
- const IMG_UINT32 ui32RegOffset,
- IMG_BOOL bLastFrame)
-{
- PVRSRV_ERROR eErr;
- PDUMP_GET_SCRIPT_STRING();
-
- eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "RDW :%s:0x%X\r\n",
- psDevId->pszPDumpRegName,
- ui32RegOffset);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, bLastFrame ? PDUMP_FLAGS_LASTFRAME : 0);
- return PVRSRV_OK;
-}
-
-
-/*!
-******************************************************************************
-
- @Function PDumpSignatureBuffer
-
- @Description
-
- Dumps a signature registers buffer
-
- @Return PVRSRV_ERROR
-
-******************************************************************************/
-PVRSRV_ERROR PDumpSignatureBuffer (PVRSRV_DEVICE_IDENTIFIER *psDevId,
- IMG_CHAR *pszFileName,
- IMG_CHAR *pszBufferType,
- IMG_UINT32 ui32FileOffset,
- IMG_DEV_VIRTADDR sDevBaseAddr,
- IMG_UINT32 ui32Size,
- IMG_UINT32 ui32MMUContextID,
- IMG_UINT32 ui32PDumpFlags)
-{
- PDumpCommentWithFlags(ui32PDumpFlags, "\r\n-- Dump microkernel %s signature Buffer\r\n",
- pszBufferType);
- PDumpCommentWithFlags(ui32PDumpFlags, "Buffer format (sizes in 32-bit words):\r\n");
- PDumpCommentWithFlags(ui32PDumpFlags, "\tNumber of signatures per sample (1)\r\n");
- PDumpCommentWithFlags(ui32PDumpFlags, "\tNumber of samples (1)\r\n");
- PDumpCommentWithFlags(ui32PDumpFlags, "\tSignature register offsets (1 * number of signatures)\r\n");
- PDumpCommentWithFlags(ui32PDumpFlags, "\tSignature sample values (number of samples * number of signatures)\r\n");
- PDumpCommentWithFlags(ui32PDumpFlags, "Note: If buffer is full, last sample is final state after test completed\r\n");
- return PDumpSaveMemKM(psDevId, pszFileName, ui32FileOffset, sDevBaseAddr, ui32Size,
- ui32MMUContextID, ui32PDumpFlags);
-}
-
-
-/*!
-******************************************************************************
-
- @Function PDumpHWPerfCBKM
-
- @Description
-
- Dumps the HW Perf Circular Buffer
-
- @Return PVRSRV_ERROR
-
-******************************************************************************/
-PVRSRV_ERROR PDumpHWPerfCBKM (PVRSRV_DEVICE_IDENTIFIER *psDevId,
- IMG_CHAR *pszFileName,
- IMG_UINT32 ui32FileOffset,
- IMG_DEV_VIRTADDR sDevBaseAddr,
- IMG_UINT32 ui32Size,
- IMG_UINT32 ui32MMUContextID,
- IMG_UINT32 ui32PDumpFlags)
-{
- PDumpCommentWithFlags(ui32PDumpFlags, "\r\n-- Dump Hardware Performance Circular Buffer\r\n");
- return PDumpSaveMemKM(psDevId, pszFileName, ui32FileOffset, sDevBaseAddr, ui32Size,
- ui32MMUContextID, ui32PDumpFlags);
-}
-
-
-/*****************************************************************************
- FUNCTION : PDumpCBP
-
- PURPOSE : Dump CBP command to script
-
- PARAMETERS :
-
- RETURNS : None
-*****************************************************************************/
-PVRSRV_ERROR PDumpCBP(PPVRSRV_KERNEL_MEM_INFO psROffMemInfo,
- IMG_UINT32 ui32ROffOffset,
- IMG_UINT32 ui32WPosVal,
- IMG_UINT32 ui32PacketSize,
- IMG_UINT32 ui32BufferSize,
- IMG_UINT32 ui32Flags,
- IMG_HANDLE hUniqueTag)
-{
- PVRSRV_ERROR eErr;
- IMG_UINT32 ui32PageOffset;
- IMG_UINT8 *pui8LinAddr;
- IMG_DEV_VIRTADDR sDevVAddr;
- IMG_DEV_PHYADDR sDevPAddr;
- IMG_DEV_VIRTADDR sDevVPageAddr;
- //IMG_CPU_PHYADDR CpuPAddr;
- PDUMP_MMU_ATTRIB *psMMUAttrib;
-
- PDUMP_GET_SCRIPT_STRING();
-
- psMMUAttrib = ((BM_BUF*)psROffMemInfo->sMemBlk.hBuffer)->pMapping->pBMHeap->psMMUAttrib;
-
- /* Check the offset and size don't exceed the bounds of the allocation */
- PVR_ASSERT((ui32ROffOffset + sizeof(IMG_UINT32)) <= psROffMemInfo->uAllocSize);
-
- pui8LinAddr = psROffMemInfo->pvLinAddrKM;
- sDevVAddr = psROffMemInfo->sDevVAddr;
-
- /* Advance addresses by offset */
- pui8LinAddr += ui32ROffOffset;
- sDevVAddr.uiAddr += ui32ROffOffset;
-
- /*
- query the buffer manager for the physical pages that back the
- virtual address
- */
- PDumpOSCPUVAddrToPhysPages(psROffMemInfo->sMemBlk.hOSMemHandle,
- ui32ROffOffset,
- pui8LinAddr,
- psMMUAttrib->ui32DataPageMask,
- &ui32PageOffset);
-
- /* calculate the DevV page address */
- sDevVPageAddr.uiAddr = sDevVAddr.uiAddr - ui32PageOffset;
-
- PVR_ASSERT((sDevVPageAddr.uiAddr & 0xFFF) == 0);
-
- /* get the physical page address based on the device virtual address */
- BM_GetPhysPageAddr(psROffMemInfo, sDevVPageAddr, &sDevPAddr);
-
- /* convert DevP page address to byte address */
- sDevPAddr.uiAddr += ui32PageOffset;
-
- eErr = PDumpOSBufprintf(hScript,
- ui32MaxLen,
- "CBP :%s:PA_%08X%08X:0x%08X 0x%08X 0x%08X 0x%08X\r\n",
- psMMUAttrib->sDevId.pszPDumpDevName,
- (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag,
- sDevPAddr.uiAddr & ~(psMMUAttrib->ui32DataPageMask),
- sDevPAddr.uiAddr & (psMMUAttrib->ui32DataPageMask),
- ui32WPosVal,
- ui32PacketSize,
- ui32BufferSize);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, ui32Flags);
- return PVRSRV_OK;
-}
-
-
-/**************************************************************************
- * Function Name : PDumpIDLWithFlags
- * Inputs : Idle time in clocks
- * Outputs : None
- * Returns : Error
- * Description : Dump IDL command to script
-**************************************************************************/
-PVRSRV_ERROR PDumpIDLWithFlags(IMG_UINT32 ui32Clocks, IMG_UINT32 ui32Flags)
-{
- PVRSRV_ERROR eErr;
- PDUMP_GET_SCRIPT_STRING();
- PDUMP_DBG(("PDumpIDLWithFlags"));
-
- eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "IDL %u\r\n", ui32Clocks);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, ui32Flags);
- return PVRSRV_OK;
-}
-
-
-/**************************************************************************
- * Function Name : PDumpIDL
- * Inputs : Idle time in clocks
- * Outputs : None
- * Returns : Error
- * Description : Dump IDL command to script
-**************************************************************************/
-PVRSRV_ERROR PDumpIDL(IMG_UINT32 ui32Clocks)
-{
- return PDumpIDLWithFlags(ui32Clocks, PDUMP_FLAGS_CONTINUOUS);
-}
-
-/**************************************************************************
- * Function Name : PDumpMemUM
- * Inputs : pvAltLinAddrUM
- * : pvLinAddrUM
- * : psMemInfo
- * : ui32Offset
- * : ui32Bytes
- * : ui32Flags
- * : hUniqueTag
- * Outputs : None
- * Returns : PVRSRV_ERROR
- * Description : Dump user mode memory
-**************************************************************************/
-PVRSRV_ERROR PDumpMemUM(PVRSRV_PER_PROCESS_DATA *psPerProc,
- IMG_PVOID pvAltLinAddrUM,
- IMG_PVOID pvLinAddrUM,
- PVRSRV_KERNEL_MEM_INFO *psMemInfo,
- IMG_UINT32 ui32Offset,
- IMG_UINT32 ui32Bytes,
- IMG_UINT32 ui32Flags,
- IMG_HANDLE hUniqueTag)
-{
- IMG_VOID *pvAddrUM;
- IMG_VOID *pvAddrKM;
- PVRSRV_ERROR eError;
-
- if (psMemInfo->pvLinAddrKM != IMG_NULL && pvAltLinAddrUM == IMG_NULL)
- {
- /*
- * There is a kernel virtual address for the memory that is
- * being dumped, and no alternate user mode linear address.
- */
- return PDumpMemKM(IMG_NULL,
- psMemInfo,
- ui32Offset,
- ui32Bytes,
- ui32Flags,
- hUniqueTag);
- }
-
- pvAddrUM = (pvAltLinAddrUM != IMG_NULL) ? pvAltLinAddrUM : ((pvLinAddrUM != IMG_NULL) ? VPTR_PLUS(pvLinAddrUM, ui32Offset) : IMG_NULL);
-
- pvAddrKM = GetTempBuffer();
-
- /*
- * The memory to be dumped needs to be copied in from
- * the client. Dump the memory, a buffer at a time.
- */
- PVR_ASSERT(pvAddrUM != IMG_NULL && pvAddrKM != IMG_NULL);
- if (pvAddrUM == IMG_NULL || pvAddrKM == IMG_NULL)
- {
- PVR_DPF((PVR_DBG_ERROR, "PDumpMemUM: Nothing to dump"));
- return PVRSRV_ERROR_INVALID_PARAMS;
- }
-
- if (ui32Bytes > PDUMP_TEMP_BUFFER_SIZE)
- {
- PDumpCommentWithFlags(ui32Flags, "Dumping 0x%08x bytes of memory, in blocks of 0x%08x bytes", ui32Bytes, (IMG_UINT32)PDUMP_TEMP_BUFFER_SIZE);
- }
-
- if (psMemInfo->ui32Flags & PVRSRV_MEM_SPARSE)
- {
- /*
- In case of sparse mappings we can't just copy the full range as not
- all pages are valid, instead we walk a page at a time only dumping
- if the a page exists at that address
- */
- IMG_UINT32 ui32BytesRemain = ui32Bytes;
- IMG_UINT32 ui32InPageStart = ui32Offset & (~HOST_PAGEMASK);
- IMG_UINT32 ui32PageOffset = ui32Offset & (HOST_PAGEMASK);
- IMG_UINT32 ui32BytesToCopy = MIN(HOST_PAGESIZE() - ui32InPageStart, ui32BytesRemain);
-
- do
- {
- if (BM_MapPageAtOffset(BM_MappingHandleFromBuffer(psMemInfo->sMemBlk.hBuffer), ui32PageOffset))
- {
- eError = OSCopyFromUser(psPerProc,
- pvAddrKM,
- pvAddrUM,
- ui32BytesToCopy);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR, "PDumpMemUM: OSCopyFromUser failed (%d)", eError));
- return eError;
- }
-
- /*
- At this point we know we're dumping a valid page so call
- the internal function
- */
- eError = _PDumpMemIntKM(pvAddrKM,
- psMemInfo,
- ui32PageOffset + ui32InPageStart,
- ui32BytesToCopy,
- ui32Flags,
- hUniqueTag);
-
- if (eError != PVRSRV_OK)
- {
- /*
- * If writing fails part way through, then some
- * investigation is needed.
- */
- if (ui32BytesToCopy != 0)
- {
- PVR_DPF((PVR_DBG_ERROR, "PDumpMemUM: PDumpMemKM failed (%d)", eError));
- }
- PVR_ASSERT(ui32BytesToCopy == 0);
- return eError;
- }
- }
-
- VPTR_INC(pvAddrUM, ui32BytesToCopy);
- ui32BytesRemain -= ui32BytesToCopy;
- ui32InPageStart = 0;
- ui32PageOffset += HOST_PAGESIZE();
- } while(ui32BytesRemain);
- }
- else
- {
- IMG_UINT32 ui32CurrentOffset = ui32Offset;
- IMG_UINT32 ui32BytesDumped;
-
- for (ui32BytesDumped = 0; ui32BytesDumped < ui32Bytes;)
- {
- IMG_UINT32 ui32BytesToDump = MIN(PDUMP_TEMP_BUFFER_SIZE, ui32Bytes - ui32BytesDumped);
-
- eError = OSCopyFromUser(psPerProc,
- pvAddrKM,
- pvAddrUM,
- ui32BytesToDump);
- if (eError != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR, "PDumpMemUM: OSCopyFromUser failed (%d)", eError));
- return eError;
- }
-
- eError = PDumpMemKM(pvAddrKM,
- psMemInfo,
- ui32CurrentOffset,
- ui32BytesToDump,
- ui32Flags,
- hUniqueTag);
-
- if (eError != PVRSRV_OK)
- {
- /*
- * If writing fails part way through, then some
- * investigation is needed.
- */
- if (ui32BytesDumped != 0)
- {
- PVR_DPF((PVR_DBG_ERROR, "PDumpMemUM: PDumpMemKM failed (%d)", eError));
- }
- PVR_ASSERT(ui32BytesDumped == 0);
- return eError;
- }
-
- VPTR_INC(pvAddrUM, ui32BytesToDump);
- ui32CurrentOffset += ui32BytesToDump;
- ui32BytesDumped += ui32BytesToDump;
- }
- }
-
- return PVRSRV_OK;
-}
-
-
-/**************************************************************************
- * Function Name : _PdumpAllocMMUContext
- * Inputs : pui32MMUContextID
- * Outputs : None
- * Returns : PVRSRV_ERROR
- * Description : pdump util to allocate MMU contexts
-**************************************************************************/
-static PVRSRV_ERROR _PdumpAllocMMUContext(IMG_UINT32 *pui32MMUContextID)
-{
- IMG_UINT32 i;
-
- /* there are MAX_PDUMP_MMU_CONTEXTS contexts available, find one */
- for(i=0; i<MAX_PDUMP_MMU_CONTEXTS; i++)
- {
- if((gui16MMUContextUsage & (1U << i)) == 0)
- {
- /* mark in use */
- gui16MMUContextUsage |= 1U << i;
- *pui32MMUContextID = i;
- return PVRSRV_OK;
- }
- }
-
- PVR_DPF((PVR_DBG_ERROR, "_PdumpAllocMMUContext: no free MMU context ids"));
-
- return PVRSRV_ERROR_MMU_CONTEXT_NOT_FOUND;
-}
-
-
-/**************************************************************************
- * Function Name : _PdumpFreeMMUContext
- * Inputs : ui32MMUContextID
- * Outputs : None
- * Returns : PVRSRV_ERROR
- * Description : pdump util to free MMU contexts
-**************************************************************************/
-static PVRSRV_ERROR _PdumpFreeMMUContext(IMG_UINT32 ui32MMUContextID)
-{
- if(ui32MMUContextID < MAX_PDUMP_MMU_CONTEXTS)
- {
- /* free the id */
- gui16MMUContextUsage &= ~(1U << ui32MMUContextID);
- return PVRSRV_OK;
- }
-
- PVR_DPF((PVR_DBG_ERROR, "_PdumpFreeMMUContext: MMU context ids invalid"));
-
- return PVRSRV_ERROR_MMU_CONTEXT_NOT_FOUND;
-}
-
-
-/**************************************************************************
- * Function Name : PDumpSetMMUContext
- * Inputs :
- * Outputs : None
- * Returns : PVRSRV_ERROR
- * Description : Set MMU Context
-**************************************************************************/
-PVRSRV_ERROR PDumpSetMMUContext(PVRSRV_DEVICE_TYPE eDeviceType,
- IMG_CHAR *pszMemSpace,
- IMG_UINT32 *pui32MMUContextID,
- IMG_UINT32 ui32MMUType,
- IMG_HANDLE hUniqueTag1,
- IMG_HANDLE hOSMemHandle,
- IMG_VOID *pvPDCPUAddr)
-{
- IMG_UINT8 *pui8LinAddr = (IMG_UINT8 *)pvPDCPUAddr;
- IMG_CPU_PHYADDR sCpuPAddr;
- IMG_DEV_PHYADDR sDevPAddr;
- IMG_UINT32 ui32MMUContextID;
- PVRSRV_ERROR eErr;
- PDUMP_GET_SCRIPT_STRING();
-
- eErr = _PdumpAllocMMUContext(&ui32MMUContextID);
- if(eErr != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR, "PDumpSetMMUContext: _PdumpAllocMMUContext failed: %d", eErr));
- return eErr;
- }
-
- /* derive the DevPAddr */
- /* FIXME: if we used OSMemHandleToCPUPAddr() here, we could lose the lin addr arg */
- sCpuPAddr = OSMapLinToCPUPhys(hOSMemHandle, pui8LinAddr);
- sDevPAddr = SysCpuPAddrToDevPAddr(eDeviceType, sCpuPAddr);
- /* and round to 4k page */
- sDevPAddr.uiAddr &= ~((PVRSRV_4K_PAGE_SIZE) -1);
-
- eErr = PDumpOSBufprintf(hScript,
- ui32MaxLen,
- "MMU :%s:v%d %d :%s:PA_%08X%08X\r\n",
- pszMemSpace,
- ui32MMUContextID,
- ui32MMUType,
- pszMemSpace,
- (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag1,
- sDevPAddr.uiAddr);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, PDUMP_FLAGS_CONTINUOUS);
-
- /* return the MMU Context ID */
- *pui32MMUContextID = ui32MMUContextID;
-
- return PVRSRV_OK;
-}
-
-
-/**************************************************************************
- * Function Name : PDumpClearMMUContext
- * Inputs :
- * Outputs : None
- * Returns : PVRSRV_ERROR
- * Description : Clear MMU Context
-**************************************************************************/
-PVRSRV_ERROR PDumpClearMMUContext(PVRSRV_DEVICE_TYPE eDeviceType,
- IMG_CHAR *pszMemSpace,
- IMG_UINT32 ui32MMUContextID,
- IMG_UINT32 ui32MMUType)
-{
- PVRSRV_ERROR eErr;
- PDUMP_GET_SCRIPT_STRING();
- PVR_UNREFERENCED_PARAMETER(eDeviceType);
- PVR_UNREFERENCED_PARAMETER(ui32MMUType);
-
- /* FIXME: Propagate error from PDumpComment once it's supported on
- * all OSes and platforms
- */
- PDumpComment("Clear MMU Context for memory space %s\r\n", pszMemSpace);
- eErr = PDumpOSBufprintf(hScript,
- ui32MaxLen,
- "MMU :%s:v%d\r\n",
- pszMemSpace,
- ui32MMUContextID);
- if(eErr != PVRSRV_OK)
- {
- return eErr;
- }
- PDumpOSWriteString2(hScript, PDUMP_FLAGS_CONTINUOUS);
-
- eErr = _PdumpFreeMMUContext(ui32MMUContextID);
- if(eErr != PVRSRV_OK)
- {
- PVR_DPF((PVR_DBG_ERROR, "PDumpClearMMUContext: _PdumpFreeMMUContext failed: %d", eErr));
- return eErr;
- }
-
- return PVRSRV_OK;
-}
-
-/*****************************************************************************
- FUNCTION : PDumpStoreMemToFile
-
- PURPOSE : Dumps a given addr:size to a file
-
- PARAMETERS :
-
- RETURNS :
-*****************************************************************************/
-PVRSRV_ERROR PDumpStoreMemToFile(PDUMP_MMU_ATTRIB *psMMUAttrib,
- IMG_CHAR *pszFileName,
- IMG_UINT32 ui32FileOffset,
- PVRSRV_KERNEL_MEM_INFO *psMemInfo,
- IMG_UINT32 uiAddr,
- IMG_UINT32 ui32Size,
- IMG_UINT32 ui32PDumpFlags,
- IMG_HANDLE hUniqueTag)
-{
- IMG_DEV_PHYADDR sDevPAddr;
- IMG_DEV_VIRTADDR sDevVPageAddr;
- IMG_UINT32 ui32PageOffset;
-
- PDUMP_GET_SCRIPT_STRING();
-
- /*
- query the buffer manager for the physical pages that back the
- virtual address
- */
- ui32PageOffset = (IMG_UINT32)((IMG_UINTPTR_T)psMemInfo->pvLinAddrKM & psMMUAttrib->ui32DataPageMask);
-
- /* calculate the DevV page address */
- sDevVPageAddr.uiAddr = uiAddr - ui32PageOffset;
-
- /* get the physical page address based on the device virtual address */
- BM_GetPhysPageAddr(psMemInfo, sDevVPageAddr, &sDevPAddr);
-
- /* convert DevP page address to byte address */
- sDevPAddr.uiAddr += ui32PageOffset;
-
- PDumpOSBufprintf(hScript,
- ui32MaxLen,
- "SAB :%s:PA_%08X%08X:0x%08X 0x%08X 0x%08X %s\r\n",
- psMMUAttrib->sDevId.pszPDumpDevName,
- (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag,
- sDevPAddr.uiAddr & ~psMMUAttrib->ui32DataPageMask,
- sDevPAddr.uiAddr & psMMUAttrib->ui32DataPageMask,
- ui32Size,
- ui32FileOffset,
- pszFileName);
-
- PDumpOSWriteString2(hScript, ui32PDumpFlags);
-
- return PVRSRV_OK;
-}
-
-/*****************************************************************************
- FUNCTION : PDumpRegBasedCBP
-
- PURPOSE : Dump CBP command to script
-
- PARAMETERS :
-
- RETURNS : None
-*****************************************************************************/
-PVRSRV_ERROR PDumpRegBasedCBP(IMG_CHAR *pszPDumpRegName,
- IMG_UINT32 ui32RegOffset,
- IMG_UINT32 ui32WPosVal,
- IMG_UINT32 ui32PacketSize,
- IMG_UINT32 ui32BufferSize,
- IMG_UINT32 ui32Flags)
-{
- PDUMP_GET_SCRIPT_STRING();
-
- PDumpOSBufprintf(hScript,
- ui32MaxLen,
- "CBP :%s:0x%08X 0x%08X 0x%08X 0x%08X\r\n",
- pszPDumpRegName,
- ui32RegOffset,
- ui32WPosVal,
- ui32PacketSize,
- ui32BufferSize);
- PDumpOSWriteString2(hScript, ui32Flags);
-
- return PVRSRV_OK;
-}
-
-
-/****************************************************
- * Non-uitron code here.
- * For example, code communicating with dbg driver.
- ***************************************************/
-/* PRQA S 5087 1 */ /* include file needed here */
-#include "syscommon.h"
-
-/**************************************************************************
- * Function Name : PDumpConnectionNotify
- * Description : Called by the debugdrv to tell Services that pdump has
- * connected
- * NOTE: No debugdrv on uitron.
- **************************************************************************/
-IMG_EXPORT IMG_VOID PDumpConnectionNotify(IMG_VOID)
-{
- SYS_DATA *psSysData;
- PVRSRV_DEVICE_NODE *psThis;
- PVR_DPF((PVR_DBG_WARNING, "PDump has connected."));
-
- /* Loop over all known devices */
- SysAcquireData(&psSysData);
-
- psThis = psSysData->psDeviceNodeList;
- while (psThis)
- {
- if (psThis->pfnPDumpInitDevice)
- {
- /* Reset pdump according to connected device */
- psThis->pfnPDumpInitDevice(psThis);
- }
- psThis = psThis->psNext;
- }
-}
-
-/*****************************************************************************
- * Function Name : DbgWrite
- * Inputs : psStream - debug stream to write to
- pui8Data - buffer
- ui32BCount - buffer length
- ui32Flags - flags, e.g. continuous, LF
- * Outputs : None
- * Returns : Bytes written
- * Description : Write a block of data to a debug stream
- * NOTE: No debugdrv on uitron.
- *****************************************************************************/
-IMG_UINT32 DbgWrite(PDBG_STREAM psStream, IMG_UINT8 *pui8Data, IMG_UINT32 ui32BCount, IMG_UINT32 ui32Flags)
-{
- IMG_UINT32 ui32BytesWritten = 0;
- IMG_UINT32 ui32Off = 0;
- PDBG_STREAM_CONTROL psCtrl = psStream->psCtrl;
-
- /* Return immediately if marked as "never" */
- if ((ui32Flags & PDUMP_FLAGS_NEVER) != 0)
- {
- return ui32BCount;
- }
-
-#if defined(SUPPORT_PDUMP_MULTI_PROCESS)
- /* Return if process is not marked for pdumping, unless it's persistent.
- */
- if ( (_PDumpIsProcessActive() == IMG_FALSE ) &&
- ((ui32Flags & PDUMP_FLAGS_PERSISTENT) == 0) )
- {
- return ui32BCount;
- }
-#endif
-
- /* Send persistent data first ...
- * If we're still initialising the params will be captured to the
- * init stream in the call to pfnDBGDrivWrite2 below.
- */
- if ( ((ui32Flags & PDUMP_FLAGS_PERSISTENT) != 0) && (psCtrl->bInitPhaseComplete) )
- {
- while (ui32BCount > 0)
- {
- /*
- Params marked as persistent should be appended to the init phase.
- For example window system mem mapping of the primary surface.
- */
- ui32BytesWritten = PDumpOSDebugDriverWrite( psStream,
- PDUMP_WRITE_MODE_PERSISTENT,
- &pui8Data[ui32Off], ui32BCount, 1, 0);
-
- if (ui32BytesWritten == 0)
- {
- PDumpOSReleaseExecution();
- }
-
- if (ui32BytesWritten != 0xFFFFFFFFU)
- {
- ui32Off += ui32BytesWritten;
- ui32BCount -= ui32BytesWritten;
- }
- else
- {
- PVR_DPF((PVR_DBG_ERROR, "DbgWrite: Failed to send persistent data"));
- if( (psCtrl->ui32Flags & DEBUG_FLAGS_READONLY) != 0)
- {
- /* suspend pdump to prevent flooding kernel log buffer */
- PDumpSuspendKM();
- }
- return 0xFFFFFFFFU;
- }
- }
-
- /* reset buffer counters */
- ui32BCount = ui32Off; ui32Off = 0; ui32BytesWritten = 0;
- }
-
- while (((IMG_UINT32) ui32BCount > 0) && (ui32BytesWritten != 0xFFFFFFFFU))
- {
- if ((ui32Flags & PDUMP_FLAGS_CONTINUOUS) != 0)
- {
- /*
- If pdump client (or its equivalent) isn't running then throw continuous data away.
- */
- if (((psCtrl->ui32CapMode & DEBUG_CAPMODE_FRAMED) != 0) &&
- (psCtrl->ui32Start == 0xFFFFFFFFU) &&
- (psCtrl->ui32End == 0xFFFFFFFFU) &&
- psCtrl->bInitPhaseComplete)
- {
- ui32BytesWritten = ui32BCount;
- }
- else
- {
- ui32BytesWritten = PDumpOSDebugDriverWrite( psStream,
- PDUMP_WRITE_MODE_CONTINUOUS,
- &pui8Data[ui32Off], ui32BCount, 1, 0);
- }
- }
- else
- {
- if (ui32Flags & PDUMP_FLAGS_LASTFRAME)
- {
- IMG_UINT32 ui32DbgFlags;
-
- ui32DbgFlags = 0;
- if (ui32Flags & PDUMP_FLAGS_RESETLFBUFFER)
- {
- ui32DbgFlags |= WRITELF_FLAGS_RESETBUF;
- }
-
- ui32BytesWritten = PDumpOSDebugDriverWrite( psStream,
- PDUMP_WRITE_MODE_LASTFRAME,
- &pui8Data[ui32Off], ui32BCount, 1, ui32DbgFlags);
- }
- else
- {
- ui32BytesWritten = PDumpOSDebugDriverWrite( psStream,
- PDUMP_WRITE_MODE_BINCM,
- &pui8Data[ui32Off], ui32BCount, 1, 0);
- }
- }
-
- /*
- If the debug driver's buffers are full so no data could be written then yield
- execution so pdump can run and empty them.
- */
- if (ui32BytesWritten == 0)
- {
- PDumpOSReleaseExecution();
- }
-
- if (ui32BytesWritten != 0xFFFFFFFFU)
- {
- ui32Off += ui32BytesWritten;
- ui32BCount -= ui32BytesWritten;
- }
-
- /* loop exits when i) all data is written, or ii) an unrecoverable error occurs */
- }
-
- return ui32BytesWritten;
-}
-
-
-
-#else /* defined(PDUMP) */
-/* disable warning about empty module */
-#endif /* defined(PDUMP) */
-/*****************************************************************************
- End of file (pdump_common.c)
-*****************************************************************************/