;
; Copyright (c) 2024, Ampere Computing LLC. All rights reserved.
; Copyright (c) 2011, Hewlett-Packard Company. All rights reserved.
; 
; SPDX-License-Identifier: BSD-2-Clause-Patent
; 
  PARAMETERS &systbl
  gosub FindDebugInfo &systbl
  enddo
FindDebugInfo:
  LOCAL   &SystemTable &CfgTableEntries &ConfigTable &i &offset &dbghdr &dbgentries &dbgptr &dbginfo &loadedimg
  ENTRY   &SystemTable
  
  &dbgentries=0
  &CfgTableEntries=Data.Long(a:&SystemTable+0x68)
  &ConfigTable=Data.Long(a:&SystemTable+0x70)
  
  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*0x18)
    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+8)
        &imagebaseptr=&loadedimg+0x40
        &imagebase=Data.Long(a:&imagebaseptr)
        do ~~~~/EfiProcessPeImage.cmm "&imagebase"
      )
    )
    &i=&i+1
  )
  return