2020年12月20日

修改OpenCore,在引导windows时不修改ACPI

OpenCore 不需要在引导除macos以外的操作系统会按 config.plist 中的配置修改ACPI、nvram。黑苹果的BIOS本来就是适配windows、linux的,按macos的标准改了以后反而适得其反,出现各种问题。如oc会修改 system-id ,会导致windows的license失效。或者windows启动在不停转圈、蓝屏。

OpenCore 0.2 的版本是有一个 Quirk ,在引导windows时不修改ACPI的,但是后续的版本取消了这个Quirk。只能通过修改源代码来解决了。

代码基于 OpenCore 0.6.5 版本,主要是在引导其他操作系统时,不修改ACPI,具体如下:

$git diff 5c8f
diff --git a/Include/Acidanthera/Library/OcConfigurationLib.h b/Include/Acidanthera/Library/OcConfigurationLib.h
index f2a71123..91385265 100644
--- a/Include/Acidanthera/Library/OcConfigurationLib.h
+++ b/Include/Acidanthera/Library/OcConfigurationLib.h
@@ -80,6 +80,7 @@
 #define OC_ACPI_QUIRKS_FIELDS(_, __) \
   _(BOOLEAN                     , FadtEnableReset     ,     , FALSE  , ()) \
   _(BOOLEAN                     , NormalizeHeaders    ,     , FALSE  , ()) \
+  _(BOOLEAN                     , OnlyForMacOS        ,     , FALSE  , ()) \
   _(BOOLEAN                     , RebaseRegions       ,     , FALSE  , ()) \
   _(BOOLEAN                     , ResetHwSig          ,     , FALSE  , ()) \
   _(BOOLEAN                     , ResetLogoStatus     ,     , FALSE  , ())
diff --git a/Library/OcConfigurationLib/OcConfigurationLib.c b/Library/OcConfigurationLib/OcConfigurationLib.c
index 001197d7..99fcb16c 100644
--- a/Library/OcConfigurationLib/OcConfigurationLib.c
+++ b/Library/OcConfigurationLib/OcConfigurationLib.c
@@ -141,6 +141,7 @@ OC_SCHEMA
 mAcpiQuirksSchema[] = {
   OC_SCHEMA_BOOLEAN_IN ("FadtEnableReset",  OC_GLOBAL_CONFIG, Acpi.Quirks.FadtEnableReset),
   OC_SCHEMA_BOOLEAN_IN ("NormalizeHeaders", OC_GLOBAL_CONFIG, Acpi.Quirks.NormalizeHeaders),
+  OC_SCHEMA_BOOLEAN_IN ("OnlyForMacOS",     OC_GLOBAL_CONFIG, Acpi.Quirks.OnlyForMacOS),
   OC_SCHEMA_BOOLEAN_IN ("RebaseRegions",    OC_GLOBAL_CONFIG, Acpi.Quirks.RebaseRegions),
   OC_SCHEMA_BOOLEAN_IN ("ResetHwSig",       OC_GLOBAL_CONFIG, Acpi.Quirks.ResetHwSig),
   OC_SCHEMA_BOOLEAN_IN ("ResetLogoStatus",  OC_GLOBAL_CONFIG, Acpi.Quirks.ResetLogoStatus),
diff --git a/Platform/OpenCore/OpenCore.c b/Platform/OpenCore/OpenCore.c
index 9f992ba4..eb716c42 100644
--- a/Platform/OpenCore/OpenCore.c
+++ b/Platform/OpenCore/OpenCore.c
@@ -90,6 +90,23 @@ OcStartImage (
     LaunchInText ? EfiConsoleControlScreenText : EfiConsoleControlScreenGraphics
     );

+  if((Chosen->Type & OC_BOOT_APPLE_ANY) && mOpenCoreConfiguration.Acpi.Quirks.OnlyForMacOS){
+    DEBUG ((DEBUG_INFO, "OC: OcLoadAcpiSupport only for macOS...\n"));
+    OcLoadAcpiSupport (&mOpenCoreStorage, &mOpenCoreConfiguration);
+
+    DEBUG ((DEBUG_INFO, "OC: OcLoadPlatformSupport...\n"));
+    OcLoadPlatformSupport (&mOpenCoreConfiguration, &mOpenCoreCpuInfo);
+
+    DEBUG ((DEBUG_INFO, "OC: OcLoadDevPropsSupport...\n"));
+    OcLoadDevPropsSupport (&mOpenCoreConfiguration);
+
+    /* DEBUG ((DEBUG_INFO, "OC: OcMiscLateInit...\n")); */
+    /* OcMiscLateInit (Storage, &mOpenCoreConfiguration); */
+
+    /* DEBUG ((DEBUG_INFO, "OC: OcLoadKernelSupport...\n")); */
+    /* OcLoadKernelSupport (&mOpenCoreStorage, &mOpenCoreConfiguration, &mOpenCoreCpuInfo); */
+  }
+
   Status = gBS->StartImage (
     ImageHandle,
     ExitDataSize,
@@ -134,14 +151,21 @@ OcMain (
   OcMiscMiddleInit (Storage, &mOpenCoreConfiguration, mStorageRoot, LoadPath, mStorageHandle);
   DEBUG ((DEBUG_INFO, "OC: OcLoadUefiSupport...\n"));
   OcLoadUefiSupport (Storage, &mOpenCoreConfiguration, &mOpenCoreCpuInfo);
-  DEBUG ((DEBUG_INFO, "OC: OcLoadAcpiSupport...\n"));
-  OcLoadAcpiSupport (&mOpenCoreStorage, &mOpenCoreConfiguration);
-  DEBUG ((DEBUG_INFO, "OC: OcLoadPlatformSupport...\n"));
-  OcLoadPlatformSupport (&mOpenCoreConfiguration, &mOpenCoreCpuInfo);
-  DEBUG ((DEBUG_INFO, "OC: OcLoadDevPropsSupport...\n"));
-  OcLoadDevPropsSupport (&mOpenCoreConfiguration);
+
+  if(!mOpenCoreConfiguration.Acpi.Quirks.OnlyForMacOS){
+    DEBUG ((DEBUG_INFO, "OC: OcLoadAcpiSupport of any OS...\n"));
+    OcLoadAcpiSupport (&mOpenCoreStorage, &mOpenCoreConfiguration);
+
+    DEBUG ((DEBUG_INFO, "OC: OcLoadPlatformSupport...\n"));
+    OcLoadPlatformSupport (&mOpenCoreConfiguration, &mOpenCoreCpuInfo);
+
+    DEBUG ((DEBUG_INFO, "OC: OcLoadDevPropsSupport...\n"));
+    OcLoadDevPropsSupport (&mOpenCoreConfiguration);
+  }
+
   DEBUG ((DEBUG_INFO, "OC: OcMiscLateInit...\n"));
   OcMiscLateInit (Storage, &mOpenCoreConfiguration);
+
   DEBUG ((DEBUG_INFO, "OC: OcLoadKernelSupport...\n"));
   OcLoadKernelSupport (&mOpenCoreStorage, &mOpenCoreConfiguration, &mOpenCoreCpuInfo);

参考