]> git.proxmox.com Git - mirror_edk2.git/blame - ArmRealViewEbPkg/Debugger_scripts/EfiFuncs.inc
Remove ArmEbPkg and replace with ArmRealViewEbPkg. Ported ArmRealViewEbPkg to have...
[mirror_edk2.git] / ArmRealViewEbPkg / Debugger_scripts / EfiFuncs.inc
CommitLineData
afdfe8f0 1error=abort\r
2\r
3// NOTE: THIS MAY NEED TO BE ADJUSTED\r
4// change to reflect the total amount of ram in your system\r
5define /r GetMaxMem()\r
6{\r
7 return 0x10000000; // 256 MB\r
8}\r
9.\r
10\r
11define /r GetWord(Addr)\r
12{\r
13 unsigned long data;\r
14 \r
15 if( (Addr & 0x2) == 0 )\r
16 {\r
17 data = dword(Addr);\r
18 data = data & 0xffff;\r
19 //$printf "getword data is %x\n", data$;\r
20 return data;\r
21 }\r
22 else\r
23 {\r
24 data = dword(Addr & 0xfffffffc);\r
25 //data = data >> 16;\r
26 data = data / 0x10000;\r
27 //$printf "getword data is %x (1)\n", data$;\r
28 return data;\r
29 }\r
30}\r
31.\r
32\r
33define /r ProcessPE32(imgstart)\r
34unsigned long imgstart;\r
35{\r
36 unsigned long filehdrstart;\r
37 unsigned long debugdirentryrva;\r
38 unsigned long debugtype;\r
39 unsigned long debugrva;\r
40 unsigned long dwarfsig;\r
41 unsigned long baseofcode;\r
42 unsigned long baseofdata;\r
43 unsigned long elfbase;\r
44 char *elfpath;\r
45\r
46 $printf "PE32 image found at %x",imgstart$;\r
47\r
48 //$printf "PE file hdr offset %x",dword(imgstart+0x3C)$;\r
49\r
50 // offset from dos hdr to PE file hdr\r
51 filehdrstart = imgstart + dword(imgstart+0x3C);\r
52\r
53 // offset to debug dir in PE hdrs\r
54 //$printf "debug dir is at %x",(filehdrstart+0xA8)$;\r
55 debugdirentryrva = dword(filehdrstart + 0xA8);\r
56 if(debugdirentryrva == 0)\r
57 {\r
58 $printf "no debug dir for image at %x",imgstart$;\r
59 return;\r
60 }\r
61\r
62 //$printf "debug dir entry rva is %x",debugdirentryrva$;\r
63\r
64 debugtype = dword(imgstart + debugdirentryrva + 0xc);\r
65 if( (debugtype != 0xdf) && (debugtype != 0x2) )\r
66 {\r
67 $printf "debug type is not dwarf for image at %x",imgstart$;\r
68 $printf "debug type is %x",debugtype$;\r
69 return;\r
70 }\r
71 \r
72 debugrva = dword(imgstart + debugdirentryrva + 0x14);\r
73 dwarfsig = dword(imgstart + debugrva);\r
74 if(dwarfsig != 0x66727764)\r
75 {\r
76 $printf "dwarf debug signature not found for image at %x",imgstart$;\r
77 return;\r
78 }\r
79\r
80 elfpath = (char *)(imgstart + debugrva + 0xc);\r
81\r
82 baseofcode = imgstart + dword(filehdrstart + 0x28);\r
83 baseofdata = imgstart + dword(filehdrstart + 0x2c);\r
84 \r
85 if( (baseofcode < baseofdata) && (baseofcode != 0) )\r
86 {\r
87 elfbase = baseofcode;\r
88 }\r
89 else\r
90 {\r
91 elfbase = baseofdata;\r
92 }\r
93\r
94 $printf "found path %s",elfpath$;\r
95 $fprintf 50, "load /ni /np /a %s &0x%x\n",elfpath,elfbase$;\r
96}\r
97.\r
98\r
99define /r ProcessTE(imgstart)\r
100unsigned long imgstart;\r
101{\r
102 unsigned long strippedsize;\r
103 unsigned long debugdirentryrva;\r
104 unsigned long debugtype;\r
105 unsigned long debugrva;\r
106 unsigned long dwarfsig;\r
107 unsigned long elfbase;\r
108 char *elfpath;\r
109\r
110 $printf "TE image found at %x",imgstart$;\r
111\r
112 // determine pe header bytes removed to account for in rva references\r
113 //strippedsize = word(imgstart + 0x6);\r
114 //strippedsize = (dword(imgstart + 0x4) & 0xffff0000) >> 16;\r
115 strippedsize = (dword(imgstart + 0x4) & 0xffff0000) / 0x10000;\r
116 strippedsize = strippedsize - 0x28;\r
117\r
118 debugdirentryrva = dword(imgstart + 0x20);\r
119 if(debugdirentryrva == 0)\r
120 {\r
121 $printf "no debug dir for image at %x",imgstart$;\r
122 return;\r
123 }\r
124 debugdirentryrva = debugdirentryrva - strippedsize;\r
125\r
126 //$printf "debug dir entry rva is %x",debugdirentryrva$;\r
127\r
128 debugtype = dword(imgstart + debugdirentryrva + 0xc);\r
129 if( (debugtype != 0xdf) && (debugtype != 0x2) )\r
130 {\r
131 $printf "debug type is not dwarf for image at %x",imgstart$;\r
132 $printf "debug type is %x",debugtype$;\r
133 return;\r
134 }\r
135 \r
136 debugrva = dword(imgstart + debugdirentryrva + 0x14);\r
137 debugrva = debugrva - strippedsize;\r
138 dwarfsig = dword(imgstart + debugrva);\r
139 if( (dwarfsig != 0x66727764) && (dwarfsig != 0x3031424e) )\r
140 {\r
141 $printf "dwarf debug signature not found for image at %x",imgstart$;\r
142 $printf "found %x", dwarfsig$;\r
143 return;\r
144 }\r
145 \r
146 if( dwarfsig == 0x66727764 )\r
147 {\r
148 elfpath = (char *)(imgstart + debugrva + 0xc);\r
149 $printf "looking for elf path at 0x%x", elfpath$; \r
150 }\r
151 else \r
152 {\r
153 elfpath = (char *)(imgstart + debugrva + 0x10);\r
154 $printf "looking for elf path at 0x%x", elfpath$; \r
155 }\r
156\r
157 // elf base is baseofcode (we hope that for TE images it's not baseofdata)\r
158 elfbase = imgstart + dword(imgstart + 0xc) - strippedsize;\r
159\r
160 $printf "found path %s",elfpath$;\r
161 $fprintf 50, "load /ni /np /a %s &0x%x\n",elfpath,elfbase$;\r
162}\r
163.\r
164\r
165define /r ProcessFvSection(secstart)\r
166unsigned long secstart;\r
167{\r
168 unsigned long sectionsize;\r
169 unsigned char sectiontype;\r
170\r
171 sectionsize = dword(secstart);\r
172 //sectiontype = (sectionsize & 0xff000000) >> 24;\r
173 sectiontype = (sectionsize & 0xff000000) / 0x1000000;\r
174 sectionsize = sectionsize & 0x00ffffff;\r
175\r
176 $printf "fv section at %x size %x type %x",secstart,sectionsize,sectiontype$;\r
177\r
178 if(sectiontype == 0x10) // PE32\r
179 {\r
180 ProcessPE32(secstart+0x4);\r
181 }\r
182 else if(sectiontype == 0x12) // TE\r
183 {\r
184 ProcessTE(secstart+0x4); \r
185 }\r
186}\r
187.\r
188\r
189define /r ProcessFfsFile(ffsfilestart)\r
190unsigned long ffsfilestart;\r
191{\r
192 unsigned long ffsfilesize;\r
193 unsigned long ffsfiletype;\r
194 unsigned long secoffset;\r
195 unsigned long secsize;\r
196\r
197 //ffsfiletype = byte(ffsfilestart + 0x12);\r
198 ffsfilesize = dword(ffsfilestart + 0x14);\r
199 //ffsfiletype = (ffsfilesize & 0xff000000) >> 24;\r
200 ffsfiletype = (ffsfilesize & 0xff000000) / 0x1000000;\r
201 ffsfilesize = ffsfilesize & 0x00ffffff;\r
202\r
203 if(ffsfiletype == 0xff) return;\r
204\r
205 $printf "ffs file at %x size %x type %x",ffsfilestart,ffsfilesize,ffsfiletype$;\r
206\r
207 secoffset = ffsfilestart + 0x18;\r
208\r
209 // loop through sections in file\r
210 while(secoffset < (ffsfilestart + ffsfilesize))\r
211 {\r
212 // process fv section and increment section offset by size\r
213 secsize = dword(secoffset) & 0x00ffffff;\r
214 ProcessFvSection(secoffset);\r
215 secoffset = secoffset + secsize;\r
216\r
217 // align to next 4 byte boundary\r
218 if( (secoffset & 0x3) != 0 )\r
219 {\r
220 secoffset = secoffset + (0x4 - (secoffset & 0x3));\r
221 }\r
222 } // end section loop\r
223}\r
224.\r
225\r
226define /r LoadPeiSec()\r
227{\r
228 unsigned long fvbase;\r
229 unsigned long fvlen;\r
230 unsigned long fvsig;\r
231 unsigned long ffsoffset;\r
232 unsigned long ffsfilesize;\r
233\r
234 fvbase = FindFv();\r
235 $printf "fvbase %x",fvbase$;\r
236\r
237 // get fv signature field\r
238 fvsig = dword(fvbase + 0x28);\r
239 if(fvsig != 0x4856465F)\r
240 {\r
241 $printf "FV does not have proper signature, exiting"$;\r
242 return 0;\r
243 }\r
244\r
245 $printf "FV signature found"$;\r
246\r
247 $fopen 50, 'C:\loadfiles.inc'$;\r
248\r
249 fvlen = dword(fvbase + 0x20);\r
250 \r
251 // first ffs file is after fv header, use headerlength field\r
252 //ffsoffset = (dword(fvbase + 0x30) & 0xffff0000) >> 16;\r
253 ffsoffset = (dword(fvbase + 0x30) & 0xffff0000) / 0x10000;\r
254 ffsoffset = fvbase + GetWord(fvbase + 0x30);\r
255\r
256 // loop through ffs files\r
257 while(ffsoffset < (fvbase+fvlen))\r
258 {\r
259 // process ffs file and increment by ffs file size field\r
260 ProcessFfsFile(ffsoffset); \r
261 ffsfilesize = (dword(ffsoffset + 0x14) & 0x00ffffff);\r
262 if(ffsfilesize == 0)\r
263 {\r
264 break;\r
265 }\r
266 ffsoffset = ffsoffset + ffsfilesize;\r
267 \r
268\r
269 // align to next 8 byte boundary\r
270 if( (ffsoffset & 0x7) != 0 )\r
271 {\r
272 ffsoffset = ffsoffset + (0x8 - (ffsoffset & 0x7));\r
273 }\r
274 \r
275 } // end fv ffs loop\r
276\r
277 $vclose 50$;\r
278\r
279}\r
280.\r
281\r
282define /r FindSystemTable(TopOfRam)\r
283unsigned long TopOfRam;\r
284{\r
285 unsigned long offset;\r
286 \r
287 $printf "FindSystemTable"$;\r
288 $printf "top of mem is %x",TopOfRam$;\r
289 \r
290 offset = TopOfRam;\r
291 \r
292 // align to highest 4MB boundary\r
293 offset = offset & 0xFFC00000;\r
294 \r
295 // start at top and look on 4MB boundaries for system table ptr structure\r
296 while(offset > 0)\r
297 {\r
298 //$printf "checking %x",offset$;\r
299 //$printf "value is %x",dword(offset)$;\r
300 \r
301 // low signature match\r
302 if(dword(offset) == 0x20494249)\r
303 {\r
304 // high signature match\r
305 if(dword(offset+4) == 0x54535953)\r
306 {\r
307 // less than 4GB?\r
308 if(dword(offset+0x0c) == 0)\r
309 {\r
310 // less than top of ram?\r
311 if(dword(offset+8) < TopOfRam)\r
312 {\r
313 return(dword(offset+8));\r
314 }\r
315 }\r
316 }\r
317 \r
318 }\r
319 \r
320 if(offset < 0x400000) break;\r
321 offset = offset - 0x400000; \r
322 }\r
323 \r
324 return 0;\r
325}\r
326.\r
327\r
328define /r ProcessImage(ImageBase)\r
329unsigned long ImageBase;\r
330{\r
331 $printf "ProcessImage %x", ImageBase$;\r
332}\r
333.\r
334\r
335define /r FindDebugInfo(SystemTable)\r
336unsigned long SystemTable;\r
337{\r
338 unsigned long CfgTableEntries;\r
339 unsigned long ConfigTable;\r
340 unsigned long i;\r
341 unsigned long offset;\r
342 unsigned long dbghdr;\r
343 unsigned long dbgentries;\r
344 unsigned long dbgptr;\r
345 unsigned long dbginfo;\r
346 unsigned long loadedimg;\r
347 \r
348 $printf "FindDebugInfo"$;\r
349 \r
350 dbgentries = 0;\r
351 CfgTableEntries = dword(SystemTable + 0x40);\r
352 ConfigTable = dword(SystemTable + 0x44);\r
353 \r
354 $printf "config table is at %x (%d entries)", ConfigTable, CfgTableEntries$;\r
355 \r
356 // now search for debug info entry with guid 49152E77-1ADA-4764-B7A2-7AFEFED95E8B\r
357 // 0x49152E77 0x47641ADA 0xFE7AA2B7 0x8B5ED9FE\r
358 for(i=0; i<CfgTableEntries; i++)\r
359 {\r
360 offset = ConfigTable + (i*0x14);\r
361 if(dword(offset) == 0x49152E77)\r
362 {\r
363 if(dword(offset+4) == 0x47641ADA)\r
364 {\r
365 if(dword(offset+8) == 0xFE7AA2B7)\r
366 {\r
367 if(dword(offset+0xc) == 0x8B5ED9FE)\r
368 {\r
369 dbghdr = dword(offset+0x10);\r
370 dbgentries = dword(dbghdr + 4);\r
371 dbgptr = dword(dbghdr + 8);\r
372 }\r
373 }\r
374 }\r
375 }\r
376 }\r
377 \r
378 if(dbgentries == 0)\r
379 {\r
380 $printf "no debug entries found"$;\r
381 return;\r
382 }\r
383 \r
384 $printf "debug table at %x (%d entries)", dbgptr, dbgentries$;\r
385 \r
386 for(i=0; i<dbgentries; i++)\r
387 {\r
388 dbginfo = dword(dbgptr + (i*4));\r
389 if(dbginfo != 0)\r
390 {\r
391 if(dword(dbginfo) == 1) // normal debug info type\r
392 {\r
393 loadedimg = dword(dbginfo + 4);\r
394 ProcessPE32(dword(loadedimg + 0x20));\r
395 }\r
396 }\r
397 }\r
398}\r
399.\r
400\r
401define /r LoadDxe()\r
402{\r
403 unsigned long maxmem;\r
404 unsigned long systbl;\r
405 \r
406 $printf "LoadDxe"$;\r
407 \r
408 $fopen 50, 'C:\loadfiles.inc'$;\r
409 \r
410 maxmem = GetMaxMem();\r
411 systbl = FindSystemTable(maxmem);\r
412 if(systbl != 0)\r
413 {\r
414 $printf "found system table at %x",systbl$;\r
415 FindDebugInfo(systbl);\r
416 }\r
417 \r
418 $vclose 50$;\r
419}\r
420.\r
421\r
422define /r LoadRuntimeDxe()\r
423\r
424{\r
425 unsigned long maxmem;\r
426 unsigned long SystemTable;\r
427 unsigned long CfgTableEntries;\r
428 unsigned long ConfigTable;\r
429 unsigned long i;\r
430 unsigned long offset;\r
431 unsigned long numentries;\r
432 unsigned long RuntimeDebugInfo;\r
433 unsigned long DebugInfoOffset;\r
434 unsigned long imgbase;\r
435 \r
436 $printf "LoadRuntimeDxe"$;\r
437 \r
438 $fopen 50, 'C:\loadfiles.inc'$;\r
439 \r
440 RuntimeDebugInfo = 0x80000010;\r
441 \r
442 if(RuntimeDebugInfo != 0)\r
443 {\r
444 numentries = dword(RuntimeDebugInfo);\r
445 \r
446 $printf "runtime debug info is at %x (%d entries)", RuntimeDebugInfo, numentries$;\r
447 \r
448 DebugInfoOffset = RuntimeDebugInfo + 0x4;\r
449 for(i=0; i<numentries; i++)\r
450 {\r
451 imgbase = dword(DebugInfoOffset);\r
452 if(imgbase != 0)\r
453 {\r
454 $printf "found image at %x",imgbase$;\r
455 ProcessPE32(imgbase);\r
456 }\r
457 DebugInfoOffset = DebugInfoOffset + 0x4;\r
458 }\r
459 }\r
460 \r
461 $vclose 50$;\r
462}\r
463.\r