blob: 8ec1ac4bf321296131caf6c0caa120284355e245 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
;
; Copyright (c) 2011, Hewlett-Packard Company. All rights reserved.<BR>
;
; This program and the accompanying materials
; are licensed and made available under the terms and conditions of the BSD License
; which accompanies this distribution. The full text of the license may be found at
; http://opensource.org/licenses/bsd-license.php
;
; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
;
LOCAL &maxmem &systbl &memsize
&memsize=0x20000000 ; default to 512MB
gosub FindSystemTable &memsize
ENTRY &systbl
if &systbl!=0
(
print "found system table at &systbl"
gosub FindDebugInfo &systbl
)
else
(
print "ERROR: system table not found, check memory size"
)
enddo
FindSystemTable:
LOCAL &TopOfRam &offset
ENTRY &TopOfRam
print "FindSystemTable"
print "top of mem is &TopOfRam$"
&offset=&TopOfRam
; align to highest 4MB boundary
&offset=&offset&0xFFC00000
; start at top and look on 4MB boundaries for system table ptr structure
while &offset>0
(
; low signature match
if Data.Long(a:&offset)==0x20494249
(
; high signature match
if Data.Long(a:&offset+4)==0x54535953
(
; less than 4GB?
if Data.Long(a:&offset+0x0c)==0
(
; less than top of ram?
if Data.Long(a:&offset+8)<&TopOfRam
(
return Data.Long(a:&offset+8)
)
)
)
)
if &offset<0x400000
(
return 0
)
&offset=&offset-0x400000
)
return 0
FindDebugInfo:
LOCAL &SystemTable &CfgTableEntries &ConfigTable &i &offset &dbghdr &dbgentries &dbgptr &dbginfo &loadedimg
ENTRY &SystemTable
print "FindDebugInfo"
&dbgentries=0
&CfgTableEntries=Data.Long(a:&SystemTable+0x40)
&ConfigTable=Data.Long(a:&SystemTable+0x44)
print "config table is at &ConfigTable (&CfgTableEntries entries)"
; now search for debug info entry with guid 49152E77-1ADA-4764-B7A2-7AFEFED95E8B
; 0x49152E77 0x47641ADA 0xFE7AA2B7 0x8B5ED9FE
&i=0
while &i<&CfgTableEntries
(
&offset=&ConfigTable+(&i*0x14)
if Data.Long(a:&offset)==0x49152E77
(
if Data.Long(a:&offset+4)==0x47641ADA
(
if Data.Long(a:&offset+8)==0xFE7AA2B7
(
if Data.Long(a:&offset+0xc)==0x8B5ED9FE
(
&dbghdr=Data.Long(a:&offset+0x10)
&dbgentries=Data.Long(a:&dbghdr+4)
&dbgptr=Data.Long(a:&dbghdr+8)
)
)
)
)
&i=&i+1
)
if &dbgentries==0
(
print "no debug entries found"
return
)
print "debug table at &dbgptr (&dbgentries entries)"
symbol.reset
&i=0
while &i<&dbgentries
(
&dbginfo=Data.Long(a:&dbgptr+(&i*4))
if &dbginfo!=0
(
if Data.Long(a:&dbginfo)==1 ; normal debug info type
(
&loadedimg=Data.Long(a:&dbginfo+4)
do EfiProcessPeImage Data.Long(a:&loadedimg+0x20)
)
)
&i=&i+1
)
return
|