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