diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e9b6e71e..682dd0b37 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,7 @@ - ex. AMD GCN - Relies on N-1 system for when matching KDK is not present - Delete unused KDKs in `/Library/Developer/KDKs` during root patching + - Resolve Power Management support for Ivy Bridge and older - Increment Binaries: - OpenCorePkg 0.8.5 release - Lilu 1.6.2 - release diff --git a/payloads/Config/config.plist b/payloads/Config/config.plist index c051f65de..2963d4c27 100644 --- a/payloads/Config/config.plist +++ b/payloads/Config/config.plist @@ -1473,6 +1473,42 @@ PlistPath Contents/Info.plist + + Arch + x86_64 + BundlePath + AppleIntelCPUPowerManagement.kext + Comment + Legacy Power Management (pre-XCPM) + Enabled + + ExecutablePath + Contents/MacOS/AppleIntelCPUPowerManagement + MaxKernel + + MinKernel + 22.0.0 + PlistPath + Contents/Info.plist + + + Arch + x86_64 + BundlePath + AppleIntelCPUPowerManagementClient.kext + Comment + Legacy Power Management (pre-XCPM) Helper + Enabled + + ExecutablePath + Contents/MacOS/AppleIntelCPUPowerManagementClient + MaxKernel + + MinKernel + 22.0.0 + PlistPath + Contents/Info.plist + Block diff --git a/payloads/Kexts/Misc/AppleIntelCPUPowerManagement-v1.0.0.zip b/payloads/Kexts/Misc/AppleIntelCPUPowerManagement-v1.0.0.zip new file mode 100644 index 000000000..e9321a128 Binary files /dev/null and b/payloads/Kexts/Misc/AppleIntelCPUPowerManagement-v1.0.0.zip differ diff --git a/payloads/Kexts/Misc/AppleIntelCPUPowerManagementClient-v1.0.0.zip b/payloads/Kexts/Misc/AppleIntelCPUPowerManagementClient-v1.0.0.zip new file mode 100644 index 000000000..6ea659945 Binary files /dev/null and b/payloads/Kexts/Misc/AppleIntelCPUPowerManagementClient-v1.0.0.zip differ diff --git a/resources/build.py b/resources/build.py index 31bc4cbf6..94b7adad9 100644 --- a/resources/build.py +++ b/resources/build.py @@ -445,6 +445,16 @@ class BuildOpenCore: self.get_item_by_kv(self.config["ACPI"]["Patch"], "Comment", "BUF0 to BUF1")["Enabled"] = True shutil.copy(self.constants.windows_ssdt_path, self.constants.acpi_path) + # In macOS Ventura, Apple dropped AppleIntelCPUPowerManagement* kexts as they're unused on Haswell+ + # However re-injecting the AICPUPM kexts is not enough, as Apple had 'intel_cpupm_matching' stripped from the kernel: + # https://github.com/apple-oss-distributions/xnu/blob/e7776783b89a353188416a9a346c6cdb4928faad/osfmk/i386/pal_routines.h#L153-L163 + # + # To resolve, AICPUPM.kext was modified to no longer check for the presence of 'intel_cpupm_matching' + if smbios_data.smbios_dictionary[self.model]["CPU Generation"] <= cpu_data.cpu_data.ivy_bridge.value: + print("- Enabling legacy power management support") + self.enable_kext("AppleIntelCPUPowerManagement.kext", self.constants.aicpupm_version, self.constants.aicpupm_path) + self.enable_kext("AppleIntelCPUPowerManagementClient.kext", self.constants.aicpupm_version, self.constants.aicpupm_client_path) + # With macOS Monterey, Apple's SDXC driver requires the system to support VT-D # However pre-Ivy Bridge don't support this feature if smbios_data.smbios_dictionary[self.model]["CPU Generation"] <= cpu_data.cpu_data.sandy_bridge.value: diff --git a/resources/constants.py b/resources/constants.py index e95652efa..57a0a8cc1 100644 --- a/resources/constants.py +++ b/resources/constants.py @@ -63,6 +63,7 @@ class Constants: self.intel_82574l_version = "1.0.0" # Intel82574L self.intel_8254x_version = "1.0.0" # AppleIntel8254XEthernet self.apple_usb_11_injector = "1.0.0" # AppleUSBUHCI/OHCI + self.aicpupm_version = "1.0.0" # AppleIntelCPUPowerManagement/Client ## Apple - Dortania Modified self.bcm570_version = "1.0.2" # CatalinaBCM5701Ethernet @@ -321,6 +322,14 @@ class Constants: def apple_usb_11_injector_path(self): return self.payload_kexts_path / Path(f"USB/USB1.1-Injector-v{self.apple_usb_11_injector}.zip") + @property + def aicpupm_path(self): + return self.payload_kexts_path / Path(f"Misc/AppleIntelCPUPowerManagement-v{self.aicpupm_version}.zip") + + @property + def aicpupm_client_path(self): + return self.payload_kexts_path / Path(f"Misc/AppleIntelCPUPowerManagementClient-v{self.aicpupm_version}.zip") + @property def mce_path(self): return self.payload_kexts_path / Path(f"Misc/AppleMCEReporterDisabler-v{self.mce_version}.zip")