3 Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
16 #include <Library/BaseMemoryLib.h>
17 #include <Library/DebugLib.h>
18 #include <Library/ExtractGuidedSectionLib.h>
19 #include <Library/PcdLib.h>
20 #include <Library/PrePiLib.h>
22 #define PRE_PI_EXTRACT_GUIDED_SECTION_DATA_GUID { 0x385A982C, 0x2F49, 0x4043, { 0xA5, 0x1E, 0x49, 0x01, 0x02, 0x5C, 0x8B, 0x6B }}
25 UINT32 NumberOfExtractHandler
;
26 GUID
*ExtractHandlerGuidTable
;
27 EXTRACT_GUIDED_SECTION_DECODE_HANDLER
*ExtractDecodeHandlerTable
;
28 EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER
*ExtractGetInfoHandlerTable
;
29 } PRE_PI_EXTRACT_GUIDED_SECTION_DATA
;
31 PRE_PI_EXTRACT_GUIDED_SECTION_DATA
*
36 EFI_HOB_GUID_TYPE
*GuidHob
;
37 GUID SavedDataGuid
= PRE_PI_EXTRACT_GUIDED_SECTION_DATA_GUID
;
39 GuidHob
= GetFirstGuidHob(&SavedDataGuid
);
42 return (PRE_PI_EXTRACT_GUIDED_SECTION_DATA
*)GuidHob
;
47 ExtractGuidedSectionRegisterHandlers (
48 IN CONST GUID
*SectionGuid
,
49 IN EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER GetInfoHandler
,
50 IN EXTRACT_GUIDED_SECTION_DECODE_HANDLER DecodeHandler
53 PRE_PI_EXTRACT_GUIDED_SECTION_DATA
*SavedData
;
56 // Check input parameter.
58 if (SectionGuid
== NULL
) {
59 return RETURN_INVALID_PARAMETER
;
62 SavedData
= GetSavedData();
65 // Search the match registered GetInfo handler for the input guided section.
67 for (Index
= 0; Index
< SavedData
->NumberOfExtractHandler
; Index
++) {
68 if (CompareGuid (&SavedData
->ExtractHandlerGuidTable
[Index
], SectionGuid
)) {
74 // If the guided handler has been registered before, only update its handler.
76 if (Index
< SavedData
->NumberOfExtractHandler
) {
77 SavedData
->ExtractDecodeHandlerTable
[Index
] = DecodeHandler
;
78 SavedData
->ExtractGetInfoHandlerTable
[Index
] = GetInfoHandler
;
79 return RETURN_SUCCESS
;
83 // Check the global table is enough to contain new Handler.
85 if (SavedData
->NumberOfExtractHandler
>= PcdGet32 (PcdMaximumGuidedExtractHandler
)) {
86 return RETURN_OUT_OF_RESOURCES
;
90 // Register new Handler and guid value.
92 CopyGuid (&SavedData
->ExtractHandlerGuidTable
[SavedData
->NumberOfExtractHandler
], SectionGuid
);
93 SavedData
->ExtractDecodeHandlerTable
[SavedData
->NumberOfExtractHandler
] = DecodeHandler
;
94 SavedData
->ExtractGetInfoHandlerTable
[SavedData
->NumberOfExtractHandler
++] = GetInfoHandler
;
96 return RETURN_SUCCESS
;
101 ExtractGuidedSectionGetGuidList (
102 IN OUT GUID
**ExtractHandlerGuidTable
105 PRE_PI_EXTRACT_GUIDED_SECTION_DATA
*SavedData
;
107 ASSERT(ExtractHandlerGuidTable
!= NULL
);
109 SavedData
= GetSavedData();
111 *ExtractHandlerGuidTable
= SavedData
->ExtractHandlerGuidTable
;
112 return SavedData
->NumberOfExtractHandler
;
117 ExtractGuidedSectionGetInfo (
118 IN CONST VOID
*InputSection
,
119 OUT UINT32
*OutputBufferSize
,
120 OUT UINT32
*ScratchBufferSize
,
121 OUT UINT16
*SectionAttribute
124 PRE_PI_EXTRACT_GUIDED_SECTION_DATA
*SavedData
;
126 EFI_GUID
*SectionDefinitionGuid
;
128 if (InputSection
== NULL
) {
129 return RETURN_INVALID_PARAMETER
;
132 ASSERT (OutputBufferSize
!= NULL
);
133 ASSERT (ScratchBufferSize
!= NULL
);
134 ASSERT (SectionAttribute
!= NULL
);
136 SavedData
= GetSavedData();
138 if (IS_SECTION2 (InputSection
)) {
139 SectionDefinitionGuid
= &(((EFI_GUID_DEFINED_SECTION2
*) InputSection
)->SectionDefinitionGuid
);
141 SectionDefinitionGuid
= &(((EFI_GUID_DEFINED_SECTION
*) InputSection
)->SectionDefinitionGuid
);
145 // Search the match registered GetInfo handler for the input guided section.
147 for (Index
= 0; Index
< SavedData
->NumberOfExtractHandler
; Index
++) {
148 if (CompareGuid (&SavedData
->ExtractHandlerGuidTable
[Index
], SectionDefinitionGuid
)) {
154 // Not found, the input guided section is not supported.
156 if (Index
== SavedData
->NumberOfExtractHandler
) {
157 return RETURN_INVALID_PARAMETER
;
161 // Call the match handler to getinfo for the input section data.
163 return SavedData
->ExtractGetInfoHandlerTable
[Index
] (
173 ExtractGuidedSectionDecode (
174 IN CONST VOID
*InputSection
,
175 OUT VOID
**OutputBuffer
,
176 OUT VOID
*ScratchBuffer
, OPTIONAL
177 OUT UINT32
*AuthenticationStatus
180 PRE_PI_EXTRACT_GUIDED_SECTION_DATA
*SavedData
;
182 EFI_GUID
*SectionDefinitionGuid
;
184 if (InputSection
== NULL
) {
185 return RETURN_INVALID_PARAMETER
;
188 ASSERT (OutputBuffer
!= NULL
);
189 ASSERT (AuthenticationStatus
!= NULL
);
191 SavedData
= GetSavedData();
193 if (IS_SECTION2 (InputSection
)) {
194 SectionDefinitionGuid
= &(((EFI_GUID_DEFINED_SECTION2
*) InputSection
)->SectionDefinitionGuid
);
196 SectionDefinitionGuid
= &(((EFI_GUID_DEFINED_SECTION
*) InputSection
)->SectionDefinitionGuid
);
200 // Search the match registered GetInfo handler for the input guided section.
202 for (Index
= 0; Index
< SavedData
->NumberOfExtractHandler
; Index
++) {
203 if (CompareGuid (&SavedData
->ExtractHandlerGuidTable
[Index
], SectionDefinitionGuid
)) {
209 // Not found, the input guided section is not supported.
211 if (Index
== SavedData
->NumberOfExtractHandler
) {
212 return RETURN_INVALID_PARAMETER
;
216 // Call the match handler to getinfo for the input section data.
218 return SavedData
->ExtractDecodeHandlerTable
[Index
] (
228 ExtractGuidedSectionLibConstructor (
232 PRE_PI_EXTRACT_GUIDED_SECTION_DATA SavedData
;
233 GUID HobGuid
= PRE_PI_EXTRACT_GUIDED_SECTION_DATA_GUID
;
236 // Allocate global pool space to store the registered handler and its guid value.
238 SavedData
.ExtractHandlerGuidTable
= (GUID
*)AllocatePool(PcdGet32(PcdMaximumGuidedExtractHandler
) * sizeof(GUID
));
239 if (SavedData
.ExtractHandlerGuidTable
== NULL
) {
240 return RETURN_OUT_OF_RESOURCES
;
243 SavedData
.ExtractDecodeHandlerTable
= (EXTRACT_GUIDED_SECTION_DECODE_HANDLER
*)AllocatePool(PcdGet32(PcdMaximumGuidedExtractHandler
) * sizeof(EXTRACT_GUIDED_SECTION_DECODE_HANDLER
));
244 if (SavedData
.ExtractDecodeHandlerTable
== NULL
) {
245 return RETURN_OUT_OF_RESOURCES
;
248 SavedData
.ExtractGetInfoHandlerTable
= (EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER
*)AllocatePool(PcdGet32(PcdMaximumGuidedExtractHandler
) * sizeof(EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER
));
249 if (SavedData
.ExtractGetInfoHandlerTable
== NULL
) {
250 return RETURN_OUT_OF_RESOURCES
;
254 // the initialized number is Zero.
256 SavedData
.NumberOfExtractHandler
= 0;
258 BuildGuidDataHob(&HobGuid
, &SavedData
, sizeof(SavedData
));
260 return RETURN_SUCCESS
;