;
; 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
