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