From 45804a2894a1583019c542c89305c619acb5cf9e Mon Sep 17 00:00:00 2001 From: vit9696 Date: Sat, 12 Jun 2021 22:57:32 +0300 Subject: [PATCH] OcAppleKernelLib: Fixed SetApfsTrimTimeout on macOS 12 --- Changelog.md | 1 + .../Acidanthera/Library/OcAppleKernelLib.h | 2 + Library/OcAppleKernelLib/CommonPatches.c | 46 +++++++++++++++++-- 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/Changelog.md b/Changelog.md index 6e7359e5..7ff81b7b 100644 --- a/Changelog.md +++ b/Changelog.md @@ -7,6 +7,7 @@ OpenCore Changelog - Fixed `PowerTimeoutKernelPanic` on macOS 12 - Fixed transparency click detection on OpenCanopy boot entries - Added PCI device info dumping to `SysReport` +- Fixed `SetApfsTrimTimeout` on macOS 12 #### v0.7.0 - Fixed NVRAM reset on firmware with write-protected `BootOptionSupport` diff --git a/Include/Acidanthera/Library/OcAppleKernelLib.h b/Include/Acidanthera/Library/OcAppleKernelLib.h index 0fd4266c..0a665ca1 100644 --- a/Include/Acidanthera/Library/OcAppleKernelLib.h +++ b/Include/Acidanthera/Library/OcAppleKernelLib.h @@ -125,6 +125,7 @@ typedef enum KERNEL_CACHE_TYPE_ { #define KERNEL_VERSION_MOJAVE_MIN KERNEL_VERSION (18, 0, 0) #define KERNEL_VERSION_CATALINA_MIN KERNEL_VERSION (19, 0, 0) #define KERNEL_VERSION_BIG_SUR_MIN KERNEL_VERSION (20, 0, 0) +#define KERNEL_VERSION_MONTEREY_MIN KERNEL_VERSION (21, 0, 0) // // Maximum kernel versions for each release. @@ -141,6 +142,7 @@ typedef enum KERNEL_CACHE_TYPE_ { #define KERNEL_VERSION_HIGH_SIERRA_MAX (KERNEL_VERSION_MOJAVE_MIN - 1) #define KERNEL_VERSION_MOJAVE_MAX (KERNEL_VERSION_CATALINA_MIN - 1) #define KERNEL_VERSION_CATALINA_MAX (KERNEL_VERSION_BIG_SUR_MIN - 1) +#define KERNEL_VERSION_BIG_SUR_MAX (KERNEL_VERSION_MONTEREY_MIN - 1) // // Prelinked context used for kernel modification. diff --git a/Library/OcAppleKernelLib/CommonPatches.c b/Library/OcAppleKernelLib/CommonPatches.c index 1bc24c3c..79f9b2d5 100644 --- a/Library/OcAppleKernelLib/CommonPatches.c +++ b/Library/OcAppleKernelLib/CommonPatches.c @@ -1970,6 +1970,34 @@ mApfsTimeoutPatch = { .Limit = 0 }; +STATIC +UINT8 +mApfsTimeoutV2Find[] = { + 0x40, 0x42, 0x0F, 0x00 +}; + +STATIC +UINT8 +mApfsTimeoutV2Replace[] = { + 0x00, 0x02, 0x00, 0x00 +}; + + +STATIC +PATCHER_GENERIC_PATCH +mApfsTimeoutV2Patch = { + .Comment = DEBUG_POINTER ("ApfsTimeout V2"), + .Base = "_spaceman_scan_free_blocks", + .Find = mApfsTimeoutV2Find, + .Mask = NULL, + .Replace = mApfsTimeoutV2Replace, + .ReplaceMask = NULL, + .Size = sizeof (mApfsTimeoutV2Find), + .Count = 2, + .Skip = 0, + .Limit = 4096 +}; + VOID PatchSetApfsTimeout ( IN UINT32 Timeout @@ -1978,6 +2006,7 @@ PatchSetApfsTimeout ( // FIXME: This is really ugly, make quirks take a context param. DEBUG ((DEBUG_INFO, "OCAK: Registering %u APFS timeout\n", Timeout)); CopyMem (&mApfsTimeoutReplace[2], &Timeout, sizeof (Timeout)); + CopyMem (&mApfsTimeoutV2Replace[0], &Timeout, sizeof (Timeout)); } STATIC @@ -1998,11 +2027,20 @@ PatchSetApfsTrimTimeout ( return EFI_NOT_FOUND; } - Status = PatcherApplyGenericPatch (Patcher, &mApfsTimeoutPatch); - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_INFO, "OCAK: Failed to apply patch SetApfsTrimTimeout - %r\n", Status)); + if (KernelVersion >= KERNEL_VERSION_MONTEREY_MIN) { + Status = PatcherApplyGenericPatch (Patcher, &mApfsTimeoutV2Patch); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_INFO, "OCAK: Failed to apply patch SetApfsTrimTimeoutV2 - %r\n", Status)); + } else { + DEBUG ((DEBUG_INFO, "OCAK: Patch success SetApfsTrimTimeoutV2\n")); + } } else { - DEBUG ((DEBUG_INFO, "OCAK: Patch success SetApfsTrimTimeout\n")); + Status = PatcherApplyGenericPatch (Patcher, &mApfsTimeoutPatch); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_INFO, "OCAK: Failed to apply patch SetApfsTrimTimeout - %r\n", Status)); + } else { + DEBUG ((DEBUG_INFO, "OCAK: Patch success SetApfsTrimTimeout\n")); + } } return Status; -- GitLab