diff --git a/Utilities/ocvalidate/README.md b/Utilities/ocvalidate/README.md index 4dae61cf784355f491369f2b18ba85007b8fb315..f524bf102f841f7aed2b29286a2c9768d0cc79f1 100644 --- a/Utilities/ocvalidate/README.md +++ b/Utilities/ocvalidate/README.md @@ -64,7 +64,7 @@ Utility to validate whether a `config.plist` matches requirements and convention ### Misc #### Boot - HibernateMode: Only `None`, `Auto`, `RTC`, or `NVRAM` are accepted. -- PickerMode: Only `Builtin`, `External`, or `Apple` are accepted. +- PickerMode: Only `Builtin`, `External`, or `Apple` are accepted. When set to `External`, `OpenCanopy.efi` should be loaded in `UEFI->Drivers`. - `PickerAudioAssist` requires `AudioSupport` in `UEFI->Audio` to be enabled. #### Security - AuthRestart: If enabled, `VirtualSMC.kext` should be present in `Kernel->Add`. @@ -95,6 +95,7 @@ Utility to validate whether a `config.plist` matches requirements and convention - When `Ps2KeyboardDxe.efi` is in use, `KeySupport` in `UEFI->Input` should always be enabled altogether. - `OpenUsbKbDxe.efi` and `Ps2KeyboardDxe.efi` should never co-exist. - When HFS+ filesystem driver or `AudioDxe.efi` is in use, `ConnectDrivers` should be enabled altogether. +- When `OpenCanopy.efi` is in use, `PickerMode` in `Misc->Boot` should be set to `External`. #### Input - KeySupportMode: Only `Auto`, `V1`, `V2`, or `AMI` are accepted. - When `PointerSupport` is enabled, the value of `PointerSupportMode` should only be `ASUS`. diff --git a/Utilities/ocvalidate/ValidateMisc.c b/Utilities/ocvalidate/ValidateMisc.c index b907a229aed1c9b84fcdc799c95d98a6cb6e2466..4903400117d6aa5d894a99235614881f55b35550 100644 --- a/Utilities/ocvalidate/ValidateMisc.c +++ b/Utilities/ocvalidate/ValidateMisc.c @@ -152,6 +152,9 @@ CheckMiscBoot ( UINT32 ConsoleAttributes; CONST CHAR8 *HibernateMode; UINT32 PickerAttributes; + UINT32 Index; + CONST CHAR8 *Driver; + BOOLEAN HasOpenCanopyEfiDriver; CONST CHAR8 *PickerMode; CONST CHAR8 *PickerVariant; BOOLEAN IsPickerAudioAssistEnabled; @@ -182,15 +185,23 @@ CheckMiscBoot ( ++ErrorCount; } - // - // FIXME: Is OpenCanopy.efi mandatory if set to External? Or is this just a suggestion? - // + HasOpenCanopyEfiDriver = FALSE; + for (Index = 0; Index < UserUefi->Drivers.Count; ++Index) { + Driver = OC_BLOB_GET (UserUefi->Drivers.Values[Index]); + + if (AsciiStrCmp (Driver, "OpenCanopy.efi") == 0) { + HasOpenCanopyEfiDriver = TRUE; + } + } PickerMode = OC_BLOB_GET (&UserMisc->Boot.PickerMode); if (AsciiStrCmp (PickerMode, "Builtin") != 0 && AsciiStrCmp (PickerMode, "External") != 0 && AsciiStrCmp (PickerMode, "Apple") != 0) { DEBUG ((DEBUG_WARN, "Misc->Boot->PickerMode is borked (Can only be Builtin, External, or Apple)!\n")); ++ErrorCount; + } else if (AsciiStrCmp (PickerMode, "External") == 0 && !HasOpenCanopyEfiDriver) { + DEBUG ((DEBUG_WARN, "Misc->Boot->PickerMode is set to External, but OpenCanopy is not loaded at UEFI->Drivers!\n")); + ++ErrorCount; } PickerVariant = OC_BLOB_GET (&UserMisc->Boot.PickerVariant); diff --git a/Utilities/ocvalidate/ValidateUEFI.c b/Utilities/ocvalidate/ValidateUEFI.c index 288e807bb57f78f4d9a625c6a83cec20be45fd4e..71723a3dbf6ed5aec83386a332c62c10c92b200d 100644 --- a/Utilities/ocvalidate/ValidateUEFI.c +++ b/Utilities/ocvalidate/ValidateUEFI.c @@ -179,6 +179,7 @@ CheckUEFIDrivers ( { UINT32 ErrorCount; OC_UEFI_CONFIG *UserUefi; + OC_MISC_CONFIG *UserMisc; UINT32 Index; CONST CHAR8 *Driver; BOOLEAN HasOpenRuntimeEfiDriver; @@ -190,12 +191,16 @@ CheckUEFIDrivers ( UINT32 IndexHfsEfiDriver; BOOLEAN HasAudioDxeEfiDriver; UINT32 IndexAudioDxeEfiDriver; + BOOLEAN HasOpenCanopyEfiDriver; + UINT32 IndexOpenCanopyEfiDriver; + CONST CHAR8 *PickerMode; BOOLEAN IsRequestBootVarRoutingEnabled; BOOLEAN IsKeySupportEnabled; BOOLEAN IsConnectDriversEnabled; ErrorCount = 0; UserUefi = &Config->Uefi; + UserMisc = &Config->Misc; HasOpenRuntimeEfiDriver = FALSE; HasOpenUsbKbDxeEfiDriver = FALSE; @@ -205,6 +210,9 @@ CheckUEFIDrivers ( HasHfsEfiDriver = FALSE; IndexHfsEfiDriver = 0; HasAudioDxeEfiDriver = FALSE; + IndexAudioDxeEfiDriver = 0; + HasOpenCanopyEfiDriver = FALSE; + IndexOpenCanopyEfiDriver = 0; for (Index = 0; Index < UserUefi->Drivers.Count; ++Index) { Driver = OC_BLOB_GET (UserUefi->Drivers.Values[Index]); @@ -240,6 +248,10 @@ CheckUEFIDrivers ( HasAudioDxeEfiDriver = TRUE; IndexAudioDxeEfiDriver = Index; } + if (AsciiStrCmp (Driver, "OpenCanopy.efi") == 0) { + HasOpenCanopyEfiDriver = TRUE; + IndexOpenCanopyEfiDriver = Index; + } } // @@ -295,6 +307,12 @@ CheckUEFIDrivers ( } } + PickerMode = OC_BLOB_GET (&UserMisc->Boot.PickerMode); + if (HasOpenCanopyEfiDriver && AsciiStrCmp (PickerMode, "External") != 0) { + DEBUG ((DEBUG_WARN, "OpenCanopy.efi is loaded at UEFI->Drivers[%u], but Misc->Boot->PickerMode is not set to External!\n", IndexOpenCanopyEfiDriver)); + ++ErrorCount; + } + return ErrorCount; }