]> git.proxmox.com Git - mirror_edk2.git/blame - EmbeddedPkg/Library/PrePiExtractGuidedSectionLib/PrePiExtractGuidedSectionLib.c
EmbeddedPkg: Correct the way of handling sections with a large size
[mirror_edk2.git] / EmbeddedPkg / Library / PrePiExtractGuidedSectionLib / PrePiExtractGuidedSectionLib.c
CommitLineData
2ef2b01e
A
1/** @file\r
2\r
60274cca 3 Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>\r
3402aac7 4\r
60274cca 5 This program and the accompanying materials\r
2ef2b01e
A
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
8 http://opensource.org/licenses/bsd-license.php\r
9\r
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
12\r
13**/\r
14\r
15#include <PiPei.h>\r
16#include <Library/BaseMemoryLib.h>\r
17#include <Library/DebugLib.h>\r
18#include <Library/ExtractGuidedSectionLib.h>\r
19#include <Library/PcdLib.h>\r
20#include <Library/PrePiLib.h>\r
21\r
22#define PRE_PI_EXTRACT_GUIDED_SECTION_DATA_GUID { 0x385A982C, 0x2F49, 0x4043, { 0xA5, 0x1E, 0x49, 0x01, 0x02, 0x5C, 0x8B, 0x6B }}\r
23\r
24typedef struct {\r
25 UINT32 NumberOfExtractHandler;\r
26 GUID *ExtractHandlerGuidTable;\r
27 EXTRACT_GUIDED_SECTION_DECODE_HANDLER *ExtractDecodeHandlerTable;\r
28 EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER *ExtractGetInfoHandlerTable;\r
29} PRE_PI_EXTRACT_GUIDED_SECTION_DATA;\r
30\r
31PRE_PI_EXTRACT_GUIDED_SECTION_DATA *\r
32GetSavedData (\r
33 VOID\r
34 )\r
35{\r
36 EFI_HOB_GUID_TYPE *GuidHob;\r
37 GUID SavedDataGuid = PRE_PI_EXTRACT_GUIDED_SECTION_DATA_GUID;\r
38\r
39 GuidHob = GetFirstGuidHob(&SavedDataGuid);\r
40 GuidHob++;\r
3402aac7 41\r
2ef2b01e
A
42 return (PRE_PI_EXTRACT_GUIDED_SECTION_DATA *)GuidHob;\r
43}\r
44\r
45RETURN_STATUS\r
46EFIAPI\r
47ExtractGuidedSectionRegisterHandlers (\r
48 IN CONST GUID *SectionGuid,\r
49 IN EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER GetInfoHandler,\r
50 IN EXTRACT_GUIDED_SECTION_DECODE_HANDLER DecodeHandler\r
51 )\r
52{\r
53 PRE_PI_EXTRACT_GUIDED_SECTION_DATA *SavedData;\r
54 UINT32 Index;\r
55 //\r
4f0624e8 56 // Check input parameter.\r
2ef2b01e
A
57 //\r
58 if (SectionGuid == NULL) {\r
59 return RETURN_INVALID_PARAMETER;\r
60 }\r
61\r
62 SavedData = GetSavedData();\r
63\r
64 //\r
65 // Search the match registered GetInfo handler for the input guided section.\r
66 //\r
67 for (Index = 0; Index < SavedData->NumberOfExtractHandler; Index ++) {\r
68 if (CompareGuid (&SavedData->ExtractHandlerGuidTable[Index], SectionGuid)) {\r
69 break;\r
70 }\r
71 }\r
72\r
73 //\r
74 // If the guided handler has been registered before, only update its handler.\r
75 //\r
76 if (Index < SavedData->NumberOfExtractHandler) {\r
77 SavedData->ExtractDecodeHandlerTable [Index] = DecodeHandler;\r
78 SavedData->ExtractGetInfoHandlerTable [Index] = GetInfoHandler;\r
79 return RETURN_SUCCESS;\r
80 }\r
3402aac7 81\r
2ef2b01e
A
82 //\r
83 // Check the global table is enough to contain new Handler.\r
84 //\r
85 if (SavedData->NumberOfExtractHandler >= PcdGet32 (PcdMaximumGuidedExtractHandler)) {\r
86 return RETURN_OUT_OF_RESOURCES;\r
87 }\r
3402aac7 88\r
2ef2b01e
A
89 //\r
90 // Register new Handler and guid value.\r
91 //\r
92 CopyGuid (&SavedData->ExtractHandlerGuidTable [SavedData->NumberOfExtractHandler], SectionGuid);\r
93 SavedData->ExtractDecodeHandlerTable [SavedData->NumberOfExtractHandler] = DecodeHandler;\r
94 SavedData->ExtractGetInfoHandlerTable [SavedData->NumberOfExtractHandler++] = GetInfoHandler;\r
3402aac7 95\r
2ef2b01e
A
96 return RETURN_SUCCESS;\r
97}\r
98\r
99UINTN\r
100EFIAPI\r
101ExtractGuidedSectionGetGuidList (\r
102 IN OUT GUID **ExtractHandlerGuidTable\r
103 )\r
104{\r
105 PRE_PI_EXTRACT_GUIDED_SECTION_DATA *SavedData;\r
106\r
107 ASSERT(ExtractHandlerGuidTable != NULL);\r
3402aac7 108\r
2ef2b01e 109 SavedData = GetSavedData();\r
3402aac7 110\r
2ef2b01e
A
111 *ExtractHandlerGuidTable = SavedData->ExtractHandlerGuidTable;\r
112 return SavedData->NumberOfExtractHandler;\r
113}\r
114\r
115RETURN_STATUS\r
116EFIAPI\r
117ExtractGuidedSectionGetInfo (\r
118 IN CONST VOID *InputSection,\r
119 OUT UINT32 *OutputBufferSize,\r
120 OUT UINT32 *ScratchBufferSize,\r
3402aac7 121 OUT UINT16 *SectionAttribute\r
2ef2b01e
A
122 )\r
123{\r
124 PRE_PI_EXTRACT_GUIDED_SECTION_DATA *SavedData;\r
125 UINT32 Index;\r
9384e1c0 126 EFI_GUID *SectionDefinitionGuid;\r
3402aac7 127\r
2ef2b01e
A
128 if (InputSection == NULL) {\r
129 return RETURN_INVALID_PARAMETER;\r
130 }\r
3402aac7 131\r
2ef2b01e
A
132 ASSERT (OutputBufferSize != NULL);\r
133 ASSERT (ScratchBufferSize != NULL);\r
134 ASSERT (SectionAttribute != NULL);\r
3402aac7 135\r
2ef2b01e
A
136 SavedData = GetSavedData();\r
137\r
9384e1c0
GS
138 if (IS_SECTION2 (InputSection)) {\r
139 SectionDefinitionGuid = &(((EFI_GUID_DEFINED_SECTION2 *) InputSection)->SectionDefinitionGuid);\r
140 } else {\r
141 SectionDefinitionGuid = &(((EFI_GUID_DEFINED_SECTION *) InputSection)->SectionDefinitionGuid);\r
142 }\r
143\r
2ef2b01e
A
144 //\r
145 // Search the match registered GetInfo handler for the input guided section.\r
146 //\r
147 for (Index = 0; Index < SavedData->NumberOfExtractHandler; Index ++) {\r
9384e1c0 148 if (CompareGuid (&SavedData->ExtractHandlerGuidTable[Index], SectionDefinitionGuid)) {\r
2ef2b01e
A
149 break;\r
150 }\r
151 }\r
152\r
153 //\r
3402aac7 154 // Not found, the input guided section is not supported.\r
2ef2b01e
A
155 //\r
156 if (Index == SavedData->NumberOfExtractHandler) {\r
157 return RETURN_INVALID_PARAMETER;\r
158 }\r
159\r
160 //\r
161 // Call the match handler to getinfo for the input section data.\r
162 //\r
163 return SavedData->ExtractGetInfoHandlerTable [Index] (\r
164 InputSection,\r
165 OutputBufferSize,\r
166 ScratchBufferSize,\r
167 SectionAttribute\r
168 );\r
169}\r
170\r
171RETURN_STATUS\r
172EFIAPI\r
173ExtractGuidedSectionDecode (\r
174 IN CONST VOID *InputSection,\r
175 OUT VOID **OutputBuffer,\r
176 OUT VOID *ScratchBuffer, OPTIONAL\r
3402aac7 177 OUT UINT32 *AuthenticationStatus\r
2ef2b01e
A
178 )\r
179{\r
180 PRE_PI_EXTRACT_GUIDED_SECTION_DATA *SavedData;\r
181 UINT32 Index;\r
9384e1c0 182 EFI_GUID *SectionDefinitionGuid;\r
3402aac7 183\r
2ef2b01e
A
184 if (InputSection == NULL) {\r
185 return RETURN_INVALID_PARAMETER;\r
186 }\r
3402aac7 187\r
2ef2b01e
A
188 ASSERT (OutputBuffer != NULL);\r
189 ASSERT (AuthenticationStatus != NULL);\r
190\r
191 SavedData = GetSavedData();\r
192\r
9384e1c0
GS
193 if (IS_SECTION2 (InputSection)) {\r
194 SectionDefinitionGuid = &(((EFI_GUID_DEFINED_SECTION2 *) InputSection)->SectionDefinitionGuid);\r
195 } else {\r
196 SectionDefinitionGuid = &(((EFI_GUID_DEFINED_SECTION *) InputSection)->SectionDefinitionGuid);\r
197 }\r
198\r
2ef2b01e
A
199 //\r
200 // Search the match registered GetInfo handler for the input guided section.\r
201 //\r
202 for (Index = 0; Index < SavedData->NumberOfExtractHandler; Index ++) {\r
9384e1c0 203 if (CompareGuid (&SavedData->ExtractHandlerGuidTable[Index], SectionDefinitionGuid)) {\r
2ef2b01e
A
204 break;\r
205 }\r
206 }\r
207\r
208 //\r
3402aac7 209 // Not found, the input guided section is not supported.\r
2ef2b01e
A
210 //\r
211 if (Index == SavedData->NumberOfExtractHandler) {\r
212 return RETURN_INVALID_PARAMETER;\r
213 }\r
214\r
215 //\r
216 // Call the match handler to getinfo for the input section data.\r
217 //\r
218 return SavedData->ExtractDecodeHandlerTable [Index] (\r
219 InputSection,\r
220 OutputBuffer,\r
221 ScratchBuffer,\r
222 AuthenticationStatus\r
223 );\r
224}\r
225\r
226RETURN_STATUS\r
227EFIAPI\r
228ExtractGuidedSectionLibConstructor (\r
229 VOID\r
230 )\r
231{\r
232 PRE_PI_EXTRACT_GUIDED_SECTION_DATA SavedData;\r
233 GUID HobGuid = PRE_PI_EXTRACT_GUIDED_SECTION_DATA_GUID;\r
234\r
235 //\r
236 // Allocate global pool space to store the registered handler and its guid value.\r
237 //\r
238 SavedData.ExtractHandlerGuidTable = (GUID *)AllocatePool(PcdGet32(PcdMaximumGuidedExtractHandler) * sizeof(GUID));\r
239 if (SavedData.ExtractHandlerGuidTable == NULL) {\r
240 return RETURN_OUT_OF_RESOURCES;\r
241 }\r
3402aac7 242\r
2ef2b01e
A
243 SavedData.ExtractDecodeHandlerTable = (EXTRACT_GUIDED_SECTION_DECODE_HANDLER *)AllocatePool(PcdGet32(PcdMaximumGuidedExtractHandler) * sizeof(EXTRACT_GUIDED_SECTION_DECODE_HANDLER));\r
244 if (SavedData.ExtractDecodeHandlerTable == NULL) {\r
245 return RETURN_OUT_OF_RESOURCES;\r
246 }\r
247\r
248 SavedData.ExtractGetInfoHandlerTable = (EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER *)AllocatePool(PcdGet32(PcdMaximumGuidedExtractHandler) * sizeof(EXTRACT_GUIDED_SECTION_GET_INFO_HANDLER));\r
249 if (SavedData.ExtractGetInfoHandlerTable == NULL) {\r
250 return RETURN_OUT_OF_RESOURCES;\r
251 }\r
3402aac7 252\r
2ef2b01e
A
253 //\r
254 // the initialized number is Zero.\r
255 //\r
256 SavedData.NumberOfExtractHandler = 0;\r
3402aac7 257\r
2ef2b01e 258 BuildGuidDataHob(&HobGuid, &SavedData, sizeof(SavedData));\r
3402aac7 259\r
2ef2b01e
A
260 return RETURN_SUCCESS;\r
261}\r