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