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