36 IN CONST VOID *PrimaryEntry,
37 IN CONST VOID *SecondaryEntry
43 CONST OC_MISC_TOOLS_ENTRY *MiscEntriesPrimaryEntry;
44 CONST OC_MISC_TOOLS_ENTRY *MiscEntriesSecondaryEntry;
45 CONST CHAR8 *MiscEntriesPrimaryArgumentsString;
46 CONST CHAR8 *MiscEntriesSecondaryArgumentsString;
47 CONST CHAR8 *MiscEntriesPrimaryPathString;
48 CONST CHAR8 *MiscEntriesSecondaryPathString;
50 MiscEntriesPrimaryEntry = *(CONST OC_MISC_TOOLS_ENTRY **)PrimaryEntry;
51 MiscEntriesSecondaryEntry = *(CONST OC_MISC_TOOLS_ENTRY **)SecondaryEntry;
52 MiscEntriesPrimaryArgumentsString =
OC_BLOB_GET (&MiscEntriesPrimaryEntry->Arguments);
53 MiscEntriesSecondaryArgumentsString =
OC_BLOB_GET (&MiscEntriesSecondaryEntry->Arguments);
54 MiscEntriesPrimaryPathString =
OC_BLOB_GET (&MiscEntriesPrimaryEntry->Path);
55 MiscEntriesSecondaryPathString =
OC_BLOB_GET (&MiscEntriesSecondaryEntry->Path);
57 if (!MiscEntriesPrimaryEntry->Enabled || !MiscEntriesSecondaryEntry->Enabled) {
61 if ( (AsciiStrCmp (MiscEntriesPrimaryArgumentsString, MiscEntriesSecondaryArgumentsString) == 0)
62 && (AsciiStrCmp (MiscEntriesPrimaryPathString, MiscEntriesSecondaryPathString) == 0))
64 DEBUG ((DEBUG_WARN,
"Misc->Entries->Arguments: %a is duplicated ", MiscEntriesPrimaryPathString));
82 IN CONST VOID *PrimaryEntry,
83 IN CONST VOID *SecondaryEntry
86 CONST OC_MISC_TOOLS_ENTRY *MiscToolsPrimaryEntry;
87 CONST OC_MISC_TOOLS_ENTRY *MiscToolsSecondaryEntry;
88 CONST CHAR8 *MiscToolsPrimaryArgumentsString;
89 CONST CHAR8 *MiscToolsSecondaryArgumentsString;
90 CONST CHAR8 *MiscToolsPrimaryPathString;
91 CONST CHAR8 *MiscToolsSecondaryPathString;
92 BOOLEAN MiscToolsPrimaryFullNvramAccess;
93 BOOLEAN MiscToolsSecondaryFullNvramAccess;
95 MiscToolsPrimaryEntry = *(CONST OC_MISC_TOOLS_ENTRY **)PrimaryEntry;
96 MiscToolsSecondaryEntry = *(CONST OC_MISC_TOOLS_ENTRY **)SecondaryEntry;
97 MiscToolsPrimaryArgumentsString =
OC_BLOB_GET (&MiscToolsPrimaryEntry->Arguments);
98 MiscToolsSecondaryArgumentsString =
OC_BLOB_GET (&MiscToolsSecondaryEntry->Arguments);
99 MiscToolsPrimaryPathString =
OC_BLOB_GET (&MiscToolsPrimaryEntry->Path);
100 MiscToolsSecondaryPathString =
OC_BLOB_GET (&MiscToolsSecondaryEntry->Path);
101 MiscToolsPrimaryFullNvramAccess = MiscToolsPrimaryEntry->FullNvramAccess;
102 MiscToolsSecondaryFullNvramAccess = MiscToolsSecondaryEntry->FullNvramAccess;
104 if (!MiscToolsPrimaryEntry->Enabled || !MiscToolsSecondaryEntry->Enabled) {
108 if ( (AsciiStrCmp (MiscToolsPrimaryArgumentsString, MiscToolsSecondaryArgumentsString) == 0)
109 && (AsciiStrCmp (MiscToolsPrimaryPathString, MiscToolsSecondaryPathString) == 0)
110 && (MiscToolsPrimaryFullNvramAccess == MiscToolsSecondaryFullNvramAccess))
112 DEBUG ((DEBUG_WARN,
"Misc->Tools->Path: %a is duplicated ", MiscToolsPrimaryPathString));
153 IN OC_GLOBAL_CONFIG *Config
159 CONST CHAR8 *BlessOverrideEntry;
160 STATIC CONST CHAR8 *DisallowedBlessOverrideValues[] = {
161 "\\EFI\\Microsoft\\Boot\\bootmgfw.efi",
162 "\\System\\Library\\CoreServices\\boot.efi",
167 for (Index = 0; Index < Config->Misc.BlessOverride.Count; ++Index) {
168 BlessOverrideEntry =
OC_BLOB_GET (Config->Misc.BlessOverride.Values[Index]);
173 for (Index2 = 0; Index2 <
ARRAY_SIZE (DisallowedBlessOverrideValues); ++Index2) {
174 if ( (AsciiStrCmp (BlessOverrideEntry, DisallowedBlessOverrideValues[Index2]) == 0)
175 || (AsciiStrCmp (BlessOverrideEntry, &DisallowedBlessOverrideValues[Index2][1]) == 0))
177 DEBUG ((DEBUG_WARN,
"Misc->BlessOverride: %a is redundant!\n", BlessOverrideEntry));
189 IN CONST CHAR8 *InstanceIdentifier
202 if (AsciiStrStr (InstanceIdentifier,
",") != NULL) {
203 DEBUG ((DEBUG_WARN,
"Misc->Boot->InstanceIdentifier cannot contain comma (,)!\n"));
210 Length = AsciiStrLen (InstanceIdentifier);
214 DEBUG ((DEBUG_WARN,
"Misc->Boot->InstanceIdentifier cannot contain CR, LF, TAB or any other non-ASCII characters!\n"));
225 IN OC_GLOBAL_CONFIG *Config
229 UINT32 ConsoleAttributes;
230 CONST CHAR8 *HibernateMode;
231 UINT32 PickerAttributes;
233 OC_UEFI_DRIVER_ENTRY *DriverEntry;
235 BOOLEAN HasOpenCanopyEfiDriver;
236 CONST CHAR8 *PickerMode;
237 CONST CHAR8 *PickerVariant;
238 CONST CHAR8 *InstanceIdentifier;
240 UINTN PVPathFixedSize;
241 BOOLEAN IsPickerAudioAssistEnabled;
242 BOOLEAN IsAudioSupportEnabled;
243 CONST CHAR8 *LauncherOption;
244 CONST CHAR8 *LauncherPath;
248 ConsoleAttributes = Config->Misc.Boot.ConsoleAttributes;
249 if ((ConsoleAttributes & ~0x7FU) != 0) {
250 DEBUG ((DEBUG_WARN,
"Misc->Boot->ConsoleAttributes has unknown bits set!\n"));
254 HibernateMode =
OC_BLOB_GET (&Config->Misc.Boot.HibernateMode);
255 if ( (AsciiStrCmp (HibernateMode,
"None") != 0)
256 && (AsciiStrCmp (HibernateMode,
"Auto") != 0)
257 && (AsciiStrCmp (HibernateMode,
"RTC") != 0)
258 && (AsciiStrCmp (HibernateMode,
"NVRAM") != 0))
260 DEBUG ((DEBUG_WARN,
"Misc->Boot->HibernateMode is borked (Can only be None, Auto, RTC, or NVRAM)!\n"));
264 PickerAttributes = Config->Misc.Boot.PickerAttributes;
266 DEBUG ((DEBUG_WARN,
"Misc->Boot->PickerAttributes has unknown bits set!\n"));
270 HasOpenCanopyEfiDriver = FALSE;
271 for (Index = 0; Index < Config->Uefi.Drivers.Count; ++Index) {
272 DriverEntry = Config->Uefi.Drivers.Values[Index];
275 if (DriverEntry->Enabled && (AsciiStrCmp (Driver,
"OpenCanopy.efi") == 0)) {
276 HasOpenCanopyEfiDriver = TRUE;
280 PickerMode =
OC_BLOB_GET (&Config->Misc.Boot.PickerMode);
281 if ( (AsciiStrCmp (PickerMode,
"Builtin") != 0)
282 && (AsciiStrCmp (PickerMode,
"External") != 0)
283 && (AsciiStrCmp (PickerMode,
"Apple") != 0))
285 DEBUG ((DEBUG_WARN,
"Misc->Boot->PickerMode is borked (Can only be Builtin, External, or Apple)!\n"));
287 }
else if (HasOpenCanopyEfiDriver && (AsciiStrCmp (PickerMode,
"External") != 0)) {
288 DEBUG ((DEBUG_WARN,
"OpenCanopy.efi is loaded at UEFI->Drivers, but Misc->Boot->PickerMode is not set to External!\n"));
292 PickerVariant =
OC_BLOB_GET (&Config->Misc.Boot.PickerVariant);
293 if (PickerVariant[0] ==
'\0') {
294 DEBUG ((DEBUG_WARN,
"Misc->Boot->PickerVariant cannot be empty!\n"));
298 InstanceIdentifier =
OC_BLOB_GET (&Config->Misc.Boot.InstanceIdentifier);
307 PVSumSize = PVPathFixedSize + AsciiStrLen (PickerVariant);
311 "Misc->Boot->PickerVariant (length %u) is too long (should not exceed %u)!\n",
312 AsciiStrLen (PickerVariant),
318 IsPickerAudioAssistEnabled = Config->Misc.Boot.PickerAudioAssist;
319 IsAudioSupportEnabled = Config->Uefi.Audio.AudioSupport;
320 if (IsPickerAudioAssistEnabled && !IsAudioSupportEnabled) {
321 DEBUG ((DEBUG_WARN,
"Misc->Boot->PickerAudioAssist is enabled, but UEFI->Audio->AudioSupport is not enabled altogether!\n"));
325 LauncherOption =
OC_BLOB_GET (&Config->Misc.Boot.LauncherOption);
326 if ( (AsciiStrCmp (LauncherOption,
"Disabled") != 0)
327 && (AsciiStrCmp (LauncherOption,
"Full") != 0)
328 && (AsciiStrCmp (LauncherOption,
"Short") != 0)
329 && (AsciiStrCmp (LauncherOption,
"System") != 0))
331 DEBUG ((DEBUG_WARN,
"Misc->Boot->LauncherOption is borked (Can only be Disabled, Full, Short, or System)!\n"));
335 LauncherPath =
OC_BLOB_GET (&Config->Misc.Boot.LauncherPath);
336 if (LauncherPath[0] ==
'\0') {
337 DEBUG ((DEBUG_WARN,
"Misc->Boot->LauncherPath cannot be empty!\n"));
347 IN OC_GLOBAL_CONFIG *Config
352 UINT64 AllowedDisplayLevel;
354 UINT64 AllowedHaltLevel;
362 DisplayLevel = Config->Misc.Debug.DisplayLevel;
363 AllowedDisplayLevel = DEBUG_WARN | DEBUG_INFO | DEBUG_VERBOSE | DEBUG_ERROR;
364 if ((DisplayLevel & ~AllowedDisplayLevel) != 0) {
365 DEBUG ((DEBUG_WARN,
"Misc->Debug->DisplayLevel has unknown bits set!\n"));
369 HaltLevel = DisplayLevel;
370 AllowedHaltLevel = AllowedDisplayLevel;
371 if ((HaltLevel & ~AllowedHaltLevel) != 0) {
372 DEBUG ((DEBUG_WARN,
"Misc->Security->HaltLevel has unknown bits set!\n"));
376 Target = Config->Misc.Debug.Target;
378 DEBUG ((DEBUG_WARN,
"Misc->Debug->Target has unknown bits set!\n"));
446 IN OC_GLOBAL_CONFIG *Config
451 CONST CHAR8 *Arguments;
452 CONST CHAR8 *Comment;
453 CONST CHAR8 *AsciiName;
454 CONST CHAR16 *UnicodeName;
456 CONST CHAR8 *Flavour;
460 for (Index = 0; Index < Config->Misc.Entries.Count; ++Index) {
461 Arguments =
OC_BLOB_GET (&Config->Misc.Entries.Values[Index]->Arguments);
462 Comment =
OC_BLOB_GET (&Config->Misc.Entries.Values[Index]->Comment);
463 AsciiName =
OC_BLOB_GET (&Config->Misc.Entries.Values[Index]->Name);
464 Path =
OC_BLOB_GET (&Config->Misc.Entries.Values[Index]->Path);
465 Flavour =
OC_BLOB_GET (&Config->Misc.Entries.Values[Index]->Flavour);
474 DEBUG ((DEBUG_WARN,
"Misc->Entries[%u]->Arguments contains illegal character!\n", Index));
479 DEBUG ((DEBUG_WARN,
"Misc->Entries[%u]->Comment contains illegal character!\n", Index));
484 if (UnicodeName != NULL) {
486 DEBUG ((DEBUG_WARN,
"Misc->Entries[%u]->Name contains illegal character!\n", Index));
490 FreePool ((VOID *)UnicodeName);
497 DEBUG ((DEBUG_WARN,
"Misc->Entries[%u]->Path contains illegal character!\n", Index));
508 Config->Misc.Entries.Values,
509 Config->Misc.Entries.Count,
510 sizeof (Config->Misc.Entries.Values[0]),
520 IN OC_GLOBAL_CONFIG *Config
525 BOOLEAN IsAuthRestartEnabled;
527 CONST CHAR8 *AsciiDmgLoading;
528 UINT32 ExposeSensitiveData;
529 CONST CHAR8 *AsciiVault;
531 UINT32 AllowedScanPolicy;
532 CONST CHAR8 *SecureBootModel;
537 for (Index = 0; Index < Config->Kernel.Add.Count; ++Index) {
543 IsAuthRestartEnabled = Config->Misc.Security.AuthRestart;
544 if (IsAuthRestartEnabled && !HasVSMCKext) {
545 DEBUG ((DEBUG_WARN,
"Misc->Security->AuthRestart is enabled, but VirtualSMC is not loaded at Kernel->Add!\n"));
549 AsciiDmgLoading =
OC_BLOB_GET (&Config->Misc.Security.DmgLoading);
550 if ( (AsciiStrCmp (AsciiDmgLoading,
"Disabled") != 0)
551 && (AsciiStrCmp (AsciiDmgLoading,
"Signed") != 0)
552 && (AsciiStrCmp (AsciiDmgLoading,
"Any") != 0))
554 DEBUG ((DEBUG_WARN,
"Misc->Security->DmgLoading is borked (Can only be Disabled, Signed, or Any)!\n"));
558 ExposeSensitiveData = Config->Misc.Security.ExposeSensitiveData;
560 DEBUG ((DEBUG_WARN,
"Misc->Security->ExposeSensitiveData has unknown bits set!\n"));
564 AsciiVault =
OC_BLOB_GET (&Config->Misc.Security.Vault);
565 if ( (AsciiStrCmp (AsciiVault,
"Optional") != 0)
566 && (AsciiStrCmp (AsciiVault,
"Basic") != 0)
567 && (AsciiStrCmp (AsciiVault,
"Secure") != 0))
569 DEBUG ((DEBUG_WARN,
"Misc->Security->Vault is borked (Can only be Optional, Basic, or Secure)!\n"));
573 ScanPolicy = Config->Misc.Security.ScanPolicy;
578 if (ScanPolicy != 0) {
579 if ((ScanPolicy & ~AllowedScanPolicy) != 0) {
580 DEBUG ((DEBUG_WARN,
"Misc->Security->ScanPolicy has unknown bits set!\n"));
585 DEBUG ((DEBUG_WARN,
"Misc->Security->ScanPolicy requests scanning filesystem, but OC_SCAN_FILE_SYSTEM_LOCK (bit 0) is not set!\n"));
590 DEBUG ((DEBUG_WARN,
"Misc->Security->ScanPolicy requests scanning devices, but OC_SCAN_DEVICE_LOCK (bit 1) is not set!\n"));
598 SecureBootModel =
OC_BLOB_GET (&Config->Misc.Security.SecureBootModel);
600 DEBUG ((DEBUG_WARN,
"Misc->Security->SecureBootModel is borked!\n"));
604 if ( !( (AsciiStrCmp (AsciiDmgLoading,
"Disabled") == 0)
605 || (AsciiStrCmp (AsciiDmgLoading,
"Signed") == 0)
606 || (AsciiDmgLoading[0] ==
'\0'))
607 && (AsciiStrCmp (SecureBootModel,
"Disabled") != 0))
609 DEBUG ((DEBUG_WARN,
"Misc->Security->DmgLoading must be Disabled or Signed unless Misc->Security->SecureBootModel is Disabled!\n"));
628 STATIC CONST UINT32 AllowedBaudRate[] = {
629 921600U, 460800U, 230400U, 115200U,
630 57600U, 38400U, 19200U, 9600U, 7200U,
631 4800U, 3600U, 2400U, 2000U, 1800U,
632 1200U, 600U, 300U, 150U, 134U,
636 for (Index = 0; Index <
ARRAY_SIZE (AllowedBaudRate); ++Index) {
637 if (BaudRate == AllowedBaudRate[Index]) {
642 DEBUG ((DEBUG_WARN,
"Misc->Serial->BaudRate is borked!\n"));
643 DEBUG ((DEBUG_WARN,
"Accepted BaudRate values:\n"));
644 for (Index = 0; Index <
ARRAY_SIZE (AllowedBaudRate); ++Index) {
645 DEBUG ((DEBUG_WARN,
"%u, ", AllowedBaudRate[Index]));
646 if ((Index != 0) && (Index % 5 == 0)) {
647 DEBUG ((DEBUG_WARN,
"\n"));
651 DEBUG ((DEBUG_WARN,
"\n"));
658 IN OC_GLOBAL_CONFIG *Config
662 UINT32 RegisterAccessWidth;
664 CONST UINT8 *PciDeviceInfo;
665 UINT32 PciDeviceInfoSize;
673 RegisterAccessWidth = Config->Misc.Serial.Custom.RegisterAccessWidth;
674 if ((RegisterAccessWidth != 8U) && (RegisterAccessWidth != 32U)) {
675 DEBUG ((DEBUG_WARN,
"Misc->Serial->RegisterAccessWidth can only be 8 or 32!\n"));
679 BaudRate = Config->Misc.Serial.Custom.BaudRate;
688 PciDeviceInfo =
OC_BLOB_GET (&Config->Misc.Serial.Custom.PciDeviceInfo);
689 PciDeviceInfoSize = Config->Misc.Serial.Custom.PciDeviceInfo.Size;
693 }
else if (PciDeviceInfoSize == 0) {
694 DEBUG ((DEBUG_WARN,
"Misc->Serial->PciDeviceInfo cannot be empty (use 0xFF instead)!\n"));
697 if (PciDeviceInfo[PciDeviceInfoSize - 1] != 0xFFU) {
698 DEBUG ((DEBUG_WARN,
"Last byte of Misc->Serial->PciDeviceInfo must be 0xFF!\n"));
702 if ((PciDeviceInfoSize - 1) % 4 != 0) {
703 DEBUG ((DEBUG_WARN,
"Misc->Serial->PciDeviceInfo must be divisible by 4 excluding the last 0xFF!\n"));
714 IN OC_GLOBAL_CONFIG *Config
719 CONST CHAR8 *Arguments;
720 CONST CHAR8 *Comment;
721 CONST CHAR8 *AsciiName;
722 CONST CHAR16 *UnicodeName;
724 CONST CHAR8 *Flavour;
728 for (Index = 0; Index < Config->Misc.Tools.Count; ++Index) {
729 Arguments =
OC_BLOB_GET (&Config->Misc.Tools.Values[Index]->Arguments);
730 Comment =
OC_BLOB_GET (&Config->Misc.Tools.Values[Index]->Comment);
731 AsciiName =
OC_BLOB_GET (&Config->Misc.Tools.Values[Index]->Name);
732 Path =
OC_BLOB_GET (&Config->Misc.Tools.Values[Index]->Path);
733 Flavour =
OC_BLOB_GET (&Config->Misc.Tools.Values[Index]->Flavour);
742 DEBUG ((DEBUG_WARN,
"Misc->Tools[%u]->Arguments contains illegal character!\n", Index));
747 DEBUG ((DEBUG_WARN,
"Misc->Tools[%u]->Comment contains illegal character!\n", Index));
755 DEBUG ((DEBUG_WARN,
"Misc->Tools[%u]->Path is too long (should not exceed %u)!\n", Index,
OC_STORAGE_SAFE_PATH_MAX));
760 if (UnicodeName != NULL) {
762 DEBUG ((DEBUG_WARN,
"Misc->Tools[%u]->Name contains illegal character!\n", Index));
766 FreePool ((VOID *)UnicodeName);
773 DEBUG ((DEBUG_WARN,
"Misc->Tools[%u]->Path contains illegal character!\n", Index));
784 Config->Misc.Tools.Values,
785 Config->Misc.Tools.Count,
786 sizeof (Config->Misc.Tools.Values[0]),
#define OPEN_CORE_TOOL_PATH