3 Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
10 #include <Library/BaseMemoryLib.h>
11 #include <Library/DebugLib.h>
12 #include <Library/ExtractGuidedSectionLib.h>
13 #include <Library/PcdLib.h>
14 #include <Library/PrePiLib.h>
16 #define PRE_PI_EXTRACT_GUIDED_SECTION_DATA_GUID { 0x385A982C, 0x2F49, 0x4043, { 0xA5, 0x1E, 0x49, 0x01, 0x02, 0x5C, 0x8B, 0x6B }}
19 UINT32 NumberOfExtractHandler
;
20 GUID
*ExtractHandlerGuidTable
;
21 EXTRACT_GUIDED_SECTION_DECODE_HANDLER
*ExtractDecodeHandlerTable
;
22 EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER
*ExtractGetInfoHandlerTable
;
23 } PRE_PI_EXTRACT_GUIDED_SECTION_DATA
;
25 PRE_PI_EXTRACT_GUIDED_SECTION_DATA
*
30 EFI_HOB_GUID_TYPE
*GuidHob
;
31 GUID SavedDataGuid
= PRE_PI_EXTRACT_GUIDED_SECTION_DATA_GUID
;
33 GuidHob
= GetFirstGuidHob(&SavedDataGuid
);
36 return (PRE_PI_EXTRACT_GUIDED_SECTION_DATA
*)GuidHob
;
41 ExtractGuidedSectionRegisterHandlers (
42 IN CONST GUID
*SectionGuid
,
43 IN EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER GetInfoHandler
,
44 IN EXTRACT_GUIDED_SECTION_DECODE_HANDLER DecodeHandler
47 PRE_PI_EXTRACT_GUIDED_SECTION_DATA
*SavedData
;
50 // Check input parameter.
52 if (SectionGuid
== NULL
) {
53 return RETURN_INVALID_PARAMETER
;
56 SavedData
= GetSavedData();
59 // Search the match registered GetInfo handler for the input guided section.
61 for (Index
= 0; Index
< SavedData
->NumberOfExtractHandler
; Index
++) {
62 if (CompareGuid (&SavedData
->ExtractHandlerGuidTable
[Index
], SectionGuid
)) {
68 // If the guided handler has been registered before, only update its handler.
70 if (Index
< SavedData
->NumberOfExtractHandler
) {
71 SavedData
->ExtractDecodeHandlerTable
[Index
] = DecodeHandler
;
72 SavedData
->ExtractGetInfoHandlerTable
[Index
] = GetInfoHandler
;
73 return RETURN_SUCCESS
;
77 // Check the global table is enough to contain new Handler.
79 if (SavedData
->NumberOfExtractHandler
>= PcdGet32 (PcdMaximumGuidedExtractHandler
)) {
80 return RETURN_OUT_OF_RESOURCES
;
84 // Register new Handler and guid value.
86 CopyGuid (&SavedData
->ExtractHandlerGuidTable
[SavedData
->NumberOfExtractHandler
], SectionGuid
);
87 SavedData
->ExtractDecodeHandlerTable
[SavedData
->NumberOfExtractHandler
] = DecodeHandler
;
88 SavedData
->ExtractGetInfoHandlerTable
[SavedData
->NumberOfExtractHandler
++] = GetInfoHandler
;
90 return RETURN_SUCCESS
;
95 ExtractGuidedSectionGetGuidList (
96 IN OUT GUID
**ExtractHandlerGuidTable
99 PRE_PI_EXTRACT_GUIDED_SECTION_DATA
*SavedData
;
101 ASSERT(ExtractHandlerGuidTable
!= NULL
);
103 SavedData
= GetSavedData();
105 *ExtractHandlerGuidTable
= SavedData
->ExtractHandlerGuidTable
;
106 return SavedData
->NumberOfExtractHandler
;
111 ExtractGuidedSectionGetInfo (
112 IN CONST VOID
*InputSection
,
113 OUT UINT32
*OutputBufferSize
,
114 OUT UINT32
*ScratchBufferSize
,
115 OUT UINT16
*SectionAttribute
118 PRE_PI_EXTRACT_GUIDED_SECTION_DATA
*SavedData
;
120 EFI_GUID
*SectionDefinitionGuid
;
122 if (InputSection
== NULL
) {
123 return RETURN_INVALID_PARAMETER
;
126 ASSERT (OutputBufferSize
!= NULL
);
127 ASSERT (ScratchBufferSize
!= NULL
);
128 ASSERT (SectionAttribute
!= NULL
);
130 SavedData
= GetSavedData();
132 if (IS_SECTION2 (InputSection
)) {
133 SectionDefinitionGuid
= &(((EFI_GUID_DEFINED_SECTION2
*) InputSection
)->SectionDefinitionGuid
);
135 SectionDefinitionGuid
= &(((EFI_GUID_DEFINED_SECTION
*) InputSection
)->SectionDefinitionGuid
);
139 // Search the match registered GetInfo handler for the input guided section.
141 for (Index
= 0; Index
< SavedData
->NumberOfExtractHandler
; Index
++) {
142 if (CompareGuid (&SavedData
->ExtractHandlerGuidTable
[Index
], SectionDefinitionGuid
)) {
148 // Not found, the input guided section is not supported.
150 if (Index
== SavedData
->NumberOfExtractHandler
) {
151 return RETURN_INVALID_PARAMETER
;
155 // Call the match handler to getinfo for the input section data.
157 return SavedData
->ExtractGetInfoHandlerTable
[Index
] (
167 ExtractGuidedSectionDecode (
168 IN CONST VOID
*InputSection
,
169 OUT VOID
**OutputBuffer
,
170 OUT VOID
*ScratchBuffer
, OPTIONAL
171 OUT UINT32
*AuthenticationStatus
174 PRE_PI_EXTRACT_GUIDED_SECTION_DATA
*SavedData
;
176 EFI_GUID
*SectionDefinitionGuid
;
178 if (InputSection
== NULL
) {
179 return RETURN_INVALID_PARAMETER
;
182 ASSERT (OutputBuffer
!= NULL
);
183 ASSERT (AuthenticationStatus
!= NULL
);
185 SavedData
= GetSavedData();
187 if (IS_SECTION2 (InputSection
)) {
188 SectionDefinitionGuid
= &(((EFI_GUID_DEFINED_SECTION2
*) InputSection
)->SectionDefinitionGuid
);
190 SectionDefinitionGuid
= &(((EFI_GUID_DEFINED_SECTION
*) InputSection
)->SectionDefinitionGuid
);
194 // Search the match registered GetInfo handler for the input guided section.
196 for (Index
= 0; Index
< SavedData
->NumberOfExtractHandler
; Index
++) {
197 if (CompareGuid (&SavedData
->ExtractHandlerGuidTable
[Index
], SectionDefinitionGuid
)) {
203 // Not found, the input guided section is not supported.
205 if (Index
== SavedData
->NumberOfExtractHandler
) {
206 return RETURN_INVALID_PARAMETER
;
210 // Call the match handler to getinfo for the input section data.
212 return SavedData
->ExtractDecodeHandlerTable
[Index
] (
222 ExtractGuidedSectionLibConstructor (
226 PRE_PI_EXTRACT_GUIDED_SECTION_DATA SavedData
;
227 GUID HobGuid
= PRE_PI_EXTRACT_GUIDED_SECTION_DATA_GUID
;
230 // Allocate global pool space to store the registered handler and its guid value.
232 SavedData
.ExtractHandlerGuidTable
= (GUID
*)AllocatePool(PcdGet32(PcdMaximumGuidedExtractHandler
) * sizeof(GUID
));
233 if (SavedData
.ExtractHandlerGuidTable
== NULL
) {
234 return RETURN_OUT_OF_RESOURCES
;
237 SavedData
.ExtractDecodeHandlerTable
= (EXTRACT_GUIDED_SECTION_DECODE_HANDLER
*)AllocatePool(PcdGet32(PcdMaximumGuidedExtractHandler
) * sizeof(EXTRACT_GUIDED_SECTION_DECODE_HANDLER
));
238 if (SavedData
.ExtractDecodeHandlerTable
== NULL
) {
239 return RETURN_OUT_OF_RESOURCES
;
242 SavedData
.ExtractGetInfoHandlerTable
= (EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER
*)AllocatePool(PcdGet32(PcdMaximumGuidedExtractHandler
) * sizeof(EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER
));
243 if (SavedData
.ExtractGetInfoHandlerTable
== NULL
) {
244 return RETURN_OUT_OF_RESOURCES
;
248 // the initialized number is Zero.
250 SavedData
.NumberOfExtractHandler
= 0;
252 BuildGuidDataHob(&HobGuid
, &SavedData
, sizeof(SavedData
));
254 return RETURN_SUCCESS
;