34 IN CONST VOID *PrimaryDriver,
35 IN CONST VOID *SecondaryDriver
38 CONST OC_UEFI_DRIVER_ENTRY *UefiPrimaryDriver;
39 CONST OC_UEFI_DRIVER_ENTRY *UefiSecondaryDriver;
40 CONST CHAR8 *UefiDriverPrimaryString;
41 CONST CHAR8 *UefiDriverSecondaryString;
43 UefiPrimaryDriver = *(CONST OC_UEFI_DRIVER_ENTRY **)PrimaryDriver;
44 UefiSecondaryDriver = *(CONST OC_UEFI_DRIVER_ENTRY **)SecondaryDriver;
45 UefiDriverPrimaryString =
OC_BLOB_GET (&UefiPrimaryDriver->Path);
46 UefiDriverSecondaryString =
OC_BLOB_GET (&UefiSecondaryDriver->Path);
48 return StringIsDuplicated (
"UEFI->Drivers", UefiDriverPrimaryString, UefiDriverSecondaryString);
63 IN CONST VOID *PrimaryEntry,
64 IN CONST VOID *SecondaryEntry
67 CONST OC_UEFI_RSVD_ENTRY *UefiReservedMemoryPrimaryEntry;
68 CONST OC_UEFI_RSVD_ENTRY *UefiReservedMemorySecondaryEntry;
69 UINT64 UefiReservedMemoryPrimaryAddress;
70 UINT64 UefiReservedMemoryPrimarySize;
71 UINT64 UefiReservedMemorySecondaryAddress;
72 UINT64 UefiReservedMemorySecondarySize;
74 UefiReservedMemoryPrimaryEntry = *(CONST OC_UEFI_RSVD_ENTRY **)PrimaryEntry;
75 UefiReservedMemorySecondaryEntry = *(CONST OC_UEFI_RSVD_ENTRY **)SecondaryEntry;
76 UefiReservedMemoryPrimaryAddress = UefiReservedMemoryPrimaryEntry->Address;
77 UefiReservedMemoryPrimarySize = UefiReservedMemoryPrimaryEntry->Size;
78 UefiReservedMemorySecondaryAddress = UefiReservedMemorySecondaryEntry->Address;
79 UefiReservedMemorySecondarySize = UefiReservedMemorySecondaryEntry->Size;
81 if (!UefiReservedMemoryPrimaryEntry->Enabled || !UefiReservedMemorySecondaryEntry->Enabled) {
85 if ( (UefiReservedMemoryPrimaryAddress < UefiReservedMemorySecondaryAddress + UefiReservedMemorySecondarySize)
86 && (UefiReservedMemorySecondaryAddress < UefiReservedMemoryPrimaryAddress + UefiReservedMemoryPrimarySize))
88 DEBUG ((DEBUG_WARN,
"UEFI->ReservedMemory: Entries have overlapped Address and Size "));
221 IN OC_GLOBAL_CONFIG *Config
225 BOOLEAN IsAudioSupportEnabled;
227 CONST CHAR8 *AsciiAudioDevicePath;
228 CONST CHAR8 *AsciiPlayChime;
232 IsAudioSupportEnabled = Config->Uefi.Audio.AudioSupport;
233 AudioOutMask = Config->Uefi.Audio.AudioOutMask;
234 AsciiAudioDevicePath =
OC_BLOB_GET (&Config->Uefi.Audio.AudioDevice);
235 AsciiPlayChime =
OC_BLOB_GET (&Config->Uefi.Audio.PlayChime);
236 if (IsAudioSupportEnabled) {
237 if (AudioOutMask == 0) {
238 DEBUG ((DEBUG_WARN,
"UEFI->Audio->AudioOutMask is zero when AudioSupport is enabled, no sound will play!\n"));
243 Config->Uefi.Audio.MaximumGain,
251 Config->Uefi.Audio.MinimumAssistGain,
253 Config->Uefi.Audio.MaximumGain,
258 Config->Uefi.Audio.MinimumAudibleGain,
259 "MinimumAudibleGain",
260 Config->Uefi.Audio.MinimumAssistGain,
265 Config->Uefi.Audio.MinimumAudibleGain,
266 "MinimumAudibleGain",
267 Config->Uefi.Audio.MaximumGain,
272 DEBUG ((DEBUG_WARN,
"UEFI->Audio->AudioDevice is borked! Please check the information above!\n"));
276 if (AsciiPlayChime[0] ==
'\0') {
277 DEBUG ((DEBUG_WARN,
"UEFI->Audio->PlayChime cannot be empty when AudioSupport is enabled!\n"));
279 }
else if ( (AsciiStrCmp (AsciiPlayChime,
"Auto") != 0)
280 && (AsciiStrCmp (AsciiPlayChime,
"Enabled") != 0)
281 && (AsciiStrCmp (AsciiPlayChime,
"Disabled") != 0))
283 DEBUG ((DEBUG_WARN,
"UEFI->Audio->PlayChime is borked (Can only be Auto, Enabled, or Disabled)!\n"));
294 IN OC_GLOBAL_CONFIG *Config
299 OC_UEFI_DRIVER_ENTRY *DriverEntry;
300 CONST CHAR8 *Comment;
303 BOOLEAN HasOpenRuntimeEfiDriver;
304 BOOLEAN IsOpenRuntimeLoadEarly;
305 UINT32 IndexOpenRuntimeEfiDriver;
306 BOOLEAN HasOpenUsbKbDxeEfiDriver;
307 UINT32 IndexOpenUsbKbDxeEfiDriver;
308 BOOLEAN HasPs2KeyboardDxeEfiDriver;
309 BOOLEAN IndexPs2KeyboardDxeEfiDriver;
310 BOOLEAN HasHfsEfiDriver;
311 UINT32 IndexHfsEfiDriver;
312 BOOLEAN HasAudioDxeEfiDriver;
313 UINT32 IndexAudioDxeEfiDriver;
314 BOOLEAN IsRequestBootVarRoutingEnabled;
315 BOOLEAN IsKeySupportEnabled;
316 BOOLEAN IsConnectDriversEnabled;
317 BOOLEAN HasOpenVariableRuntimeDxeEfiDriver;
318 UINT32 IndexOpenVariableRuntimeDxeEfiDriver;
319 BOOLEAN HasFirmwareSettingsEntryEfiDriver;
323 HasOpenRuntimeEfiDriver = FALSE;
324 IndexOpenRuntimeEfiDriver = 0;
325 HasOpenUsbKbDxeEfiDriver = FALSE;
326 IndexOpenUsbKbDxeEfiDriver = 0;
327 HasPs2KeyboardDxeEfiDriver = FALSE;
328 IndexPs2KeyboardDxeEfiDriver = 0;
329 HasHfsEfiDriver = FALSE;
330 IndexHfsEfiDriver = 0;
331 HasAudioDxeEfiDriver = FALSE;
332 IndexAudioDxeEfiDriver = 0;
333 HasOpenVariableRuntimeDxeEfiDriver = FALSE;
334 IndexOpenVariableRuntimeDxeEfiDriver = 0;
335 IsOpenRuntimeLoadEarly = FALSE;
336 HasFirmwareSettingsEntryEfiDriver = FALSE;
337 for (Index = 0; Index < Config->Uefi.Drivers.Count; ++Index) {
338 DriverEntry = Config->Uefi.Drivers.Values[Index];
349 "UEFI->Drivers[%u] (length %u) is too long (should not exceed %u)!\n",
351 AsciiStrLen (Driver),
361 DEBUG ((DEBUG_WARN,
"UEFI->Drivers[%u]->Comment contains illegal character!\n", Index));
370 if (!DriverEntry->Enabled) {
374 if (AsciiStrCmp (Driver,
"OpenVariableRuntimeDxe.efi") == 0) {
375 HasOpenVariableRuntimeDxeEfiDriver = TRUE;
376 IndexOpenVariableRuntimeDxeEfiDriver = Index;
378 if (!DriverEntry->LoadEarly) {
379 DEBUG ((DEBUG_WARN,
"OpenVariableRuntimeDxe at UEFI->Drivers[%u] must have LoadEarly set to TRUE!\n", Index));
387 if ((AsciiStrCmp (Driver,
"OpenVariableRuntimeDxe.efi") != 0) && (AsciiStrCmp (Driver,
"OpenRuntime.efi") != 0) && DriverEntry->LoadEarly) {
388 DEBUG ((DEBUG_WARN,
"%a at UEFI->Drivers[%u] must have LoadEarly set to FALSE!\n", Driver, Index));
392 if (AsciiStrCmp (Driver,
"OpenRuntime.efi") == 0) {
393 HasOpenRuntimeEfiDriver = TRUE;
394 IndexOpenRuntimeEfiDriver = Index;
395 IsOpenRuntimeLoadEarly = DriverEntry->LoadEarly;
398 if (AsciiStrCmp (Driver,
"OpenUsbKbDxe.efi") == 0) {
399 HasOpenUsbKbDxeEfiDriver = TRUE;
400 IndexOpenUsbKbDxeEfiDriver = Index;
403 if (AsciiStrCmp (Driver,
"Ps2KeyboardDxe.efi") == 0) {
404 HasPs2KeyboardDxeEfiDriver = TRUE;
405 IndexPs2KeyboardDxeEfiDriver = Index;
413 HasHfsEfiDriver = TRUE;
414 IndexHfsEfiDriver = Index;
417 if (AsciiStrCmp (Driver,
"AudioDxe.efi") == 0) {
418 HasAudioDxeEfiDriver = TRUE;
419 IndexAudioDxeEfiDriver = Index;
422 if (AsciiStrCmp (Driver,
"FirmwareSettingsEntry.efi") == 0) {
423 HasFirmwareSettingsEntryEfiDriver = TRUE;
431 Config->Uefi.Drivers.Values,
432 Config->Uefi.Drivers.Count,
433 sizeof (Config->Uefi.Drivers.Values[0]),
437 if (HasOpenRuntimeEfiDriver) {
438 if (HasOpenVariableRuntimeDxeEfiDriver) {
439 if (!IsOpenRuntimeLoadEarly) {
442 "OpenRuntime.efi at UEFI->Drivers[%u] should have its LoadEarly set to TRUE when OpenVariableRuntimeDxe.efi at UEFI->Drivers[%u] is in use!\n",
443 IndexOpenRuntimeEfiDriver,
444 IndexOpenVariableRuntimeDxeEfiDriver
449 if (IndexOpenVariableRuntimeDxeEfiDriver >= IndexOpenRuntimeEfiDriver) {
452 "OpenRuntime.efi (currently at UEFI->Drivers[%u]) should be placed after OpenVariableRuntimeDxe.efi (currently at UEFI->Drivers[%u])!\n",
453 IndexOpenRuntimeEfiDriver,
454 IndexOpenVariableRuntimeDxeEfiDriver
459 if (IsOpenRuntimeLoadEarly) {
462 "OpenRuntime.efi at UEFI->Drivers[%u] should have its LoadEarly set to FALSE unless OpenVariableRuntimeDxe.efi is in use!\n",
463 IndexOpenRuntimeEfiDriver
470 if (HasFirmwareSettingsEntryEfiDriver && HasOpenVariableRuntimeDxeEfiDriver) {
471 DEBUG ((DEBUG_WARN,
"OpenVariableRuntimeDxe.efi is incompatible with FirmwareSettingsEntry.efi!\n"));
475 IsRequestBootVarRoutingEnabled = Config->Uefi.Quirks.RequestBootVarRouting;
476 if (IsRequestBootVarRoutingEnabled) {
477 if (!HasOpenRuntimeEfiDriver) {
478 DEBUG ((DEBUG_WARN,
"UEFI->Quirks->RequestBootVarRouting is enabled, but OpenRuntime.efi is not loaded at UEFI->Drivers!\n"));
483 IsKeySupportEnabled = Config->Uefi.Input.KeySupport;
484 if (IsKeySupportEnabled) {
485 if (HasOpenUsbKbDxeEfiDriver) {
486 DEBUG ((DEBUG_WARN,
"OpenUsbKbDxe.efi at UEFI->Drivers[%u] should NEVER be used together with UEFI->Input->KeySupport!\n", IndexOpenUsbKbDxeEfiDriver));
490 if (HasPs2KeyboardDxeEfiDriver) {
491 DEBUG ((DEBUG_WARN,
"UEFI->Input->KeySupport should be enabled when Ps2KeyboardDxe.efi is in use!\n"));
496 if (HasOpenUsbKbDxeEfiDriver && HasPs2KeyboardDxeEfiDriver) {
499 "OpenUsbKbDxe.efi at UEFI->Drivers[%u], and Ps2KeyboardDxe.efi at UEFI->Drivers[%u], should NEVER co-exist!\n",
500 IndexOpenUsbKbDxeEfiDriver,
501 IndexPs2KeyboardDxeEfiDriver
506 IsConnectDriversEnabled = Config->Uefi.ConnectDrivers;
507 if (!IsConnectDriversEnabled) {
508 if (HasHfsEfiDriver) {
509 DEBUG ((DEBUG_WARN,
"HFS+ filesystem driver is loaded at UEFI->Drivers[%u], but UEFI->ConnectDrivers is not enabled!\n", IndexHfsEfiDriver));
513 if (HasAudioDxeEfiDriver) {
514 DEBUG ((DEBUG_WARN,
"AudioDevice.efi is loaded at UEFI->Drivers[%u], but UEFI->ConnectDrivers is not enabled!\n", IndexAudioDxeEfiDriver));
525 IN OC_GLOBAL_CONFIG *Config
529 BOOLEAN IsPointerSupportEnabled;
530 CONST CHAR8 *PointerSupportMode;
531 CONST CHAR8 *KeySupportMode;
535 IsPointerSupportEnabled = Config->Uefi.Input.PointerSupport;
536 PointerSupportMode =
OC_BLOB_GET (&Config->Uefi.Input.PointerSupportMode);
537 if (IsPointerSupportEnabled && (AsciiStrCmp (PointerSupportMode,
"ASUS") != 0)) {
538 DEBUG ((DEBUG_WARN,
"UEFI->Input->PointerSupport is enabled, but PointerSupportMode is not ASUS!\n"));
542 KeySupportMode =
OC_BLOB_GET (&Config->Uefi.Input.KeySupportMode);
543 if ( (AsciiStrCmp (KeySupportMode,
"Auto") != 0)
544 && (AsciiStrCmp (KeySupportMode,
"V1") != 0)
545 && (AsciiStrCmp (KeySupportMode,
"V2") != 0)
546 && (AsciiStrCmp (KeySupportMode,
"AMI") != 0))
548 DEBUG ((DEBUG_WARN,
"UEFI->Input->KeySupportMode is illegal (Can only be Auto, V1, V2, AMI)!\n"));
558 IN OC_GLOBAL_CONFIG *Config
562 CONST CHAR8 *InitialMode;
563 CONST CHAR8 *TextRenderer;
564 CONST CHAR8 *GopPassThrough;
565 BOOLEAN IsTextRendererSystem;
566 BOOLEAN IsClearScreenOnModeSwitchEnabled;
567 BOOLEAN IsIgnoreTextInGraphicsEnabled;
568 BOOLEAN IsReplaceTabWithSpaceEnabled;
569 BOOLEAN IsSanitiseClearScreenEnabled;
570 CONST CHAR8 *ConsoleFont;
571 CONST CHAR8 *ConsoleMode;
572 CONST CHAR8 *Resolution;
578 BOOLEAN HasUefiOutputUIScale;
581 IsTextRendererSystem = FALSE;
582 HasUefiOutputUIScale = FALSE;
587 InitialMode =
OC_BLOB_GET (&Config->Uefi.Output.InitialMode);
588 if ( (AsciiStrCmp (InitialMode,
"Auto") != 0)
589 && (AsciiStrCmp (InitialMode,
"Text") != 0)
590 && (AsciiStrCmp (InitialMode,
"Graphics") != 0))
592 DEBUG ((DEBUG_WARN,
"UEFI->Output->InitialMode is illegal (Can only be Auto, Text, or Graphics)!\n"));
596 TextRenderer =
OC_BLOB_GET (&Config->Uefi.Output.TextRenderer);
597 if ( (AsciiStrCmp (TextRenderer,
"BuiltinGraphics") != 0)
598 && (AsciiStrCmp (TextRenderer,
"BuiltinText") != 0)
599 && (AsciiStrCmp (TextRenderer,
"SystemGraphics") != 0)
600 && (AsciiStrCmp (TextRenderer,
"SystemText") != 0)
601 && (AsciiStrCmp (TextRenderer,
"SystemGeneric") != 0))
603 DEBUG ((DEBUG_WARN,
"UEFI->Output->TextRenderer is illegal (Can only be BuiltinGraphics, BuiltinText, SystemGraphics, SystemText, or SystemGeneric)!\n"));
605 }
else if (AsciiStrnCmp (TextRenderer,
"System",
L_STR_LEN (
"System")) == 0) {
609 IsTextRendererSystem = TRUE;
612 if (IsTextRendererSystem) {
613 ConsoleFont =
OC_BLOB_GET (&Config->Uefi.Output.ConsoleFont);
614 if (ConsoleFont[0] !=
'\0') {
615 DEBUG ((DEBUG_WARN,
"UEFI->Output->ConsoleFont is specified on non-Builtin TextRenderer (currently %a)!\n", TextRenderer));
619 IsClearScreenOnModeSwitchEnabled = Config->Uefi.Output.ClearScreenOnModeSwitch;
620 if (IsClearScreenOnModeSwitchEnabled) {
621 DEBUG ((DEBUG_WARN,
"UEFI->Output->ClearScreenOnModeSwitch is enabled on non-System TextRenderer (currently %a)!\n", TextRenderer));
625 IsIgnoreTextInGraphicsEnabled = Config->Uefi.Output.IgnoreTextInGraphics;
626 if (IsIgnoreTextInGraphicsEnabled) {
627 DEBUG ((DEBUG_WARN,
"UEFI->Output->IgnoreTextInGraphics is enabled on non-System TextRenderer (currently %a)!\n", TextRenderer));
631 IsReplaceTabWithSpaceEnabled = Config->Uefi.Output.ReplaceTabWithSpace;
632 if (IsReplaceTabWithSpaceEnabled) {
633 DEBUG ((DEBUG_WARN,
"UEFI->Output->ReplaceTabWithSpace is enabled on non-System TextRenderer (currently %a)!\n", TextRenderer));
637 IsSanitiseClearScreenEnabled = Config->Uefi.Output.SanitiseClearScreen;
638 if (IsSanitiseClearScreenEnabled) {
639 DEBUG ((DEBUG_WARN,
"UEFI->Output->SanitiseClearScreen is enabled on non-System TextRenderer (currently %a)!\n", TextRenderer));
644 GopPassThrough =
OC_BLOB_GET (&Config->Uefi.Output.GopPassThrough);
645 if ( (AsciiStrCmp (GopPassThrough,
"Enabled") != 0)
646 && (AsciiStrCmp (GopPassThrough,
"Disabled") != 0)
647 && (AsciiStrCmp (GopPassThrough,
"Apple") != 0))
649 DEBUG ((DEBUG_WARN,
"UEFI->Output->GopPassThrough is illegal (Can only be Enabled, Disabled, Apple)!\n"));
656 ConsoleMode =
OC_BLOB_GET (&Config->Uefi.Output.ConsoleMode);
663 if ( (ConsoleMode[0] !=
'\0')
666 if ((UserWidth == 0) || (UserHeight == 0)) {
667 DEBUG ((DEBUG_WARN,
"UEFI->Output->ConsoleMode is borked, please check documentation!\n"));
669 }
else if ((UserWidth < 80) || (UserHeight < 25)) {
670 DEBUG ((DEBUG_WARN,
"UEFI->Output->ConsoleMode is below minumum supported console text resolution of 80x25, please fix!\n"));
678 Resolution =
OC_BLOB_GET (&Config->Uefi.Output.Resolution);
686 if ( (Resolution[0] !=
'\0')
688 && ((UserWidth == 0) || (UserHeight == 0)))
690 DEBUG ((DEBUG_WARN,
"UEFI->Output->Resolution is borked, please check documentation!\n"));
694 UIScale = Config->Uefi.Output.UIScale;
695 if ((UIScale < -1) || (UIScale > 2)) {
696 DEBUG ((DEBUG_WARN,
"UEFI->Output->UIScale is borked (Can only be between -1 and 2)!\n"));
698 }
else if (UIScale != -1) {
699 HasUefiOutputUIScale = TRUE;
703 DEBUG ((DEBUG_WARN,
"UIScale is set under both NVRAM and UEFI->Output!\n"));
736 IN OC_GLOBAL_CONFIG *Config
741 CONST CHAR8 *AsciiReservedMemoryType;
742 UINT64 ReservedMemoryAddress;
743 UINT64 ReservedMemorySize;
750 for (Index = 0; Index < Config->Uefi.ReservedMemory.Count; ++Index) {
751 AsciiReservedMemoryType =
OC_BLOB_GET (&Config->Uefi.ReservedMemory.Values[Index]->Type);
752 ReservedMemoryAddress = Config->Uefi.ReservedMemory.Values[Index]->Address;
753 ReservedMemorySize = Config->Uefi.ReservedMemory.Values[Index]->Size;
756 DEBUG ((DEBUG_WARN,
"UEFI->ReservedMemory[%u]->Type is borked!\n", Index));
760 if (ReservedMemoryAddress % EFI_PAGE_SIZE != 0) {
761 DEBUG ((DEBUG_WARN,
"UEFI->ReservedMemory[%u]->Address (%Lu) cannot be divided by page size!\n", Index, ReservedMemoryAddress));
765 if (ReservedMemorySize == 0ULL) {
766 DEBUG ((DEBUG_WARN,
"UEFI->ReservedMemory[%u]->Size cannot be zero!\n", Index));
768 }
else if (ReservedMemorySize % EFI_PAGE_SIZE != 0) {
769 DEBUG ((DEBUG_WARN,
"UEFI->ReservedMemory[%u]->Size (%Lu) cannot be divided by page size!\n", Index, ReservedMemorySize));
778 Config->Uefi.ReservedMemory.Values,
779 Config->Uefi.ReservedMemory.Count,
780 sizeof (Config->Uefi.ReservedMemory.Values[0]),