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