@@ -43,9 +43,11 @@ static constexpr size_t kBigSurAmdBronzeMtlAddrLibGetBaseArrayModeReturnSize = s
4343
4444static_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
5052static 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