diff --git a/Include/OpenCore.h b/Include/OpenCore.h index 54e57c1b..df0f3ae8 100644 --- a/Include/OpenCore.h +++ b/Include/OpenCore.h @@ -128,4 +128,36 @@ OcLoadUefiSupport ( IN OC_CPU_INFO *CpuInfo ); +/** + Load early miscellaneous support like configuration. + + @param[in] Storage OpenCore storage. + @param[out] Config OpenCore configuration. + @param[in] VaultKey Vault key. + + @retval EFI_SUCCESS when allowed to continue. +**/ +EFI_STATUS +OcMiscEarlyInit ( + IN OC_STORAGE_CONTEXT *Storage, + OUT OC_GLOBAL_CONFIG *Config, + IN RSA_PUBLIC_KEY *VaultKey OPTIONAL + ); + +/** + Load late miscellaneous support like boot screen config. + + @param[in] Config OpenCore configuration. + @param[in] LoadPath OpenCore loading path. + @param[out] LoadHandle OpenCore loading handle. + + @retval EFI_SUCCESS on success, informational. +**/ +EFI_STATUS +OcMiscLateInit ( + IN OC_GLOBAL_CONFIG *Config, + IN EFI_DEVICE_PATH_PROTOCOL *LoadPath OPTIONAL, + OUT EFI_HANDLE *LoadHandle OPTIONAL + ); + #endif // OPEN_CORE_H diff --git a/Platform/OpenCore/OpenCore.c b/Platform/OpenCore/OpenCore.c index bdb49c6f..cfd980bb 100644 --- a/Platform/OpenCore/OpenCore.c +++ b/Platform/OpenCore/OpenCore.c @@ -172,116 +172,6 @@ OcStartImage ( return Status; } -STATIC -VOID -OcStoreLoadPath ( - IN EFI_DEVICE_PATH_PROTOCOL *LoadPath OPTIONAL - ) -{ - EFI_STATUS Status; - CHAR16 *DevicePath; - CHAR8 OutPath[256]; - - if (LoadPath != NULL) { - DevicePath = ConvertDevicePathToText (LoadPath, FALSE, FALSE); - if (DevicePath != NULL) { - AsciiSPrint (OutPath, sizeof (OutPath), "%s", DevicePath); - FreePool (DevicePath); - } else { - LoadPath = NULL; - } - } - - if (LoadPath == NULL) { - AsciiSPrint (OutPath, sizeof (OutPath), "Unknown"); - } - - Status = gRT->SetVariable ( - OC_LOG_VARIABLE_PATH, - &gOcLogVariableGuid, - OPEN_CORE_NVRAM_ATTR, - AsciiStrSize (OutPath), - OutPath - ); - - DEBUG (( - EFI_ERROR (Status) ? DEBUG_WARN : DEBUG_INFO, - "OC: Setting NVRAM %g:%a = %a - %r\n", - &gOcLogVariableGuid, - OC_LOG_VARIABLE_PATH, - OutPath, - Status - )); -} - -STATIC -EFI_STATUS -OcMiscEarlyInit ( - IN OC_STORAGE_CONTEXT *Storage, - IN OC_GLOBAL_CONFIG *Configuration - ) -{ - EFI_STATUS Status; - CHAR8 *Config; - UINT32 ConfigSize; - - Config = OcStorageReadFileUnicode ( - Storage, - OPEN_CORE_CONFIG_PATH, - &ConfigSize - ); - - if (Config != NULL) { - DEBUG ((DEBUG_INFO, "OC: Loaded configuration of %u bytes\n", ConfigSize)); - - Status = OcConfigurationInit (Configuration, Config, ConfigSize); - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "OC: Failed to parse configuration!\n")); - CpuDeadLoop (); - return EFI_UNSUPPORTED; ///< Should be unreachable. - } - - FreePool (Config); - } else { - DEBUG ((DEBUG_ERROR, "OC: Failed to load configuration!\n")); - CpuDeadLoop (); - return EFI_UNSUPPORTED; ///< Should be unreachable. - } - - // - // Sanity check that the configuration is adequate. - // - if (!Storage->HasVault && Configuration->Misc.Security.RequireVault) { - DEBUG ((DEBUG_ERROR, "OC: Configuration requires vault but no vault provided!\n")); - CpuDeadLoop (); - return EFI_SECURITY_VIOLATION; ///< Should be unreachable. - } - - if (mOpenCoreVaultKey == NULL && Configuration->Misc.Security.RequireSignature) { - DEBUG ((DEBUG_ERROR, "OC: Configuration requires signed vault but no public key provided!\n")); - CpuDeadLoop (); - return EFI_SECURITY_VIOLATION; ///< Should be unreachable. - } - - OcConfigureLogProtocol ( - Configuration->Misc.Debug.Target, - Configuration->Misc.Debug.Delay, - (UINTN) Configuration->Misc.Debug.DisplayLevel, - (UINTN) Configuration->Misc.Security.HaltLevel - ); - - DEBUG (( - DEBUG_INFO, - "OC: OpenCore is now loading (Vault: %d/%d, Sign %d/%d)...\n", - Storage->HasVault, - Configuration->Misc.Security.RequireVault, - mOpenCoreVaultKey != NULL, - Configuration->Misc.Security.RequireSignature - )); - - return EFI_SUCCESS; -} - STATIC VOID OcMain ( @@ -294,7 +184,13 @@ OcMain ( OC_CPU_INFO CpuInfo; EFI_HANDLE LoadHandle; - Status = OcMiscEarlyInit (Storage, &mOpenCoreConfiguration); + DEBUG ((DEBUG_INFO, "OC: OcMiscEarlyInit...\n")); + Status = OcMiscEarlyInit ( + Storage, + &mOpenCoreConfiguration, + mOpenCoreVaultKey + ); + if (EFI_ERROR (Status)) { return; } @@ -309,26 +205,8 @@ OcMain ( OcLoadDevPropsSupport (&mOpenCoreConfiguration); DEBUG ((DEBUG_INFO, "OC: OcLoadNvramSupport...\n")); OcLoadNvramSupport (&mOpenCoreConfiguration); - - if (mOpenCoreConfiguration.Misc.Debug.ExposeBootPath) { - OcStoreLoadPath (LoadPath); - } - - if (mOpenCoreConfiguration.Misc.Boot.ReinstallProtocol) { - if (OcAppleBootPolicyInstallProtocol (TRUE) == NULL) { - DEBUG ((DEBUG_ERROR, "OC: Failed to reinstall boot policy protocol\n")); - } - } - - LoadHandle = NULL; - if (LoadPath != NULL) { - Status = gBS->LocateDevicePath ( - &gEfiSimpleFileSystemProtocolGuid, - &LoadPath, - &LoadHandle - ); - DEBUG ((DEBUG_INFO, "OC: LoadHandle is %p - %r\n", LoadHandle, Status)); - } + DEBUG ((DEBUG_INFO, "OC: OcMiscLateInit...\n")); + OcMiscLateInit (&mOpenCoreConfiguration, LoadPath, &LoadHandle); // // This is required to catch UEFI Shell boot if any. @@ -341,13 +219,6 @@ OcMain ( DEBUG ((DEBUG_INFO, "OC: OpenCore is loaded, showing boot menu...\n")); - // - // Do not hide self entry unless asked. - // - if (!mOpenCoreConfiguration.Misc.Boot.HideSelf) { - LoadHandle = NULL; - } - Status = OcRunSimpleBootPicker ( OC_SCAN_DEFAULT_POLICY, OC_LOAD_DEFAULT_POLICY, diff --git a/Platform/OpenCore/OpenCore.inf b/Platform/OpenCore/OpenCore.inf index 10572c4d..26ac110b 100644 --- a/Platform/OpenCore/OpenCore.inf +++ b/Platform/OpenCore/OpenCore.inf @@ -39,6 +39,7 @@ OpenCoreAcpi.c OpenCoreDevProps.c OpenCoreKernel.c + OpenCoreMisc.c OpenCoreNvram.c OpenCorePlatform.c OpenCoreUefi.c diff --git a/Platform/OpenCore/OpenCoreMisc.c b/Platform/OpenCore/OpenCoreMisc.c new file mode 100644 index 00000000..3999e403 --- /dev/null +++ b/Platform/OpenCore/OpenCoreMisc.c @@ -0,0 +1,176 @@ +/** @file + OpenCore driver. + +Copyright (c) 2019, vit9696. All rights reserved.
+This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +STATIC +VOID +OcStoreLoadPath ( + IN EFI_DEVICE_PATH_PROTOCOL *LoadPath OPTIONAL + ) +{ + EFI_STATUS Status; + CHAR16 *DevicePath; + CHAR8 OutPath[256]; + + if (LoadPath != NULL) { + DevicePath = ConvertDevicePathToText (LoadPath, FALSE, FALSE); + if (DevicePath != NULL) { + AsciiSPrint (OutPath, sizeof (OutPath), "%s", DevicePath); + FreePool (DevicePath); + } else { + LoadPath = NULL; + } + } + + if (LoadPath == NULL) { + AsciiSPrint (OutPath, sizeof (OutPath), "Unknown"); + } + + Status = gRT->SetVariable ( + OC_LOG_VARIABLE_PATH, + &gOcLogVariableGuid, + OPEN_CORE_NVRAM_ATTR, + AsciiStrSize (OutPath), + OutPath + ); + + DEBUG (( + EFI_ERROR (Status) ? DEBUG_WARN : DEBUG_INFO, + "OC: Setting NVRAM %g:%a = %a - %r\n", + &gOcLogVariableGuid, + OC_LOG_VARIABLE_PATH, + OutPath, + Status + )); +} + +EFI_STATUS +OcMiscEarlyInit ( + IN OC_STORAGE_CONTEXT *Storage, + OUT OC_GLOBAL_CONFIG *Config, + IN RSA_PUBLIC_KEY *VaultKey OPTIONAL + ) +{ + EFI_STATUS Status; + CHAR8 *ConfigData; + UINT32 ConfigDataSize; + + ConfigData = OcStorageReadFileUnicode ( + Storage, + OPEN_CORE_CONFIG_PATH, + &ConfigDataSize + ); + + if (ConfigData != NULL) { + DEBUG ((DEBUG_INFO, "OC: Loaded configuration of %u bytes\n", ConfigDataSize)); + + Status = OcConfigurationInit (Config, ConfigData, ConfigDataSize); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "OC: Failed to parse configuration!\n")); + CpuDeadLoop (); + return EFI_UNSUPPORTED; ///< Should be unreachable. + } + + FreePool (ConfigData); + } else { + DEBUG ((DEBUG_ERROR, "OC: Failed to load configuration!\n")); + CpuDeadLoop (); + return EFI_UNSUPPORTED; ///< Should be unreachable. + } + + // + // Sanity check that the configuration is adequate. + // + if (!Storage->HasVault && Config->Misc.Security.RequireVault) { + DEBUG ((DEBUG_ERROR, "OC: Configuration requires vault but no vault provided!\n")); + CpuDeadLoop (); + return EFI_SECURITY_VIOLATION; ///< Should be unreachable. + } + + if (VaultKey == NULL && Config->Misc.Security.RequireSignature) { + DEBUG ((DEBUG_ERROR, "OC: Configuration requires signed vault but no public key provided!\n")); + CpuDeadLoop (); + return EFI_SECURITY_VIOLATION; ///< Should be unreachable. + } + + OcConfigureLogProtocol ( + Config->Misc.Debug.Target, + Config->Misc.Debug.Delay, + (UINTN) Config->Misc.Debug.DisplayLevel, + (UINTN) Config->Misc.Security.HaltLevel + ); + + DEBUG (( + DEBUG_INFO, + "OC: OpenCore is now loading (Vault: %d/%d, Sign %d/%d)...\n", + Storage->HasVault, + Config->Misc.Security.RequireVault, + VaultKey != NULL, + Config->Misc.Security.RequireSignature + )); + + return EFI_SUCCESS; +} + +EFI_STATUS +OcMiscLateInit ( + IN OC_GLOBAL_CONFIG *Config, + IN EFI_DEVICE_PATH_PROTOCOL *LoadPath OPTIONAL, + OUT EFI_HANDLE *LoadHandle OPTIONAL + ) +{ + EFI_STATUS Status; + + if (Config->Misc.Debug.ExposeBootPath) { + OcStoreLoadPath (LoadPath); + } + + if (Config->Misc.Boot.ReinstallProtocol) { + if (OcAppleBootPolicyInstallProtocol (TRUE) == NULL) { + DEBUG ((DEBUG_ERROR, "OC: Failed to reinstall boot policy protocol\n")); + } + } + + Status = EFI_SUCCESS; + + if (LoadHandle != NULL) { + *LoadHandle = NULL; + // + // Do not disclose self entry unless asked. + // + if (LoadPath != NULL && Config->Misc.Boot.HideSelf) { + Status = gBS->LocateDevicePath ( + &gEfiSimpleFileSystemProtocolGuid, + &LoadPath, + LoadHandle + ); + DEBUG ((DEBUG_INFO, "OC: LoadHandle is %p - %r\n", *LoadHandle, Status)); + } + } + + return Status; +}