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