130 lines
2.6 KiB
Text
130 lines
2.6 KiB
Text
|
;
|
||
|
; Copyright (c) 2011, Hewlett-Packard Company. All rights reserved.<BR>
|
||
|
;
|
||
|
; SPDX-License-Identifier: BSD-2-Clause-Patent
|
||
|
;
|
||
|
|
||
|
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
|