| /*************************************************************************/ /*! |
| @File |
| @Title MMU PDump functions |
| @Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved |
| @Description Common PDump (MMU specific) functions |
| @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 "img_types.h" |
| #include "pdump_mmu.h" |
| #include "pdump_osfunc.h" |
| #include "pdump_km.h" |
| #include "pdump_physmem.h" |
| #include "osfunc.h" |
| #include "pvr_debug.h" |
| #include "pvrsrv_error.h" |
| |
| #define MAX_PDUMP_MMU_CONTEXTS (10) |
| static IMG_UINT32 guiPDumpMMUContextAvailabilityMask = (1<<MAX_PDUMP_MMU_CONTEXTS)-1; |
| |
| |
| #define MMUPX_FMT(X) ((X<3) ? ((X<2) ? "MMUPT_\0" : "MMUPD_\0") : "MMUPC_\0") |
| #define MIPSMMUPX_FMT(X) ((X<3) ? ((X<2) ? "MIPSMMUPT_\0" : "MIPSMMUPD_\0") : "MIPSMMUPC_\0") |
| |
| |
| /* Array used to look-up debug strings from MMU_LEVEL */ |
| static IMG_CHAR ai8MMULevelStringLookup[MMU_LEVEL_LAST][15] = |
| { |
| "MMU_LEVEL_0", |
| "PAGE_TABLE", |
| "PAGE_DIRECTORY", |
| "PAGE_CATALOGUE", |
| }; |
| |
| static PVRSRV_ERROR |
| _ContiguousPDumpBytes(const IMG_CHAR *pszSymbolicName, |
| IMG_UINT32 ui32SymAddrOffset, |
| IMG_BOOL bFlush, |
| IMG_UINT32 uiNumBytes, |
| void *pvBytes, |
| IMG_UINT32 ui32Flags) |
| { |
| static const IMG_CHAR *pvBeyondLastPointer; |
| static const IMG_CHAR *pvBasePointer; |
| static IMG_UINT32 ui32BeyondLastOffset; |
| static IMG_UINT32 ui32BaseOffset; |
| static IMG_UINT32 uiAccumulatedBytes = 0; |
| IMG_UINT32 ui32ParamOutPos; |
| PVRSRV_ERROR eErr = PVRSRV_OK; |
| |
| PDUMP_GET_SCRIPT_AND_FILE_STRING(); |
| PVR_UNREFERENCED_PARAMETER(ui32MaxLenFileName); |
| |
| /* Caller has PDUMP_LOCK */ |
| |
| if (!bFlush && uiAccumulatedBytes > 0) |
| { |
| /* do some tests for contiguity. If it fails, we flush anyway */ |
| |
| if (pvBeyondLastPointer != pvBytes || |
| ui32SymAddrOffset != ui32BeyondLastOffset |
| /* NB: ought to check that symbolic name agrees too, but |
| we know this always to be the case in the current use-case */ |
| ) |
| { |
| bFlush = IMG_TRUE; |
| } |
| } |
| |
| /* Flush if necessary */ |
| if (bFlush && uiAccumulatedBytes > 0) |
| { |
| eErr = PDumpWriteParameter((IMG_UINT8 *)(uintptr_t)pvBasePointer, |
| uiAccumulatedBytes, ui32Flags, |
| &ui32ParamOutPos, pszFileName); |
| if (eErr == PVRSRV_OK) |
| { |
| eErr = PDumpOSBufprintf(hScript, ui32MaxLenScript, |
| "LDB %s:0x%X 0x%X 0x%X %s", |
| /* dest */ |
| pszSymbolicName, |
| ui32BaseOffset, |
| /* size */ |
| uiAccumulatedBytes, |
| /* file offset */ |
| ui32ParamOutPos, |
| /* filename */ |
| pszFileName); |
| PVR_LOGG_IF_ERROR(eErr, "PDumpOSBufprintf", ErrOut); |
| |
| PDumpWriteScript(hScript, ui32Flags); |
| |
| } |
| else if (eErr != PVRSRV_ERROR_PDUMP_NOT_ALLOWED) |
| { |
| PVR_LOGG_IF_ERROR(eErr, "PDumpWriteParameter", ErrOut); |
| } |
| else |
| { |
| /* else Write to parameter file prevented under the flags and |
| * current state of the driver so skip write to script and error IF. |
| */ |
| eErr = PVRSRV_OK; |
| } |
| |
| uiAccumulatedBytes = 0; |
| } |
| |
| |
| /* Initialise offsets and pointers if necessary */ |
| if (uiAccumulatedBytes == 0) |
| { |
| ui32BaseOffset = ui32BeyondLastOffset = ui32SymAddrOffset; |
| pvBeyondLastPointer = pvBasePointer = (const IMG_CHAR *)pvBytes; |
| } |
| |
| /* Accumulate some bytes */ |
| ui32BeyondLastOffset += uiNumBytes; |
| pvBeyondLastPointer += uiNumBytes; |
| uiAccumulatedBytes += uiNumBytes; |
| |
| ErrOut: |
| return eErr; |
| } |
| |
| |
| /************************************************************************** |
| * Function Name : PDumpMMUMalloc |
| * Inputs : |
| * Outputs : |
| * Returns : PVRSRV_ERROR |
| * Description : |
| **************************************************************************/ |
| PVRSRV_ERROR PDumpMMUMalloc(const IMG_CHAR *pszPDumpDevName, |
| MMU_LEVEL eMMULevel, |
| IMG_DEV_PHYADDR *psDevPAddr, |
| IMG_UINT32 ui32Size, |
| IMG_UINT32 ui32Align, |
| PDUMP_MMU_TYPE eMMUType) |
| { |
| PVRSRV_ERROR eErr = PVRSRV_OK; |
| IMG_UINT32 ui32Flags = PDUMP_FLAGS_CONTINUOUS; |
| IMG_UINT64 ui64SymbolicAddr; |
| IMG_CHAR *pszMMUPX; |
| |
| PDUMP_GET_SCRIPT_STRING(); |
| |
| if (eMMULevel >= MMU_LEVEL_LAST) |
| { |
| eErr = PVRSRV_ERROR_INVALID_PARAMS; |
| goto ErrOut; |
| } |
| |
| PDUMP_LOCK(); |
| |
| /* |
| Write a comment to the PDump2 script streams indicating the memory allocation |
| */ |
| eErr = PDumpOSBufprintf(hScript, |
| ui32MaxLen, |
| "-- MALLOC :%s:%s Size=0x%08X Alignment=0x%08X DevPAddr=0x%08llX", |
| pszPDumpDevName, |
| ai8MMULevelStringLookup[eMMULevel], |
| ui32Size, |
| ui32Align, |
| psDevPAddr->uiAddr); |
| if(eErr != PVRSRV_OK) |
| { |
| goto ErrUnlock; |
| } |
| |
| PDumpWriteScript(hScript, ui32Flags); |
| |
| /* |
| construct the symbolic address |
| */ |
| ui64SymbolicAddr = (IMG_UINT64)psDevPAddr->uiAddr; |
| |
| /* |
| Write to the MMU script stream indicating the memory allocation |
| */ |
| if (eMMUType == PDUMP_MMU_TYPE_MIPS_MICROAPTIV) |
| { |
| pszMMUPX = MIPSMMUPX_FMT(eMMULevel); |
| } |
| else |
| { |
| pszMMUPX = MMUPX_FMT(eMMULevel); |
| } |
| eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "MALLOC :%s:%s%016llX 0x%X 0x%X", |
| pszPDumpDevName, |
| pszMMUPX, |
| ui64SymbolicAddr, |
| ui32Size, |
| ui32Align |
| /* don't need this sDevPAddr.uiAddr*/); |
| if(eErr != PVRSRV_OK) |
| { |
| goto ErrUnlock; |
| } |
| PDumpWriteScript(hScript, ui32Flags); |
| |
| ErrUnlock: |
| PDUMP_UNLOCK(); |
| ErrOut: |
| return eErr; |
| } |
| |
| |
| /************************************************************************** |
| * Function Name : PDumpMMUFree |
| * Inputs : |
| * Outputs : |
| * Returns : PVRSRV_ERROR |
| * Description : |
| **************************************************************************/ |
| PVRSRV_ERROR PDumpMMUFree(const IMG_CHAR *pszPDumpDevName, |
| MMU_LEVEL eMMULevel, |
| IMG_DEV_PHYADDR *psDevPAddr, |
| PDUMP_MMU_TYPE eMMUType) |
| { |
| PVRSRV_ERROR eErr = PVRSRV_OK; |
| IMG_UINT64 ui64SymbolicAddr; |
| IMG_UINT32 ui32Flags = PDUMP_FLAGS_CONTINUOUS; |
| IMG_CHAR *pszMMUPX; |
| |
| PDUMP_GET_SCRIPT_STRING(); |
| |
| if (eMMULevel >= MMU_LEVEL_LAST) |
| { |
| eErr = PVRSRV_ERROR_INVALID_PARAMS; |
| goto ErrOut; |
| } |
| |
| PDUMP_LOCK(); |
| /* |
| Write a comment to the PDUMP2 script streams indicating the memory free |
| */ |
| eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "-- FREE :%s:%s", |
| pszPDumpDevName, ai8MMULevelStringLookup[eMMULevel]); |
| if(eErr != PVRSRV_OK) |
| { |
| goto ErrUnlock; |
| } |
| |
| PDumpWriteScript(hScript, ui32Flags); |
| |
| /* |
| construct the symbolic address |
| */ |
| ui64SymbolicAddr = (IMG_UINT64)psDevPAddr->uiAddr; |
| |
| /* |
| Write to the MMU script stream indicating the memory free |
| */ |
| if (eMMUType == PDUMP_MMU_TYPE_MIPS_MICROAPTIV) |
| { |
| pszMMUPX = MIPSMMUPX_FMT(eMMULevel); |
| } |
| else |
| { |
| pszMMUPX = MMUPX_FMT(eMMULevel); |
| } |
| eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "FREE :%s:%s%016llX", |
| pszPDumpDevName, |
| pszMMUPX, |
| ui64SymbolicAddr); |
| if(eErr != PVRSRV_OK) |
| { |
| goto ErrUnlock; |
| } |
| PDumpWriteScript(hScript, ui32Flags); |
| |
| ErrUnlock: |
| PDUMP_UNLOCK(); |
| ErrOut: |
| return eErr; |
| } |
| |
| |
| /************************************************************************** |
| * Function Name : PDumpMMUMalloc2 |
| * Inputs : |
| * Outputs : |
| * Returns : PVRSRV_ERROR |
| * Description : |
| **************************************************************************/ |
| PVRSRV_ERROR PDumpMMUMalloc2(const IMG_CHAR *pszPDumpDevName, |
| const IMG_CHAR *pszTableType,/* PAGE_CATALOGUE, PAGE_DIRECTORY, PAGE_TABLE */ |
| const IMG_CHAR *pszSymbolicAddr, |
| IMG_UINT32 ui32Size, |
| IMG_UINT32 ui32Align) |
| { |
| PVRSRV_ERROR eErr = PVRSRV_OK; |
| IMG_UINT32 ui32Flags = PDUMP_FLAGS_CONTINUOUS; |
| |
| PDUMP_GET_SCRIPT_STRING(); |
| |
| PDUMP_LOCK(); |
| /* |
| Write a comment to the PDump2 script streams indicating the memory allocation |
| */ |
| eErr = PDumpOSBufprintf(hScript, |
| ui32MaxLen, |
| "-- MALLOC :%s:%s Size=0x%08X Alignment=0x%08X\n", |
| pszPDumpDevName, |
| pszTableType, |
| ui32Size, |
| ui32Align); |
| if(eErr != PVRSRV_OK) |
| { |
| goto ErrUnlock; |
| } |
| |
| PDumpWriteScript(hScript, ui32Flags); |
| |
| /* |
| Write to the MMU script stream indicating the memory allocation |
| */ |
| eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "MALLOC :%s:%s 0x%X 0x%X\n", |
| pszPDumpDevName, |
| pszSymbolicAddr, |
| ui32Size, |
| ui32Align |
| /* don't need this sDevPAddr.uiAddr*/); |
| if(eErr != PVRSRV_OK) |
| { |
| goto ErrUnlock; |
| } |
| PDumpWriteScript(hScript, ui32Flags); |
| |
| ErrUnlock: |
| PDUMP_UNLOCK(); |
| return eErr; |
| } |
| |
| |
| /************************************************************************** |
| * Function Name : PDumpMMUFree2 |
| * Inputs : |
| * Outputs : |
| * Returns : PVRSRV_ERROR |
| * Description : |
| **************************************************************************/ |
| PVRSRV_ERROR PDumpMMUFree2(const IMG_CHAR *pszPDumpDevName, |
| const IMG_CHAR *pszTableType,/* PAGE_CATALOGUE, PAGE_DIRECTORY, PAGE_TABLE */ |
| const IMG_CHAR *pszSymbolicAddr) |
| { |
| PVRSRV_ERROR eErr = PVRSRV_OK; |
| IMG_UINT32 ui32Flags = PDUMP_FLAGS_CONTINUOUS; |
| |
| PDUMP_GET_SCRIPT_STRING(); |
| |
| PDUMP_LOCK(); |
| /* |
| Write a comment to the PDUMP2 script streams indicating the memory free |
| */ |
| eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "-- FREE :%s:%s\n", |
| pszPDumpDevName, pszTableType); |
| if(eErr != PVRSRV_OK) |
| { |
| goto ErrUnlock; |
| } |
| |
| PDumpWriteScript(hScript, ui32Flags); |
| |
| /* |
| Write to the MMU script stream indicating the memory free |
| */ |
| eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "FREE :%s:%s\n", |
| pszPDumpDevName, |
| pszSymbolicAddr); |
| if(eErr != PVRSRV_OK) |
| { |
| goto ErrUnlock; |
| } |
| PDumpWriteScript(hScript, ui32Flags); |
| |
| ErrUnlock: |
| PDUMP_UNLOCK(); |
| return eErr; |
| } |
| |
| /******************************************************************************************************* |
| * Function Name : PDumpPTBaseObjectToMem64 |
| * Outputs : None |
| * Returns : PVRSRV_ERROR |
| * Description : Create a PDUMP string, which represents a memory write from the baseobject |
| * for MIPS MMU device type |
| ********************************************************************************************************/ |
| PVRSRV_ERROR PDumpPTBaseObjectToMem64(const IMG_CHAR *pszPDumpDevName, |
| PMR *psPMRDest, |
| IMG_DEVMEM_OFFSET_T uiLogicalOffsetSource, |
| IMG_DEVMEM_OFFSET_T uiLogicalOffsetDest, |
| IMG_UINT32 ui32Flags, |
| MMU_LEVEL eMMULevel, |
| IMG_UINT64 ui64PxSymAddr) |
| { |
| |
| IMG_CHAR aszMemspaceNameDest[PHYSMEM_PDUMP_MEMSPACE_MAX_LENGTH]; |
| IMG_CHAR aszSymbolicNameDest[PHYSMEM_PDUMP_SYMNAME_MAX_LENGTH]; |
| IMG_DEVMEM_OFFSET_T uiPDumpSymbolicOffsetDest; |
| IMG_DEVMEM_OFFSET_T uiNextSymNameDest; |
| PVRSRV_ERROR eErr = PVRSRV_OK; |
| |
| |
| PDUMP_GET_SCRIPT_STRING() |
| |
| eErr = PMR_PDumpSymbolicAddr(psPMRDest, |
| uiLogicalOffsetDest, |
| PHYSMEM_PDUMP_MEMSPACE_MAX_LENGTH, |
| aszMemspaceNameDest, |
| PHYSMEM_PDUMP_SYMNAME_MAX_LENGTH, |
| aszSymbolicNameDest, |
| &uiPDumpSymbolicOffsetDest, |
| &uiNextSymNameDest); |
| |
| |
| if (eErr != PVRSRV_OK) |
| { |
| return eErr; |
| } |
| |
| PDUMP_LOCK(); |
| |
| eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "WRW64 :%s:%s:0x%llX :%s:%s%016llX:0x%llX",aszMemspaceNameDest, aszSymbolicNameDest, |
| uiPDumpSymbolicOffsetDest, pszPDumpDevName, MIPSMMUPX_FMT(eMMULevel), ui64PxSymAddr, |
| (IMG_UINT64)0); |
| |
| |
| if (eErr != PVRSRV_OK) |
| { |
| PDUMP_UNLOCK(); |
| return eErr; |
| } |
| |
| |
| PDumpWriteScript(hScript, ui32Flags); |
| PDUMP_UNLOCK(); |
| |
| return PVRSRV_OK; |
| } |
| |
| |
| |
| /************************************************************************** |
| * Function Name : PDumpMMUDumpPxEntries |
| * Inputs : |
| * Outputs : |
| * Returns : PVRSRV_ERROR |
| * Description : |
| **************************************************************************/ |
| PVRSRV_ERROR PDumpMMUDumpPxEntries(MMU_LEVEL eMMULevel, |
| const IMG_CHAR *pszPDumpDevName, |
| void *pvPxMem, |
| IMG_DEV_PHYADDR sPxDevPAddr, |
| IMG_UINT32 uiFirstEntry, |
| IMG_UINT32 uiNumEntries, |
| const IMG_CHAR *pszMemspaceName, |
| const IMG_CHAR *pszSymbolicAddr, |
| IMG_UINT64 uiSymbolicAddrOffset, |
| IMG_UINT32 uiBytesPerEntry, |
| IMG_UINT32 uiLog2Align, |
| IMG_UINT32 uiAddrShift, |
| IMG_UINT64 uiAddrMask, |
| IMG_UINT64 uiPxEProtMask, |
| IMG_UINT64 uiDataValidEnable, |
| IMG_UINT32 ui32Flags, |
| PDUMP_MMU_TYPE eMMUType) |
| { |
| PVRSRV_ERROR eErr = PVRSRV_OK; |
| IMG_UINT64 ui64PxSymAddr; |
| IMG_UINT64 ui64PxEValueSymAddr; |
| IMG_UINT32 ui32SymAddrOffset = 0; |
| IMG_UINT32 *pui32PxMem; |
| IMG_UINT64 *pui64PxMem; |
| IMG_BOOL bPxEValid; |
| IMG_UINT32 uiPxEIdx; |
| IMG_INT32 iShiftAmount; |
| IMG_CHAR *pszWrwSuffix = 0; |
| void *pvRawBytes = 0; |
| IMG_CHAR aszPxSymbolicAddr[PHYSMEM_PDUMP_SYMNAME_MAX_LENGTH]; |
| IMG_UINT64 ui64PxE64; |
| IMG_UINT64 ui64Protflags64; |
| IMG_CHAR *pszMMUPX; |
| |
| PDUMP_GET_SCRIPT_STRING(); |
| |
| if (!PDumpReady()) |
| { |
| eErr = PVRSRV_ERROR_PDUMP_NOT_AVAILABLE; |
| goto ErrOut; |
| } |
| |
| |
| if (PDumpIsDumpSuspended()) |
| { |
| eErr = PVRSRV_OK; |
| goto ErrOut; |
| } |
| |
| if (pvPxMem == NULL) |
| { |
| eErr = PVRSRV_ERROR_INVALID_PARAMS; |
| goto ErrOut; |
| } |
| |
| |
| /* |
| create the symbolic address of the Px |
| */ |
| ui64PxSymAddr = sPxDevPAddr.uiAddr; |
| |
| if (eMMUType == PDUMP_MMU_TYPE_MIPS_MICROAPTIV) |
| { |
| pszMMUPX = MIPSMMUPX_FMT(eMMULevel); |
| } |
| else |
| { |
| pszMMUPX = MMUPX_FMT(eMMULevel); |
| } |
| OSSNPrintf(aszPxSymbolicAddr, |
| PHYSMEM_PDUMP_SYMNAME_MAX_LENGTH, |
| ":%s:%s%016llX", |
| pszPDumpDevName, |
| pszMMUPX, |
| ui64PxSymAddr); |
| |
| PDUMP_LOCK(); |
| |
| /* |
| traverse PxEs, dumping entries |
| */ |
| for(uiPxEIdx = uiFirstEntry; |
| uiPxEIdx < uiFirstEntry + uiNumEntries; |
| uiPxEIdx++) |
| { |
| /* Calc the symbolic address offset of the PxE location |
| This is what we have to add to the table address to get to a certain entry */ |
| ui32SymAddrOffset = (uiPxEIdx*uiBytesPerEntry); |
| |
| /* Calc the symbolic address of the PxE value and HW protflags */ |
| /* just read it here */ |
| switch(uiBytesPerEntry) |
| { |
| case 4: |
| { |
| pui32PxMem = pvPxMem; |
| ui64PxE64 = pui32PxMem[uiPxEIdx]; |
| pszWrwSuffix = ""; |
| pvRawBytes = &pui32PxMem[uiPxEIdx]; |
| break; |
| } |
| case 8: |
| { |
| pui64PxMem = pvPxMem; |
| ui64PxE64 = pui64PxMem[uiPxEIdx]; |
| pszWrwSuffix = "64"; |
| pvRawBytes = &pui64PxMem[uiPxEIdx]; |
| break; |
| } |
| default: |
| { |
| PVR_DPF((PVR_DBG_ERROR, "PDumpMMUPxEntries: error")); |
| ui64PxE64 = 0; |
| //!!error |
| break; |
| } |
| } |
| |
| ui64PxEValueSymAddr = (ui64PxE64 & uiAddrMask) >> uiAddrShift << uiLog2Align; |
| ui64Protflags64 = ui64PxE64 & uiPxEProtMask; |
| bPxEValid = (ui64Protflags64 & uiDataValidEnable) ? IMG_TRUE : IMG_FALSE; |
| if(bPxEValid) |
| { |
| _ContiguousPDumpBytes(aszPxSymbolicAddr, ui32SymAddrOffset, IMG_TRUE, |
| 0, 0, |
| ui32Flags | PDUMP_FLAGS_CONTINUOUS); |
| |
| iShiftAmount = (IMG_INT32)(uiLog2Align - uiAddrShift); |
| |
| /* First put the symbolic representation of the actual |
| address of the entry into a pdump internal register */ |
| /* MOV seemed cleaner here, since (a) it's 64-bit; (b) the |
| target is not memory. However, MOV cannot do the |
| "reference" of the symbolic address. Apparently WRW is |
| correct. */ |
| |
| if (pszSymbolicAddr == NULL) |
| { |
| pszSymbolicAddr = "none"; |
| } |
| |
| if (eMMULevel == MMU_LEVEL_1) |
| { |
| if (iShiftAmount == 0) |
| { |
| eErr = PDumpOSBufprintf(hScript, |
| ui32MaxLen, |
| "WRW%s :%s:%s%016llX:0x%08X :%s:%s:0x%llx | 0x%llX\n", |
| pszWrwSuffix, |
| /* dest */ |
| pszPDumpDevName, |
| pszMMUPX, |
| ui64PxSymAddr, |
| ui32SymAddrOffset, |
| /* src */ |
| pszMemspaceName, |
| pszSymbolicAddr, |
| uiSymbolicAddrOffset, |
| /* ORing prot flags */ |
| ui64Protflags64); |
| } |
| else |
| { |
| eErr = PDumpOSBufprintf(hScript, |
| ui32MaxLen, |
| "WRW :%s:$1 :%s:%s:0x%llx\n", |
| /* dest */ |
| pszPDumpDevName, |
| /* src */ |
| pszMemspaceName, |
| pszSymbolicAddr, |
| uiSymbolicAddrOffset); |
| } |
| } |
| else |
| { |
| if (eMMUType == PDUMP_MMU_TYPE_MIPS_MICROAPTIV) |
| { |
| pszMMUPX = MIPSMMUPX_FMT(eMMULevel - 1); |
| } |
| else |
| { |
| pszMMUPX = MMUPX_FMT(eMMULevel - 1); |
| } |
| eErr = PDumpOSBufprintf(hScript, |
| ui32MaxLen, |
| "WRW :%s:$1 :%s:%s%016llX:0x0", |
| /* dest */ |
| pszPDumpDevName, |
| /* src */ |
| pszPDumpDevName, |
| pszMMUPX, |
| ui64PxEValueSymAddr); |
| if (eMMUType == PDUMP_MMU_TYPE_MIPS_MICROAPTIV) |
| { |
| pszMMUPX = MIPSMMUPX_FMT(eMMULevel); |
| } |
| else |
| { |
| pszMMUPX = MMUPX_FMT(eMMULevel); |
| } |
| } |
| if (eErr != PVRSRV_OK) |
| { |
| goto ErrUnlock; |
| } |
| PDumpWriteScript(hScript, ui32Flags | PDUMP_FLAGS_CONTINUOUS); |
| |
| /* Now shift it to the right place, if necessary: */ |
| /* Now shift that value down, by the "Align shift" |
| amount, to get it into units (ought to assert that |
| we get an integer - i.e. we don't shift any bits |
| off the bottom, don't know how to do PDUMP |
| assertions yet) and then back up by the right |
| amount to get it into the position of the field. |
| This is optimised into a single shift right by the |
| difference between the two. */ |
| if (iShiftAmount > 0) |
| { |
| /* Page X Address is specified in units larger |
| than the position in the PxE would suggest. */ |
| eErr = PDumpOSBufprintf(hScript, |
| ui32MaxLen, |
| "SHR :%s:$1 :%s:$1 0x%X", |
| /* dest */ |
| pszPDumpDevName, |
| /* src A */ |
| pszPDumpDevName, |
| /* src B */ |
| iShiftAmount); |
| if (eErr != PVRSRV_OK) |
| { |
| goto ErrUnlock; |
| } |
| PDumpWriteScript(hScript, ui32Flags | PDUMP_FLAGS_CONTINUOUS); |
| } |
| else if (iShiftAmount < 0) |
| { |
| /* Page X Address is specified in units smaller |
| than the position in the PxE would suggest. */ |
| eErr = PDumpOSBufprintf(hScript, |
| ui32MaxLen, |
| "SHL :%s:$1 :%s:$1 0x%X", |
| /* dest */ |
| pszPDumpDevName, |
| /* src A */ |
| pszPDumpDevName, |
| /* src B */ |
| -iShiftAmount); |
| if (eErr != PVRSRV_OK) |
| { |
| goto ErrUnlock; |
| } |
| PDumpWriteScript(hScript, ui32Flags | PDUMP_FLAGS_CONTINUOUS); |
| } |
| |
| if (eMMULevel == MMU_LEVEL_1) |
| { |
| if( iShiftAmount != 0) |
| { |
| /* Now we can "or" in the protection flags */ |
| eErr = PDumpOSBufprintf(hScript, |
| ui32MaxLen, |
| "OR :%s:$1 :%s:$1 0x%llX", |
| /* dest */ |
| pszPDumpDevName, |
| /* src A */ |
| pszPDumpDevName, |
| /* src B */ |
| ui64Protflags64); |
| if (eErr != PVRSRV_OK) |
| { |
| goto ErrUnlock; |
| } |
| PDumpWriteScript(hScript, ui32Flags | PDUMP_FLAGS_CONTINUOUS); |
| eErr = PDumpOSBufprintf(hScript, |
| ui32MaxLen, |
| "WRW%s :%s:%s%016llX:0x%08X :%s:$1 ", |
| pszWrwSuffix, |
| /* dest */ |
| pszPDumpDevName, |
| pszMMUPX, |
| ui64PxSymAddr, |
| ui32SymAddrOffset, |
| /* src */ |
| pszPDumpDevName); |
| if(eErr != PVRSRV_OK) |
| { |
| goto ErrUnlock; |
| } |
| PDumpWriteScript(hScript, ui32Flags | PDUMP_FLAGS_CONTINUOUS); |
| |
| } |
| } |
| else |
| { |
| /* Now we can "or" in the protection flags */ |
| eErr = PDumpOSBufprintf(hScript, |
| ui32MaxLen, |
| "OR :%s:$1 :%s:$1 0x%llX", |
| /* dest */ |
| pszPDumpDevName, |
| /* src A */ |
| pszPDumpDevName, |
| /* src B */ |
| ui64Protflags64); |
| if (eErr != PVRSRV_OK) |
| { |
| goto ErrUnlock; |
| } |
| PDumpWriteScript(hScript, ui32Flags | PDUMP_FLAGS_CONTINUOUS); |
| |
| /* Finally, we write the register into the actual PxE */ |
| eErr = PDumpOSBufprintf(hScript, |
| ui32MaxLen, |
| "WRW%s :%s:%s%016llX:0x%08X :%s:$1", |
| pszWrwSuffix, |
| /* dest */ |
| pszPDumpDevName, |
| pszMMUPX, |
| ui64PxSymAddr, |
| ui32SymAddrOffset, |
| /* src */ |
| pszPDumpDevName); |
| if(eErr != PVRSRV_OK) |
| { |
| goto ErrUnlock; |
| } |
| PDumpWriteScript(hScript, ui32Flags | PDUMP_FLAGS_CONTINUOUS); |
| } |
| } |
| else |
| { |
| /* If the entry was "invalid", simply write the actual |
| value found to the memory location */ |
| eErr = _ContiguousPDumpBytes(aszPxSymbolicAddr, ui32SymAddrOffset, IMG_FALSE, |
| uiBytesPerEntry, pvRawBytes, |
| ui32Flags | PDUMP_FLAGS_CONTINUOUS); |
| if (eErr != PVRSRV_OK) |
| { |
| goto ErrUnlock; |
| } |
| } |
| } |
| |
| /* flush out any partly accumulated stuff for LDB */ |
| _ContiguousPDumpBytes(aszPxSymbolicAddr, ui32SymAddrOffset, IMG_TRUE, |
| 0, 0, |
| ui32Flags | PDUMP_FLAGS_CONTINUOUS); |
| |
| ErrUnlock: |
| PDUMP_UNLOCK(); |
| ErrOut: |
| return eErr; |
| } |
| |
| |
| /************************************************************************** |
| * 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((guiPDumpMMUContextAvailabilityMask & (1U << i))) |
| { |
| /* mark in use */ |
| guiPDumpMMUContextAvailabilityMask &= ~(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 */ |
| PVR_ASSERT (!(guiPDumpMMUContextAvailabilityMask & (1U << ui32MMUContextID))); |
| guiPDumpMMUContextAvailabilityMask |= (1U << ui32MMUContextID); |
| return PVRSRV_OK; |
| } |
| |
| PVR_DPF((PVR_DBG_ERROR, "_PdumpFreeMMUContext: MMU context ids invalid")); |
| |
| return PVRSRV_ERROR_MMU_CONTEXT_NOT_FOUND; |
| } |
| |
| |
| /************************************************************************** |
| * Function Name : PDumpMMUAllocMMUContext |
| * Inputs : |
| * Outputs : None |
| * Returns : PVRSRV_ERROR |
| * Description : Alloc MMU Context |
| **************************************************************************/ |
| PVRSRV_ERROR PDumpMMUAllocMMUContext(const IMG_CHAR *pszPDumpMemSpaceName, |
| IMG_DEV_PHYADDR sPCDevPAddr, |
| PDUMP_MMU_TYPE eMMUType, |
| IMG_UINT32 *pui32MMUContextID) |
| { |
| IMG_UINT64 ui64PCSymAddr; |
| IMG_CHAR *pszMMUPX; |
| |
| IMG_UINT32 ui32MMUContextID; |
| PVRSRV_ERROR eErr = PVRSRV_OK; |
| PDUMP_GET_SCRIPT_STRING(); |
| |
| eErr = _PdumpAllocMMUContext(&ui32MMUContextID); |
| if(eErr != PVRSRV_OK) |
| { |
| PVR_DPF((PVR_DBG_ERROR, "%s: _PdumpAllocMMUContext failed: %d", |
| __func__, eErr)); |
| PVR_DBG_BREAK; |
| goto ErrOut; |
| } |
| |
| /* |
| create the symbolic address of the PC |
| */ |
| ui64PCSymAddr = sPCDevPAddr.uiAddr; |
| |
| if (eMMUType == PDUMP_MMU_TYPE_MIPS_MICROAPTIV) |
| { |
| pszMMUPX = MIPSMMUPX_FMT(1); |
| /* Giving it a mock value until the Pdump player implements |
| the support for the MIPS microAptiv MMU*/ |
| eMMUType = PDUMP_MMU_TYPE_VARPAGE_40BIT; |
| } |
| else |
| { |
| pszMMUPX = MMUPX_FMT(3); |
| } |
| |
| PDUMP_LOCK(); |
| |
| eErr = PDumpOSBufprintf(hScript, |
| ui32MaxLen, |
| "MMU :%s:v%d %d :%s:%s%016llX", |
| /* mmu context */ |
| pszPDumpMemSpaceName, |
| ui32MMUContextID, |
| /* mmu type */ |
| eMMUType, |
| /* PC base address */ |
| pszPDumpMemSpaceName, |
| pszMMUPX, |
| ui64PCSymAddr); |
| if(eErr != PVRSRV_OK) |
| { |
| PDUMP_UNLOCK(); |
| PVR_DBG_BREAK; |
| goto ErrOut; |
| } |
| |
| PDumpWriteScript(hScript, PDUMP_FLAGS_CONTINUOUS); |
| PDUMP_UNLOCK(); |
| |
| /* return the MMU Context ID */ |
| *pui32MMUContextID = ui32MMUContextID; |
| |
| ErrOut: |
| return eErr; |
| } |
| |
| |
| /************************************************************************** |
| * Function Name : PDumpMMUFreeMMUContext |
| * Inputs : |
| * Outputs : None |
| * Returns : PVRSRV_ERROR |
| * Description : Free MMU Context |
| **************************************************************************/ |
| PVRSRV_ERROR PDumpMMUFreeMMUContext(const IMG_CHAR *pszPDumpMemSpaceName, |
| IMG_UINT32 ui32MMUContextID) |
| { |
| PVRSRV_ERROR eErr = PVRSRV_OK; |
| PDUMP_GET_SCRIPT_STRING(); |
| |
| PDUMP_LOCK(); |
| eErr = PDumpOSBufprintf(hScript, |
| ui32MaxLen, |
| "-- Clear MMU Context for memory space %s", pszPDumpMemSpaceName); |
| if(eErr != PVRSRV_OK) |
| { |
| goto ErrUnlock; |
| } |
| |
| PDumpWriteScript(hScript, PDUMP_FLAGS_CONTINUOUS); |
| |
| eErr = PDumpOSBufprintf(hScript, |
| ui32MaxLen, |
| "MMU :%s:v%d", |
| pszPDumpMemSpaceName, |
| ui32MMUContextID); |
| if(eErr != PVRSRV_OK) |
| { |
| goto ErrUnlock; |
| } |
| |
| PDumpWriteScript(hScript, PDUMP_FLAGS_CONTINUOUS); |
| |
| eErr = _PdumpFreeMMUContext(ui32MMUContextID); |
| if(eErr != PVRSRV_OK) |
| { |
| PVR_DPF((PVR_DBG_ERROR, "%s: _PdumpFreeMMUContext failed: %d", |
| __func__, eErr)); |
| goto ErrUnlock; |
| } |
| |
| ErrUnlock: |
| PDUMP_UNLOCK(); |
| return eErr; |
| } |
| |
| |
| /************************************************************************** |
| * Function Name : PDumpMMUActivateCatalog |
| * Inputs : |
| * Outputs : |
| * Returns : PVRSRV_ERROR |
| * Description : |
| **************************************************************************/ |
| PVRSRV_ERROR PDumpMMUActivateCatalog(const IMG_CHAR *pszPDumpRegSpaceName, |
| const IMG_CHAR *pszPDumpRegName, |
| IMG_UINT32 uiRegAddr, |
| const IMG_CHAR *pszPDumpPCSymbolicName) |
| { |
| IMG_UINT32 ui32Flags = PDUMP_FLAGS_CONTINUOUS; |
| PVRSRV_ERROR eErr = PVRSRV_OK; |
| |
| PDUMP_GET_SCRIPT_STRING(); |
| |
| if (!PDumpReady()) |
| { |
| eErr = PVRSRV_ERROR_PDUMP_NOT_AVAILABLE; |
| goto ErrOut; |
| } |
| |
| |
| if (PDumpIsDumpSuspended()) |
| { |
| goto ErrOut; |
| } |
| |
| PDUMP_LOCK(); |
| |
| eErr = PDumpOSBufprintf(hScript, ui32MaxLen, |
| "-- Write Page Catalogue Address to %s", |
| pszPDumpRegName); |
| if(eErr != PVRSRV_OK) |
| { |
| goto ErrUnlock; |
| } |
| |
| PDumpWriteScript(hScript, ui32Flags); |
| |
| eErr = PDumpOSBufprintf(hScript, |
| ui32MaxLen, |
| "WRW :%s:0x%04X %s:0", |
| /* dest */ |
| pszPDumpRegSpaceName, |
| uiRegAddr, |
| /* src */ |
| pszPDumpPCSymbolicName); |
| if (eErr != PVRSRV_OK) |
| { |
| goto ErrUnlock; |
| } |
| PDumpWriteScript(hScript, ui32Flags | PDUMP_FLAGS_CONTINUOUS); |
| |
| ErrUnlock: |
| PDUMP_UNLOCK(); |
| ErrOut: |
| return eErr; |
| } |
| |
| |
| PVRSRV_ERROR |
| PDumpMMUSAB(const IMG_CHAR *pszPDumpMemNamespace, |
| IMG_UINT32 uiPDumpMMUCtx, |
| IMG_DEV_VIRTADDR sDevAddrStart, |
| IMG_DEVMEM_SIZE_T uiSize, |
| const IMG_CHAR *pszFilename, |
| IMG_UINT32 uiFileOffset, |
| IMG_UINT32 ui32PDumpFlags) |
| { |
| PVRSRV_ERROR eErr = PVRSRV_OK; |
| |
| // "SAB :%s:v%x:0x%010llX 0x%08X 0x%08X %s.bin", |
| |
| PDUMP_GET_SCRIPT_STRING(); |
| |
| if (!PDumpReady()) |
| { |
| eErr = PVRSRV_ERROR_PDUMP_NOT_AVAILABLE; |
| goto ErrOut; |
| } |
| |
| |
| if (PDumpIsDumpSuspended()) |
| { |
| eErr = PVRSRV_OK; |
| goto ErrOut; |
| } |
| |
| PDUMP_LOCK(); |
| |
| eErr = PDumpOSBufprintf(hScript, |
| ui32MaxLen, |
| "SAB :%s:v%x:" IMG_DEV_VIRTADDR_FMTSPEC " " |
| IMG_DEVMEM_SIZE_FMTSPEC " " |
| "0x%x %s.bin\n", |
| pszPDumpMemNamespace, |
| uiPDumpMMUCtx, |
| sDevAddrStart.uiAddr, |
| uiSize, |
| uiFileOffset, |
| pszFilename); |
| if (eErr != PVRSRV_OK) |
| { |
| goto ErrUnlock; |
| } |
| |
| PDumpWriteScript(hScript, ui32PDumpFlags); |
| |
| ErrUnlock: |
| PDUMP_UNLOCK(); |
| ErrOut: |
| return eErr; |
| } |
| |
| /************************************************************************** |
| * Function Name : PdumpWireUpMipsTLB |
| **************************************************************************/ |
| PVRSRV_ERROR PdumpWireUpMipsTLB(PMR *psPMRSource, |
| PMR *psPMRDest, |
| IMG_DEVMEM_OFFSET_T uiLogicalOffsetSource, |
| IMG_DEVMEM_OFFSET_T uiLogicalOffsetDest, |
| IMG_UINT32 ui32AllocationFlags, |
| IMG_UINT32 ui32Flags) |
| { |
| PVRSRV_ERROR eErr = PVRSRV_OK; |
| IMG_CHAR aszMemspaceNameSource[PHYSMEM_PDUMP_MEMSPACE_MAX_LENGTH]; |
| IMG_CHAR aszSymbolicNameSource[PHYSMEM_PDUMP_SYMNAME_MAX_LENGTH]; |
| IMG_CHAR aszMemspaceNameDest[PHYSMEM_PDUMP_MEMSPACE_MAX_LENGTH]; |
| IMG_CHAR aszSymbolicNameDest[PHYSMEM_PDUMP_SYMNAME_MAX_LENGTH]; |
| IMG_DEVMEM_OFFSET_T uiPDumpSymbolicOffsetSource; |
| IMG_DEVMEM_OFFSET_T uiPDumpSymbolicOffsetDest; |
| IMG_DEVMEM_OFFSET_T uiNextSymNameSource; |
| IMG_DEVMEM_OFFSET_T uiNextSymNameDest; |
| |
| |
| PDUMP_GET_SCRIPT_STRING() |
| |
| eErr = PMR_PDumpSymbolicAddr(psPMRSource, |
| uiLogicalOffsetSource, |
| PHYSMEM_PDUMP_MEMSPACE_MAX_LENGTH, |
| aszMemspaceNameSource, |
| PHYSMEM_PDUMP_SYMNAME_MAX_LENGTH, |
| aszSymbolicNameSource, |
| &uiPDumpSymbolicOffsetSource, |
| &uiNextSymNameSource); |
| |
| if (eErr != PVRSRV_OK) |
| { |
| goto ErrOut; |
| } |
| |
| eErr = PMR_PDumpSymbolicAddr(psPMRDest, |
| uiLogicalOffsetDest, |
| PHYSMEM_PDUMP_MEMSPACE_MAX_LENGTH, |
| aszMemspaceNameDest, |
| PHYSMEM_PDUMP_SYMNAME_MAX_LENGTH, |
| aszSymbolicNameDest, |
| &uiPDumpSymbolicOffsetDest, |
| &uiNextSymNameDest); |
| |
| |
| if (eErr != PVRSRV_OK) |
| { |
| goto ErrOut; |
| } |
| |
| PDUMP_LOCK(); |
| |
| eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "WRW :%s:$1 :%s:%s:0x%llX", aszMemspaceNameSource, |
| aszMemspaceNameSource, aszSymbolicNameSource, |
| uiPDumpSymbolicOffsetSource); |
| |
| if (eErr != PVRSRV_OK) |
| { |
| goto ErrUnlock; |
| } |
| PDumpWriteScript(hScript, ui32Flags); |
| |
| eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "SHR :%s:$1 :%s:$1 0x6", aszMemspaceNameSource, |
| aszMemspaceNameSource); |
| |
| if (eErr != PVRSRV_OK) |
| { |
| goto ErrUnlock; |
| } |
| PDumpWriteScript(hScript, ui32Flags); |
| |
| eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "AND :%s:$1 :%s:$1 0x03FFFFC0", aszMemspaceNameSource, |
| aszMemspaceNameSource); |
| |
| if (eErr != PVRSRV_OK) |
| { |
| goto ErrUnlock; |
| } |
| PDumpWriteScript(hScript, ui32Flags); |
| |
| eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "OR :%s:$1 :%s:$1 0x%X", aszMemspaceNameSource, |
| aszMemspaceNameSource, ui32AllocationFlags); |
| |
| if (eErr != PVRSRV_OK) |
| { |
| goto ErrUnlock; |
| } |
| PDumpWriteScript(hScript, ui32Flags); |
| |
| eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "WRW :%s:%s:0x%llX :%s:$1",aszMemspaceNameDest, aszSymbolicNameDest, |
| uiPDumpSymbolicOffsetDest, aszMemspaceNameSource); |
| |
| |
| if (eErr != PVRSRV_OK) |
| { |
| goto ErrUnlock; |
| } |
| PDumpWriteScript(hScript, ui32Flags); |
| |
| ErrUnlock: |
| PDUMP_UNLOCK(); |
| ErrOut: |
| return eErr; |
| } |
| |
| /************************************************************************** |
| * Function Name : PdumpInvalidateMipsTLB |
| **************************************************************************/ |
| PVRSRV_ERROR PdumpInvalidateMipsTLB(PMR *psPMRDest, |
| IMG_DEVMEM_OFFSET_T uiLogicalOffsetDest, |
| IMG_UINT32 ui32MipsTLBValidClearMask, |
| IMG_UINT32 ui32Flags) |
| { |
| PVRSRV_ERROR eErr = PVRSRV_OK; |
| IMG_CHAR aszMemspaceNameDest[PHYSMEM_PDUMP_MEMSPACE_MAX_LENGTH]; |
| IMG_CHAR aszSymbolicNameDest[PHYSMEM_PDUMP_SYMNAME_MAX_LENGTH]; |
| IMG_DEVMEM_OFFSET_T uiPDumpSymbolicOffsetDest; |
| IMG_DEVMEM_OFFSET_T uiNextSymNameDest; |
| |
| |
| PDUMP_GET_SCRIPT_STRING() |
| |
| eErr = PMR_PDumpSymbolicAddr(psPMRDest, |
| uiLogicalOffsetDest, |
| PHYSMEM_PDUMP_MEMSPACE_MAX_LENGTH, |
| aszMemspaceNameDest, |
| PHYSMEM_PDUMP_SYMNAME_MAX_LENGTH, |
| aszSymbolicNameDest, |
| &uiPDumpSymbolicOffsetDest, |
| &uiNextSymNameDest); |
| |
| |
| if (eErr != PVRSRV_OK) |
| { |
| goto ErrOut; |
| } |
| |
| PDUMP_LOCK(); |
| |
| eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "WRW :%s:$1 :%s:%s:0x%llX", aszMemspaceNameDest, |
| aszMemspaceNameDest, aszSymbolicNameDest, |
| uiPDumpSymbolicOffsetDest); |
| |
| if (eErr != PVRSRV_OK) |
| { |
| goto ErrUnlock; |
| } |
| PDumpWriteScript(hScript, ui32Flags); |
| |
| eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "AND :%s:$1 :%s:$1 0x%X", aszMemspaceNameDest, |
| aszMemspaceNameDest, ui32MipsTLBValidClearMask); |
| |
| if (eErr != PVRSRV_OK) |
| { |
| goto ErrUnlock; |
| } |
| PDumpWriteScript(hScript, ui32Flags); |
| |
| |
| |
| eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "WRW :%s:%s:0x%llX :%s:$1",aszMemspaceNameDest, aszSymbolicNameDest, |
| uiPDumpSymbolicOffsetDest, aszMemspaceNameDest); |
| |
| |
| if (eErr != PVRSRV_OK) |
| { |
| goto ErrUnlock; |
| } |
| PDumpWriteScript(hScript, ui32Flags); |
| |
| |
| ErrUnlock: |
| PDUMP_UNLOCK(); |
| ErrOut: |
| return eErr; |
| } |
| |
| |
| #endif /* #if defined (PDUMP) */ |
| |