]> git.proxmox.com Git - mirror_edk2.git/blame - MdePkg/Library/PeiExtractGuidedSectionLib/PeiExtractGuidedSectionLib.c
Correct function comments on DxeServicesLib GetFileBufferByFilePath API.
[mirror_edk2.git] / MdePkg / Library / PeiExtractGuidedSectionLib / PeiExtractGuidedSectionLib.c
CommitLineData
8069d49e 1/** @file\r
eceb3a4c 2 Provide generic extract guided section functions for PEI phase.\r
0fa00159 3\r
30f001ca 4 Copyright (c) 2007 - 2011, Intel Corporation. All rights reserved.<BR>\r
19388d29 5 This program and the accompanying materials\r
8069d49e
LG
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution. The full text of the license may be found at\r
2fc59a00 8 http://opensource.org/licenses/bsd-license.php.\r
0fa00159 9\r
8069d49e
LG
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
0fa00159 12\r
8069d49e 13**/\r
0fa00159
LG
14\r
15#include <PiPei.h>\r
16\r
17#include <Library/DebugLib.h>\r
18#include <Library/PcdLib.h>\r
19#include <Library/BaseMemoryLib.h>\r
20#include <Library/HobLib.h>\r
21#include <Library/ExtractGuidedSectionLib.h>\r
22\r
07636730 23#define PEI_EXTRACT_HANDLER_INFO_SIGNATURE SIGNATURE_32 ('P', 'E', 'H', 'I')\r
0fa00159
LG
24\r
25typedef struct {\r
26 UINT32 Signature;\r
27 UINT32 NumberOfExtractHandler;\r
28 GUID *ExtractHandlerGuidTable;\r
29 EXTRACT_GUIDED_SECTION_DECODE_HANDLER *ExtractDecodeHandlerTable;\r
30 EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER *ExtractGetInfoHandlerTable;\r
31} PEI_EXTRACT_GUIDED_SECTION_HANDLER_INFO;\r
32\r
4754c98b 33/**\r
0fa00159
LG
34 Build guid hob for the global memory to store the registered guid and Handler list.\r
35 If GuidHob exists, HandlerInfo will be directly got from Guid hob data.\r
36\r
58380e9c 37 @param[in, out] InfoPointer The pointer to pei handler information structure.\r
0fa00159 38\r
3e5c3238 39 @retval RETURN_SUCCESS Build Guid hob for the global memory space to store guid and function tables.\r
4754c98b 40 @retval RETURN_OUT_OF_RESOURCES No enough memory to allocated.\r
0fa00159
LG
41**/\r
42RETURN_STATUS\r
0fa00159
LG
43PeiGetExtractGuidedSectionHandlerInfo (\r
44 IN OUT PEI_EXTRACT_GUIDED_SECTION_HANDLER_INFO **InfoPointer\r
45 )\r
46{\r
47 PEI_EXTRACT_GUIDED_SECTION_HANDLER_INFO *HandlerInfo;\r
48 EFI_PEI_HOB_POINTERS Hob;\r
49 \r
50 //\r
58380e9c 51 // First try to get handler information from guid hob specified by CallerId.\r
0fa00159
LG
52 //\r
53 Hob.Raw = GetNextHob (EFI_HOB_TYPE_GUID_EXTENSION, GetHobList ());\r
54 while (Hob.Raw != NULL) {\r
55 if (CompareGuid (&(Hob.Guid->Name), &gEfiCallerIdGuid)) {\r
56 HandlerInfo = (PEI_EXTRACT_GUIDED_SECTION_HANDLER_INFO *) GET_GUID_HOB_DATA (Hob.Guid);\r
57 if (HandlerInfo->Signature == PEI_EXTRACT_HANDLER_INFO_SIGNATURE) {\r
e111752c
LG
58 //\r
59 // Update Table Pointer when hob start address is changed.\r
60 //\r
61 if (HandlerInfo->ExtractHandlerGuidTable != (GUID *) (HandlerInfo + 1)) {\r
62 HandlerInfo->ExtractHandlerGuidTable = (GUID *) (HandlerInfo + 1);\r
63 HandlerInfo->ExtractDecodeHandlerTable = (EXTRACT_GUIDED_SECTION_DECODE_HANDLER *) (\r
64 (UINT8 *)HandlerInfo->ExtractHandlerGuidTable + \r
65 PcdGet32 (PcdMaximumGuidedExtractHandler) * sizeof (GUID)\r
66 );\r
67 HandlerInfo->ExtractGetInfoHandlerTable = (EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER *) (\r
68 (UINT8 *)HandlerInfo->ExtractDecodeHandlerTable + \r
69 PcdGet32 (PcdMaximumGuidedExtractHandler) * \r
b9d5a7f1 70 sizeof (EXTRACT_GUIDED_SECTION_DECODE_HANDLER)\r
e111752c
LG
71 );\r
72 }\r
73 //\r
74 // Return HandlerInfo pointer.\r
75 //\r
0fa00159
LG
76 *InfoPointer = HandlerInfo;\r
77 return EFI_SUCCESS;\r
78 }\r
79 }\r
80 Hob.Raw = GET_NEXT_HOB (Hob);\r
81 Hob.Raw = GetNextHob (EFI_HOB_TYPE_GUID_EXTENSION, Hob.Raw);\r
82 }\r
83 \r
84 //\r
85 // If Guid Hob is not found, Build CallerId Guid hob to store Handler Info\r
86 //\r
87 HandlerInfo = BuildGuidHob (\r
88 &gEfiCallerIdGuid, \r
89 sizeof (PEI_EXTRACT_GUIDED_SECTION_HANDLER_INFO) +\r
90 PcdGet32 (PcdMaximumGuidedExtractHandler) * \r
91 (sizeof (GUID) + sizeof (EXTRACT_GUIDED_SECTION_DECODE_HANDLER) + sizeof (EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER))\r
92 );\r
93 if (HandlerInfo == NULL) {\r
94 //\r
95 // No enough resource to build guid hob.\r
96 //\r
b9d5a7f1 97 *InfoPointer = NULL;\r
0fa00159
LG
98 return EFI_OUT_OF_RESOURCES;\r
99 }\r
eceb3a4c
LG
100 //\r
101 // Init HandlerInfo structure\r
102 //\r
0fa00159
LG
103 HandlerInfo->Signature = PEI_EXTRACT_HANDLER_INFO_SIGNATURE;\r
104 HandlerInfo->NumberOfExtractHandler = 0;\r
105 HandlerInfo->ExtractHandlerGuidTable = (GUID *) (HandlerInfo + 1);\r
106 HandlerInfo->ExtractDecodeHandlerTable = (EXTRACT_GUIDED_SECTION_DECODE_HANDLER *) (\r
107 (UINT8 *)HandlerInfo->ExtractHandlerGuidTable + \r
108 PcdGet32 (PcdMaximumGuidedExtractHandler) * sizeof (GUID)\r
109 );\r
110 HandlerInfo->ExtractGetInfoHandlerTable = (EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER *) (\r
111 (UINT8 *)HandlerInfo->ExtractDecodeHandlerTable + \r
112 PcdGet32 (PcdMaximumGuidedExtractHandler) * \r
b9d5a7f1 113 sizeof (EXTRACT_GUIDED_SECTION_DECODE_HANDLER)\r
0fa00159 114 );\r
eceb3a4c
LG
115 //\r
116 // return the created HandlerInfo.\r
117 //\r
0fa00159
LG
118 *InfoPointer = HandlerInfo;\r
119 return EFI_SUCCESS;\r
120}\r
121\r
4754c98b 122/**\r
f1db45f8 123 Retrieve the list GUIDs that have been registered through ExtractGuidedSectionRegisterHandlers().\r
0fa00159 124\r
f1db45f8 125 Sets ExtractHandlerGuidTable so it points at a callee allocated array of registered GUIDs.\r
126 The total number of GUIDs in the array are returned. Since the array of GUIDs is callee allocated\r
127 and caller must treat this array of GUIDs as read-only data. \r
128 If ExtractHandlerGuidTable is NULL, then ASSERT().\r
129\r
3e5c3238 130 @param[out] ExtractHandlerGuidTable A pointer to the array of GUIDs that have been registered through\r
f1db45f8 131 ExtractGuidedSectionRegisterHandlers().\r
0fa00159 132\r
4754c98b 133 @return the number of the supported extract guided Handler.\r
f1db45f8 134\r
0fa00159
LG
135**/\r
136UINTN\r
137EFIAPI\r
138ExtractGuidedSectionGetGuidList (\r
eceb3a4c 139 OUT GUID **ExtractHandlerGuidTable\r
0fa00159
LG
140 )\r
141{\r
142 EFI_STATUS Status;\r
143 PEI_EXTRACT_GUIDED_SECTION_HANDLER_INFO *HandlerInfo;\r
144\r
145 ASSERT (ExtractHandlerGuidTable != NULL);\r
146\r
eceb3a4c
LG
147 //\r
148 // Get all registered handler information\r
149 //\r
0fa00159
LG
150 Status = PeiGetExtractGuidedSectionHandlerInfo (&HandlerInfo);\r
151 if (EFI_ERROR (Status)) {\r
b9d5a7f1
LG
152 *ExtractHandlerGuidTable = NULL;\r
153 return 0;\r
0fa00159
LG
154 }\r
155\r
eceb3a4c
LG
156 //\r
157 // Get GuidTable and Table Number\r
158 //\r
3dbef428 159 ASSERT (HandlerInfo != NULL);\r
0fa00159
LG
160 *ExtractHandlerGuidTable = HandlerInfo->ExtractHandlerGuidTable;\r
161 return HandlerInfo->NumberOfExtractHandler;\r
162}\r
163\r
4754c98b 164/**\r
f1db45f8 165 Registers handlers of type EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER and EXTRACT_GUIDED_SECTION_DECODE_HANDLER\r
166 for a specific GUID section type.\r
167\r
3e5c3238 168 Registers the handlers specified by GetInfoHandler and DecodeHandler with the GUID specified by SectionGuid.\r
f1db45f8 169 If the GUID value specified by SectionGuid has already been registered, then return RETURN_ALREADY_STARTED.\r
170 If there are not enough resources available to register the handlers then RETURN_OUT_OF_RESOURCES is returned.\r
3e5c3238 171 \r
f1db45f8 172 If SectionGuid is NULL, then ASSERT().\r
173 If GetInfoHandler is NULL, then ASSERT().\r
174 If DecodeHandler is NULL, then ASSERT().\r
175\r
176 @param[in] SectionGuid A pointer to the GUID associated with the the handlers\r
177 of the GUIDed section type being registered.\r
2fc59a00 178 @param[in] GetInfoHandler The pointer to a function that examines a GUIDed section and returns the\r
f1db45f8 179 size of the decoded buffer and the size of an optional scratch buffer\r
180 required to actually decode the data in a GUIDed section.\r
2fc59a00 181 @param[in] DecodeHandler The pointer to a function that decodes a GUIDed section into a caller\r
f1db45f8 182 allocated output buffer. \r
183\r
184 @retval RETURN_SUCCESS The handlers were registered.\r
f1db45f8 185 @retval RETURN_OUT_OF_RESOURCES There are not enough resources available to register the handlers.\r
4754c98b 186\r
0fa00159
LG
187**/\r
188RETURN_STATUS\r
189EFIAPI\r
190ExtractGuidedSectionRegisterHandlers (\r
191 IN CONST GUID *SectionGuid,\r
192 IN EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER GetInfoHandler,\r
193 IN EXTRACT_GUIDED_SECTION_DECODE_HANDLER DecodeHandler\r
194 )\r
195{\r
196 EFI_STATUS Status;\r
e2701217 197 UINT32 Index;\r
0fa00159
LG
198 PEI_EXTRACT_GUIDED_SECTION_HANDLER_INFO *HandlerInfo;\r
199\r
200 //\r
f1db45f8 201 // Check input paramter\r
0fa00159 202 //\r
f1db45f8 203 ASSERT (SectionGuid != NULL);\r
204 ASSERT (GetInfoHandler != NULL);\r
205 ASSERT (DecodeHandler != NULL);\r
206\r
207\r
0fa00159
LG
208\r
209 //\r
210 // Get the registered handler information\r
211 //\r
212 Status = PeiGetExtractGuidedSectionHandlerInfo (&HandlerInfo);\r
213 if (EFI_ERROR (Status)) {\r
214 return Status;\r
215 }\r
e2701217
LG
216\r
217 //\r
218 // Search the match registered GetInfo handler for the input guided section.\r
219 //\r
3dbef428 220 ASSERT (HandlerInfo != NULL);\r
e2701217 221 for (Index = 0; Index < HandlerInfo->NumberOfExtractHandler; Index ++) {\r
e111752c 222 if (CompareGuid (HandlerInfo->ExtractHandlerGuidTable + Index, SectionGuid)) {\r
b911d09f
LG
223 //\r
224 // If the guided handler has been registered before, only update its handler.\r
225 //\r
226 HandlerInfo->ExtractDecodeHandlerTable [Index] = DecodeHandler;\r
227 HandlerInfo->ExtractGetInfoHandlerTable [Index] = GetInfoHandler;\r
228 return RETURN_SUCCESS;\r
e2701217
LG
229 }\r
230 }\r
231\r
0fa00159
LG
232 //\r
233 // Check the global table is enough to contain new Handler.\r
234 //\r
235 if (HandlerInfo->NumberOfExtractHandler >= PcdGet32 (PcdMaximumGuidedExtractHandler)) {\r
236 return RETURN_OUT_OF_RESOURCES;\r
237 }\r
238 \r
239 //\r
240 // Register new Handler and guid value.\r
241 //\r
e111752c 242 CopyGuid (HandlerInfo->ExtractHandlerGuidTable + HandlerInfo->NumberOfExtractHandler, SectionGuid);\r
0fa00159
LG
243 HandlerInfo->ExtractDecodeHandlerTable [HandlerInfo->NumberOfExtractHandler] = DecodeHandler;\r
244 HandlerInfo->ExtractGetInfoHandlerTable [HandlerInfo->NumberOfExtractHandler++] = GetInfoHandler;\r
b9d5a7f1 245\r
0fa00159
LG
246 return RETURN_SUCCESS;\r
247}\r
248\r
4754c98b 249/**\r
3e5c3238 250 Retrieves a GUID from a GUIDed section and uses that GUID to select an associated handler of type\r
f1db45f8 251 EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER that was registered with ExtractGuidedSectionRegisterHandlers().\r
252 The selected handler is used to retrieve and return the size of the decoded buffer and the size of an\r
253 optional scratch buffer required to actually decode the data in a GUIDed section.\r
254\r
255 Examines a GUIDed section specified by InputSection. \r
256 If GUID for InputSection does not match any of the GUIDs registered through ExtractGuidedSectionRegisterHandlers(),\r
257 then RETURN_UNSUPPORTED is returned. \r
258 If the GUID of InputSection does match the GUID that this handler supports, then the the associated handler \r
259 of type EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER that was registered with ExtractGuidedSectionRegisterHandlers()\r
260 is used to retrieve the OututBufferSize, ScratchSize, and Attributes values. The return status from the handler of\r
261 type EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER is returned.\r
3e5c3238 262 \r
f1db45f8 263 If InputSection is NULL, then ASSERT().\r
264 If OutputBufferSize is NULL, then ASSERT().\r
265 If ScratchBufferSize is NULL, then ASSERT().\r
266 If SectionAttribute is NULL, then ASSERT().\r
267\r
268 @param[in] InputSection A pointer to a GUIDed section of an FFS formatted file.\r
269 @param[out] OutputBufferSize A pointer to the size, in bytes, of an output buffer required if the buffer\r
270 specified by InputSection were decoded.\r
271 @param[out] ScratchBufferSize A pointer to the size, in bytes, required as scratch space if the buffer specified by\r
272 InputSection were decoded.\r
273 @param[out] SectionAttribute A pointer to the attributes of the GUIDed section. See the Attributes field of\r
274 EFI_GUID_DEFINED_SECTION in the PI Specification.\r
275\r
276 @retval RETURN_SUCCESS Get the required information successfully.\r
277 @retval RETURN_UNSUPPORTED The GUID from the section specified by InputSection does not match any of\r
278 the GUIDs registered with ExtractGuidedSectionRegisterHandlers().\r
279 @retval Others The return status from the handler associated with the GUID retrieved from\r
280 the section specified by InputSection.\r
0fa00159
LG
281\r
282**/\r
283RETURN_STATUS\r
284EFIAPI\r
285ExtractGuidedSectionGetInfo (\r
286 IN CONST VOID *InputSection,\r
287 OUT UINT32 *OutputBufferSize,\r
288 OUT UINT32 *ScratchBufferSize,\r
289 OUT UINT16 *SectionAttribute \r
290 )\r
291{\r
292 UINT32 Index;\r
293 EFI_STATUS Status;\r
294 PEI_EXTRACT_GUIDED_SECTION_HANDLER_INFO *HandlerInfo;\r
30f001ca 295 EFI_GUID *SectionDefinitionGuid;\r
0fa00159
LG
296 \r
297 //\r
298 // Check input paramter\r
299 //\r
f1db45f8 300 ASSERT (InputSection != NULL);\r
0fa00159
LG
301 ASSERT (OutputBufferSize != NULL);\r
302 ASSERT (ScratchBufferSize != NULL);\r
303 ASSERT (SectionAttribute != NULL);\r
304\r
305 //\r
eceb3a4c 306 // Get all registered handler information.\r
0fa00159
LG
307 //\r
308 Status = PeiGetExtractGuidedSectionHandlerInfo (&HandlerInfo);\r
309 if (EFI_ERROR (Status)) {\r
310 return Status;\r
311 }\r
30f001ca
SZ
312\r
313 if (IS_SECTION2 (InputSection)) {\r
314 SectionDefinitionGuid = &(((EFI_GUID_DEFINED_SECTION2 *) InputSection)->SectionDefinitionGuid);\r
315 } else {\r
316 SectionDefinitionGuid = &(((EFI_GUID_DEFINED_SECTION *) InputSection)->SectionDefinitionGuid);\r
317 }\r
318\r
0fa00159
LG
319 //\r
320 // Search the match registered GetInfo handler for the input guided section.\r
321 //\r
3dbef428 322 ASSERT (HandlerInfo != NULL);\r
0fa00159 323 for (Index = 0; Index < HandlerInfo->NumberOfExtractHandler; Index ++) {\r
30f001ca 324 if (CompareGuid (HandlerInfo->ExtractHandlerGuidTable + Index, SectionDefinitionGuid)) {\r
b911d09f 325 //\r
58380e9c 326 // Call the match handler to get information for the input section data.\r
b911d09f
LG
327 //\r
328 return HandlerInfo->ExtractGetInfoHandlerTable [Index] (\r
329 InputSection,\r
330 OutputBufferSize,\r
331 ScratchBufferSize,\r
332 SectionAttribute\r
333 );\r
0fa00159
LG
334 }\r
335 }\r
336\r
337 //\r
338 // Not found, the input guided section is not supported. \r
339 //\r
b911d09f 340 return RETURN_UNSUPPORTED;\r
0fa00159
LG
341}\r
342\r
4754c98b 343/**\r
3e5c3238 344 Retrieves the GUID from a GUIDed section and uses that GUID to select an associated handler of type\r
f1db45f8 345 EXTRACT_GUIDED_SECTION_DECODE_HANDLER that was registered with ExtractGuidedSectionRegisterHandlers().\r
346 The selected handler is used to decode the data in a GUIDed section and return the result in a caller\r
347 allocated output buffer.\r
348\r
349 Decodes the GUIDed section specified by InputSection. \r
350 If GUID for InputSection does not match any of the GUIDs registered through ExtractGuidedSectionRegisterHandlers(),\r
351 then RETURN_UNSUPPORTED is returned. \r
352 If the GUID of InputSection does match the GUID that this handler supports, then the the associated handler\r
353 of type EXTRACT_GUIDED_SECTION_DECODE_HANDLER that was registered with ExtractGuidedSectionRegisterHandlers()\r
354 is used to decode InputSection into the buffer specified by OutputBuffer and the authentication status of this\r
355 decode operation is returned in AuthenticationStatus. If the decoded buffer is identical to the data in InputSection,\r
356 then OutputBuffer is set to point at the data in InputSection. Otherwise, the decoded data will be placed in caller\r
357 allocated buffer specified by OutputBuffer. This function is responsible for computing the EFI_AUTH_STATUS_PLATFORM_OVERRIDE\r
3e5c3238 358 bit of in AuthenticationStatus. The return status from the handler of type EXTRACT_GUIDED_SECTION_DECODE_HANDLER is returned. \r
359 \r
f1db45f8 360 If InputSection is NULL, then ASSERT().\r
361 If OutputBuffer is NULL, then ASSERT().\r
362 If ScratchBuffer is NULL and this decode operation requires a scratch buffer, then ASSERT().\r
363 If AuthenticationStatus is NULL, then ASSERT(). \r
364\r
365 @param[in] InputSection A pointer to a GUIDed section of an FFS formatted file.\r
366 @param[out] OutputBuffer A pointer to a buffer that contains the result of a decode operation. \r
367 @param[in] ScratchBuffer A caller allocated buffer that may be required by this function as a scratch buffer to perform the decode operation. \r
0fa00159 368 @param[out] AuthenticationStatus \r
f1db45f8 369 A pointer to the authentication status of the decoded output buffer. See the definition\r
370 of authentication status in the EFI_PEI_GUIDED_SECTION_EXTRACTION_PPI section of the PI\r
371 Specification.\r
4754c98b 372\r
f1db45f8 373 @retval RETURN_SUCCESS The buffer specified by InputSection was decoded.\r
374 @retval RETURN_UNSUPPORTED The section specified by InputSection does not match the GUID this handler supports.\r
375 @retval RETURN_INVALID_PARAMETER The section specified by InputSection can not be decoded.\r
4754c98b 376\r
0fa00159
LG
377**/\r
378RETURN_STATUS\r
379EFIAPI\r
380ExtractGuidedSectionDecode (\r
381 IN CONST VOID *InputSection,\r
382 OUT VOID **OutputBuffer,\r
f1db45f8 383 IN VOID *ScratchBuffer, OPTIONAL\r
0fa00159
LG
384 OUT UINT32 *AuthenticationStatus \r
385 )\r
386{\r
387 UINT32 Index;\r
388 EFI_STATUS Status;\r
389 PEI_EXTRACT_GUIDED_SECTION_HANDLER_INFO *HandlerInfo;\r
30f001ca 390 EFI_GUID *SectionDefinitionGuid;\r
0fa00159 391 \r
eceb3a4c
LG
392 //\r
393 // Check input parameter\r
394 //\r
f1db45f8 395 ASSERT (InputSection != NULL);\r
0fa00159
LG
396 ASSERT (OutputBuffer != NULL);\r
397 ASSERT (AuthenticationStatus != NULL);\r
eceb3a4c
LG
398\r
399 //\r
400 // Get all registered handler information.\r
401 // \r
0fa00159
LG
402 Status = PeiGetExtractGuidedSectionHandlerInfo (&HandlerInfo);\r
403 if (EFI_ERROR (Status)) {\r
404 return Status;\r
405 }\r
406\r
30f001ca
SZ
407 if (IS_SECTION2 (InputSection)) {\r
408 SectionDefinitionGuid = &(((EFI_GUID_DEFINED_SECTION2 *) InputSection)->SectionDefinitionGuid);\r
409 } else {\r
410 SectionDefinitionGuid = &(((EFI_GUID_DEFINED_SECTION *) InputSection)->SectionDefinitionGuid);\r
411 }\r
412\r
0fa00159 413 //\r
eceb3a4c 414 // Search the match registered Extract handler for the input guided section.\r
0fa00159 415 //\r
3dbef428 416 ASSERT (HandlerInfo != NULL);\r
0fa00159 417 for (Index = 0; Index < HandlerInfo->NumberOfExtractHandler; Index ++) {\r
30f001ca 418 if (CompareGuid (HandlerInfo->ExtractHandlerGuidTable + Index, SectionDefinitionGuid)) {\r
b911d09f
LG
419 //\r
420 // Call the match handler to extract raw data for the input guided section.\r
421 //\r
422 return HandlerInfo->ExtractDecodeHandlerTable [Index] (\r
423 InputSection,\r
424 OutputBuffer,\r
425 ScratchBuffer,\r
426 AuthenticationStatus\r
427 );\r
0fa00159
LG
428 }\r
429 }\r
430\r
431 //\r
432 // Not found, the input guided section is not supported. \r
433 //\r
b911d09f 434 return RETURN_UNSUPPORTED;\r
0fa00159 435}\r
9be899c5
ED
436\r
437/**\r
438 Retrieves handlers of type EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER and \r
439 EXTRACT_GUIDED_SECTION_DECODE_HANDLER for a specific GUID section type.\r
440 \r
441 Retrieves the handlers associated with SectionGuid and returns them in \r
442 GetInfoHandler and DecodeHandler.\r
443\r
444 If the GUID value specified by SectionGuid has not been registered, then \r
445 return RETURN_NOT_FOUND.\r
446 \r
447 If SectionGuid is NULL, then ASSERT().\r
448\r
449 @param[in] SectionGuid A pointer to the GUID associated with the handlersof the GUIDed \r
450 section type being retrieved.\r
451 @param[out] GetInfoHandler Pointer to a function that examines a GUIDed section and returns \r
452 the size of the decoded buffer and the size of an optional scratch \r
453 buffer required to actually decode the data in a GUIDed section. \r
454 This is an optional parameter that may be NULL. If it is NULL, then \r
455 the previously registered handler is not returned.\r
456 @param[out] DecodeHandler Pointer to a function that decodes a GUIDed section into a caller\r
457 allocated output buffer. This is an optional parameter that may be NULL.\r
458 If it is NULL, then the previously registered handler is not returned.\r
459\r
460 @retval RETURN_SUCCESS The handlers were retrieved.\r
461 @retval RETURN_NOT_FOUND No handlers have been registered with the specified GUID.\r
462\r
463**/\r
464RETURN_STATUS\r
465EFIAPI\r
466ExtractGuidedSectionGetHandlers (\r
467 IN CONST GUID *SectionGuid,\r
468 OUT EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER *GetInfoHandler, OPTIONAL\r
469 OUT EXTRACT_GUIDED_SECTION_DECODE_HANDLER *DecodeHandler OPTIONAL\r
470 )\r
471{\r
472 EFI_STATUS Status;\r
473 UINT32 Index;\r
474 PEI_EXTRACT_GUIDED_SECTION_HANDLER_INFO *HandlerInfo;\r
475\r
476 //\r
477 // Check input parameter\r
478 //\r
479 ASSERT (SectionGuid != NULL);\r
480\r
481 //\r
482 // Get the registered handler information\r
483 //\r
484 Status = PeiGetExtractGuidedSectionHandlerInfo (&HandlerInfo);\r
485 if (EFI_ERROR (Status)) {\r
486 return Status;\r
487 }\r
488\r
489 //\r
490 // Search the match registered GetInfo handler for the input guided section.\r
491 //\r
492 ASSERT (HandlerInfo != NULL);\r
493 for (Index = 0; Index < HandlerInfo->NumberOfExtractHandler; Index ++) {\r
494 if (CompareGuid (HandlerInfo->ExtractHandlerGuidTable + Index, SectionGuid)) {\r
495\r
496 //\r
497 // If the guided handler has been registered before, then return the registered handlers.\r
498 //\r
499 if (GetInfoHandler != NULL) {\r
500 *GetInfoHandler = HandlerInfo->ExtractGetInfoHandlerTable[Index];\r
501 }\r
502 if (DecodeHandler != NULL) {\r
503 *DecodeHandler = HandlerInfo->ExtractDecodeHandlerTable[Index];\r
504 }\r
505 return RETURN_SUCCESS;\r
506 }\r
507 }\r
508 return RETURN_NOT_FOUND;\r
509}\r