diff --git a/Changelog.md b/Changelog.md index b04e48c1..c8af9986 100644 --- a/Changelog.md +++ b/Changelog.md @@ -4,6 +4,7 @@ OpenCore Changelog #### v0.5.1 - Added support of kernel resource kext injection - Added support for 0.25% clock slowdown on Xeon Scalable CPUs (thx @mrmiller) +- Replaced `MatchKernel` with `MinKernel` and `MaxKernel` #### v0.5.0 - Added builtin firmware versions for new models 2019 diff --git a/Docs/Sample.plist b/Docs/Sample.plist index a437d5de..7d7128cb 100644 --- a/Docs/Sample.plist +++ b/Docs/Sample.plist @@ -249,7 +249,9 @@ ExecutablePath Contents/MacOS/Lilu - MatchKernel + MaxKernel + + MinKernel PlistPath Contents/Info.plist @@ -263,7 +265,9 @@ ExecutablePath Contents/MacOS/VirtualSMC - MatchKernel + MaxKernel + + MinKernel PlistPath Contents/Info.plist @@ -277,7 +281,9 @@ ExecutablePath Contents/MacOS/WhateverGreen - MatchKernel + MaxKernel + + MinKernel PlistPath Contents/Info.plist @@ -291,7 +297,9 @@ ExecutablePath Contents/MacOS/AppleALC - MatchKernel + MaxKernel + + MinKernel PlistPath Contents/Info.plist @@ -305,7 +313,9 @@ ExecutablePath Contents/MacOS/IntelMausi - MatchKernel + MaxKernel + + MinKernel PlistPath Contents/Info.plist @@ -319,7 +329,9 @@ ExecutablePath - MatchKernel + MaxKernel + + MinKernel PlistPath Contents/Info.plist @@ -341,7 +353,9 @@ Identifier com.apple.driver.AppleTyMCEDriver - MatchKernel + MaxKernel + + MinKernel @@ -364,7 +378,9 @@ 0 Mask - MatchKernel + MaxKernel + + MinKernel Replace 6y4Ptg== @@ -390,7 +406,9 @@ 0 Mask - MatchKernel + MaxKernel + 18.5.0 + MinKernel 18.5.0 Replace 6zMPtw== @@ -416,7 +434,9 @@ 0 Mask - MatchKernel + MaxKernel + 18.5.0 + MinKernel 18.5.0 Replace ww== @@ -442,7 +462,9 @@ 0 Mask /wAA//////////// - MatchKernel + MaxKernel + + MinKernel Replace uLQWAABmiYMABQAA diff --git a/Docs/SampleFull.plist b/Docs/SampleFull.plist index fc2c3596..54d158b1 100644 --- a/Docs/SampleFull.plist +++ b/Docs/SampleFull.plist @@ -249,7 +249,9 @@ ExecutablePath Contents/MacOS/Lilu - MatchKernel + MaxKernel + + MinKernel PlistPath Contents/Info.plist @@ -263,7 +265,9 @@ ExecutablePath Contents/MacOS/VirtualSMC - MatchKernel + MaxKernel + + MinKernel PlistPath Contents/Info.plist @@ -277,7 +281,9 @@ ExecutablePath Contents/MacOS/WhateverGreen - MatchKernel + MaxKernel + + MinKernel PlistPath Contents/Info.plist @@ -291,7 +297,9 @@ ExecutablePath Contents/MacOS/AppleALC - MatchKernel + MaxKernel + + MinKernel PlistPath Contents/Info.plist @@ -305,7 +313,9 @@ ExecutablePath Contents/MacOS/IntelMausi - MatchKernel + MaxKernel + + MinKernel PlistPath Contents/Info.plist @@ -319,7 +329,9 @@ ExecutablePath - MatchKernel + MaxKernel + + MinKernel PlistPath Contents/Info.plist @@ -341,7 +353,9 @@ Identifier com.apple.driver.AppleTyMCEDriver - MatchKernel + MaxKernel + + MinKernel @@ -364,7 +378,9 @@ 0 Mask - MatchKernel + MaxKernel + + MinKernel Replace 6y4Ptg== @@ -390,7 +406,9 @@ 0 Mask - MatchKernel + MaxKernel + 18.5.0 + MinKernel 18.5.0 Replace 6zMPtw== @@ -416,7 +434,9 @@ 0 Mask - MatchKernel + MaxKernel + 18.5.0 + MinKernel 18.5.0 Replace ww== @@ -442,7 +462,9 @@ 0 Mask /wAA//////////// - MatchKernel + MaxKernel + + MinKernel Replace uLQWAABmiYMABQAA diff --git a/Platform/OpenCore/OpenCoreKernel.c b/Platform/OpenCore/OpenCoreKernel.c index 342871a9..5da4557f 100644 --- a/Platform/OpenCore/OpenCoreKernel.c +++ b/Platform/OpenCore/OpenCoreKernel.c @@ -29,18 +29,95 @@ STATIC OC_GLOBAL_CONFIG *mOcConfiguration; STATIC OC_CPU_INFO *mOcCpuInfo; STATIC -VOID +UINT32 +OcParseDarwinVersion ( + IN CONST CHAR8 *String + ) +{ + UINT32 Version; + UINT32 Index; + UINT32 Index2; + + if (*String == '\0' || *String < '0' || *String > '9') { + return 0; + } + + Version = 0; + + for (Index = 0; Index < 3; ++Index) { + for (Index2 = 0; Index2 < 2; ++Index2) { + Version *= 10; + if (*String >= '0' && *String <= '9') { + Version += *String++ - '0'; + } else if (*String != '.' && *String != '\0') { + return 0; + } + } + + if (*String == '.') { + ++String; + } + } + + return Version; +} + +STATIC +BOOLEAN +OcMatchDarwinVersion ( + IN UINT32 CurrentVersion, + IN UINT32 MinVersion, + IN UINT32 MaxVersion + ) +{ + // + // Check against min <= curr <= max. + // curr=0 -> curr=inf, max=0 -> max=inf + // + + // + // Replace max inf with max known version. + // + if (MaxVersion == 0) { + MaxVersion = CurrentVersion; + } + + // + // Handle curr=inf <= max=inf(?) case. + // + if (CurrentVersion == 0) { + return MaxVersion == 0; + } + + // + // Handle curr=num > max=num case. + // + if (CurrentVersion > MaxVersion) { + return FALSE; + } + + // + // Handle min=num > curr=num case. + // + if (CurrentVersion < MinVersion) { + return FALSE; + } + + return TRUE; +} + +STATIC +UINT32 OcKernelReadDarwinVersion ( IN CONST UINT8 *Kernel, - IN UINT32 KernelSize, - OUT CHAR8 *DarwinVersion, - OUT UINT32 DarwinVersionSize + IN UINT32 KernelSize ) { INT32 Offset; UINT32 Index; + CHAR8 DarwinVersion[32]; + CHAR8 DarwinVersionInteger; - ASSERT (DarwinVersion > 0); Offset = FindPattern ( (CONST UINT8 *) "Darwin Kernel Version ", @@ -53,21 +130,28 @@ OcKernelReadDarwinVersion ( if (Offset < 0) { DEBUG ((DEBUG_WARN, "OC: Failed to determine kernel version\n")); - DarwinVersion[0] = '\0'; - return; + return 0; } Offset += L_STR_LEN ("Darwin Kernel Version "); - for (Index = 0; Index < DarwinVersionSize - 1; ++Index, ++Offset) { + for (Index = 0; Index < ARRAY_SIZE (DarwinVersion) - 1; ++Index, ++Offset) { if ((UINT32) Offset >= KernelSize || Kernel[Offset] == ':') { break; } DarwinVersion[Index] = (CHAR8) Kernel[Offset]; } DarwinVersion[Index] = '\0'; + DarwinVersionInteger = OcParseDarwinVersion (DarwinVersion); - DEBUG ((DEBUG_INFO, "OC: Read kernel version %a\n", DarwinVersion)); + DEBUG (( + DEBUG_INFO, + "OC: Read kernel version %a (%u)\n", + DarwinVersion, + DarwinVersionInteger + )); + + return DarwinVersionInteger; } STATIC @@ -80,6 +164,7 @@ OcKernelLoadKextsAndReserve ( UINT32 Index; UINT32 ReserveSize; CHAR8 *BundlePath; + CHAR8 *Comment; CHAR8 *PlistPath; CHAR8 *ExecutablePath; CHAR16 FullPath[128]; @@ -96,6 +181,7 @@ OcKernelLoadKextsAndReserve ( if (Kext->PlistDataSize == 0) { BundlePath = OC_BLOB_GET (&Kext->BundlePath); + Comment = OC_BLOB_GET (&Kext->Comment); PlistPath = OC_BLOB_GET (&Kext->PlistPath); if (BundlePath[0] == '\0' || PlistPath[0] == '\0') { DEBUG ((DEBUG_ERROR, "OC: Your config has improper for kext info\n")); @@ -120,7 +206,13 @@ OcKernelLoadKextsAndReserve ( ); if (Kext->PlistData == NULL) { - DEBUG ((DEBUG_ERROR, "OC: Plist %s is missing for kext %a\n", FullPath, BundlePath)); + DEBUG (( + DEBUG_ERROR, + "OC: Plist %s is missing for kext %a (%a)\n", + FullPath, + BundlePath, + Comment + )); Kext->Enabled = FALSE; continue; } @@ -144,7 +236,13 @@ OcKernelLoadKextsAndReserve ( ); if (Kext->ImageData == NULL) { - DEBUG ((DEBUG_ERROR, "OC: Image %s is missing for kext %a\n", FullPath, BundlePath)); + DEBUG (( + DEBUG_ERROR, + "OC: Image %s is missing for kext %a (%a)\n", + FullPath, + BundlePath, + Comment + )); Kext->Enabled = FALSE; continue; } @@ -168,7 +266,7 @@ STATIC VOID OcKernelApplyPatches ( IN OC_GLOBAL_CONFIG *Config, - IN CONST CHAR8 *DarwinVersion, + IN UINT32 DarwinVersion, IN PRELINKED_CONTEXT *Context, IN OUT UINT8 *Kernel, IN UINT32 Size @@ -180,7 +278,9 @@ OcKernelApplyPatches ( PATCHER_GENERIC_PATCH Patch; OC_KERNEL_PATCH_ENTRY *UserPatch; CONST CHAR8 *Target; - CONST CHAR8 *MatchKernel; + CONST CHAR8 *Comment; + UINT32 MaxKernel; + UINT32 MinKernel; BOOLEAN IsKernelPatch; IsKernelPatch = Context == NULL; @@ -203,22 +303,25 @@ OcKernelApplyPatches ( for (Index = 0; Index < Config->Kernel.Patch.Count; ++Index) { UserPatch = Config->Kernel.Patch.Values[Index]; Target = OC_BLOB_GET (&UserPatch->Identifier); + Comment = OC_BLOB_GET (&UserPatch->Comment); - if (!UserPatch->Enabled - || (AsciiStrCmp (Target, "kernel") == 0) != IsKernelPatch) { + if (!UserPatch->Enabled || (AsciiStrCmp (Target, "kernel") == 0) != IsKernelPatch) { continue; } - MatchKernel = OC_BLOB_GET (&UserPatch->MatchKernel); + MaxKernel = OcParseDarwinVersion (OC_BLOB_GET (&UserPatch->MaxKernel)); + MinKernel = OcParseDarwinVersion (OC_BLOB_GET (&UserPatch->MaxKernel)); - if (AsciiStrnCmp (DarwinVersion, MatchKernel, AsciiStrLen (MatchKernel)) != 0) { + if (!OcMatchDarwinVersion (DarwinVersion, MinKernel, MaxKernel)) { DEBUG (( DEBUG_INFO, - "OC: Kernel patcher skips %a patch at %u due to version %a vs %a", + "OC: Kernel patcher skips %a (%a) patch at %u due to version %u <= %u <= %u", Target, + Comment, Index, - MatchKernel, - DarwinVersion + MinKernel, + DarwinVersion, + MaxKernel )); continue; } @@ -231,10 +334,10 @@ OcKernelApplyPatches ( ); if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_WARN, "OC: Kernel patcher %a init failure - %r\n", Target, Status)); + DEBUG ((DEBUG_WARN, "OC: Kernel patcher %a (%a) init failure - %r\n", Target, Comment, Status)); continue; } else { - DEBUG ((DEBUG_INFO, "OC: Kernel patcher %a init succeed\n", Target)); + DEBUG ((DEBUG_INFO, "OC: Kernel patcher %a (%a) init succeed\n", Target, Comment)); } } @@ -249,7 +352,7 @@ OcKernelApplyPatches ( || (OC_BLOB_GET (&UserPatch->Base)[0] == '\0' && UserPatch->Find.Size != UserPatch->Replace.Size) || (UserPatch->Mask.Size > 0 && UserPatch->Find.Size != UserPatch->Mask.Size) || (UserPatch->ReplaceMask.Size > 0 && UserPatch->Find.Size != UserPatch->ReplaceMask.Size)) { - DEBUG ((DEBUG_ERROR, "OC: Kernel patch %u for %a is borked\n", Index, Target)); + DEBUG ((DEBUG_ERROR, "OC: Kernel patch %u for %a (%a) is borked\n", Index, Target, Comment)); continue; } @@ -285,9 +388,10 @@ OcKernelApplyPatches ( Status = PatcherApplyGenericPatch (&Patcher, &Patch); DEBUG (( EFI_ERROR (Status) ? DEBUG_WARN : DEBUG_INFO, - "OC: Kernel patcher result %u for %a - %r\n", + "OC: Kernel patcher result %u for %a (%a) - %r\n", Index, Target, + Comment, Status )); } @@ -351,7 +455,7 @@ STATIC VOID OcKernelBlockKexts ( IN OC_GLOBAL_CONFIG *Config, - IN CONST CHAR8 *DarwinVersion, + IN UINT32 DarwinVersion, IN PRELINKED_CONTEXT *Context ) { @@ -360,26 +464,32 @@ OcKernelBlockKexts ( UINT32 Index; OC_KERNEL_BLOCK_ENTRY *Kext; CONST CHAR8 *Target; - CONST CHAR8 *MatchKernel; + CONST CHAR8 *Comment; + UINT32 MaxKernel; + UINT32 MinKernel; for (Index = 0; Index < Config->Kernel.Block.Count; ++Index) { - Kext = Config->Kernel.Block.Values[Index]; - Target = OC_BLOB_GET (&Kext->Identifier); + Kext = Config->Kernel.Block.Values[Index]; + Target = OC_BLOB_GET (&Kext->Identifier); + Comment = OC_BLOB_GET (&Kext->Comment); if (!Kext->Enabled) { continue; } - MatchKernel = OC_BLOB_GET (&Kext->MatchKernel); + MaxKernel = OcParseDarwinVersion (OC_BLOB_GET (&Kext->MaxKernel)); + MinKernel = OcParseDarwinVersion (OC_BLOB_GET (&Kext->MaxKernel)); - if (AsciiStrnCmp (DarwinVersion, MatchKernel, AsciiStrLen (MatchKernel)) != 0) { + if (!OcMatchDarwinVersion (DarwinVersion, MinKernel, MaxKernel)) { DEBUG (( DEBUG_INFO, - "OC: Prelink blocker skips %a block at %u due to version %a vs %a", + "OC: Prelink blocker skips %a (%a) block at %u due to version %u <= %u <= %u", Target, + Comment, Index, - MatchKernel, - DarwinVersion + MinKernel, + DarwinVersion, + MaxKernel )); continue; } @@ -391,7 +501,7 @@ OcKernelBlockKexts ( ); if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_WARN, "OC: Prelink blocker %a init failure - %r\n", Target, Status)); + DEBUG ((DEBUG_WARN, "OC: Prelink blocker %a (%a) init failure - %r\n", Target, Comment, Status)); continue; } @@ -399,8 +509,9 @@ OcKernelBlockKexts ( DEBUG (( EFI_ERROR (Status) ? DEBUG_WARN : DEBUG_INFO, - "OC: Prelink blocker %a - %r\n", + "OC: Prelink blocker %a (%a) - %r\n", Target, + Comment, Status )); } @@ -410,7 +521,7 @@ STATIC EFI_STATUS OcKernelProcessPrelinked ( IN OC_GLOBAL_CONFIG *Config, - IN CONST CHAR8 *DarwinVersion, + IN UINT32 DarwinVersion, IN OUT UINT8 *Kernel, IN UINT32 *KernelSize, IN UINT32 AllocatedSize @@ -420,10 +531,12 @@ OcKernelProcessPrelinked ( PRELINKED_CONTEXT Context; CHAR8 *BundlePath; CHAR8 *ExecutablePath; + CHAR8 *Comment; UINT32 Index; CHAR8 FullPath[128]; OC_KERNEL_ADD_ENTRY *Kext; - CONST CHAR8 *MatchKernel; + UINT32 MaxKernel; + UINT32 MinKernel; Status = PrelinkedContextInit (&Context, Kernel, *KernelSize, AllocatedSize); @@ -443,16 +556,20 @@ OcKernelProcessPrelinked ( } BundlePath = OC_BLOB_GET (&Kext->BundlePath); - MatchKernel = OC_BLOB_GET (&Kext->MatchKernel); + Comment = OC_BLOB_GET (&Kext->Comment); + MaxKernel = OcParseDarwinVersion (OC_BLOB_GET (&Kext->MaxKernel)); + MinKernel = OcParseDarwinVersion (OC_BLOB_GET (&Kext->MaxKernel)); - if (AsciiStrnCmp (DarwinVersion, MatchKernel, AsciiStrLen (MatchKernel)) != 0) { + if (!OcMatchDarwinVersion (DarwinVersion, MinKernel, MaxKernel)) { DEBUG (( DEBUG_INFO, - "OC: Prelink injection skips %a kext at %u due to version %a vs %a", + "OC: Prelink injection skips %a (%a) kext at %u due to version %u <= %u <= %u", BundlePath, + Comment, Index, - MatchKernel, - DarwinVersion + MinKernel, + DarwinVersion, + MaxKernel )); continue; } @@ -476,8 +593,9 @@ OcKernelProcessPrelinked ( DEBUG (( EFI_ERROR (Status) ? DEBUG_WARN : DEBUG_INFO, - "OC: Prelink injection %a - %r\n", + "OC: Prelink injection %a (%a) - %r\n", BundlePath, + Comment, Status )); } @@ -517,7 +635,7 @@ OcKernelFileOpen ( EFI_FILE_PROTOCOL *VirtualFileHandle; EFI_STATUS PrelinkedStatus; EFI_TIME ModificationTime; - CHAR8 DarwinVersion[16]; + UINT32 DarwinVersion; Status = This->Open (This, NewHandle, FileName, OpenMode, Attributes); @@ -556,7 +674,7 @@ OcKernelFileOpen ( // This is not Apple kernel, just return the original file. // if (!EFI_ERROR (Status)) { - OcKernelReadDarwinVersion (Kernel, KernelSize, DarwinVersion, sizeof (DarwinVersion)); + DarwinVersion = OcKernelReadDarwinVersion (Kernel, KernelSize); OcKernelApplyPatches (mOcConfiguration, DarwinVersion, NULL, Kernel, KernelSize); PrelinkedStatus = OcKernelProcessPrelinked (