/**@file

Copyright (c) 2006 - 2009, Intel Corporation. All rights reserved.<BR>
Portions copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>
Portions copyright (c) 2011 - 2012, ARM Ltd. All rights reserved.<BR>

SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#include <PiDxe.h>
#include <Library/PeCoffLib.h>

#include <Library/BaseLib.h>
#include <Library/DebugLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/PeCoffExtraActionLib.h>
#include <Library/PrintLib.h>

/**
  Performs additional actions after a PE/COFF image has been loaded and relocated.

  If ImageContext is NULL, then ASSERT().

  @param  ImageContext  Pointer to the image context structure that describes the
                        PE/COFF image that has already been loaded and relocated.

**/
VOID
EFIAPI
PeCoffLoaderRelocateImageExtraAction (
  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext
  )
{
#ifdef __GNUC__
  if (ImageContext->PdbPointer) {
    DEBUG ((
      DEBUG_LOAD | DEBUG_INFO,
      "add-symbol-file %a 0x%p\n",
      ImageContext->PdbPointer,
      (UINTN)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders)
      ));
    return;
  }
#endif

  DEBUG ((
    DEBUG_LOAD | DEBUG_INFO,
    "Loading driver at 0x%11p EntryPoint=0x%11p\n",
    (VOID *)(UINTN)ImageContext->ImageAddress,
    FUNCTION_ENTRY_POINT (ImageContext->EntryPoint)
    ));
}

/**
  Performs additional actions just before a PE/COFF image is unloaded.  Any resources
  that were allocated by PeCoffLoaderRelocateImageExtraAction() must be freed.

  If ImageContext is NULL, then ASSERT().

  @param  ImageContext  Pointer to the image context structure that describes the
                        PE/COFF image that is being unloaded.

**/
VOID
EFIAPI
PeCoffLoaderUnloadImageExtraAction (
  IN OUT PE_COFF_LOADER_IMAGE_CONTEXT  *ImageContext
  )
{
#ifdef __GNUC__
  if (ImageContext->PdbPointer) {
    DEBUG ((
      DEBUG_LOAD | DEBUG_INFO,
      "remove-symbol-file %a 0x%08x\n",
      ImageContext->PdbPointer,
      (UINTN)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders)
      ));
    return;
  }
#endif

  DEBUG ((
    DEBUG_LOAD | DEBUG_INFO,
    "Unloading driver at 0x%11p\n",
    (VOID *)(UINTN)ImageContext->ImageAddress
    ));
}
