mirror of
https://github.com/acidanthera/OpenCorePkg.git
synced 2025-12-08 19:25:01 +00:00
OpenCoreMisc: Separate from main OC
This commit is contained in:
parent
8a42786ccc
commit
b33519082b
@ -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
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -39,6 +39,7 @@
|
||||
OpenCoreAcpi.c
|
||||
OpenCoreDevProps.c
|
||||
OpenCoreKernel.c
|
||||
OpenCoreMisc.c
|
||||
OpenCoreNvram.c
|
||||
OpenCorePlatform.c
|
||||
OpenCoreUefi.c
|
||||
|
||||
176
Platform/OpenCore/OpenCoreMisc.c
Normal file
176
Platform/OpenCore/OpenCoreMisc.c
Normal file
@ -0,0 +1,176 @@
|
||||
/** @file
|
||||
OpenCore driver.
|
||||
|
||||
Copyright (c) 2019, vit9696. All rights reserved.<BR>
|
||||
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 <OpenCore.h>
|
||||
|
||||
#include <Guid/OcLogVariable.h>
|
||||
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/DevicePathLib.h>
|
||||
#include <Library/MemoryAllocationLib.h>
|
||||
#include <Library/OcAppleBootPolicyLib.h>
|
||||
#include <Library/OcDebugLogLib.h>
|
||||
#include <Library/PrintLib.h>
|
||||
#include <Library/UefiBootServicesTableLib.h>
|
||||
#include <Library/UefiRuntimeServicesTableLib.h>
|
||||
|
||||
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;
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user