aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/pvr/mem_debug.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/pvr/mem_debug.c')
-rw-r--r--drivers/gpu/pvr/mem_debug.c250
1 files changed, 250 insertions, 0 deletions
diff --git a/drivers/gpu/pvr/mem_debug.c b/drivers/gpu/pvr/mem_debug.c
new file mode 100644
index 00000000000..cbe99120e21
--- /dev/null
+++ b/drivers/gpu/pvr/mem_debug.c
@@ -0,0 +1,250 @@
1/**********************************************************************
2 *
3 * Copyright(c) 2008 Imagination Technologies Ltd. All rights reserved.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms and conditions of the GNU General Public License,
7 * version 2, as published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope it will be useful but, except
10 * as otherwise stated in writing, without any warranty; without even the
11 * implied warranty of merchantability or fitness for a particular purpose.
12 * See the GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
17 *
18 * The full GNU General Public License is included in this distribution in
19 * the file called "COPYING".
20 *
21 * Contact Information:
22 * Imagination Technologies Ltd. <gpl-support@imgtec.com>
23 * Home Park Estate, Kings Langley, Herts, WD4 8LZ, UK
24 *
25 ******************************************************************************/
26
27#ifndef MEM_DEBUG_C
28#define MEM_DEBUG_C
29
30#if defined(PVRSRV_DEBUG_OS_MEMORY)
31
32#include "img_types.h"
33#include "services_headers.h"
34
35#if defined (__cplusplus)
36extern "C"
37{
38#endif
39
40#define STOP_ON_ERROR 0
41
42
43
44
45
46
47
48
49
50 IMG_BOOL MemCheck(const IMG_PVOID pvAddr, const IMG_UINT8 ui8Pattern, IMG_SIZE_T uSize)
51 {
52 IMG_UINT8 *pui8Addr;
53 for (pui8Addr = (IMG_UINT8*)pvAddr; uSize > 0; uSize--, pui8Addr++)
54 {
55 if (*pui8Addr != ui8Pattern)
56 {
57 return IMG_FALSE;
58 }
59 }
60 return IMG_TRUE;
61 }
62
63
64
65 IMG_VOID OSCheckMemDebug(IMG_PVOID pvCpuVAddr, IMG_SIZE_T uSize, const IMG_CHAR *pszFileName, const IMG_UINT32 uLine)
66 {
67 OSMEM_DEBUG_INFO const *psInfo = (OSMEM_DEBUG_INFO *)((IMG_UINT32)pvCpuVAddr - TEST_BUFFER_PADDING_STATUS);
68
69
70 if (pvCpuVAddr == IMG_NULL)
71 {
72 PVR_DPF((PVR_DBG_ERROR, "Pointer 0x%X : null pointer"
73 " - referenced %s:%d - allocated %s:%d",
74 pvCpuVAddr,
75 pszFileName, uLine,
76 psInfo->sFileName, psInfo->uLineNo));
77 while (STOP_ON_ERROR);
78 }
79
80
81 if (((IMG_UINT32)pvCpuVAddr&3) != 0)
82 {
83 PVR_DPF((PVR_DBG_ERROR, "Pointer 0x%X : invalid alignment"
84 " - referenced %s:%d - allocated %s:%d",
85 pvCpuVAddr,
86 pszFileName, uLine,
87 psInfo->sFileName, psInfo->uLineNo));
88 while (STOP_ON_ERROR);
89 }
90
91
92 if (!MemCheck((IMG_PVOID)psInfo->sGuardRegionBefore, 0xB1, sizeof(psInfo->sGuardRegionBefore)))
93 {
94 PVR_DPF((PVR_DBG_ERROR, "Pointer 0x%X : guard region before overwritten"
95 " - referenced %s:%d - allocated %s:%d",
96 pvCpuVAddr,
97 pszFileName, uLine,
98 psInfo->sFileName, psInfo->uLineNo));
99 while (STOP_ON_ERROR);
100 }
101
102
103 if (uSize != psInfo->uSize)
104 {
105 PVR_DPF((PVR_DBG_WARNING, "Pointer 0x%X : supplied size was different to stored size (0x%X != 0x%X)"
106 " - referenced %s:%d - allocated %s:%d",
107 pvCpuVAddr, uSize, psInfo->uSize,
108 pszFileName, uLine,
109 psInfo->sFileName, psInfo->uLineNo));
110 while (STOP_ON_ERROR);
111 }
112
113
114 if ((0x01234567 ^ psInfo->uSizeParityCheck) != psInfo->uSize)
115 {
116 PVR_DPF((PVR_DBG_WARNING, "Pointer 0x%X : stored size parity error (0x%X != 0x%X)"
117 " - referenced %s:%d - allocated %s:%d",
118 pvCpuVAddr, psInfo->uSize, 0x01234567 ^ psInfo->uSizeParityCheck,
119 pszFileName, uLine,
120 psInfo->sFileName, psInfo->uLineNo));
121 while (STOP_ON_ERROR);
122 }
123 else
124 {
125
126 uSize = psInfo->uSize;
127 }
128
129
130 if (uSize)
131 {
132 if (!MemCheck((IMG_VOID*)((IMG_UINT32)pvCpuVAddr + uSize), 0xB2, TEST_BUFFER_PADDING_AFTER))
133 {
134 PVR_DPF((PVR_DBG_ERROR, "Pointer 0x%X : guard region after overwritten"
135 " - referenced from %s:%d - allocated from %s:%d",
136 pvCpuVAddr,
137 pszFileName, uLine,
138 psInfo->sFileName, psInfo->uLineNo));
139 }
140 }
141
142
143 if (psInfo->eValid != isAllocated)
144 {
145 PVR_DPF((PVR_DBG_ERROR, "Pointer 0x%X : not allocated (freed? %d)"
146 " - referenced %s:%d - freed %s:%d",
147 pvCpuVAddr, psInfo->eValid == isFree,
148 pszFileName, uLine,
149 psInfo->sFileName, psInfo->uLineNo));
150 while (STOP_ON_ERROR);
151 }
152 }
153
154 IMG_VOID debug_strcpy(IMG_CHAR *pDest, const IMG_CHAR *pSrc)
155 {
156 IMG_SIZE_T i = 0;
157
158 for (; i < 128; i++)
159 {
160 *pDest = *pSrc;
161 if (*pSrc == '\0') break;
162 pDest++;
163 pSrc++;
164 }
165 }
166
167 PVRSRV_ERROR OSAllocMem_Debug_Wrapper(IMG_UINT32 ui32Flags,
168 IMG_UINT32 ui32Size,
169 IMG_PVOID *ppvCpuVAddr,
170 IMG_HANDLE *phBlockAlloc,
171 IMG_CHAR *pszFilename,
172 IMG_UINT32 ui32Line)
173 {
174 OSMEM_DEBUG_INFO *psInfo;
175
176 PVRSRV_ERROR eError;
177
178 eError = OSAllocMem_Debug_Linux_Memory_Allocations(ui32Flags,
179 ui32Size + TEST_BUFFER_PADDING,
180 ppvCpuVAddr,
181 phBlockAlloc,
182 pszFilename,
183 ui32Line);
184
185 if (eError != PVRSRV_OK)
186 {
187 return eError;
188 }
189
190
191 OSMemSet((IMG_CHAR *)(*ppvCpuVAddr) + TEST_BUFFER_PADDING_STATUS, 0xBB, ui32Size);
192 OSMemSet((IMG_CHAR *)(*ppvCpuVAddr) + ui32Size + TEST_BUFFER_PADDING_STATUS, 0xB2, TEST_BUFFER_PADDING_AFTER);
193
194
195 psInfo = (OSMEM_DEBUG_INFO *)(*ppvCpuVAddr);
196
197 OSMemSet(psInfo->sGuardRegionBefore, 0xB1, sizeof(psInfo->sGuardRegionBefore));
198 debug_strcpy(psInfo->sFileName, pszFilename);
199 psInfo->uLineNo = ui32Line;
200 psInfo->eValid = isAllocated;
201 psInfo->uSize = ui32Size;
202 psInfo->uSizeParityCheck = 0x01234567 ^ ui32Size;
203
204
205 *ppvCpuVAddr = (IMG_PVOID) ((IMG_UINT32)*ppvCpuVAddr)+TEST_BUFFER_PADDING_STATUS;
206
207#ifdef PVRSRV_LOG_MEMORY_ALLOCS
208
209 PVR_TRACE(("Allocated pointer (after debug info): 0x%X from %s:%d", *ppvCpuVAddr, pszFilename, ui32Line));
210#endif
211
212 return PVRSRV_OK;
213 }
214
215 PVRSRV_ERROR OSFreeMem_Debug_Wrapper(IMG_UINT32 ui32Flags,
216 IMG_UINT32 ui32Size,
217 IMG_PVOID pvCpuVAddr,
218 IMG_HANDLE hBlockAlloc,
219 IMG_CHAR *pszFilename,
220 IMG_UINT32 ui32Line)
221 {
222 OSMEM_DEBUG_INFO *psInfo;
223
224
225 OSCheckMemDebug(pvCpuVAddr, ui32Size, pszFilename, ui32Line);
226
227
228 OSMemSet(pvCpuVAddr, 0xBF, ui32Size + TEST_BUFFER_PADDING_AFTER);
229
230
231 psInfo = (OSMEM_DEBUG_INFO *)((IMG_UINT32) pvCpuVAddr - TEST_BUFFER_PADDING_STATUS);
232
233
234 psInfo->uSize = 0;
235 psInfo->uSizeParityCheck = 0;
236 psInfo->eValid = isFree;
237 psInfo->uLineNo = ui32Line;
238 debug_strcpy(psInfo->sFileName, pszFilename);
239
240 return OSFreeMem_Debug_Linux_Memory_Allocations(ui32Flags, ui32Size + TEST_BUFFER_PADDING, psInfo, hBlockAlloc, pszFilename, ui32Line);
241 }
242
243#if defined (__cplusplus)
244
245}
246#endif
247
248#endif
249
250#endif