mirror of https://github.com/acidanthera/audk.git
136 lines
3.3 KiB
Plaintext
136 lines
3.3 KiB
Plaintext
;
|
|
; 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
|