]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Library/VarCheckUefiLib/VarCheckUefiLibNullClass.c
MdeModulePkg/ResetUtilityLib: Fix GCC build failure
[mirror_edk2.git] / MdeModulePkg / Library / VarCheckUefiLib / VarCheckUefiLibNullClass.c
CommitLineData
b85488b3
SZ
1/** @file\r
2 Implementation functions and structures for var check uefi library.\r
3\r
8b73a15c 4Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>\r
b85488b3
SZ
5This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include <Library/VarCheckLib.h>\r
16#include <Library/BaseLib.h>\r
17#include <Library/BaseMemoryLib.h>\r
18#include <Library/DebugLib.h>\r
19#include <Library/DevicePathLib.h>\r
20\r
21#include <Guid/VariableFormat.h>\r
22#include <Guid/GlobalVariable.h>\r
23#include <Guid/HardwareErrorVariable.h>\r
24#include <Guid/ImageAuthentication.h>\r
25\r
26typedef\r
27EFI_STATUS\r
28(EFIAPI *INTERNAL_VAR_CHECK_FUNCTION) (\r
29 IN VAR_CHECK_VARIABLE_PROPERTY *Propery,\r
30 IN UINTN DataSize,\r
31 IN VOID *Data\r
32 );\r
33\r
34typedef struct {\r
35 CHAR16 *Name;\r
36 VAR_CHECK_VARIABLE_PROPERTY VariableProperty;\r
37 INTERNAL_VAR_CHECK_FUNCTION CheckFunction;\r
38} UEFI_DEFINED_VARIABLE_ENTRY;\r
39\r
40/**\r
41 Internal check for load option.\r
42\r
43 @param[in] VariablePropery Pointer to variable property.\r
44 @param[in] DataSize Data size.\r
45 @param[in] Data Pointer to data buffer.\r
46\r
47 @retval EFI_SUCCESS The SetVariable check result was success.\r
48 @retval EFI_INVALID_PARAMETER The data buffer is not a valid load option.\r
49\r
50**/\r
51EFI_STATUS\r
52EFIAPI\r
53InternalVarCheckLoadOption (\r
54 IN VAR_CHECK_VARIABLE_PROPERTY *VariablePropery,\r
55 IN UINTN DataSize,\r
56 IN VOID *Data\r
57 )\r
58{\r
59 UINT16 FilePathListLength;\r
60 CHAR16 *Description;\r
61 EFI_DEVICE_PATH_PROTOCOL *FilePathList;\r
62\r
63 FilePathListLength = *((UINT16 *) ((UINTN) Data + sizeof (UINT32)));\r
64\r
65 //\r
66 // Check Description\r
67 //\r
68 Description = (CHAR16 *) ((UINTN) Data + sizeof (UINT32) + sizeof (UINT16));\r
69 while (Description < (CHAR16 *) ((UINTN) Data + DataSize)) {\r
70 if (*Description == L'\0') {\r
71 break;\r
72 }\r
73 Description++;\r
74 }\r
75 if ((UINTN) Description >= ((UINTN) Data + DataSize)) {\r
76 return EFI_INVALID_PARAMETER;\r
77 }\r
78 Description++;\r
79\r
80 //\r
81 // Check FilePathList\r
82 //\r
83 FilePathList = (EFI_DEVICE_PATH_PROTOCOL *) Description;\r
84 if ((UINTN) FilePathList > (MAX_ADDRESS - FilePathListLength)) {\r
85 return EFI_INVALID_PARAMETER;\r
86 }\r
87 if (((UINTN) FilePathList + FilePathListLength) > ((UINTN) Data + DataSize)) {\r
88 return EFI_INVALID_PARAMETER;\r
89 }\r
90 if (FilePathListLength < sizeof (EFI_DEVICE_PATH_PROTOCOL)) {\r
91 return EFI_INVALID_PARAMETER;\r
92 }\r
93 if (!IsDevicePathValid (FilePathList, FilePathListLength)) {\r
94 return EFI_INVALID_PARAMETER;\r
95 }\r
96\r
97 return EFI_SUCCESS;\r
98}\r
99\r
100/**\r
101 Internal check for key option.\r
102\r
103 @param[in] VariablePropery Pointer to variable property.\r
104 @param[in] DataSize Data size.\r
105 @param[in] Data Pointer to data buffer.\r
106\r
107 @retval EFI_SUCCESS The SetVariable check result was success.\r
108 @retval EFI_INVALID_PARAMETER The data buffer is not a valid key option.\r
109\r
110**/\r
111EFI_STATUS\r
112EFIAPI\r
113InternalVarCheckKeyOption (\r
114 IN VAR_CHECK_VARIABLE_PROPERTY *VariablePropery,\r
115 IN UINTN DataSize,\r
116 IN VOID *Data\r
117 )\r
118{\r
119 if (((DataSize - sizeof (EFI_KEY_OPTION)) % sizeof (EFI_INPUT_KEY)) != 0) {\r
120 return EFI_INVALID_PARAMETER;\r
121 }\r
122\r
123 return EFI_SUCCESS;\r
124}\r
125\r
126/**\r
127 Internal check for device path.\r
128\r
129 @param[in] VariablePropery Pointer to variable property.\r
130 @param[in] DataSize Data size.\r
131 @param[in] Data Pointer to data buffer.\r
132\r
133 @retval EFI_SUCCESS The SetVariable check result was success.\r
134 @retval EFI_INVALID_PARAMETER The data buffer is not a valid device path.\r
135\r
136**/\r
137EFI_STATUS\r
138EFIAPI\r
139InternalVarCheckDevicePath (\r
140 IN VAR_CHECK_VARIABLE_PROPERTY *VariablePropery,\r
141 IN UINTN DataSize,\r
142 IN VOID *Data\r
143 )\r
144{\r
145 if (!IsDevicePathValid ((EFI_DEVICE_PATH_PROTOCOL *) Data, DataSize)) {\r
146 return EFI_INVALID_PARAMETER;\r
147 }\r
148 return EFI_SUCCESS;\r
149}\r
150\r
151/**\r
152 Internal check for ASCII string.\r
153\r
154 @param[in] VariablePropery Pointer to variable property.\r
155 @param[in] DataSize Data size.\r
156 @param[in] Data Pointer to data buffer.\r
157\r
158 @retval EFI_SUCCESS The SetVariable check result was success.\r
159 @retval EFI_INVALID_PARAMETER The data buffer is not a Null-terminated ASCII string.\r
160\r
161**/\r
162EFI_STATUS\r
163EFIAPI\r
164InternalVarCheckAsciiString (\r
165 IN VAR_CHECK_VARIABLE_PROPERTY *VariablePropery,\r
166 IN UINTN DataSize,\r
167 IN VOID *Data\r
168 )\r
169{\r
170 CHAR8 *String;\r
171 UINTN Index;\r
172\r
173 String = (CHAR8 *) Data;\r
174 if (String[DataSize - 1] == '\0') {\r
175 return EFI_SUCCESS;\r
176 } else {\r
177 for (Index = 1; Index < DataSize && (String[DataSize - 1 - Index] != '\0'); Index++);\r
178 if (Index == DataSize) {\r
179 return EFI_INVALID_PARAMETER;\r
180 }\r
181 }\r
182 return EFI_SUCCESS;\r
183}\r
184\r
185/**\r
186 Internal check for size array.\r
187\r
188 @param[in] VariablePropery Pointer to variable property.\r
189 @param[in] DataSize Data size.\r
190 @param[in] Data Pointer to data buffer.\r
191\r
192 @retval EFI_SUCCESS The SetVariable check result was success.\r
193 @retval EFI_INVALID_PARAMETER The DataSize is not size array.\r
194\r
195**/\r
196EFI_STATUS\r
197EFIAPI\r
198InternalVarCheckSizeArray (\r
199 IN VAR_CHECK_VARIABLE_PROPERTY *VariablePropery,\r
200 IN UINTN DataSize,\r
201 IN VOID *Data\r
202 )\r
203{\r
204 if ((DataSize % VariablePropery->MinSize) != 0) {\r
205 return EFI_INVALID_PARAMETER;\r
206 }\r
207 return EFI_SUCCESS;\r
208}\r
209\r
210//\r
211// To prevent name collisions with possible future globally defined variables,\r
212// other internal firmware data variables that are not defined here must be\r
213// saved with a unique VendorGuid other than EFI_GLOBAL_VARIABLE or\r
214// any other GUID defined by the UEFI Specification. Implementations must\r
215// only permit the creation of variables with a UEFI Specification-defined\r
216// VendorGuid when these variables are documented in the UEFI Specification.\r
217//\r
218UEFI_DEFINED_VARIABLE_ENTRY mGlobalVariableList[] = {\r
219 {\r
220 EFI_LANG_CODES_VARIABLE_NAME,\r
221 {\r
222 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
223 0,\r
224 VARIABLE_ATTRIBUTE_BS_RT,\r
225 1,\r
226 MAX_UINTN\r
227 },\r
228 InternalVarCheckAsciiString\r
229 },\r
230 {\r
231 EFI_LANG_VARIABLE_NAME,\r
232 {\r
233 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
234 0,\r
235 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
236 1,\r
237 MAX_UINTN\r
238 },\r
239 InternalVarCheckAsciiString\r
240 },\r
241 {\r
242 EFI_TIME_OUT_VARIABLE_NAME,\r
243 {\r
244 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
245 0,\r
246 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
247 sizeof (UINT16),\r
248 sizeof (UINT16)\r
249 },\r
250 NULL\r
251 },\r
252 {\r
253 EFI_PLATFORM_LANG_CODES_VARIABLE_NAME,\r
254 {\r
255 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
256 0,\r
257 VARIABLE_ATTRIBUTE_BS_RT,\r
258 1,\r
259 MAX_UINTN\r
260 },\r
261 InternalVarCheckAsciiString\r
262 },\r
263 {\r
264 EFI_PLATFORM_LANG_VARIABLE_NAME,\r
265 {\r
266 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
267 0,\r
268 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
269 1,\r
270 MAX_UINTN\r
271 },\r
272 InternalVarCheckAsciiString\r
273 },\r
274 {\r
275 EFI_CON_IN_VARIABLE_NAME,\r
276 {\r
277 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
278 0,\r
279 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
280 sizeof (EFI_DEVICE_PATH_PROTOCOL),\r
281 MAX_UINTN\r
282 },\r
283 InternalVarCheckDevicePath\r
284 },\r
285 {\r
286 EFI_CON_OUT_VARIABLE_NAME,\r
287 {\r
288 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
289 0,\r
290 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
291 sizeof (EFI_DEVICE_PATH_PROTOCOL),\r
292 MAX_UINTN\r
293 },\r
294 InternalVarCheckDevicePath\r
295 },\r
296 {\r
297 EFI_ERR_OUT_VARIABLE_NAME,\r
298 {\r
299 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
300 0,\r
301 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
302 sizeof (EFI_DEVICE_PATH_PROTOCOL),\r
303 MAX_UINTN\r
304 },\r
305 InternalVarCheckDevicePath\r
306 },\r
307 {\r
308 EFI_CON_IN_DEV_VARIABLE_NAME,\r
309 {\r
310 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
311 0,\r
312 VARIABLE_ATTRIBUTE_BS_RT,\r
313 sizeof (EFI_DEVICE_PATH_PROTOCOL),\r
314 MAX_UINTN\r
315 },\r
316 InternalVarCheckDevicePath\r
317 },\r
318 {\r
319 EFI_CON_OUT_DEV_VARIABLE_NAME,\r
320 {\r
321 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
322 0,\r
323 VARIABLE_ATTRIBUTE_BS_RT,\r
324 sizeof (EFI_DEVICE_PATH_PROTOCOL),\r
325 MAX_UINTN\r
326 },\r
327 InternalVarCheckDevicePath\r
328 },\r
329 {\r
330 EFI_ERR_OUT_DEV_VARIABLE_NAME,\r
331 {\r
332 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
333 0,\r
334 VARIABLE_ATTRIBUTE_BS_RT,\r
335 sizeof (EFI_DEVICE_PATH_PROTOCOL),\r
336 MAX_UINTN\r
337 },\r
338 InternalVarCheckDevicePath\r
339 },\r
340 {\r
341 EFI_BOOT_ORDER_VARIABLE_NAME,\r
342 {\r
343 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
344 0,\r
345 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
346 sizeof (UINT16),\r
347 MAX_UINTN\r
348 },\r
349 InternalVarCheckSizeArray\r
350 },\r
351 {\r
352 EFI_BOOT_NEXT_VARIABLE_NAME,\r
353 {\r
354 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
355 0,\r
356 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
357 sizeof (UINT16),\r
358 sizeof (UINT16)\r
359 },\r
360 NULL\r
361 },\r
362 {\r
363 EFI_BOOT_CURRENT_VARIABLE_NAME,\r
364 {\r
365 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
366 0,\r
367 VARIABLE_ATTRIBUTE_BS_RT,\r
368 sizeof (UINT16),\r
369 sizeof (UINT16)\r
370 },\r
371 NULL\r
372 },\r
373 {\r
374 EFI_BOOT_OPTION_SUPPORT_VARIABLE_NAME,\r
375 {\r
376 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
377 0,\r
378 VARIABLE_ATTRIBUTE_BS_RT,\r
379 sizeof (UINT32),\r
380 sizeof (UINT32)\r
381 },\r
382 NULL\r
383 },\r
384 {\r
385 EFI_DRIVER_ORDER_VARIABLE_NAME,\r
386 {\r
387 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
388 0,\r
389 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
390 sizeof (UINT16),\r
391 MAX_UINTN\r
392 },\r
393 InternalVarCheckSizeArray\r
394 },\r
395 {\r
396 EFI_SYS_PREP_ORDER_VARIABLE_NAME,\r
397 {\r
398 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
399 0,\r
400 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
401 sizeof (UINT16),\r
402 MAX_UINTN\r
403 },\r
404 InternalVarCheckSizeArray\r
405 },\r
406 {\r
407 EFI_HW_ERR_REC_SUPPORT_VARIABLE_NAME,\r
408 {\r
409 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
410 0,\r
411 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
412 sizeof (UINT16),\r
413 sizeof (UINT16)\r
414 },\r
415 NULL\r
416 },\r
417 {\r
418 EFI_SETUP_MODE_NAME,\r
419 {\r
420 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
421 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY,\r
422 VARIABLE_ATTRIBUTE_BS_RT,\r
423 sizeof (UINT8),\r
424 sizeof (UINT8)\r
425 },\r
426 NULL\r
427 },\r
428 {\r
429 EFI_KEY_EXCHANGE_KEY_NAME,\r
430 {\r
431 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
432 0,\r
433 VARIABLE_ATTRIBUTE_NV_BS_RT_AT,\r
434 1,\r
435 MAX_UINTN\r
436 },\r
437 NULL\r
438 },\r
439 {\r
440 EFI_PLATFORM_KEY_NAME,\r
441 {\r
442 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
443 0,\r
444 VARIABLE_ATTRIBUTE_NV_BS_RT_AT,\r
445 1,\r
446 MAX_UINTN\r
447 },\r
448 NULL\r
449 },\r
450 {\r
451 EFI_SIGNATURE_SUPPORT_NAME,\r
452 {\r
453 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
454 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY,\r
455 VARIABLE_ATTRIBUTE_BS_RT,\r
456 sizeof (EFI_GUID),\r
457 MAX_UINTN\r
458 },\r
459 InternalVarCheckSizeArray\r
460 },\r
461 {\r
462 EFI_SECURE_BOOT_MODE_NAME,\r
463 {\r
464 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
465 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY,\r
466 VARIABLE_ATTRIBUTE_BS_RT,\r
467 sizeof (UINT8),\r
468 sizeof (UINT8)\r
469 },\r
470 NULL\r
471 },\r
472 {\r
473 EFI_KEK_DEFAULT_VARIABLE_NAME,\r
474 {\r
475 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
476 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY,\r
477 VARIABLE_ATTRIBUTE_BS_RT,\r
478 1,\r
479 MAX_UINTN\r
480 },\r
481 NULL\r
482 },\r
483 {\r
484 EFI_PK_DEFAULT_VARIABLE_NAME,\r
485 {\r
486 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
487 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY,\r
488 VARIABLE_ATTRIBUTE_BS_RT,\r
489 1,\r
490 MAX_UINTN\r
491 },\r
492 NULL\r
493 },\r
494 {\r
495 EFI_DB_DEFAULT_VARIABLE_NAME,\r
496 {\r
497 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
498 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY,\r
499 VARIABLE_ATTRIBUTE_BS_RT,\r
500 1,\r
501 MAX_UINTN\r
502 },\r
503 NULL\r
504 },\r
505 {\r
506 EFI_DBX_DEFAULT_VARIABLE_NAME,\r
507 {\r
508 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
509 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY,\r
510 VARIABLE_ATTRIBUTE_BS_RT,\r
511 1,\r
512 MAX_UINTN\r
513 },\r
514 NULL\r
515 },\r
516 {\r
517 EFI_DBT_DEFAULT_VARIABLE_NAME,\r
518 {\r
519 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
520 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY,\r
521 VARIABLE_ATTRIBUTE_BS_RT,\r
522 1,\r
523 MAX_UINTN\r
524 },\r
525 NULL\r
526 },\r
527 {\r
528 EFI_OS_INDICATIONS_SUPPORT_VARIABLE_NAME,\r
529 {\r
530 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
531 0,\r
532 VARIABLE_ATTRIBUTE_BS_RT,\r
533 sizeof (UINT64),\r
534 sizeof (UINT64)\r
535 },\r
536 NULL\r
537 },\r
538 {\r
539 EFI_OS_INDICATIONS_VARIABLE_NAME,\r
540 {\r
541 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
542 0,\r
543 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
544 sizeof (UINT64),\r
545 sizeof (UINT64)\r
546 },\r
547 NULL\r
548 },\r
549 {\r
550 EFI_VENDOR_KEYS_VARIABLE_NAME,\r
551 {\r
552 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
553 VAR_CHECK_VARIABLE_PROPERTY_READ_ONLY,\r
554 VARIABLE_ATTRIBUTE_BS_RT,\r
555 sizeof (UINT8),\r
556 sizeof (UINT8)\r
557 },\r
558 NULL\r
559 },\r
560};\r
561\r
562UEFI_DEFINED_VARIABLE_ENTRY mGlobalVariableList2[] = {\r
563 {\r
564 L"Boot####",\r
565 {\r
566 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
567 0,\r
568 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
569 sizeof (UINT32) + sizeof (UINT16),\r
570 MAX_UINTN\r
571 },\r
572 InternalVarCheckLoadOption\r
573 },\r
574 {\r
575 L"Driver####",\r
576 {\r
577 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
578 0,\r
579 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
580 sizeof (UINT32) + sizeof (UINT16),\r
581 MAX_UINTN\r
582 },\r
583 InternalVarCheckLoadOption\r
584 },\r
585 {\r
586 L"SysPrep####",\r
587 {\r
588 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
589 0,\r
590 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
591 sizeof (UINT32) + sizeof (UINT16),\r
592 MAX_UINTN\r
593 },\r
594 InternalVarCheckLoadOption\r
595 },\r
596 {\r
597 L"Key####",\r
598 {\r
599 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
600 0,\r
601 VARIABLE_ATTRIBUTE_NV_BS_RT,\r
602 sizeof (EFI_KEY_OPTION),\r
603 sizeof (EFI_KEY_OPTION) + 3 * sizeof (EFI_INPUT_KEY)\r
604 },\r
605 InternalVarCheckKeyOption\r
606 },\r
51b655a8
RN
607 {\r
608 L"PlatformRecovery####",\r
609 {\r
610 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
611 0,\r
612 VARIABLE_ATTRIBUTE_BS_RT,\r
613 sizeof (UINT32) + sizeof (UINT16),\r
614 MAX_UINTN\r
615 },\r
616 InternalVarCheckLoadOption\r
617 },\r
b85488b3
SZ
618};\r
619\r
620//\r
621// EFI_IMAGE_SECURITY_DATABASE_GUID\r
622//\r
623UEFI_DEFINED_VARIABLE_ENTRY mImageSecurityVariableList[] = {\r
624 {\r
625 EFI_IMAGE_SECURITY_DATABASE,\r
626 {\r
627 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
628 0,\r
629 VARIABLE_ATTRIBUTE_NV_BS_RT_AT,\r
630 1,\r
631 MAX_UINTN\r
632 },\r
633 NULL\r
634 },\r
635 {\r
636 EFI_IMAGE_SECURITY_DATABASE1,\r
637 {\r
638 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
639 0,\r
640 VARIABLE_ATTRIBUTE_NV_BS_RT_AT,\r
641 1,\r
642 MAX_UINTN\r
643 },\r
644 NULL\r
645 },\r
646 {\r
647 EFI_IMAGE_SECURITY_DATABASE2,\r
648 {\r
649 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
650 0,\r
651 VARIABLE_ATTRIBUTE_NV_BS_RT_AT,\r
652 1,\r
653 MAX_UINTN\r
654 },\r
655 NULL\r
656 },\r
657};\r
658\r
659//\r
660// EFI_HARDWARE_ERROR_VARIABLE\r
661//\r
662UEFI_DEFINED_VARIABLE_ENTRY mHwErrRecVariable = {\r
663 L"HwErrRec####",\r
664 {\r
665 VAR_CHECK_VARIABLE_PROPERTY_REVISION,\r
666 0,\r
667 VARIABLE_ATTRIBUTE_NV_BS_RT_HR,\r
668 1,\r
669 MAX_UINTN\r
670 },\r
671 NULL\r
672};\r
673\r
674EFI_GUID *mUefiDefinedGuid[] = {\r
675 &gEfiGlobalVariableGuid,\r
676 &gEfiImageSecurityDatabaseGuid,\r
677 &gEfiHardwareErrorVariableGuid\r
678};\r
679\r
680/**\r
6c59c7c2 681 Check if a Unicode character is an upper case hexadecimal character.\r
b85488b3 682\r
6c59c7c2
SZ
683 This function checks if a Unicode character is an upper case\r
684 hexadecimal character. The valid upper case hexadecimal character is\r
685 L'0' to L'9', or L'A' to L'F'.\r
b85488b3
SZ
686\r
687\r
688 @param[in] Char The character to check against.\r
689\r
6c59c7c2
SZ
690 @retval TRUE If the Char is an upper case hexadecmial character.\r
691 @retval FALSE If the Char is not an upper case hexadecmial character.\r
b85488b3
SZ
692\r
693**/\r
694BOOLEAN\r
695EFIAPI\r
696VarCheckUefiIsHexaDecimalDigitCharacter (\r
697 IN CHAR16 Char\r
698 )\r
699{\r
6c59c7c2 700 return (BOOLEAN) ((Char >= L'0' && Char <= L'9') || (Char >= L'A' && Char <= L'F'));\r
b85488b3
SZ
701}\r
702\r
703/**\r
704\r
705 This code checks if variable is hardware error record variable or not.\r
706\r
707 According to UEFI spec, hardware error record variable should use the EFI_HARDWARE_ERROR_VARIABLE VendorGuid\r
708 and have the L"HwErrRec####" name convention, #### is a printed hex value and no 0x or h is included in the hex value.\r
709\r
710 @param[in] VariableName Pointer to variable name.\r
711 @param[in] VendorGuid Variable Vendor Guid.\r
712\r
713 @retval TRUE Variable is hardware error record variable.\r
714 @retval FALSE Variable is not hardware error record variable.\r
715\r
716**/\r
717BOOLEAN\r
718EFIAPI\r
719IsHwErrRecVariable (\r
720 IN CHAR16 *VariableName,\r
721 IN EFI_GUID *VendorGuid\r
722 )\r
723{\r
724 if (!CompareGuid (VendorGuid, &gEfiHardwareErrorVariableGuid) ||\r
725 (StrLen (VariableName) != StrLen (L"HwErrRec####")) ||\r
726 (StrnCmp(VariableName, L"HwErrRec", StrLen (L"HwErrRec")) != 0) ||\r
727 !VarCheckUefiIsHexaDecimalDigitCharacter (VariableName[0x8]) ||\r
728 !VarCheckUefiIsHexaDecimalDigitCharacter (VariableName[0x9]) ||\r
729 !VarCheckUefiIsHexaDecimalDigitCharacter (VariableName[0xA]) ||\r
730 !VarCheckUefiIsHexaDecimalDigitCharacter (VariableName[0xB])) {\r
731 return FALSE;\r
732 }\r
733\r
734 return TRUE;\r
735}\r
736\r
737/**\r
738 Get UEFI defined var check function.\r
739\r
740 @param[in] VariableName Pointer to variable name.\r
741 @param[in] VendorGuid Pointer to variable vendor GUID.\r
742 @param[out] VariableProperty Pointer to variable property.\r
743\r
744 @return Internal var check function, NULL if no specific check function.\r
745\r
746**/\r
747INTERNAL_VAR_CHECK_FUNCTION\r
748GetUefiDefinedVarCheckFunction (\r
749 IN CHAR16 *VariableName,\r
750 IN EFI_GUID *VendorGuid,\r
751 OUT VAR_CHECK_VARIABLE_PROPERTY **VariableProperty\r
752 )\r
753{\r
754 UINTN Index;\r
755 UINTN NameLength;\r
756\r
757 if (CompareGuid (VendorGuid, &gEfiGlobalVariableGuid)) {\r
758 //\r
759 // Try list 1, exactly match.\r
760 //\r
761 for (Index = 0; Index < sizeof (mGlobalVariableList)/sizeof (mGlobalVariableList[0]); Index++) {\r
762 if (StrCmp (mGlobalVariableList[Index].Name, VariableName) == 0) {\r
763 *VariableProperty = &(mGlobalVariableList[Index].VariableProperty);\r
764 return mGlobalVariableList[Index].CheckFunction;\r
765 }\r
766 }\r
767\r
768 //\r
769 // Try list 2.\r
770 //\r
771 NameLength = StrLen (VariableName) - 4;\r
772 for (Index = 0; Index < sizeof (mGlobalVariableList2)/sizeof (mGlobalVariableList2[0]); Index++) {\r
773 if ((StrLen (VariableName) == StrLen (mGlobalVariableList2[Index].Name)) &&\r
774 (StrnCmp (VariableName, mGlobalVariableList2[Index].Name, NameLength) == 0) &&\r
775 VarCheckUefiIsHexaDecimalDigitCharacter (VariableName[NameLength]) &&\r
776 VarCheckUefiIsHexaDecimalDigitCharacter (VariableName[NameLength + 1]) &&\r
777 VarCheckUefiIsHexaDecimalDigitCharacter (VariableName[NameLength + 2]) &&\r
778 VarCheckUefiIsHexaDecimalDigitCharacter (VariableName[NameLength + 3])) {\r
779 *VariableProperty = &(mGlobalVariableList2[Index].VariableProperty);\r
780 return mGlobalVariableList2[Index].CheckFunction;\r
781 }\r
782 }\r
783 }\r
784\r
785 return NULL;\r
786}\r
787\r
788/**\r
789 SetVariable check handler UEFI defined.\r
790\r
791 @param[in] VariableName Name of Variable to set.\r
792 @param[in] VendorGuid Variable vendor GUID.\r
793 @param[in] Attributes Attribute value of the variable.\r
794 @param[in] DataSize Size of Data to set.\r
795 @param[in] Data Data pointer.\r
796\r
797 @retval EFI_SUCCESS The SetVariable check result was success.\r
798 @retval EFI_INVALID_PARAMETER An invalid combination of attribute bits, name, GUID,\r
799 DataSize and Data value was supplied.\r
800 @retval EFI_WRITE_PROTECTED The variable in question is read-only.\r
801\r
802**/\r
803EFI_STATUS\r
804EFIAPI\r
805SetVariableCheckHandlerUefiDefined (\r
806 IN CHAR16 *VariableName,\r
807 IN EFI_GUID *VendorGuid,\r
808 IN UINT32 Attributes,\r
809 IN UINTN DataSize,\r
810 IN VOID *Data\r
811 )\r
812{\r
813 EFI_STATUS Status;\r
814 UINTN Index;\r
815 VAR_CHECK_VARIABLE_PROPERTY Property;\r
816 VAR_CHECK_VARIABLE_PROPERTY *VarCheckProperty;\r
817 INTERNAL_VAR_CHECK_FUNCTION VarCheckFunction;\r
818\r
819 if ((((Attributes & EFI_VARIABLE_APPEND_WRITE) == 0) && (DataSize == 0)) || (Attributes == 0)) {\r
820 //\r
821 // Do not check delete variable.\r
822 //\r
823 return EFI_SUCCESS;\r
824 }\r
825\r
826 if ((Attributes & EFI_VARIABLE_HARDWARE_ERROR_RECORD) == EFI_VARIABLE_HARDWARE_ERROR_RECORD) {\r
827 if (!IsHwErrRecVariable (VariableName, VendorGuid)) {\r
828 return EFI_INVALID_PARAMETER;\r
829 }\r
830 }\r
831\r
832 for (Index = 0; Index < sizeof (mUefiDefinedGuid)/sizeof (mUefiDefinedGuid[0]); Index++) {\r
833 if (CompareGuid (VendorGuid, mUefiDefinedGuid[Index])) {\r
834 if (VarCheckLibVariablePropertyGet (VariableName, VendorGuid, &Property) == EFI_NOT_FOUND) {\r
835 //\r
836 // To prevent name collisions with possible future globally defined variables,\r
837 // other internal firmware data variables that are not defined here must be\r
838 // saved with a unique VendorGuid other than EFI_GLOBAL_VARIABLE or\r
839 // any other GUID defined by the UEFI Specification. Implementations must\r
840 // only permit the creation of variables with a UEFI Specification-defined\r
841 // VendorGuid when these variables are documented in the UEFI Specification.\r
842 //\r
843 DEBUG ((EFI_D_INFO, "UEFI Variable Check fail %r - %s not in %g namespace\n", EFI_INVALID_PARAMETER, VariableName, VendorGuid));\r
844 return EFI_INVALID_PARAMETER;\r
845 }\r
846 }\r
847 }\r
848\r
849 if (DataSize == 0) {\r
850 return EFI_SUCCESS;\r
851 }\r
852\r
853 VarCheckProperty = NULL;\r
854 VarCheckFunction = GetUefiDefinedVarCheckFunction (VariableName, VendorGuid, &VarCheckProperty);\r
855 if (VarCheckFunction != NULL) {\r
856 Status = VarCheckFunction (\r
857 VarCheckProperty,\r
858 DataSize,\r
859 Data\r
860 );\r
861 if (EFI_ERROR (Status)) {\r
862 DEBUG ((EFI_D_INFO, "UEFI Variable Check function fail %r - %g:%s\n", Status, VendorGuid, VariableName));\r
863 return Status;\r
864 }\r
865 }\r
866\r
867 return EFI_SUCCESS;\r
868}\r
869\r
870/**\r
871 Variable property set for UEFI defined variables.\r
872\r
873**/\r
874VOID\r
875VariablePropertySetUefiDefined (\r
876 VOID\r
877 )\r
878{\r
879 UINTN Index;\r
880\r
881 //\r
882 // EFI_GLOBAL_VARIABLE\r
883 //\r
884 for (Index = 0; Index < sizeof (mGlobalVariableList)/sizeof (mGlobalVariableList[0]); Index++) {\r
885 VarCheckLibVariablePropertySet (\r
886 mGlobalVariableList[Index].Name,\r
887 &gEfiGlobalVariableGuid,\r
888 &mGlobalVariableList[Index].VariableProperty\r
889 );\r
890 }\r
891 for (Index = 0; Index < sizeof (mGlobalVariableList2)/sizeof (mGlobalVariableList2[0]); Index++) {\r
892 VarCheckLibVariablePropertySet (\r
893 mGlobalVariableList2[Index].Name,\r
894 &gEfiGlobalVariableGuid,\r
895 &mGlobalVariableList2[Index].VariableProperty\r
896 );\r
897 }\r
898\r
899 //\r
900 // EFI_IMAGE_SECURITY_DATABASE_GUID\r
901 //\r
902 for (Index = 0; Index < sizeof (mImageSecurityVariableList)/sizeof (mImageSecurityVariableList[0]); Index++) {\r
903 VarCheckLibVariablePropertySet (\r
904 mImageSecurityVariableList[Index].Name,\r
905 &gEfiImageSecurityDatabaseGuid,\r
906 &mImageSecurityVariableList[Index].VariableProperty\r
907 );\r
908 }\r
909\r
910 //\r
911 // EFI_HARDWARE_ERROR_VARIABLE\r
912 //\r
913 VarCheckLibVariablePropertySet (\r
914 mHwErrRecVariable.Name,\r
915 &gEfiHardwareErrorVariableGuid,\r
916 &mHwErrRecVariable.VariableProperty\r
917 );\r
918}\r
919\r
920/**\r
921 Constructor function of VarCheckUefiLib to set property and\r
922 register SetVariable check handler for UEFI defined variables.\r
923\r
924 @param[in] ImageHandle The firmware allocated handle for the EFI image.\r
925 @param[in] SystemTable A pointer to the EFI System Table.\r
926\r
927 @retval EFI_SUCCESS The constructor executed correctly.\r
928\r
929**/\r
930EFI_STATUS\r
931EFIAPI\r
932VarCheckUefiLibNullClassConstructor (\r
933 IN EFI_HANDLE ImageHandle,\r
934 IN EFI_SYSTEM_TABLE *SystemTable\r
935 )\r
936{\r
937 VariablePropertySetUefiDefined ();\r
938 VarCheckLibRegisterSetVariableCheckHandler (SetVariableCheckHandlerUefiDefined);\r
939\r
940 return EFI_SUCCESS;\r
941}\r