;============================================================================
;  Name:
;    hob_walk.cmm
;
;  Description:
;
;
; Copyright (c) 2012-2016,2018 Qualcomm Technologies, Inc.
; All Rights Reserved.
; Qualcomm Technologies Proprietary and Confidential.
;
;----------------------------------------------------------------------------
;============================================================================
;
;                        EDIT HISTORY FOR MODULE
;
;
;
;when         who     what, where, why
;----------   ---     ----------------------------------------------------------
;2018-07-02   yg      Revert A: to RD: get correct data through caches
;2016-03-17   bh      Update offset
;2015-02-12   bh      Change RD: to A:
;2015-01-27   bh      Use global variable from InitOffsets.cmm
;2014-12-14   vk      Update offset
;2014-03-02   vk      Add support for UefiBase 0x8020_0000
;2013-06-03   vk      Initial version
;============================================================================;

; ---------------------------------------------------------
; Script entry point
; ---------------------------------------------------------

  ;entry &UefiBase
  &UefiBase=0x9fc00000

  do ../InitOffsets.cmm

  gosub FindHobStartPtr &UefiBase
  entry &Hob_start_ptr

  if (&Hob_start_ptr==0)
  (
    PRINT %ERROR "Unable to locate UEFI Info Block with ref to the Base Addr : &UefiBase"
    END
  )


  print "-----------"
  print " HOB Walk  "
  print "-----------"
  print "EFI_HOB_TYPE_HANDOFF              0x0001"
  print "EFI_HOB_TYPE_MEMORY_ALLOCATION    0x0002"
  print "EFI_HOB_TYPE_RESOURCE_DESCRIPTOR  0x0003"
  print "EFI_HOB_TYPE_GUID_EXTENSION       0x0004"
  print "EFI_HOB_TYPE_FV                   0x0005"
  print "EFI_HOB_TYPE_CPU                  0x0006"
  print "EFI_HOB_TYPE_MEMORY_POOL          0x0007"
  print "EFI_HOB_TYPE_FV2                  0x0009"
  print "EFI_HOB_TYPE_LOAD_PEIM_UNUSED     0x000A"
  print "EFI_HOB_TYPE_UEFI_CAPSULE         0x000B"
  print "EFI_HOB_TYPE_UNUSED               0xFFFE"
  print "EFI_HOB_TYPE_END_OF_HOB_LIST      0xFFFF"

  while (&Hob_start_ptr>0)
  (
    gosub print_hob &Hob_start_ptr
    entry &Hob_start_ptr
  )
enddo

; ---------------------------------------------------------
; print hob and return next hob pointer, null if end of it
; ---------------------------------------------------------
print_hob:
  entry &Hob_ptr

  local &hob_type
  local &hob_size
  local &next_hob

  &next_hob=0

  &hob_type=data.word(RD:&Hob_ptr)

  &hob_size=data.word(RD:&Hob_ptr+2)

  print "Addr : &Hob_ptr Hob Type : &hob_type Hob Size : &hob_size"

  if (&hob_type==0xFFFF)
  (
    &next_hob=&Hob_ptr+&hob_size
  )

  if (&hob_size==0)
    return 0

  if (&hob_type!=0xFFFF)
  (
    &next_hob=&Hob_ptr+&hob_size
  )

return &next_hob

enddo



;---------------------------------------------------
; FindHobStartPtr
;---------------------------------------------------
FindHobStartPtr:
  ENTRY &UefiBase
  ;&UefiBase is the base of FD
  &InfoBlkPtrOffset=0x003FF000
  if (os.file("../oem_infblk.cmm"))
  (
    do ../oem_infblk.cmm
  )
  &InfoBlkAddr=&UefiBase+&InfoBlkPtrOffset

  ;Read signature and verify
  &Sig=data.long(RD:&InfoBlkAddr)

  ;Check signature before dereference
  if (&Sig!=0x6B6C4249)
  (
    PRINT "Unable to locate UEFI Info Block with ref to the Base Addr : &InfoBlkAddr"
    &HobStartPtr=0
    RETURN &HobStartPtr
  )
  else
  (
    PRINT "InfoBlock Signature OK"
  )

  &HobStartPtr=data.long(RD:&InfoBlkAddr+&IBlkHobBaseOffset)

RETURN &HobStartPtr
