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;
+}