diff --git a/Include/Protocol/OcBootstrap.h b/Include/Protocol/OcBootstrap.h index 04e36321..ecdc169b 100644 --- a/Include/Protocol/OcBootstrap.h +++ b/Include/Protocol/OcBootstrap.h @@ -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; }; diff --git a/Platform/OpenCore/OpenCore.c b/Platform/OpenCore/OpenCore.c index b63abbef..144392b4 100644 --- a/Platform/OpenCore/OpenCore.c +++ b/Platform/OpenCore/OpenCore.c @@ -20,6 +20,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include #include #include +#include #include #include @@ -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 };