@@ -17,6 +17,8 @@ static const int kPathMaxLen = 1024;
1717
1818#pragma mark - Patches
1919
20+ static const int kEllesmereDeviceId = 0x67DF ;
21+
2022static const uint8_t kAmdBronzeMtlAddrLibGetBaseArrayModeReturnOriginal [] = {
2123 0xb8 , 0x02 , 0x00 , 0x00 , 0x00 , 0x0f , 0x43 , 0xc1 , 0xeb ,
2224};
@@ -39,13 +41,21 @@ static const char kDyldCachePath[] = "/private/var/db/dyld/dyld_shared_cache_x86
3941
4042static const char *kAmdRadeonX4000HwLibsPath [] { " /System/Library/Extensions/AMDRadeonX4000HWServices.kext/Contents/PlugIns/AMDRadeonX4000HWLibs.kext/Contents/MacOS/AMDRadeonX4000HWLibs" };
4143
44+ static const char *kAmdRadeonX4000Path [] { " /System/Library/Extensions/AMDRadeonX4000.kext/Contents/MacOS/AMDRadeonX4000" };
45+
46+ enum {
47+ kAmdRadeonX4000 =0 ,
48+ kAmdRadeonX4000HwLibs ,
49+ };
50+
4251static KernelPatcher::KextInfo kAMDHWLibsInfo [] = {
43- { " com.apple.kext.AMDRadeonX4000HWLibs" , kAmdRadeonX4000HwLibsPath , arrsize (kAmdRadeonX4000HwLibsPath ), {true }, {}, KernelPatcher::KextInfo::Unloaded },
52+ [kAmdRadeonX4000 ] = { " com.apple.kext.AMDRadeonX4000" , kAmdRadeonX4000Path , arrsize (kAmdRadeonX4000Path ), {true }, {}, KernelPatcher::KextInfo::Unloaded },
53+ [kAmdRadeonX4000HwLibs ] = { " com.apple.kext.AMDRadeonX4000HWLibs" , kAmdRadeonX4000HwLibsPath , arrsize (kAmdRadeonX4000HwLibsPath ), {true }, {}, KernelPatcher::KextInfo::Unloaded },
4454};
4555
4656static mach_vm_address_t orig_cs_validate_range {};
47-
4857static mach_vm_address_t orig_IsEarlySAMUInitEnabled {};
58+ static mach_vm_address_t orig_getHardwareInfo {};
4959
5060static uint8_t const *patchFind {};
5161static uint8_t const *patchReplace {};
@@ -106,6 +116,16 @@ static int patched_IsEarlySAMUInitEnabled(void *ctx) {
106116 return 0 ;
107117}
108118
119+ static int patched_getHardwareInfo (void *obj, uint32_t *hwInfo) {
120+ int ret = FunctionCast (patched_getHardwareInfo, orig_getHardwareInfo)(obj, hwInfo);
121+ DBGLOG (MODULE_SHORT, " AMDRadeonX4000_AMDAccelDevice::getHardwareInfo: return 0x%08X" );
122+ if (ret == 0 ) {
123+ SYSLOG (MODULE_SHORT, " getHardwareInfo: deviceId = 0x%x" , *hwInfo);
124+ *hwInfo = kEllesmereDeviceId ;
125+ }
126+ return ret;
127+ }
128+
109129#pragma mark - Patches on start/stop
110130
111131static void pluginStart () {
@@ -145,7 +165,16 @@ static void pluginStart() {
145165 error = lilu.onKextLoad (kAMDHWLibsInfo , arrsize (kAMDHWLibsInfo ), [](void *user, KernelPatcher &patcher, size_t index, mach_vm_address_t address, size_t size){
146166 DBGLOG (MODULE_SHORT, " processing AMDRadeonX4000HWLibs" );
147167 for (size_t i = 0 ; i < arrsize (kAMDHWLibsInfo ); i++) {
148- if (kAMDHWLibsInfo [i].loadIndex == index) {
168+ if (i == kAmdRadeonX4000 && kAMDHWLibsInfo [i].loadIndex == index) {
169+ KernelPatcher::RouteRequest amd_requests[] {
170+ KernelPatcher::RouteRequest (" __ZN29AMDRadeonX4000_AMDAccelDevice15getHardwareInfoEP24_sAMD_GET_HW_INFO_VALUES" , patched_getHardwareInfo, orig_getHardwareInfo),
171+ };
172+ if (patcher.routeMultiple (index, amd_requests, address, size, true , true )) {
173+ DBGLOG (MODULE_SHORT, " patched getHardwareInfo" );
174+ } else {
175+ SYSLOG (MODULE_SHORT, " failed to patch getHardwareInfo: %d" , patcher.getError ());
176+ }
177+ } else if (i == kAmdRadeonX4000HwLibs && kAMDHWLibsInfo [i].loadIndex == index) {
149178 KernelPatcher::RouteRequest amd_requests[] {
150179 KernelPatcher::RouteRequest (" _PECI_IsEarlySAMUInitEnabled" , patched_IsEarlySAMUInitEnabled, orig_IsEarlySAMUInitEnabled),
151180 };
@@ -185,6 +214,6 @@ PluginConfiguration ADDPR(config) {
185214 bootargBeta,
186215 arrsize (bootargBeta),
187216 KernelVersion::Mojave,
188- KernelVersion::Catalina ,
217+ KernelVersion::BigSur ,
189218 pluginStart
190219};
0 commit comments