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