]>
Commit | Line | Data |
---|---|---|
98790d81 | 1 | ;\r |
2 | ; Copyright (c) 2011, Hewlett-Packard Company. All rights reserved.<BR>\r | |
3 | ; \r | |
878b807a | 4 | ; SPDX-License-Identifier: BSD-2-Clause-Patent\r |
98790d81 | 5 | ; \r |
6 | \r | |
7 | LOCAL &maxmem &systbl &memsize\r | |
8 | \r | |
9 | &memsize=0x20000000 ; default to 512MB\r | |
10 | \r | |
11 | gosub FindSystemTable &memsize\r | |
12 | ENTRY &systbl\r | |
13 | \r | |
14 | if &systbl!=0\r | |
15 | (\r | |
16 | print "found system table at &systbl"\r | |
17 | gosub FindDebugInfo &systbl\r | |
18 | )\r | |
19 | else\r | |
20 | (\r | |
21 | print "ERROR: system table not found, check memory size"\r | |
22 | )\r | |
23 | enddo\r | |
24 | \r | |
25 | FindSystemTable:\r | |
26 | LOCAL &TopOfRam &offset\r | |
27 | ENTRY &TopOfRam\r | |
28 | \r | |
29 | print "FindSystemTable"\r | |
30 | print "top of mem is &TopOfRam$"\r | |
31 | \r | |
32 | &offset=&TopOfRam\r | |
33 | \r | |
34 | ; align to highest 4MB boundary\r | |
35 | &offset=&offset&0xFFC00000\r | |
36 | \r | |
37 | ; start at top and look on 4MB boundaries for system table ptr structure\r | |
38 | while &offset>0\r | |
39 | (\r | |
40 | ; low signature match\r | |
41 | if Data.Long(a:&offset)==0x20494249\r | |
42 | (\r | |
43 | ; high signature match\r | |
44 | if Data.Long(a:&offset+4)==0x54535953\r | |
45 | (\r | |
46 | ; less than 4GB?\r | |
47 | if Data.Long(a:&offset+0x0c)==0\r | |
48 | (\r | |
49 | ; less than top of ram?\r | |
50 | if Data.Long(a:&offset+8)<&TopOfRam\r | |
51 | (\r | |
52 | return Data.Long(a:&offset+8)\r | |
53 | )\r | |
54 | )\r | |
55 | )\r | |
56 | )\r | |
57 | \r | |
58 | if &offset<0x400000\r | |
59 | (\r | |
60 | return 0\r | |
61 | )\r | |
62 | &offset=&offset-0x400000\r | |
63 | )\r | |
64 | \r | |
65 | return 0\r | |
66 | \r | |
67 | \r | |
68 | FindDebugInfo:\r | |
69 | LOCAL &SystemTable &CfgTableEntries &ConfigTable &i &offset &dbghdr &dbgentries &dbgptr &dbginfo &loadedimg\r | |
70 | ENTRY &SystemTable\r | |
71 | \r | |
72 | print "FindDebugInfo"\r | |
73 | \r | |
74 | &dbgentries=0\r | |
75 | &CfgTableEntries=Data.Long(a:&SystemTable+0x40)\r | |
76 | &ConfigTable=Data.Long(a:&SystemTable+0x44)\r | |
77 | \r | |
78 | print "config table is at &ConfigTable (&CfgTableEntries entries)"\r | |
79 | \r | |
80 | ; now search for debug info entry with guid 49152E77-1ADA-4764-B7A2-7AFEFED95E8B\r | |
81 | ; 0x49152E77 0x47641ADA 0xFE7AA2B7 0x8B5ED9FE\r | |
82 | &i=0\r | |
83 | while &i<&CfgTableEntries\r | |
84 | (\r | |
85 | &offset=&ConfigTable+(&i*0x14)\r | |
86 | if Data.Long(a:&offset)==0x49152E77\r | |
87 | (\r | |
88 | if Data.Long(a:&offset+4)==0x47641ADA\r | |
89 | (\r | |
90 | if Data.Long(a:&offset+8)==0xFE7AA2B7\r | |
91 | (\r | |
92 | if Data.Long(a:&offset+0xc)==0x8B5ED9FE\r | |
93 | (\r | |
94 | &dbghdr=Data.Long(a:&offset+0x10)\r | |
95 | &dbgentries=Data.Long(a:&dbghdr+4)\r | |
96 | &dbgptr=Data.Long(a:&dbghdr+8)\r | |
97 | )\r | |
98 | )\r | |
99 | )\r | |
100 | )\r | |
101 | \r | |
102 | &i=&i+1\r | |
103 | )\r | |
104 | \r | |
105 | if &dbgentries==0\r | |
106 | (\r | |
107 | print "no debug entries found"\r | |
108 | return\r | |
109 | )\r | |
110 | \r | |
111 | print "debug table at &dbgptr (&dbgentries entries)"\r | |
112 | \r | |
113 | symbol.reset\r | |
114 | \r | |
115 | &i=0\r | |
116 | while &i<&dbgentries\r | |
117 | (\r | |
118 | &dbginfo=Data.Long(a:&dbgptr+(&i*4))\r | |
119 | if &dbginfo!=0\r | |
120 | (\r | |
121 | if Data.Long(a:&dbginfo)==1 ; normal debug info type\r | |
122 | (\r | |
123 | &loadedimg=Data.Long(a:&dbginfo+4)\r | |
124 | do EfiProcessPeImage Data.Long(a:&loadedimg+0x20)\r | |
125 | )\r | |
126 | )\r | |
127 | &i=&i+1\r | |
128 | )\r | |
129 | return\r |