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")