OpenCore: Skip self entry and prohibit nested count

This commit is contained in:
vit9696 2019-04-12 08:52:16 +03:00
parent 4921f8dbc7
commit 95822763a4
2 changed files with 41 additions and 20 deletions

View File

@ -28,7 +28,7 @@
///
/// OC_BOOTSTRAP_PROTOCOL revision
///
#define OC_BOOTSTRAP_PROTOCOL_REVISION 2
#define OC_BOOTSTRAP_PROTOCOL_REVISION 3
///
/// Forward declaration of OC_BOOTSTRAP_PROTOCOL structure.
@ -55,6 +55,7 @@ VOID
///
struct OC_BOOTSTRAP_PROTOCOL_ {
UINTN Revision;
UINTN NestedCount;
OC_BOOTSTRAP_RERUN ReRun;
};

View File

@ -20,6 +20,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#include <Protocol/DevicePath.h>
#include <Protocol/LoadedImage.h>
#include <Protocol/OcBootstrap.h>
#include <Protocol/SimpleFileSystem.h>
#include <Library/DebugLib.h>
#include <Library/OcDebugLogLib.h>
@ -196,6 +197,7 @@ OcMain (
CHAR8 *Config;
UINT32 ConfigSize;
OC_CPU_INFO CpuInfo;
EFI_HANDLE LoadHandle;
Config = OcStorageReadFileUnicode (
Storage,
@ -229,6 +231,16 @@ OcMain (
OcStoreLoadPath (LoadPath);
}
LoadHandle = NULL;
if (LoadPath != NULL) {
Status = gBS->LocateDevicePath (
&gEfiSimpleFileSystemProtocolGuid,
&LoadPath,
&LoadHandle
);
DEBUG ((DEBUG_INFO, "OC: LoadHandle is %p - %r\n", LoadHandle, Status));
}
OcCpuScanProcessor (&CpuInfo);
DEBUG ((DEBUG_INFO, "OC: OcLoadUefiSupport...\n"));
@ -245,8 +257,8 @@ OcMain (
// We do it as late as possible to let other drivers install their hooks.
//
mOcOriginalStartImage = gBS->StartImage;
gBS->StartImage = OcEfiStartImage;
gBS->Hdr.CRC32 = 0;
gBS->StartImage = OcEfiStartImage;
gBS->Hdr.CRC32 = 0;
gBS->CalculateCrc32 (gBS, gBS->Hdr.HeaderSize, &gBS->Hdr.CRC32);
DEBUG ((DEBUG_INFO, "OC: OpenCore is loaded, showing boot menu...\n"));
@ -256,7 +268,8 @@ OcMain (
OC_LOAD_DEFAULT_POLICY,
mOpenCoreConfiguration.Misc.Boot.Timeout,
OcStartImage,
mOpenCoreConfiguration.Misc.Boot.ShowPicker
mOpenCoreConfiguration.Misc.Boot.ShowPicker,
LoadHandle
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "OC: Failed to show boot menu!\n"));
@ -276,31 +289,38 @@ OcBootstrapRerun (
DEBUG ((DEBUG_INFO, "OC: ReRun executed!\n"));
//
// FIXME: Key should not be NULL, but be a statically defined RSA key
// updated via bin patching prior to signing OpenCore.efi.
//
Status = OcStorageInitFromFs (
&mOpenCoreStorage,
FileSystem,
OPEN_CORE_ROOT_PATH,
NULL
);
++This->NestedCount;
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "OC: Failed to open root FS - %r!\n", Status));
return;
if (This->NestedCount == 1) {
//
// FIXME: Key should not be NULL, but be a statically defined RSA key
// updated via bin patching prior to signing OpenCore.efi.
//
Status = OcStorageInitFromFs (
&mOpenCoreStorage,
FileSystem,
OPEN_CORE_ROOT_PATH,
NULL
);
if (!EFI_ERROR (Status)) {
OcMain (&mOpenCoreStorage, LoadPath);
OcStorageFree (&mOpenCoreStorage);
} else {
DEBUG ((DEBUG_ERROR, "OC: Failed to open root FS - %r!\n", Status));
}
} else {
DEBUG ((DEBUG_ERROR, "OC: Nested ReRun is not supported\n"));
}
OcMain (&mOpenCoreStorage, LoadPath);
OcStorageFree (&mOpenCoreStorage);
--This->NestedCount;
}
STATIC
OC_BOOTSTRAP_PROTOCOL
mOpenCoreBootStrap = {
OC_BOOTSTRAP_PROTOCOL_REVISION,
0,
OcBootstrapRerun
};