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