Skip to content

Commit 056d657

Browse files
author
osy
committed
Fix for Big Sur beta 7+
1 parent 4d66dab commit 056d657

File tree

2 files changed

+28
-29
lines changed

2 files changed

+28
-29
lines changed

Polaris22Fixup.xcodeproj/project.pbxproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,7 @@
404404
MODULE_NAME = com.osy86.Polaris22Fixup;
405405
MODULE_START = "$(PRODUCT_NAME)_kern_start";
406406
MODULE_STOP = "$(PRODUCT_NAME)_kern_stop";
407-
MODULE_VERSION = 1.3.0;
407+
MODULE_VERSION = 1.3.1;
408408
PRODUCT_BUNDLE_IDENTIFIER = com.osy86.Polaris22Fixup;
409409
PRODUCT_NAME = "$(TARGET_NAME)";
410410
WRAPPER_EXTENSION = kext;
@@ -428,7 +428,7 @@
428428
MODULE_NAME = com.osy86.Polaris22Fixup;
429429
MODULE_START = "$(PRODUCT_NAME)_kern_start";
430430
MODULE_STOP = "$(PRODUCT_NAME)_kern_stop";
431-
MODULE_VERSION = 1.3.0;
431+
MODULE_VERSION = 1.3.1;
432432
PRODUCT_BUNDLE_IDENTIFIER = com.osy86.Polaris22Fixup;
433433
PRODUCT_NAME = "$(TARGET_NAME)";
434434
WRAPPER_EXTENSION = kext;

Polaris22Fixup/kern_start.cpp

Lines changed: 26 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,11 @@ static constexpr size_t kBigSurAmdBronzeMtlAddrLibGetBaseArrayModeReturnSize = s
4343

4444
static_assert(kBigSurAmdBronzeMtlAddrLibGetBaseArrayModeReturnSize == sizeof(kBigSurAmdBronzeMtlAddrLibGetBaseArrayModeReturnPatched), "patch size invalid");
4545

46-
static const char kAmdBronzeMtlDriverPath[] = "/System/Library/Extensions/AMDMTLBronzeDriver.bundle/Contents/MacOS/AMDMTLBronzeDriver";
46+
static const char kAmdBronzeMtlDriverPath[kPathMaxLen] = "/System/Library/Extensions/AMDMTLBronzeDriver.bundle/Contents/MacOS/AMDMTLBronzeDriver";
4747

48-
static const char kDyldCachePath[] = "/private/var/db/dyld/dyld_shared_cache_x86_64h";
48+
static const char kDyldCachePath[kPathMaxLen] = "/private/var/db/dyld/dyld_shared_cache_x86_64h";
49+
50+
static const char kBigSurDyldCachePath[kPathMaxLen] = "/System/Library/dyld/dyld_shared_cache_x86_64h";
4951

5052
static const char *kAmdRadeonX4000HwLibsPath[] { "/System/Library/Extensions/AMDRadeonX4000HWServices.kext/Contents/PlugIns/AMDRadeonX4000HWLibs.kext/Contents/MacOS/AMDRadeonX4000HWLibs" };
5153

@@ -87,6 +89,26 @@ static void doKernelPatch(void (^patchFunc)(void)) {
8789
}
8890
}
8991

92+
template <size_t patchSize>
93+
static inline void searchAndPatch(const void *haystack,
94+
size_t haystackSize,
95+
const char (&path)[kPathMaxLen],
96+
const char (&dylibCachePath)[kPathMaxLen],
97+
const uint8_t (&needle)[patchSize],
98+
const uint8_t (&patch)[patchSize]) {
99+
if (UNLIKELY(strncmp(path, kAmdBronzeMtlDriverPath, sizeof(kAmdBronzeMtlDriverPath)) == 0) ||
100+
UNLIKELY(strncmp(path, dylibCachePath, sizeof(dylibCachePath)) == 0)) {
101+
void *res;
102+
if (UNLIKELY((res = memmem(haystack, haystackSize, needle, patchSize)) != NULL)) {
103+
SYSLOG(MODULE_SHORT, "found function to patch!");
104+
SYSLOG(MODULE_SHORT, "path: %s", path);
105+
doKernelPatch(^{
106+
lilu_os_memcpy(res, patch, patchSize);
107+
});
108+
}
109+
}
110+
}
111+
90112
#pragma mark - Patched functions
91113

92114
// pre Big Sur
@@ -100,19 +122,7 @@ static boolean_t patched_cs_validate_range(vnode_t vp,
100122
int pathlen = kPathMaxLen;
101123
boolean_t res = FunctionCast(patched_cs_validate_range, orig_cs_validate)(vp, pager, offset, data, size, result);
102124
if (res && vn_getpath(vp, path, &pathlen) == 0) {
103-
static_assert(sizeof(kAmdBronzeMtlDriverPath) <= sizeof(path), "path too long");
104-
static_assert(sizeof(kDyldCachePath) <= sizeof(path), "path too long");
105-
if (UNLIKELY(strncmp(path, kAmdBronzeMtlDriverPath, sizeof(kAmdBronzeMtlDriverPath)) == 0) ||
106-
UNLIKELY(strncmp(path, kDyldCachePath, sizeof(kDyldCachePath)) == 0)) {
107-
void *res;
108-
if (UNLIKELY((res = memmem(data, size, kAmdBronzeMtlAddrLibGetBaseArrayModeReturnOriginal, kAmdBronzeMtlAddrLibGetBaseArrayModeReturnSize)) != NULL)) {
109-
SYSLOG(MODULE_SHORT, "found function to patch!");
110-
SYSLOG(MODULE_SHORT, "path: %s", path);
111-
doKernelPatch(^{
112-
lilu_os_memcpy(res, kAmdBronzeMtlAddrLibGetBaseArrayModeReturnPatched, kAmdBronzeMtlAddrLibGetBaseArrayModeReturnSize);
113-
});
114-
}
115-
}
125+
searchAndPatch(data, size, path, kDyldCachePath, kAmdBronzeMtlAddrLibGetBaseArrayModeReturnOriginal, kAmdBronzeMtlAddrLibGetBaseArrayModeReturnPatched);
116126
}
117127
return res;
118128
}
@@ -129,18 +139,7 @@ static void patched_cs_validate_page(vnode_t vp,
129139
int pathlen = kPathMaxLen;
130140
FunctionCast(patched_cs_validate_page, orig_cs_validate)(vp, pager, page_offset, data, arg4, arg5, arg6);
131141
if (vn_getpath(vp, path, &pathlen) == 0) {
132-
static_assert(sizeof(kAmdBronzeMtlDriverPath) <= sizeof(path), "path too long");
133-
static_assert(sizeof(kBigSurAmdBronzeMtlAddrLibGetBaseArrayModeReturnOriginal) == sizeof(kBigSurAmdBronzeMtlAddrLibGetBaseArrayModeReturnPatched), "patch size invalid");
134-
if (UNLIKELY(strncmp(path, kAmdBronzeMtlDriverPath, sizeof(kAmdBronzeMtlDriverPath)) == 0)) {
135-
void *res;
136-
if (UNLIKELY((res = memmem(data, PAGE_SIZE, kBigSurAmdBronzeMtlAddrLibGetBaseArrayModeReturnOriginal, kBigSurAmdBronzeMtlAddrLibGetBaseArrayModeReturnSize)) != NULL)) {
137-
SYSLOG(MODULE_SHORT, "found function to patch!");
138-
SYSLOG(MODULE_SHORT, "found path: %s", path);
139-
doKernelPatch(^{
140-
lilu_os_memcpy(res, kBigSurAmdBronzeMtlAddrLibGetBaseArrayModeReturnPatched, kBigSurAmdBronzeMtlAddrLibGetBaseArrayModeReturnSize);
141-
});
142-
}
143-
}
142+
searchAndPatch(data, PAGE_SIZE, path, kBigSurDyldCachePath, kBigSurAmdBronzeMtlAddrLibGetBaseArrayModeReturnOriginal, kBigSurAmdBronzeMtlAddrLibGetBaseArrayModeReturnPatched);
144143
}
145144
}
146145

0 commit comments

Comments
 (0)