]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Library/VarCheckHiiLib/VarCheckHiiLibNullClass.c
MdeModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Library / VarCheckHiiLib / VarCheckHiiLibNullClass.c
CommitLineData
1241af95
SZ
1/** @file\r
2 Var Check Hii handler.\r
3\r
16f69227 4Copyright (c) 2015 - 2017, Intel Corporation. All rights reserved.<BR>\r
9d510e61 5SPDX-License-Identifier: BSD-2-Clause-Patent\r
1241af95
SZ
6\r
7**/\r
8\r
9#include "VarCheckHii.h"\r
10\r
11GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 mVarCheckHiiHex[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};\r
12\r
13/**\r
14 Dump some hexadecimal data.\r
15\r
16 @param[in] Indent How many spaces to indent the output.\r
17 @param[in] Offset The offset of the dump.\r
18 @param[in] DataSize The size in bytes of UserData.\r
19 @param[in] UserData The data to dump.\r
20\r
21**/\r
22VOID\r
23VarCheckHiiInternalDumpHex (\r
24 IN UINTN Indent,\r
25 IN UINTN Offset,\r
26 IN UINTN DataSize,\r
27 IN VOID *UserData\r
28 )\r
29{\r
30 UINT8 *Data;\r
31\r
32 CHAR8 Val[50];\r
33\r
34 CHAR8 Str[20];\r
35\r
36 UINT8 TempByte;\r
37 UINTN Size;\r
38 UINTN Index;\r
39\r
40 Data = UserData;\r
41 while (DataSize != 0) {\r
42 Size = 16;\r
43 if (Size > DataSize) {\r
44 Size = DataSize;\r
45 }\r
46\r
47 for (Index = 0; Index < Size; Index += 1) {\r
48 TempByte = Data[Index];\r
49 Val[Index * 3 + 0] = mVarCheckHiiHex[TempByte >> 4];\r
50 Val[Index * 3 + 1] = mVarCheckHiiHex[TempByte & 0xF];\r
51 Val[Index * 3 + 2] = (CHAR8) ((Index == 7) ? '-' : ' ');\r
52 Str[Index] = (CHAR8) ((TempByte < ' ' || TempByte > 'z') ? '.' : TempByte);\r
53 }\r
54\r
55 Val[Index * 3] = 0;\r
56 Str[Index] = 0;\r
c9a7f343 57 DEBUG ((DEBUG_INFO , "%*a%08X: %-48a *%a*\r\n", Indent, "", Offset, Val, Str));\r
1241af95
SZ
58\r
59 Data += Size;\r
60 Offset += Size;\r
61 DataSize -= Size;\r
62 }\r
63}\r
64\r
65/**\r
66 Var Check Hii Question.\r
67\r
68 @param[in] HiiQuestion Pointer to Hii Question\r
69 @param[in] Data Data pointer.\r
70 @param[in] DataSize Size of Data to set.\r
71\r
72 @retval TRUE Check pass\r
73 @retval FALSE Check fail.\r
74\r
75**/\r
76BOOLEAN\r
77VarCheckHiiQuestion (\r
78 IN VAR_CHECK_HII_QUESTION_HEADER *HiiQuestion,\r
79 IN VOID *Data,\r
80 IN UINTN DataSize\r
81 )\r
82{\r
83 UINT64 OneData;\r
84 UINT64 Minimum;\r
85 UINT64 Maximum;\r
86 UINT64 OneValue;\r
87 UINT8 *Ptr;\r
88 UINT8 Index;\r
89 UINT8 MaxContainers;\r
8182e9f4
DB
90 UINT8 StartBit;\r
91 UINT8 EndBit;\r
92 UINT8 TotalBits;\r
93 UINT16 VarOffsetByteLevel;\r
94 UINT8 StorageWidthByteLevel;\r
95\r
96 if (HiiQuestion->BitFieldStore) {\r
97 VarOffsetByteLevel = HiiQuestion->VarOffset / 8;\r
98 TotalBits = HiiQuestion->VarOffset % 8 + HiiQuestion->StorageWidth;\r
99 StorageWidthByteLevel = (TotalBits % 8 == 0 ? TotalBits / 8: TotalBits / 8 + 1);\r
100 } else {\r
101 VarOffsetByteLevel = HiiQuestion->VarOffset;\r
102 StorageWidthByteLevel = HiiQuestion->StorageWidth;\r
103 }\r
1241af95 104\r
8182e9f4
DB
105 if (((UINT32) VarOffsetByteLevel + StorageWidthByteLevel) > DataSize) {\r
106 DEBUG ((DEBUG_INFO , "VarCheckHiiQuestion fail: (VarOffset(0x%04x) + StorageWidth(0x%02x)) > Size(0x%x)\n", VarOffsetByteLevel, StorageWidthByteLevel, DataSize));\r
1241af95
SZ
107 return FALSE;\r
108 }\r
109\r
110 OneData = 0;\r
8182e9f4
DB
111 CopyMem (&OneData, (UINT8 *) Data + VarOffsetByteLevel, StorageWidthByteLevel);\r
112 if (HiiQuestion->BitFieldStore) {\r
113 //\r
114 // Get the value from the bit field.\r
115 //\r
116 StartBit = HiiQuestion->VarOffset % 8;\r
117 EndBit = StartBit + HiiQuestion->StorageWidth - 1;\r
118 OneData = BitFieldRead64 (OneData, StartBit, EndBit);\r
119 }\r
1241af95
SZ
120\r
121 switch (HiiQuestion->OpCode) {\r
122 case EFI_IFR_ONE_OF_OP:\r
123 Ptr = (UINT8 *) ((VAR_CHECK_HII_QUESTION_ONEOF *) HiiQuestion + 1);\r
124 while ((UINTN) Ptr < (UINTN) HiiQuestion + HiiQuestion->Length) {\r
125 OneValue = 0;\r
8182e9f4
DB
126 if (HiiQuestion->BitFieldStore) {\r
127 //\r
128 // For OneOf stored in bit field, the value of options are saved as UINT32 type.\r
129 //\r
130 CopyMem (&OneValue, Ptr, sizeof (UINT32));\r
131 } else {\r
132 CopyMem (&OneValue, Ptr, HiiQuestion->StorageWidth);\r
133 }\r
1241af95
SZ
134 if (OneData == OneValue) {\r
135 //\r
136 // Match\r
137 //\r
138 break;\r
139 }\r
8182e9f4
DB
140 if (HiiQuestion->BitFieldStore) {\r
141 Ptr += sizeof (UINT32);\r
142 } else {\r
143 Ptr += HiiQuestion->StorageWidth;\r
144 }\r
1241af95
SZ
145 }\r
146 if ((UINTN) Ptr >= ((UINTN) HiiQuestion + HiiQuestion->Length)) {\r
147 //\r
148 // No match\r
149 //\r
c9a7f343 150 DEBUG ((DEBUG_INFO , "VarCheckHiiQuestion fail: OneOf mismatch (0x%lx)\n", OneData));\r
1241af95
SZ
151 DEBUG_CODE (VarCheckHiiInternalDumpHex (2, 0, HiiQuestion->Length, (UINT8 *) HiiQuestion););\r
152 return FALSE;\r
153 }\r
154 break;\r
155\r
156 case EFI_IFR_CHECKBOX_OP:\r
157 if ((OneData != 0) && (OneData != 1)) {\r
c9a7f343 158 DEBUG ((DEBUG_INFO , "VarCheckHiiQuestion fail: CheckBox mismatch (0x%lx)\n", OneData));\r
1241af95
SZ
159 DEBUG_CODE (VarCheckHiiInternalDumpHex (2, 0, HiiQuestion->Length, (UINT8 *) HiiQuestion););\r
160 return FALSE;\r
161 }\r
162 break;\r
163\r
164 case EFI_IFR_NUMERIC_OP:\r
165 Minimum = 0;\r
166 Maximum = 0;\r
167 Ptr = (UINT8 *) ((VAR_CHECK_HII_QUESTION_NUMERIC *) HiiQuestion + 1);\r
8182e9f4
DB
168 if (HiiQuestion->BitFieldStore) {\r
169 //\r
170 // For Numeric stored in bit field, the value of Maximum/Minimum are saved as UINT32 type.\r
171 //\r
172 CopyMem (&Minimum, Ptr, sizeof (UINT32));\r
173 Ptr += sizeof (UINT32);\r
174 CopyMem (&Maximum, Ptr, sizeof (UINT32));\r
175 Ptr += sizeof (UINT32);\r
176 } else {\r
177 CopyMem (&Minimum, Ptr, HiiQuestion->StorageWidth);\r
178 Ptr += HiiQuestion->StorageWidth;\r
179 CopyMem (&Maximum, Ptr, HiiQuestion->StorageWidth);\r
180 Ptr += HiiQuestion->StorageWidth;\r
181 }\r
1241af95
SZ
182\r
183 //\r
184 // No need to check Step, because it is ONLY for UI.\r
185 //\r
186 if ((OneData < Minimum) || (OneData > Maximum)) {\r
c9a7f343 187 DEBUG ((DEBUG_INFO , "VarCheckHiiQuestion fail: Numeric mismatch (0x%lx)\n", OneData));\r
1241af95
SZ
188 DEBUG_CODE (VarCheckHiiInternalDumpHex (2, 0, HiiQuestion->Length, (UINT8 *) HiiQuestion););\r
189 return FALSE;\r
190 }\r
191 break;\r
192\r
193 case EFI_IFR_ORDERED_LIST_OP:\r
194 MaxContainers = ((VAR_CHECK_HII_QUESTION_ORDEREDLIST *) HiiQuestion)->MaxContainers;\r
16f69227 195 if (((UINT32) HiiQuestion->VarOffset + HiiQuestion->StorageWidth * MaxContainers) > DataSize) {\r
c9a7f343 196 DEBUG ((DEBUG_INFO , "VarCheckHiiQuestion fail: (VarOffset(0x%04x) + StorageWidth(0x%02x) * MaxContainers(0x%02x)) > Size(0x%x)\n", HiiQuestion->VarOffset, HiiQuestion->StorageWidth, MaxContainers, DataSize));\r
1241af95
SZ
197 return FALSE;\r
198 }\r
199 for (Index = 0; Index < MaxContainers; Index++) {\r
200 OneData = 0;\r
201 CopyMem (&OneData, (UINT8 *) Data + HiiQuestion->VarOffset + HiiQuestion->StorageWidth * Index, HiiQuestion->StorageWidth);\r
202 if (OneData == 0) {\r
203 //\r
204 // The value of 0 is used to determine if a particular "slot" in the array is empty.\r
205 //\r
206 continue;\r
207 }\r
208\r
209 Ptr = (UINT8 *) ((VAR_CHECK_HII_QUESTION_ORDEREDLIST *) HiiQuestion + 1);\r
210 while ((UINTN) Ptr < ((UINTN) HiiQuestion + HiiQuestion->Length)) {\r
211 OneValue = 0;\r
212 CopyMem (&OneValue, Ptr, HiiQuestion->StorageWidth);\r
213 if (OneData == OneValue) {\r
214 //\r
215 // Match\r
216 //\r
217 break;\r
218 }\r
219 Ptr += HiiQuestion->StorageWidth;\r
220 }\r
221 if ((UINTN) Ptr >= ((UINTN) HiiQuestion + HiiQuestion->Length)) {\r
222 //\r
223 // No match\r
224 //\r
c9a7f343 225 DEBUG ((DEBUG_INFO , "VarCheckHiiQuestion fail: OrderedList mismatch\n"));\r
1241af95
SZ
226 DEBUG_CODE (VarCheckHiiInternalDumpHex (2, 0, HiiQuestion->StorageWidth * MaxContainers, (UINT8 *) Data + HiiQuestion->VarOffset););\r
227 DEBUG_CODE (VarCheckHiiInternalDumpHex (2, 0, HiiQuestion->Length, (UINT8 *) HiiQuestion););\r
228 return FALSE;\r
229 }\r
230 }\r
231 break;\r
232\r
233 default:\r
234 ASSERT (FALSE);\r
235 break;\r
236 }\r
237\r
238 return TRUE;\r
239}\r
240\r
241VAR_CHECK_HII_VARIABLE_HEADER *mVarCheckHiiBin = NULL;\r
242UINTN mVarCheckHiiBinSize = 0;\r
243\r
244/**\r
245 SetVariable check handler HII.\r
246\r
247 @param[in] VariableName Name of Variable to set.\r
248 @param[in] VendorGuid Variable vendor GUID.\r
249 @param[in] Attributes Attribute value of the variable.\r
250 @param[in] DataSize Size of Data to set.\r
251 @param[in] Data Data pointer.\r
252\r
253 @retval EFI_SUCCESS The SetVariable check result was success.\r
254 @retval EFI_SECURITY_VIOLATION Check fail.\r
255\r
256**/\r
257EFI_STATUS\r
258EFIAPI\r
259SetVariableCheckHandlerHii (\r
260 IN CHAR16 *VariableName,\r
261 IN EFI_GUID *VendorGuid,\r
262 IN UINT32 Attributes,\r
263 IN UINTN DataSize,\r
264 IN VOID *Data\r
265 )\r
266{\r
267 VAR_CHECK_HII_VARIABLE_HEADER *HiiVariable;\r
268 VAR_CHECK_HII_QUESTION_HEADER *HiiQuestion;\r
269\r
270 if (mVarCheckHiiBin == NULL) {\r
271 return EFI_SUCCESS;\r
272 }\r
273\r
274 if ((((Attributes & EFI_VARIABLE_APPEND_WRITE) == 0) && (DataSize == 0)) || (Attributes == 0)) {\r
275 //\r
276 // Do not check delete variable.\r
277 //\r
278 return EFI_SUCCESS;\r
279 }\r
280\r
281 //\r
282 // For Hii Variable header align.\r
283 //\r
284 HiiVariable = (VAR_CHECK_HII_VARIABLE_HEADER *) HEADER_ALIGN (mVarCheckHiiBin);\r
285 while ((UINTN) HiiVariable < ((UINTN) mVarCheckHiiBin + mVarCheckHiiBinSize)) {\r
286 if ((StrCmp ((CHAR16 *) (HiiVariable + 1), VariableName) == 0) &&\r
287 (CompareGuid (&HiiVariable->Guid, VendorGuid))) {\r
288 //\r
289 // Found the Hii Variable that could be used to do check.\r
290 //\r
c9a7f343 291 DEBUG ((DEBUG_INFO , "VarCheckHiiVariable - %s:%g with Attributes = 0x%08x Size = 0x%x\n", VariableName, VendorGuid, Attributes, DataSize));\r
1241af95 292 if (HiiVariable->Attributes != Attributes) {\r
c9a7f343 293 DEBUG ((DEBUG_INFO, "VarCheckHiiVariable fail for Attributes - 0x%08x\n", HiiVariable->Attributes));\r
1241af95
SZ
294 return EFI_SECURITY_VIOLATION;\r
295 }\r
296\r
297 if (DataSize == 0) {\r
c9a7f343 298 DEBUG ((DEBUG_INFO, "VarCheckHiiVariable - CHECK PASS with DataSize == 0 !\n"));\r
1241af95
SZ
299 return EFI_SUCCESS;\r
300 }\r
301\r
302 if (HiiVariable->Size != DataSize) {\r
c9a7f343 303 DEBUG ((DEBUG_INFO, "VarCheckHiiVariable fail for Size - 0x%x\n", HiiVariable->Size));\r
1241af95
SZ
304 return EFI_SECURITY_VIOLATION;\r
305 }\r
306\r
307 //\r
308 // Do the check.\r
309 // For Hii Question header align.\r
310 //\r
311 HiiQuestion = (VAR_CHECK_HII_QUESTION_HEADER *) HEADER_ALIGN (((UINTN) HiiVariable + HiiVariable->HeaderLength));\r
312 while ((UINTN) HiiQuestion < ((UINTN) HiiVariable + HiiVariable->Length)) {\r
313 if (!VarCheckHiiQuestion (HiiQuestion, Data, DataSize)) {\r
314 return EFI_SECURITY_VIOLATION;\r
315 }\r
316 //\r
317 // For Hii Question header align.\r
318 //\r
319 HiiQuestion = (VAR_CHECK_HII_QUESTION_HEADER *) HEADER_ALIGN (((UINTN) HiiQuestion + HiiQuestion->Length));\r
320 }\r
321\r
c9a7f343 322 DEBUG ((DEBUG_INFO, "VarCheckHiiVariable - ALL CHECK PASS!\n"));\r
1241af95
SZ
323 return EFI_SUCCESS;\r
324 }\r
325 //\r
326 // For Hii Variable header align.\r
327 //\r
328 HiiVariable = (VAR_CHECK_HII_VARIABLE_HEADER *) HEADER_ALIGN (((UINTN) HiiVariable + HiiVariable->Length));\r
329 }\r
330\r
331 // Not found, so pass.\r
332 return EFI_SUCCESS;\r
333}\r
334\r
335#ifdef DUMP_VAR_CHECK_HII\r
336GLOBAL_REMOVE_IF_UNREFERENCED VAR_CHECK_HII_OPCODE_STRING mHiiOpCodeStringTable[] = {\r
337 {EFI_IFR_VARSTORE_EFI_OP, "EfiVarStore"},\r
338 {EFI_IFR_ONE_OF_OP, "OneOf"},\r
339 {EFI_IFR_CHECKBOX_OP, "CheckBox"},\r
340 {EFI_IFR_NUMERIC_OP, "Numeric"},\r
341 {EFI_IFR_ORDERED_LIST_OP, "OrderedList"},\r
342};\r
343\r
344/**\r
345 HII opcode to string.\r
346\r
347 @param[in] HiiOpCode Hii OpCode.\r
348\r
349 @return Pointer to string.\r
350\r
351**/\r
352CHAR8 *\r
353HiiOpCodeToStr (\r
354 IN UINT8 HiiOpCode\r
355 )\r
356{\r
357 UINTN Index;\r
fe69b398 358 for (Index = 0; Index < ARRAY_SIZE (mHiiOpCodeStringTable); Index++) {\r
1241af95
SZ
359 if (mHiiOpCodeStringTable[Index].HiiOpCode == HiiOpCode) {\r
360 return mHiiOpCodeStringTable[Index].HiiOpCodeStr;\r
361 }\r
362 }\r
363\r
364 return "<UnknownHiiOpCode>";\r
365}\r
366\r
367/**\r
368 Dump Hii Question.\r
369\r
370 @param[in] HiiQuestion Pointer to Hii Question.\r
371\r
372**/\r
373VOID\r
374DumpHiiQuestion (\r
375 IN VAR_CHECK_HII_QUESTION_HEADER *HiiQuestion\r
376 )\r
377{\r
378 UINT64 Minimum;\r
379 UINT64 Maximum;\r
380 UINT64 OneValue;\r
381 UINT8 *Ptr;\r
382\r
c9a7f343 383 DEBUG ((DEBUG_INFO, " VAR_CHECK_HII_QUESTION_HEADER\n"));\r
8182e9f4 384 DEBUG ((DEBUG_INFO, " OpCode - 0x%02x (%a) (%a)\n", HiiQuestion->OpCode, HiiOpCodeToStr (HiiQuestion->OpCode), (HiiQuestion->BitFieldStore? "bit level": "byte level")));\r
c9a7f343 385 DEBUG ((DEBUG_INFO, " Length - 0x%02x\n", HiiQuestion->Length));\r
8182e9f4
DB
386 DEBUG ((DEBUG_INFO, " VarOffset - 0x%04x (%a)\n", HiiQuestion->VarOffset, (HiiQuestion->BitFieldStore? "bit level": "byte level")));\r
387 DEBUG ((DEBUG_INFO, " StorageWidth - 0x%02x (%a)\n", HiiQuestion->StorageWidth, (HiiQuestion->BitFieldStore? "bit level": "byte level")));\r
1241af95
SZ
388\r
389 switch (HiiQuestion->OpCode) {\r
390 case EFI_IFR_ONE_OF_OP:\r
391 Ptr = (UINT8 *) ((VAR_CHECK_HII_QUESTION_ONEOF *) HiiQuestion + 1);\r
392 while ((UINTN) Ptr < ((UINTN) HiiQuestion + HiiQuestion->Length)) {\r
393 OneValue = 0;\r
8182e9f4
DB
394 if (HiiQuestion->BitFieldStore) {\r
395 //\r
396 // For OneOf stored in bit field, the value of options are saved as UINT32 type.\r
397 //\r
398 CopyMem (&OneValue, Ptr, sizeof (UINT32));\r
399 DEBUG ((DEBUG_INFO, " OneOfOption - 0x%08x\n", OneValue));\r
400 } else {\r
401 CopyMem (&OneValue, Ptr, HiiQuestion->StorageWidth);\r
402 switch (HiiQuestion->StorageWidth) {\r
403 case sizeof (UINT8):\r
404 DEBUG ((DEBUG_INFO, " OneOfOption - 0x%02x\n", OneValue));\r
405 break;\r
406 case sizeof (UINT16):\r
407 DEBUG ((DEBUG_INFO, " OneOfOption - 0x%04x\n", OneValue));\r
408 break;\r
409 case sizeof (UINT32):\r
410 DEBUG ((DEBUG_INFO, " OneOfOption - 0x%08x\n", OneValue));\r
411 break;\r
412 case sizeof (UINT64):\r
413 DEBUG ((DEBUG_INFO, " OneOfOption - 0x%016lx\n", OneValue));\r
414 break;\r
415 default:\r
416 ASSERT (FALSE);\r
417 break;\r
418 }\r
419 }\r
420 if (HiiQuestion->BitFieldStore) {\r
421 Ptr += sizeof (UINT32);\r
422 } else {\r
423 Ptr += HiiQuestion->StorageWidth;\r
424 }\r
425 }\r
426 break;\r
427\r
428 case EFI_IFR_CHECKBOX_OP:\r
429 break;\r
430\r
431 case EFI_IFR_NUMERIC_OP:\r
432 Minimum = 0;\r
433 Maximum = 0;\r
434 Ptr = (UINT8 *) ((VAR_CHECK_HII_QUESTION_NUMERIC *) HiiQuestion + 1);\r
435 if(HiiQuestion->BitFieldStore) {\r
436 //\r
437 // For Numeric stored in bit field, the value of Maximum/Minimum are saved as UINT32 type.\r
438 //\r
439 CopyMem (&Minimum, Ptr, sizeof (UINT32));\r
440 Ptr += sizeof (UINT32);\r
441 CopyMem (&Maximum, Ptr, sizeof (UINT32));\r
442 Ptr += sizeof (UINT32);\r
443\r
444 DEBUG ((DEBUG_INFO, " Minimum - 0x%08x\n", Minimum));\r
445 DEBUG ((DEBUG_INFO, " Maximum - 0x%08x\n", Maximum));\r
446 } else {\r
447 CopyMem (&Minimum, Ptr, HiiQuestion->StorageWidth);\r
448 Ptr += HiiQuestion->StorageWidth;\r
449 CopyMem (&Maximum, Ptr, HiiQuestion->StorageWidth);\r
450 Ptr += HiiQuestion->StorageWidth;\r
451\r
1241af95
SZ
452 switch (HiiQuestion->StorageWidth) {\r
453 case sizeof (UINT8):\r
8182e9f4
DB
454 DEBUG ((DEBUG_INFO, " Minimum - 0x%02x\n", Minimum));\r
455 DEBUG ((DEBUG_INFO, " Maximum - 0x%02x\n", Maximum));\r
1241af95
SZ
456 break;\r
457 case sizeof (UINT16):\r
8182e9f4
DB
458 DEBUG ((DEBUG_INFO, " Minimum - 0x%04x\n", Minimum));\r
459 DEBUG ((DEBUG_INFO, " Maximum - 0x%04x\n", Maximum));\r
1241af95
SZ
460 break;\r
461 case sizeof (UINT32):\r
8182e9f4
DB
462 DEBUG ((DEBUG_INFO, " Minimum - 0x%08x\n", Minimum));\r
463 DEBUG ((DEBUG_INFO, " Maximum - 0x%08x\n", Maximum));\r
1241af95
SZ
464 break;\r
465 case sizeof (UINT64):\r
8182e9f4
DB
466 DEBUG ((DEBUG_INFO, " Minimum - 0x%016lx\n", Minimum));\r
467 DEBUG ((DEBUG_INFO, " Maximum - 0x%016lx\n", Maximum));\r
1241af95
SZ
468 break;\r
469 default:\r
470 ASSERT (FALSE);\r
471 break;\r
472 }\r
1241af95
SZ
473 }\r
474 break;\r
475\r
476 case EFI_IFR_ORDERED_LIST_OP:\r
c9a7f343 477 DEBUG ((DEBUG_INFO, " MaxContainers - 0x%02x\n", ((VAR_CHECK_HII_QUESTION_ORDEREDLIST *) HiiQuestion)->MaxContainers));\r
1241af95
SZ
478 Ptr = (UINT8 *) ((VAR_CHECK_HII_QUESTION_ORDEREDLIST *) HiiQuestion + 1);\r
479 while ((UINTN) Ptr < ((UINTN) HiiQuestion + HiiQuestion->Length)) {\r
480 OneValue = 0;\r
481 CopyMem (&OneValue, Ptr, HiiQuestion->StorageWidth);\r
482 switch (HiiQuestion->StorageWidth) {\r
483 case sizeof (UINT8):\r
c9a7f343 484 DEBUG ((DEBUG_INFO, " OneOfOption - 0x%02x\n", OneValue));\r
1241af95
SZ
485 break;\r
486 case sizeof (UINT16):\r
c9a7f343 487 DEBUG ((DEBUG_INFO, " OneOfOption - 0x%04x\n", OneValue));\r
1241af95
SZ
488 break;\r
489 case sizeof (UINT32):\r
c9a7f343 490 DEBUG ((DEBUG_INFO, " OneOfOption - 0x%08x\n", OneValue));\r
1241af95
SZ
491 break;\r
492 case sizeof (UINT64):\r
c9a7f343 493 DEBUG ((DEBUG_INFO, " OneOfOption - 0x%016lx\n", OneValue));\r
1241af95
SZ
494 break;\r
495 default:\r
496 ASSERT (FALSE);\r
497 break;\r
498 }\r
499 Ptr += HiiQuestion->StorageWidth;\r
500 }\r
501 break;\r
502\r
503 default:\r
504 ASSERT (FALSE);\r
505 break;\r
506 }\r
507}\r
508\r
509/**\r
510 Dump Hii Variable.\r
511\r
512 @param[in] HiiVariable Pointer to Hii Variable.\r
513\r
514**/\r
515VOID\r
516DumpHiiVariable (\r
517 IN VAR_CHECK_HII_VARIABLE_HEADER *HiiVariable\r
518 )\r
519{\r
520 VAR_CHECK_HII_QUESTION_HEADER *HiiQuestion;\r
521\r
c9a7f343
DB
522 DEBUG ((DEBUG_INFO, "VAR_CHECK_HII_VARIABLE_HEADER\n"));\r
523 DEBUG ((DEBUG_INFO, " Revision - 0x%04x\n", HiiVariable->Revision));\r
524 DEBUG ((DEBUG_INFO, " HeaderLength - 0x%04x\n", HiiVariable->HeaderLength));\r
525 DEBUG ((DEBUG_INFO, " Length - 0x%08x\n", HiiVariable->Length));\r
526 DEBUG ((DEBUG_INFO, " OpCode - 0x%02x (%a)\n", HiiVariable->OpCode, HiiOpCodeToStr (HiiVariable->OpCode)));\r
527 DEBUG ((DEBUG_INFO, " Size - 0x%04x\n", HiiVariable->Size));\r
528 DEBUG ((DEBUG_INFO, " Attributes - 0x%08x\n", HiiVariable->Attributes));\r
529 DEBUG ((DEBUG_INFO, " Guid - %g\n", &HiiVariable->Guid));\r
530 DEBUG ((DEBUG_INFO, " Name - %s\n", HiiVariable + 1));\r
1241af95
SZ
531\r
532 //\r
533 // For Hii Question header align.\r
534 //\r
535 HiiQuestion = (VAR_CHECK_HII_QUESTION_HEADER *) HEADER_ALIGN (((UINTN) HiiVariable + HiiVariable->HeaderLength));\r
536 while ((UINTN) HiiQuestion < ((UINTN) HiiVariable + HiiVariable->Length)) {\r
537 //\r
538 // Dump Hii Question related to the Hii Variable.\r
539 //\r
540 DumpHiiQuestion (HiiQuestion);\r
541 //\r
542 // For Hii Question header align.\r
543 //\r
544 HiiQuestion = (VAR_CHECK_HII_QUESTION_HEADER *) HEADER_ALIGN (((UINTN) HiiQuestion + HiiQuestion->Length));\r
545 }\r
546}\r
547\r
548/**\r
549 Dump Var Check HII.\r
550\r
551 @param[in] VarCheckHiiBin Pointer to VarCheckHiiBin.\r
552 @param[in] VarCheckHiiBinSize VarCheckHiiBin size.\r
553\r
554**/\r
555VOID\r
556DumpVarCheckHii (\r
557 IN VOID *VarCheckHiiBin,\r
558 IN UINTN VarCheckHiiBinSize\r
559 )\r
560{\r
561 VAR_CHECK_HII_VARIABLE_HEADER *HiiVariable;\r
562\r
c9a7f343 563 DEBUG ((DEBUG_INFO, "DumpVarCheckHii\n"));\r
1241af95
SZ
564\r
565 //\r
566 // For Hii Variable header align.\r
567 //\r
568 HiiVariable = (VAR_CHECK_HII_VARIABLE_HEADER *) HEADER_ALIGN (VarCheckHiiBin);\r
569 while ((UINTN) HiiVariable < ((UINTN) VarCheckHiiBin + VarCheckHiiBinSize)) {\r
570 DumpHiiVariable (HiiVariable);\r
571 //\r
572 // For Hii Variable header align.\r
573 //\r
574 HiiVariable = (VAR_CHECK_HII_VARIABLE_HEADER *) HEADER_ALIGN (((UINTN) HiiVariable + HiiVariable->Length));\r
575 }\r
576}\r
577#endif\r
578\r
579/**\r
580 Constructor function of VarCheckHiiLib to register var check HII handler.\r
581\r
582 @param[in] ImageHandle The firmware allocated handle for the EFI image.\r
583 @param[in] SystemTable A pointer to the EFI System Table.\r
584\r
585 @retval EFI_SUCCESS The constructor executed correctly.\r
586\r
587**/\r
588EFI_STATUS\r
589EFIAPI\r
590VarCheckHiiLibNullClassConstructor (\r
591 IN EFI_HANDLE ImageHandle,\r
592 IN EFI_SYSTEM_TABLE *SystemTable\r
593 )\r
594{\r
595 VarCheckLibRegisterEndOfDxeCallback (VarCheckHiiGen);\r
596 VarCheckLibRegisterAddressPointer ((VOID **) &mVarCheckHiiBin);\r
597 VarCheckLibRegisterSetVariableCheckHandler (SetVariableCheckHandlerHii);\r
598\r
599 return EFI_SUCCESS;\r
600}\r
601\r