;============================================================================
;  Name:
;    memalloc_hobwalk.cmm
;
;  Description:
;    Print memory allocation hobs
;
;
; 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-05-07   vk      Update infoblock address
;2015-15-04   vk      Support 64 bit addresses
;2015-02-12   bh      Change RD: to A:
;2015-01-27   bh      Use global variable from InitOffsets.cmm
;2014-03-02   vk      Add support for UefiBase 0x8020_0000
;2013-06-03   vk      Initial version
;============================================================================;

; ---------------------------------------------------------
; Script entry point
; ---------------------------------------------------------
  local &hobCountType2
  local &hobCountType3
  local &hobCountAll

  print "--------------------------"
  print "+ UEFI MemAlloc Hob Walk +"
  print "--------------------------"

  ;entry &UefiBase
  &UefiBase=0x9fc00000

  do ../InitOffsets.cmm

  gosub FindHobStartPtr &UefiBase
  entry &Hob_start_ptr

  if (&Hob_start_ptr==0)
  (
    &UefiBase=0x200000
    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"

      &UefiBase=0x4002800000
      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
      )
     )
  )

  &hobCountType2=0
  &hobCountType3=0
  &hobCountAll=0

  while (&Hob_start_ptr>0)
  (
    gosub print_hob &Hob_start_ptr
    entry &Hob_start_ptr
  )
  print "Count Type 2  = " %Decimal &hobCountType2
  print "Count Type 3  = " %Decimal &hobCountType3
  print "Count Type2/3 = " %Decimal &hobCountType2+&hobCountType3
  print "Count Total   = " %Decimal &hobCountAll

enddo

;
;  HOB Types
; -----------------------------------------
; EFI_HOB_TYPE_HANDOFF              0x0001
; EFI_HOB_TYPE_MEMORY_ALLOCATION    0x0002
; EFI_HOB_TYPE_RESOURCE_DESCRIPTOR  0x0003
; EFI_HOB_TYPE_GUID_EXTENSION       0x0004
; EFI_HOB_TYPE_FV                   0x0005
; EFI_HOB_TYPE_CPU                  0x0006
; EFI_HOB_TYPE_MEMORY_POOL          0x0007
; EFI_HOB_TYPE_FV2                  0x0009
; EFI_HOB_TYPE_LOAD_PEIM_UNUSED     0x000A
; EFI_HOB_TYPE_UEFI_CAPSULE         0x000B
; EFI_HOB_TYPE_UNUSED               0xFFFE
; EFI_HOB_TYPE_END_OF_HOB_LIST      0xFFFF
;
;
; Memory Type Enums
; ----------------------------------------
; EfiReservedMemoryType              0x0
; EfiLoaderCode                      0x1
; EfiLoaderData                      0x2
; EfiBootServicesCode                0x3
; EfiBootServicesData                0x4
; EfiRuntimeServicesCode             0x5
; EfiRuntimeServicesData             0x6
; EfiConventionalMemory              0x7
; EfiUnusableMemory                  0x8
; EfiACPIReclaimMemory               0x9
; EfiACPIMemoryNVS                   0xA
; EfiMemoryMappedIO                  0xB
; EfiMemoryMappedIOPortSpace         0xC
; EfiPalCode                         0xD
; EfiMaxMemoryType                   0xE
;
; 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 "
  &hobCountAll=&hobCountAll+1

  if (&hob_type==0x2)
  (
    &hobType2_Memory_Base_Addr=data.quad(RD:&Hob_ptr+18)
    &hobType2_Memory_Length=data.quad(RD:&Hob_ptr+20)
    &hobType2_Memory_Type=data.word(RD:&Hob_ptr+28)
    &hobCountType2=&hobCountType2+1
    print "   Type 2: MemBaseAddr   : 0x", FORMAT.HEX(16.,&hobType2_Memory_Base_Addr), " MemLength  : 0x", FORMAT.HEX(16.,&hobType2_Memory_Length), " MemType : &hobType2_Memory_Type"
  )

  if (&hob_type==0x3)
  (
    &hobType3_PhysicalStart=data.quad(RD:&Hob_ptr+20)
    &hobType3_ResourceLength=data.quad(RD:&Hob_ptr+28)
    &hobCountType3=&hobCountType3+1
    print "   Type 3: PhysicalStart : 0x", FORMAT.HEX(16.,&hobType3_PhysicalStart), " ResourceLen: 0x", FORMAT.HEX(16.,&hobType3_ResourceLength)
  )

  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

