• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /** @file
2 
3   Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
4   This program and the accompanying materials
5   are licensed and made available under the terms and conditions of the BSD License
6   which accompanies this distribution.  The full text of the license may be found at
7   http://opensource.org/licenses/bsd-license.php.
8 
9   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11 
12 **/
13 
14 #ifndef __PEI_DXEIPL_H__
15 #define __PEI_DXEIPL_H__
16 
17 #include <PiPei.h>
18 #include <Ppi/DxeIpl.h>
19 #include <Ppi/EndOfPeiPhase.h>
20 #include <Ppi/MemoryDiscovered.h>
21 #include <Ppi/Decompress.h>
22 #include <Ppi/FirmwareVolumeInfo.h>
23 #include <Ppi/GuidedSectionExtraction.h>
24 
25 #include <Library/DebugLib.h>
26 #include <Library/PeimEntryPoint.h>
27 #include <Library/BaseLib.h>
28 #include <Library/HobLib.h>
29 #include <Library/PeiServicesLib.h>
30 #include <Library/ReportStatusCodeLib.h>
31 #include <Library/UefiDecompressLib.h>
32 #include <Library/ExtractGuidedSectionLib.h>
33 #include <Library/BaseMemoryLib.h>
34 #include <Library/MemoryAllocationLib.h>
35 #include <Library/PcdLib.h>
36 #include <Library/FspSwitchStackLib.h>
37 #include <Library/FspCommonLib.h>
38 #include <Library/FspPlatformLib.h>
39 
40 /**
41    Main entry point to last PEIM.
42 
43    This function finds DXE Core in the firmware volume and transfer the control to
44    DXE core.
45 
46    @param[in] This          Entry point for DXE IPL PPI.
47    @param[in] PeiServices   General purpose services available to every PEIM.
48    @param[in] HobList       Address to the Pei HOB list.
49 
50    @return EFI_SUCCESS              DXE core was successfully loaded.
51    @return EFI_OUT_OF_RESOURCES     There are not enough resources to load DXE core.
52 
53 **/
54 EFI_STATUS
55 EFIAPI
56 DxeLoadCore (
57   IN CONST EFI_DXE_IPL_PPI *This,
58   IN EFI_PEI_SERVICES      **PeiServices,
59   IN EFI_PEI_HOB_POINTERS  HobList
60   );
61 
62 
63 
64 /**
65    Transfers control to DxeCore.
66 
67    This function performs a CPU architecture specific operations to execute
68    the entry point of DxeCore with the parameters of HobList.
69    It also installs EFI_END_OF_PEI_PPI to signal the end of PEI phase.
70 
71    @param[in] DxeCoreEntryPoint         The entry point of DxeCore.
72    @param[in] HobList                   The start of HobList passed to DxeCore.
73 
74 **/
75 VOID
76 HandOffToDxeCore (
77   IN EFI_PHYSICAL_ADDRESS   DxeCoreEntryPoint,
78   IN EFI_PEI_HOB_POINTERS   HobList
79   );
80 
81 
82 
83 /**
84    Updates the Stack HOB passed to DXE phase.
85 
86    This function traverses the whole HOB list and update the stack HOB to
87    reflect the real stack that is used by DXE core.
88 
89    @param[in] BaseAddress           The lower address of stack used by DxeCore.
90    @param[in] Length                The length of stack used by DxeCore.
91 
92 **/
93 VOID
94 UpdateStackHob (
95   IN EFI_PHYSICAL_ADDRESS        BaseAddress,
96   IN UINT64                      Length
97   );
98 
99 /**
100   The ExtractSection() function processes the input section and
101   returns a pointer to the section contents. If the section being
102   extracted does not require processing (if the section
103   GuidedSectionHeader.Attributes has the
104   EFI_GUIDED_SECTION_PROCESSING_REQUIRED field cleared), then
105   OutputBuffer is just updated to point to the start of the
106   section's contents. Otherwise, *Buffer must be allocated
107   from PEI permanent memory.
108 
109   @param[in]  This                   Indicates the
110                                      EFI_PEI_GUIDED_SECTION_EXTRACTION_PPI instance.
111                                      Buffer containing the input GUIDed section to be
112                                      processed. OutputBuffer OutputBuffer is
113                                      allocated from PEI permanent memory and contains
114                                      the new section stream.
115   @param[in]  InputSection           A pointer to the input buffer, which contains
116                                      the input section to be processed.
117   @param[out] OutputBuffer           A pointer to a caller-allocated buffer, whose
118                                      size is specified by the contents of OutputSize.
119   @param[out] OutputSize             A pointer to a caller-allocated
120                                      UINTN in which the size of *OutputBuffer
121                                      allocation is stored. If the function
122                                      returns anything other than EFI_SUCCESS,
123                                      the value of OutputSize is undefined.
124   @param[out] AuthenticationStatus   A pointer to a caller-allocated
125                                      UINT32 that indicates the
126                                      authentication status of the
127                                      output buffer. If the input
128                                      section's GuidedSectionHeader.
129                                      Attributes field has the
130                                      EFI_GUIDED_SECTION_AUTH_STATUS_VALID
131                                      bit as clear,
132                                      AuthenticationStatus must return
133                                      zero. These bits reflect the
134                                      status of the extraction
135                                      operation. If the function
136                                      returns anything other than
137                                      EFI_SUCCESS, the value of
138                                      AuthenticationStatus is
139                                      undefined.
140 
141   @retval EFI_SUCCESS           The InputSection was
142                                 successfully processed and the
143                                 section contents were returned.
144 
145   @retval EFI_OUT_OF_RESOURCES  The system has insufficient
146                                 resources to process the request.
147 
148   @retval EFI_INVALID_PARAMETER The GUID in InputSection does
149                                 not match this instance of the
150                                 GUIDed Section Extraction PPI.
151 
152 **/
153 EFI_STATUS
154 EFIAPI
155 CustomGuidedSectionExtract (
156   IN CONST  EFI_PEI_GUIDED_SECTION_EXTRACTION_PPI *This,
157   IN CONST  VOID                                  *InputSection,
158   OUT       VOID                                  **OutputBuffer,
159   OUT       UINTN                                 *OutputSize,
160   OUT       UINT32                                *AuthenticationStatus
161   );
162 
163 /**
164    Decompresses a section to the output buffer.
165 
166    This function looks up the compression type field in the input section and
167    applies the appropriate compression algorithm to compress the section to a
168    callee allocated buffer.
169 
170    @param[in]  This                  Points to this instance of the
171                                      EFI_PEI_DECOMPRESS_PEI PPI.
172    @param[in]  CompressionSection    Points to the compressed section.
173    @param[out] OutputBuffer          Holds the returned pointer to the decompressed
174                                      sections.
175    @param[out] OutputSize            Holds the returned size of the decompress
176                                      section streams.
177 
178    @retval EFI_SUCCESS           The section was decompressed successfully.
179                                  OutputBuffer contains the resulting data and
180                                  OutputSize contains the resulting size.
181 
182 **/
183 EFI_STATUS
184 EFIAPI
185 Decompress (
186   IN CONST  EFI_PEI_DECOMPRESS_PPI  *This,
187   IN CONST  EFI_COMPRESSION_SECTION *CompressionSection,
188   OUT       VOID                    **OutputBuffer,
189   OUT       UINTN                   *OutputSize
190   );
191 
192 #endif
193