提交 45804a28 编写于 作者: V vit9696

OcAppleKernelLib: Fixed SetApfsTrimTimeout on macOS 12

上级 060e0fc8
...@@ -7,6 +7,7 @@ OpenCore Changelog ...@@ -7,6 +7,7 @@ OpenCore Changelog
- Fixed `PowerTimeoutKernelPanic` on macOS 12 - Fixed `PowerTimeoutKernelPanic` on macOS 12
- Fixed transparency click detection on OpenCanopy boot entries - Fixed transparency click detection on OpenCanopy boot entries
- Added PCI device info dumping to `SysReport` - Added PCI device info dumping to `SysReport`
- Fixed `SetApfsTrimTimeout` on macOS 12
#### v0.7.0 #### v0.7.0
- Fixed NVRAM reset on firmware with write-protected `BootOptionSupport` - Fixed NVRAM reset on firmware with write-protected `BootOptionSupport`
......
...@@ -125,6 +125,7 @@ typedef enum KERNEL_CACHE_TYPE_ { ...@@ -125,6 +125,7 @@ typedef enum KERNEL_CACHE_TYPE_ {
#define KERNEL_VERSION_MOJAVE_MIN KERNEL_VERSION (18, 0, 0) #define KERNEL_VERSION_MOJAVE_MIN KERNEL_VERSION (18, 0, 0)
#define KERNEL_VERSION_CATALINA_MIN KERNEL_VERSION (19, 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_BIG_SUR_MIN KERNEL_VERSION (20, 0, 0)
#define KERNEL_VERSION_MONTEREY_MIN KERNEL_VERSION (21, 0, 0)
// //
// Maximum kernel versions for each release. // Maximum kernel versions for each release.
...@@ -141,6 +142,7 @@ typedef enum KERNEL_CACHE_TYPE_ { ...@@ -141,6 +142,7 @@ typedef enum KERNEL_CACHE_TYPE_ {
#define KERNEL_VERSION_HIGH_SIERRA_MAX (KERNEL_VERSION_MOJAVE_MIN - 1) #define KERNEL_VERSION_HIGH_SIERRA_MAX (KERNEL_VERSION_MOJAVE_MIN - 1)
#define KERNEL_VERSION_MOJAVE_MAX (KERNEL_VERSION_CATALINA_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_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. // Prelinked context used for kernel modification.
......
...@@ -1970,6 +1970,34 @@ mApfsTimeoutPatch = { ...@@ -1970,6 +1970,34 @@ mApfsTimeoutPatch = {
.Limit = 0 .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 VOID
PatchSetApfsTimeout ( PatchSetApfsTimeout (
IN UINT32 Timeout IN UINT32 Timeout
...@@ -1978,6 +2006,7 @@ PatchSetApfsTimeout ( ...@@ -1978,6 +2006,7 @@ PatchSetApfsTimeout (
// FIXME: This is really ugly, make quirks take a context param. // FIXME: This is really ugly, make quirks take a context param.
DEBUG ((DEBUG_INFO, "OCAK: Registering %u APFS timeout\n", Timeout)); DEBUG ((DEBUG_INFO, "OCAK: Registering %u APFS timeout\n", Timeout));
CopyMem (&mApfsTimeoutReplace[2], &Timeout, sizeof (Timeout)); CopyMem (&mApfsTimeoutReplace[2], &Timeout, sizeof (Timeout));
CopyMem (&mApfsTimeoutV2Replace[0], &Timeout, sizeof (Timeout));
} }
STATIC STATIC
...@@ -1998,11 +2027,20 @@ PatchSetApfsTrimTimeout ( ...@@ -1998,11 +2027,20 @@ PatchSetApfsTrimTimeout (
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
Status = PatcherApplyGenericPatch (Patcher, &mApfsTimeoutPatch); if (KernelVersion >= KERNEL_VERSION_MONTEREY_MIN) {
if (EFI_ERROR (Status)) { Status = PatcherApplyGenericPatch (Patcher, &mApfsTimeoutV2Patch);
DEBUG ((DEBUG_INFO, "OCAK: Failed to apply patch SetApfsTrimTimeout - %r\n", Status)); 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 { } 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; return Status;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册