text: /** @file
    Master header file for DxeIpl PEIM. All source files in this module should
    include this file for common definitions.
  
  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent
  
  **/
  
  #ifndef __PEI_DXEIPL_H__
  #define __PEI_DXEIPL_H__
  
  #include <PiPei.h>
  #include <Ppi/DxeIpl.h>
  #include <Ppi/EndOfPeiPhase.h>
  #include <Ppi/MemoryDiscovered.h>
  #include <Ppi/ReadOnlyVariable2.h>
  #include <Ppi/Decompress.h>
  #include <Ppi/FirmwareVolumeInfo.h>
  #include <Ppi/GuidedSectionExtraction.h>
  #include <Ppi/LoadFile.h>
  #include <Ppi/S3Resume2.h>
  #include <Ppi/RecoveryModule.h>
  #include <Ppi/VectorHandoffInfo.h>
  
  #include <Guid/MemoryTypeInformation.h>
  #include <Guid/MemoryAllocationHob.h>
  #include <Guid/FirmwareFileSystem2.h>
  
  #include <Library/DebugLib.h>
  #include <Library/PeimEntryPoint.h>
  #include <Library/BaseLib.h>
  #include <Library/HobLib.h>
  #include <Library/PeiServicesLib.h>
  #include <Library/ReportStatusCodeLib.h>
  #include <Library/UefiDecompressLib.h>
  #include <Library/ExtractGuidedSectionLib.h>
  #include <Library/BaseMemoryLib.h>
  #include <Library/MemoryAllocationLib.h>
  #include <Library/PcdLib.h>
  #include <Library/S3Lib.h>
  #include <Library/RecoveryLib.h>
  #include <Library/DebugAgentLib.h>
  #include <Library/PeiServicesTablePointerLib.h>
  #include <Library/PerformanceLib.h>
  
  #define STACK_SIZE      0x20000
  #define BSP_STORE_SIZE  0x4000
  
  
  //
  // This PPI is installed to indicate the end of the PEI usage of memory
  //
  extern CONST EFI_PEI_PPI_DESCRIPTOR gEndOfPeiSignalPpi;
  
  /**
     This function installs the PPIs that require permanent memory.
  
     @param  PeiServices      Indirect reference to the PEI Services Table.
     @param  NotifyDescriptor Address of the notification descriptor data structure.
     @param  Ppi              Address of the PPI that was installed.
  
     @return EFI_SUCCESS      The PPIs were installed successfully.
     @return Others           Some error occurs during the execution of this function.
  
  **/
  EFI_STATUS
  EFIAPI
  InstallIplPermanentMemoryPpis (
    IN EFI_PEI_SERVICES           **PeiServices,
    IN EFI_PEI_NOTIFY_DESCRIPTOR  *NotifyDescriptor,
    IN VOID                       *Ppi
    );
  
  /**
     Searches DxeCore in all firmware Volumes and loads the first
     instance that contains DxeCore.
  
     @return FileHandle of DxeCore to load DxeCore.
  
  **/
  EFI_PEI_FILE_HANDLE
  DxeIplFindDxeCore (
    VOID
    );
  
  
  /**
     Main entry point to last PEIM
  
     @param This          Entry point for DXE IPL PPI
     @param PeiServices   General purpose services available to every PEIM.
     @param HobList       Address to the Pei HOB list
  
     @return EFI_SUCCESS              DXE core was successfully loaded.
     @return EFI_OUT_OF_RESOURCES     There are not enough resources to load DXE core.
  
  **/
  EFI_STATUS
  EFIAPI
  DxeLoadCore (
    IN CONST EFI_DXE_IPL_PPI *This,
    IN EFI_PEI_SERVICES      **PeiServices,
    IN EFI_PEI_HOB_POINTERS  HobList
    );
  
  
  
  /**
     Transfers control to DxeCore.
  
     This function performs a CPU architecture specific operations to execute
     the entry point of DxeCore with the parameters of HobList.
     It also installs EFI_END_OF_PEI_PPI to signal the end of PEI phase.
  
     @param DxeCoreEntryPoint         The entry point of DxeCore.
     @param HobList                   The start of HobList passed to DxeCore.
  
  **/
  VOID
  HandOffToDxeCore (
    IN EFI_PHYSICAL_ADDRESS   DxeCoreEntryPoint,
    IN EFI_PEI_HOB_POINTERS   HobList
    );
  
  
  
  /**
     Updates the Stack HOB passed to DXE phase.
  
     This function traverses the whole HOB list and update the stack HOB to
     reflect the real stack that is used by DXE core.
  
     @param BaseAddress           The lower address of stack used by DxeCore.
     @param Length                The length of stack used by DxeCore.
  
  **/
  VOID
  UpdateStackHob (
    IN EFI_PHYSICAL_ADDRESS        BaseAddress,
    IN UINT64                      Length
    );
  
  /**
    The ExtractSection() function processes the input section and
    returns a pointer to the section contents. If the section being
    extracted does not require processing (if the section
    GuidedSectionHeader.Attributes has the
    EFI_GUIDED_SECTION_PROCESSING_REQUIRED field cleared), then
    OutputBuffer is just updated to point to the start of the
    section's contents. Otherwise, *Buffer must be allocated
    from PEI permanent memory.
  
    @param This                   Indicates the
                                  EFI_PEI_GUIDED_SECTION_EXTRACTION_PPI instance.
                                  Buffer containing the input GUIDed section to be
                                  processed. OutputBuffer OutputBuffer is
                                  allocated from PEI permanent memory and contains
                                  the new section stream.
    @param InputSection           A pointer to the input buffer, which contains
                                  the input section to be processed.
    @param OutputBuffer           A pointer to a caller-allocated buffer, whose
                                  size is specified by the contents of OutputSize.
    @param OutputSize             A pointer to a caller-allocated
                                  UINTN in which the size of *OutputBuffer
                                  allocation is stored. If the function
                                  returns anything other than EFI_SUCCESS,
                                  the value of OutputSize is undefined.
    @param AuthenticationStatus   A pointer to a caller-allocated
                                  UINT32 that indicates the
                                  authentication status of the
                                  output buffer. If the input
                                  section's GuidedSectionHeader.
                                  Attributes field has the
                                  EFI_GUIDED_SECTION_AUTH_STATUS_VALID
                                  bit as clear,
                                  AuthenticationStatus must return
                                  zero. These bits reflect the
                                  status of the extraction
                                  operation. If the function
                                  returns anything other than
                                  EFI_SUCCESS, the value of
                                  AuthenticationStatus is
                                  undefined.
  
    @retval EFI_SUCCESS           The InputSection was
                                  successfully processed and the
                                  section contents were returned.
  
    @retval EFI_OUT_OF_RESOURCES  The system has insufficient
                                  resources to process the request.
  
    @retval EFI_INVALID_PARAMETER The GUID in InputSection does
                                  not match this instance of the
                                  GUIDed Section Extraction PPI.
  
  **/
  EFI_STATUS
  EFIAPI
  CustomGuidedSectionExtract (
    IN CONST  EFI_PEI_GUIDED_SECTION_EXTRACTION_PPI *This,
    IN CONST  VOID                                  *InputSection,
    OUT       VOID                                  **OutputBuffer,
    OUT       UINTN                                 *OutputSize,
    OUT       UINT32                                *AuthenticationStatus
    );
  
  
  /**
     Decompresses a section to the output buffer.
  
     This function looks up the compression type field in the input section and
     applies the appropriate compression algorithm to compress the section to a
     callee allocated buffer.
  
     @param  This                  Points to this instance of the
                                   EFI_PEI_DECOMPRESS_PEI PPI.
     @param  CompressionSection    Points to the compressed section.
     @param  OutputBuffer          Holds the returned pointer to the decompressed
                                   sections.
     @param  OutputSize            Holds the returned size of the decompress
                                   section streams.
  
     @retval EFI_SUCCESS           The section was decompressed successfully.
                                   OutputBuffer contains the resulting data and
                                   OutputSize contains the resulting size.
  
  **/
  EFI_STATUS
  EFIAPI
  Decompress (
    IN CONST  EFI_PEI_DECOMPRESS_PPI  *This,
    IN CONST  EFI_COMPRESSION_SECTION *CompressionSection,
    OUT       VOID                    **OutputBuffer,
    OUT       UINTN                   *OutputSize
    );
  
  #endif
  