• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /** @file
2   This library provides common functions to process the different guided section data.
3 
4   This library provides functions to process GUIDed sections of FFS files.  Handlers may
5   be registered to decode GUIDed sections of FFS files.  Services are provided to determine
6   the set of supported section GUIDs, collection information about a specific GUIDed section,
7   and decode a specific GUIDed section.
8 
9   A library instance that produces this library class may be used to produce a
10   EFI_PEI_GUIDED_SECTION_EXTRACTION_PPI or a EFI_GUIDED_SECTION_EXTRACTION_PROTOCOL
11   providing a simple method to extend the number of GUIDed sections types a platform supports.
12 
13 Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
14 This program and the accompanying materials
15 are licensed and made available under the terms and conditions of the BSD License
16 which accompanies this distribution.  The full text of the license may be found at
17 http://opensource.org/licenses/bsd-license.php
18 
19 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
20 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
21 
22 **/
23 #ifndef __EXTRACT_GUIDED_SECTION_H__
24 #define __EXTRACT_GUIDED_SECTION_H__
25 
26 /**
27   Examines a GUIDed section and returns the size of the decoded buffer and the
28   size of an optional scratch buffer required to actually decode the data in a GUIDed section.
29 
30   Examines a GUIDed section specified by InputSection.
31   If GUID for InputSection does not match the GUID that this handler supports,
32   then RETURN_UNSUPPORTED is returned.
33   If the required information can not be retrieved from InputSection,
34   then RETURN_INVALID_PARAMETER is returned.
35   If the GUID of InputSection does match the GUID that this handler supports,
36   then the size required to hold the decoded buffer is returned in OututBufferSize,
37   the size of an optional scratch buffer is returned in ScratchSize, and the Attributes field
38   from EFI_GUID_DEFINED_SECTION header of InputSection is returned in SectionAttribute.
39 
40   If InputSection is NULL, then ASSERT().
41   If OutputBufferSize is NULL, then ASSERT().
42   If ScratchBufferSize is NULL, then ASSERT().
43   If SectionAttribute is NULL, then ASSERT().
44 
45 
46   @param[in]  InputSection       A pointer to a GUIDed section of an FFS formatted file.
47   @param[out] OutputBufferSize   A pointer to the size, in bytes, of an output buffer required
48                                  if the buffer specified by InputSection were decoded.
49   @param[out] ScratchBufferSize  A pointer to the size, in bytes, required as scratch space
50                                  if the buffer specified by InputSection were decoded.
51   @param[out] SectionAttribute   A pointer to the attributes of the GUIDed section. See the Attributes
52                                  field of EFI_GUID_DEFINED_SECTION in the PI Specification.
53 
54   @retval  RETURN_SUCCESS            The information about InputSection was returned.
55   @retval  RETURN_UNSUPPORTED        The section specified by InputSection does not match the GUID this handler supports.
56   @retval  RETURN_INVALID_PARAMETER  The information can not be retrieved from the section specified by InputSection.
57 
58 **/
59 typedef
60 RETURN_STATUS
61 (EFIAPI *EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER)(
62   IN CONST  VOID    *InputSection,
63   OUT       UINT32  *OutputBufferSize,
64   OUT       UINT32  *ScratchBufferSize,
65   OUT       UINT16  *SectionAttribute
66   );
67 
68 /**
69   Decodes a GUIDed section into a caller allocated output buffer.
70 
71   Decodes the GUIDed section specified by InputSection.
72   If GUID for InputSection does not match the GUID that this handler supports, then RETURN_UNSUPPORTED is returned.
73   If the data in InputSection can not be decoded, then RETURN_INVALID_PARAMETER is returned.
74   If the GUID of InputSection does match the GUID that this handler supports, then InputSection
75   is decoded into the buffer specified by OutputBuffer and the authentication status of this
76   decode operation is returned in AuthenticationStatus.  If the decoded buffer is identical to the
77   data in InputSection, then OutputBuffer is set to point at the data in InputSection.  Otherwise,
78   the decoded data will be placed in caller allocated buffer specified by OutputBuffer.
79 
80   If InputSection is NULL, then ASSERT().
81   If OutputBuffer is NULL, then ASSERT().
82   If ScratchBuffer is NULL and this decode operation requires a scratch buffer, then ASSERT().
83   If AuthenticationStatus is NULL, then ASSERT().
84 
85 
86   @param[in]  InputSection  A pointer to a GUIDed section of an FFS formatted file.
87   @param[out] OutputBuffer  A pointer to a buffer that contains the result of a decode operation.
88   @param[out] ScratchBuffer A caller allocated buffer that may be required by this function
89                             as a scratch buffer to perform the decode operation.
90   @param[out] AuthenticationStatus
91                             A pointer to the authentication status of the decoded output buffer.
92                             See the definition of authentication status in the EFI_PEI_GUIDED_SECTION_EXTRACTION_PPI
93                             section of the PI Specification. EFI_AUTH_STATUS_PLATFORM_OVERRIDE must
94                             never be set by this handler.
95 
96   @retval  RETURN_SUCCESS            The buffer specified by InputSection was decoded.
97   @retval  RETURN_UNSUPPORTED        The section specified by InputSection does not match the GUID this handler supports.
98   @retval  RETURN_INVALID_PARAMETER  The section specified by InputSection can not be decoded.
99 
100 **/
101 typedef
102 RETURN_STATUS
103 (EFIAPI *EXTRACT_GUIDED_SECTION_DECODE_HANDLER)(
104   IN CONST  VOID    *InputSection,
105   OUT       VOID    **OutputBuffer,
106   IN        VOID    *ScratchBuffer,        OPTIONAL
107   OUT       UINT32  *AuthenticationStatus
108   );
109 
110 /**
111   Registers handlers of type EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER and EXTRACT_GUIDED_SECTION_DECODE_HANDLER
112   for a specific GUID section type.
113 
114   Registers the handlers specified by GetInfoHandler and DecodeHandler with the GUID specified by SectionGuid.
115   If the GUID value specified by SectionGuid has already been registered, then return RETURN_ALREADY_STARTED.
116   If there are not enough resources available to register the handlers  then RETURN_OUT_OF_RESOURCES is returned.
117 
118   If SectionGuid is NULL, then ASSERT().
119   If GetInfoHandler is NULL, then ASSERT().
120   If DecodeHandler is NULL, then ASSERT().
121 
122   @param[in]  SectionGuid    A pointer to the GUID associated with the the handlers
123                              of the GUIDed section type being registered.
124   @param[in]  GetInfoHandler Pointer to a function that examines a GUIDed section and returns the
125                              size of the decoded buffer and the size of an optional scratch buffer
126                              required to actually decode the data in a GUIDed section.
127   @param[in]  DecodeHandler  Pointer to a function that decodes a GUIDed section into a caller
128                              allocated output buffer.
129 
130   @retval  RETURN_SUCCESS           The handlers were registered.
131   @retval  RETURN_OUT_OF_RESOURCES  There are not enough resources available to register the handlers.
132 
133 **/
134 RETURN_STATUS
135 EFIAPI
136 ExtractGuidedSectionRegisterHandlers (
137   IN CONST  GUID                                     *SectionGuid,
138   IN        EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER  GetInfoHandler,
139   IN        EXTRACT_GUIDED_SECTION_DECODE_HANDLER    DecodeHandler
140   );
141 
142 /**
143   Retrieve the list GUIDs that have been registered through ExtractGuidedSectionRegisterHandlers().
144 
145   Sets ExtractHandlerGuidTable so it points at a callee allocated array of registered GUIDs.
146   The total number of GUIDs in the array are returned. Since the array of GUIDs is callee allocated
147   and caller must treat this array of GUIDs as read-only data.
148   If ExtractHandlerGuidTable is NULL, then ASSERT().
149 
150   @param[out]  ExtractHandlerGuidTable  A pointer to the array of GUIDs that have been registered through
151                                         ExtractGuidedSectionRegisterHandlers().
152 
153   @return the number of the supported extract guided Handler.
154 
155 **/
156 UINTN
157 EFIAPI
158 ExtractGuidedSectionGetGuidList (
159   OUT  GUID  **ExtractHandlerGuidTable
160   );
161 
162 /**
163   Retrieves a GUID from a GUIDed section and uses that GUID to select an associated handler of type
164   EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER that was registered with ExtractGuidedSectionRegisterHandlers().
165   The selected handler is used to retrieve and return the size of the decoded buffer and the size of an
166   optional scratch buffer required to actually decode the data in a GUIDed section.
167 
168   Examines a GUIDed section specified by InputSection.
169   If GUID for InputSection does not match any of the GUIDs registered through ExtractGuidedSectionRegisterHandlers(),
170   then RETURN_UNSUPPORTED is returned.
171   If the GUID of InputSection does match the GUID that this handler supports, then the the associated handler
172   of type EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER that was registered with ExtractGuidedSectionRegisterHandlers()
173   is used to retrieve the OututBufferSize, ScratchSize, and Attributes values. The return status from the handler of
174   type EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER is returned.
175 
176   If InputSection is NULL, then ASSERT().
177   If OutputBufferSize is NULL, then ASSERT().
178   If ScratchBufferSize is NULL, then ASSERT().
179   If SectionAttribute is NULL, then ASSERT().
180 
181   @param[in]  InputSection       A pointer to a GUIDed section of an FFS formatted file.
182   @param[out] OutputBufferSize   A pointer to the size, in bytes, of an output buffer required if the buffer
183                                  specified by InputSection were decoded.
184   @param[out] ScratchBufferSize  A pointer to the size, in bytes, required as scratch space if the buffer specified by
185                                  InputSection were decoded.
186   @param[out] SectionAttribute   A pointer to the attributes of the GUIDed section.  See the Attributes field of
187                                  EFI_GUID_DEFINED_SECTION in the PI Specification.
188 
189   @retval  RETURN_SUCCESS      Get the required information successfully.
190   @retval  RETURN_UNSUPPORTED  The GUID from the section specified by InputSection does not match any of
191                                the GUIDs registered with ExtractGuidedSectionRegisterHandlers().
192   @retval  Others              The return status from the handler associated with the GUID retrieved from
193                                the section specified by InputSection.
194 
195 **/
196 RETURN_STATUS
197 EFIAPI
198 ExtractGuidedSectionGetInfo (
199   IN  CONST VOID    *InputSection,
200   OUT       UINT32  *OutputBufferSize,
201   OUT       UINT32  *ScratchBufferSize,
202   OUT       UINT16  *SectionAttribute
203   );
204 
205 /**
206   Retrieves the GUID from a GUIDed section and uses that GUID to select an associated handler of type
207   EXTRACT_GUIDED_SECTION_DECODE_HANDLER that was registered with ExtractGuidedSectionRegisterHandlers().
208   The selected handler is used to decode the data in a GUIDed section and return the result in a caller
209   allocated output buffer.
210 
211   Decodes the GUIDed section specified by InputSection.
212   If GUID for InputSection does not match any of the GUIDs registered through ExtractGuidedSectionRegisterHandlers(),
213   then RETURN_UNSUPPORTED is returned.
214   If the GUID of InputSection does match the GUID that this handler supports, then the the associated handler
215   of type EXTRACT_GUIDED_SECTION_DECODE_HANDLER that was registered with ExtractGuidedSectionRegisterHandlers()
216   is used to decode InputSection into the buffer specified by OutputBuffer and the authentication status of this
217   decode operation is returned in AuthenticationStatus.  If the decoded buffer is identical to the data in InputSection,
218   then OutputBuffer is set to point at the data in InputSection.  Otherwise, the decoded data will be placed in caller
219   allocated buffer specified by OutputBuffer.    This function is responsible for computing the  EFI_AUTH_STATUS_PLATFORM_OVERRIDE
220   bit of in AuthenticationStatus.  The return status from the handler of type EXTRACT_GUIDED_SECTION_DECODE_HANDLER is returned.
221 
222   If InputSection is NULL, then ASSERT().
223   If OutputBuffer is NULL, then ASSERT().
224   If ScratchBuffer is NULL and this decode operation requires a scratch buffer, then ASSERT().
225   If AuthenticationStatus is NULL, then ASSERT().
226 
227   @param[in]  InputSection   A pointer to a GUIDed section of an FFS formatted file.
228   @param[out] OutputBuffer   A pointer to a buffer that contains the result of a decode operation.
229   @param[in]  ScratchBuffer  A caller allocated buffer that may be required by this function as a scratch buffer to perform the decode operation.
230   @param[out] AuthenticationStatus
231                              A pointer to the authentication status of the decoded output buffer. See the definition
232                              of authentication status in the EFI_PEI_GUIDED_SECTION_EXTRACTION_PPI section of the PI
233                              Specification.
234 
235   @retval  RETURN_SUCCESS           The buffer specified by InputSection was decoded.
236   @retval  RETURN_UNSUPPORTED       The section specified by InputSection does not match the GUID this handler supports.
237   @retval  RETURN_INVALID_PARAMETER The section specified by InputSection can not be decoded.
238 
239 **/
240 RETURN_STATUS
241 EFIAPI
242 ExtractGuidedSectionDecode (
243   IN  CONST VOID    *InputSection,
244   OUT       VOID    **OutputBuffer,
245   IN        VOID    *ScratchBuffer,        OPTIONAL
246   OUT       UINT32  *AuthenticationStatus
247   );
248 
249 /**
250   Retrieves handlers of type EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER and
251   EXTRACT_GUIDED_SECTION_DECODE_HANDLER for a specific GUID section type.
252 
253   Retrieves the handlers associated with SectionGuid and returns them in
254   GetInfoHandler and DecodeHandler.
255 
256   If the GUID value specified by SectionGuid has not been registered, then
257   return RETURN_NOT_FOUND.
258 
259   If SectionGuid is NULL, then ASSERT().
260 
261   @param[in]  SectionGuid    A pointer to the GUID associated with the handlersof the GUIDed
262                              section type being retrieved.
263   @param[out] GetInfoHandler Pointer to a function that examines a GUIDed section and returns
264                              the size of the decoded buffer and the size of an optional scratch
265                              buffer required to actually decode the data in a GUIDed section.
266                              This is an optional parameter that may be NULL. If it is NULL, then
267                              the previously registered handler is not returned.
268   @param[out] DecodeHandler  Pointer to a function that decodes a GUIDed section into a caller
269                              allocated output buffer. This is an optional parameter that may be NULL.
270                              If it is NULL, then the previously registered handler is not returned.
271 
272   @retval  RETURN_SUCCESS     The handlers were retrieved.
273   @retval  RETURN_NOT_FOUND   No handlers have been registered with the specified GUID.
274 
275 **/
276 RETURN_STATUS
277 EFIAPI
278 ExtractGuidedSectionGetHandlers (
279   IN CONST   GUID                                     *SectionGuid,
280   OUT        EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER  *GetInfoHandler,  OPTIONAL
281   OUT        EXTRACT_GUIDED_SECTION_DECODE_HANDLER    *DecodeHandler    OPTIONAL
282   );
283 
284 #endif
285