mirror of
https://github.com/dortania/OpenCore-Legacy-Patcher.git
synced 2026-04-20 02:34:33 +10:00
Compare commits
24 Commits
main
...
macos-next
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dba48072fd | ||
|
|
b4e6688203 | ||
|
|
a71086935d | ||
|
|
2cd692ed9b | ||
|
|
13115072a9 | ||
|
|
75302a1ec2 | ||
|
|
decf6a9676 | ||
|
|
c3f8b47cec | ||
|
|
9f35856b39 | ||
|
|
5c8d0d967d | ||
|
|
6d68399483 | ||
|
|
31572c86b9 | ||
|
|
a024bfc117 | ||
|
|
4976c5148e | ||
|
|
e3c064d2c1 | ||
|
|
0bfe09c3ef | ||
|
|
689f423625 | ||
|
|
cd3f3fb039 | ||
|
|
8872a18bfe | ||
|
|
feca197ade | ||
|
|
9be3dc8d58 | ||
|
|
90412f1354 | ||
|
|
1cf7335ec4 | ||
|
|
453ef78dda |
@@ -1,5 +1,12 @@
|
|||||||
# OpenCore Legacy Patcher changelog
|
# OpenCore Legacy Patcher changelog
|
||||||
|
|
||||||
|
## 3.0.0
|
||||||
|
- Restore support for FileVault 2 on macOS 26
|
||||||
|
- Add USB mappings for macOS 26
|
||||||
|
- Adopt Liquid Glass-conformant app icon
|
||||||
|
- Increment Binaries:
|
||||||
|
- OpenCorePkg 1.0.5 - rolling (f03819e)
|
||||||
|
|
||||||
## 2.4.1
|
## 2.4.1
|
||||||
- Switch installer source to AppleDB
|
- Switch installer source to AppleDB
|
||||||
- Resolves missing or incorrect installers showing up when downloading an installer
|
- Resolves missing or incorrect installers showing up when downloading an installer
|
||||||
|
|||||||
@@ -83,4 +83,5 @@ app = BUNDLE(coll,
|
|||||||
"Build Date": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),
|
"Build Date": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),
|
||||||
"BuildMachineOSBuild": subprocess.run(["/usr/bin/sw_vers", "-buildVersion"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT).stdout.decode().strip(),
|
"BuildMachineOSBuild": subprocess.run(["/usr/bin/sw_vers", "-buildVersion"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT).stdout.decode().strip(),
|
||||||
"NSPrincipalClass": "NSApplication",
|
"NSPrincipalClass": "NSApplication",
|
||||||
|
"CFBundleIconName": "oclp",
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -131,6 +131,26 @@ class GenerateApplication:
|
|||||||
f.write(data)
|
f.write(data)
|
||||||
|
|
||||||
|
|
||||||
|
def _patch_sdk_version(self) -> None:
|
||||||
|
"""
|
||||||
|
Patch LC_BUILD_VERSION in Load Command to report the macOS 26 SDK
|
||||||
|
|
||||||
|
This will enable the Solarium refresh when running on macOS 26
|
||||||
|
Minor visual anomalies and padding issues exist, disable if not addressed before release
|
||||||
|
"""
|
||||||
|
_file = self._application_output / "Contents" / "MacOS" / "OpenCore-Patcher"
|
||||||
|
|
||||||
|
_find = b'\x00\x01\x0C\x00'
|
||||||
|
_replace = b'\x00\x00\x1A\x00'
|
||||||
|
|
||||||
|
print("Patching LC_BUILD_VERSION")
|
||||||
|
with open(_file, "rb") as f:
|
||||||
|
data = f.read()
|
||||||
|
data = data.replace(_find, _replace)
|
||||||
|
|
||||||
|
with open(_file, "wb") as f:
|
||||||
|
f.write(data)
|
||||||
|
|
||||||
def _embed_git_data(self) -> None:
|
def _embed_git_data(self) -> None:
|
||||||
"""
|
"""
|
||||||
Embed git data
|
Embed git data
|
||||||
@@ -162,6 +182,11 @@ class GenerateApplication:
|
|||||||
stdout=subprocess.PIPE, stderr=subprocess.PIPE
|
stdout=subprocess.PIPE, stderr=subprocess.PIPE
|
||||||
)
|
)
|
||||||
|
|
||||||
|
subprocess_wrapper.run_and_verify(
|
||||||
|
generate_copy_arguments("payloads/Icon/AppIcons/Assets.car", self._application_output / "Contents/Resources/"),
|
||||||
|
stdout=subprocess.PIPE, stderr=subprocess.PIPE
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def generate(self) -> None:
|
def generate(self) -> None:
|
||||||
"""
|
"""
|
||||||
@@ -172,5 +197,6 @@ class GenerateApplication:
|
|||||||
self._remove_analytics_key()
|
self._remove_analytics_key()
|
||||||
|
|
||||||
self._patch_load_command()
|
self._patch_load_command()
|
||||||
|
self._patch_sdk_version() if not self._git_branch or not self._git_branch.startswith('refs/tags') else None
|
||||||
self._embed_git_data()
|
self._embed_git_data()
|
||||||
self._embed_resources()
|
self._embed_resources()
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ class InstallerBackup:
|
|||||||
os_data.os_data.ventura,
|
os_data.os_data.ventura,
|
||||||
os_data.os_data.sonoma,
|
os_data.os_data.sonoma,
|
||||||
os_data.os_data.sequoia,
|
os_data.os_data.sequoia,
|
||||||
|
os_data.os_data.tahoe,
|
||||||
],
|
],
|
||||||
first_run: bool = False
|
first_run: bool = False
|
||||||
) -> None:
|
) -> None:
|
||||||
@@ -59,6 +60,7 @@ class InstallerBackup:
|
|||||||
os_data.os_data.ventura: Path(self._directory, "13 Ventura"),
|
os_data.os_data.ventura: Path(self._directory, "13 Ventura"),
|
||||||
os_data.os_data.sonoma: Path(self._directory, "14 Sonoma"),
|
os_data.os_data.sonoma: Path(self._directory, "14 Sonoma"),
|
||||||
os_data.os_data.sequoia: Path(self._directory, "15 Sequoia"),
|
os_data.os_data.sequoia: Path(self._directory, "15 Sequoia"),
|
||||||
|
os_data.os_data.tahoe: Path(self._directory, "26 Tahoe"),
|
||||||
}
|
}
|
||||||
|
|
||||||
for os_version in self._supported_oses:
|
for os_version in self._supported_oses:
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 270 KiB After Width: | Height: | Size: 639 KiB |
@@ -13,7 +13,7 @@ from .detections import device_probe
|
|||||||
class Constants:
|
class Constants:
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
# Patcher Versioning
|
# Patcher Versioning
|
||||||
self.patcher_version: str = "2.4.1" # OpenCore-Legacy-Patcher
|
self.patcher_version: str = "3.0.0" # OpenCore-Legacy-Patcher
|
||||||
self.patcher_support_pkg_version: str = "1.9.5" # PatcherSupportPkg
|
self.patcher_support_pkg_version: str = "1.9.5" # PatcherSupportPkg
|
||||||
self.copyright_date: str = "Copyright © 2020-2025 Dortania"
|
self.copyright_date: str = "Copyright © 2020-2025 Dortania"
|
||||||
self.patcher_name: str = "OpenCore Legacy Patcher"
|
self.patcher_name: str = "OpenCore Legacy Patcher"
|
||||||
@@ -28,7 +28,7 @@ class Constants:
|
|||||||
|
|
||||||
# OpenCore Versioning
|
# OpenCore Versioning
|
||||||
# https://github.com/acidanthera/OpenCorePkg
|
# https://github.com/acidanthera/OpenCorePkg
|
||||||
self.opencore_version: str = "1.0.4"
|
self.opencore_version: str = "1.0.5"
|
||||||
|
|
||||||
# Kext Versioning
|
# Kext Versioning
|
||||||
## Acidanthera
|
## Acidanthera
|
||||||
@@ -322,6 +322,10 @@ class Constants:
|
|||||||
return self.payload_path / Path("ACPI/SSDT-DGPU.aml")
|
return self.payload_path / Path("ACPI/SSDT-DGPU.aml")
|
||||||
|
|
||||||
# Drivers
|
# Drivers
|
||||||
|
@property
|
||||||
|
def sequoia_apfs_driver_path(self):
|
||||||
|
return self.payload_path / Path("Drivers/apfs_aligned.efi")
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def nvme_driver_path(self):
|
def nvme_driver_path(self):
|
||||||
return self.payload_path / Path("Drivers/NvmExpressDxe.efi")
|
return self.payload_path / Path("Drivers/NvmExpressDxe.efi")
|
||||||
@@ -685,10 +689,18 @@ class Constants:
|
|||||||
def map_kext_folder(self):
|
def map_kext_folder(self):
|
||||||
return self.kexts_path / Path("USB-Map.kext")
|
return self.kexts_path / Path("USB-Map.kext")
|
||||||
|
|
||||||
|
@property
|
||||||
|
def map_kext_folder_tahoe(self):
|
||||||
|
return self.kexts_path / Path("USB-Map-Tahoe.kext")
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def map_contents_folder(self):
|
def map_contents_folder(self):
|
||||||
return self.map_kext_folder / Path("Contents")
|
return self.map_kext_folder / Path("Contents")
|
||||||
|
|
||||||
|
@property
|
||||||
|
def map_contents_folder_tahoe(self):
|
||||||
|
return self.map_kext_folder_tahoe / Path("Contents")
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def pp_kext_folder(self):
|
def pp_kext_folder(self):
|
||||||
return self.kexts_path / Path("CPUFriendDataProvider.kext")
|
return self.kexts_path / Path("CPUFriendDataProvider.kext")
|
||||||
@@ -794,6 +806,10 @@ class Constants:
|
|||||||
def icon_path_macos_sequoia(self):
|
def icon_path_macos_sequoia(self):
|
||||||
return self.icns_resource_path / Path("Sequoia.icns")
|
return self.icns_resource_path / Path("Sequoia.icns")
|
||||||
|
|
||||||
|
@property
|
||||||
|
def icon_path_macos_tahoe(self):
|
||||||
|
return self.icns_resource_path / Path("Tahoe.icns")
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def gui_path(self):
|
def gui_path(self):
|
||||||
return self.payload_path / Path("Icon/Resources.zip")
|
return self.payload_path / Path("Icon/Resources.zip")
|
||||||
@@ -828,6 +844,7 @@ class Constants:
|
|||||||
str(self.icon_path_macos_ventura),
|
str(self.icon_path_macos_ventura),
|
||||||
str(self.icon_path_macos_sonoma),
|
str(self.icon_path_macos_sonoma),
|
||||||
str(self.icon_path_macos_sequoia),
|
str(self.icon_path_macos_sequoia),
|
||||||
|
str(self.icon_path_macos_tahoe),
|
||||||
]
|
]
|
||||||
|
|
||||||
sbm_values = [
|
sbm_values = [
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ SupportedSMBIOS = [
|
|||||||
"MacBookAir7,2",
|
"MacBookAir7,2",
|
||||||
# "MacBookAir8,1",
|
# "MacBookAir8,1",
|
||||||
# "MacBookAir8,2",
|
# "MacBookAir8,2",
|
||||||
|
# "MacBookAir9,1",
|
||||||
# MacBook Pro
|
# MacBook Pro
|
||||||
"MacBookPro4,1",
|
"MacBookPro4,1",
|
||||||
"MacBookPro5,1",
|
"MacBookPro5,1",
|
||||||
@@ -55,6 +56,11 @@ SupportedSMBIOS = [
|
|||||||
"MacBookPro14,1",
|
"MacBookPro14,1",
|
||||||
"MacBookPro14,2",
|
"MacBookPro14,2",
|
||||||
"MacBookPro14,3",
|
"MacBookPro14,3",
|
||||||
|
# "MacBookPro15,1",
|
||||||
|
# "MacBookPro15,2",
|
||||||
|
# "MacBookPro15,3",
|
||||||
|
# "MacBookPro15,4",
|
||||||
|
# "MacBookPro16,3",
|
||||||
# Mac Mini
|
# Mac Mini
|
||||||
"Macmini3,1",
|
"Macmini3,1",
|
||||||
"Macmini4,1",
|
"Macmini4,1",
|
||||||
@@ -64,6 +70,7 @@ SupportedSMBIOS = [
|
|||||||
"Macmini6,1",
|
"Macmini6,1",
|
||||||
"Macmini6,2",
|
"Macmini6,2",
|
||||||
"Macmini7,1",
|
"Macmini7,1",
|
||||||
|
# "Macmini8,1",
|
||||||
# iMac
|
# iMac
|
||||||
"iMac7,1",
|
"iMac7,1",
|
||||||
"iMac8,1",
|
"iMac8,1",
|
||||||
@@ -88,6 +95,8 @@ SupportedSMBIOS = [
|
|||||||
"iMac18,1",
|
"iMac18,1",
|
||||||
"iMac18,2",
|
"iMac18,2",
|
||||||
"iMac18,3",
|
"iMac18,3",
|
||||||
|
"iMac19,1",
|
||||||
|
"iMac19,2",
|
||||||
# Mac Pro
|
# Mac Pro
|
||||||
"MacPro3,1",
|
"MacPro3,1",
|
||||||
"MacPro4,1",
|
"MacPro4,1",
|
||||||
@@ -96,6 +105,8 @@ SupportedSMBIOS = [
|
|||||||
# Xserve
|
# Xserve
|
||||||
"Xserve2,1",
|
"Xserve2,1",
|
||||||
"Xserve3,1",
|
"Xserve3,1",
|
||||||
|
# iMac Pro
|
||||||
|
# "iMacPro1,1",
|
||||||
]
|
]
|
||||||
|
|
||||||
# Audio
|
# Audio
|
||||||
|
|||||||
@@ -216,6 +216,14 @@ class BuildFirmware:
|
|||||||
if not "CPU Generation" in smbios_data.smbios_dictionary[self.model]:
|
if not "CPU Generation" in smbios_data.smbios_dictionary[self.model]:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
# APFS check
|
||||||
|
# The macOS 26 APFS EFI driver's FileVault 2 implementation is broken, and
|
||||||
|
# must be replaced with the macOS 15 APFS EFI driver.
|
||||||
|
logging.info("- Enabling macOS 26 FileVault 2 support")
|
||||||
|
self.config["UEFI"]["APFS"]["EnableJumpstart"] = False
|
||||||
|
shutil.copy(self.constants.sequoia_apfs_driver_path, self.constants.drivers_path)
|
||||||
|
support.BuildSupport(self.model, self.constants, self.config).get_efi_binary_by_path("apfs_aligned.efi", "UEFI", "Drivers")["Enabled"] = True
|
||||||
|
|
||||||
# Exfat check
|
# Exfat check
|
||||||
if smbios_data.smbios_dictionary[self.model]["CPU Generation"] < cpu_data.CPUGen.sandy_bridge.value:
|
if smbios_data.smbios_dictionary[self.model]["CPU Generation"] < cpu_data.CPUGen.sandy_bridge.value:
|
||||||
# Sandy Bridge and newer Macs natively support ExFat
|
# Sandy Bridge and newer Macs natively support ExFat
|
||||||
|
|||||||
@@ -285,19 +285,26 @@ xw
|
|||||||
|
|
||||||
# USB Map
|
# USB Map
|
||||||
usb_map_path = Path(self.constants.plist_folder_path) / Path("AppleUSBMaps/Info.plist")
|
usb_map_path = Path(self.constants.plist_folder_path) / Path("AppleUSBMaps/Info.plist")
|
||||||
|
usb_map_tahoe_path = Path(self.constants.plist_folder_path) / Path("AppleUSBMaps/Info-Tahoe.plist")
|
||||||
if (
|
if (
|
||||||
usb_map_path.exists()
|
usb_map_path.exists()
|
||||||
|
and usb_map_tahoe_path.exists()
|
||||||
and (self.constants.allow_oc_everywhere is False or self.constants.allow_native_spoofs is True)
|
and (self.constants.allow_oc_everywhere is False or self.constants.allow_native_spoofs is True)
|
||||||
and self.model not in ["Xserve2,1", "Dortania1,1"]
|
and self.model not in ["Xserve2,1", "Dortania1,1"]
|
||||||
and (
|
and (
|
||||||
(self.model in model_array.Missing_USB_Map or self.model in model_array.Missing_USB_Map_Ventura)
|
(self.model in model_array.Missing_USB_Map or self.model in model_array.Missing_USB_Map_Ventura)
|
||||||
or self.constants.serial_settings in ["Moderate", "Advanced"])
|
or self.constants.serial_settings in ["Moderate", "Advanced"])
|
||||||
):
|
):
|
||||||
logging.info("- Adding USB-Map.kext")
|
logging.info("- Adding USB-Map.kext and USB-Map-Tahoe.kext")
|
||||||
Path(self.constants.map_kext_folder).mkdir()
|
Path(self.constants.map_kext_folder).mkdir()
|
||||||
|
Path(self.constants.map_kext_folder_tahoe).mkdir()
|
||||||
Path(self.constants.map_contents_folder).mkdir()
|
Path(self.constants.map_contents_folder).mkdir()
|
||||||
|
Path(self.constants.map_contents_folder_tahoe).mkdir()
|
||||||
shutil.copy(usb_map_path, self.constants.map_contents_folder)
|
shutil.copy(usb_map_path, self.constants.map_contents_folder)
|
||||||
|
# for the tahoe, need to copy but rename to Info.plist
|
||||||
|
shutil.copy(usb_map_tahoe_path, self.constants.map_contents_folder_tahoe / Path("Info.plist"))
|
||||||
support.BuildSupport(self.model, self.constants, self.config).get_kext_by_bundle_path("USB-Map.kext")["Enabled"] = True
|
support.BuildSupport(self.model, self.constants, self.config).get_kext_by_bundle_path("USB-Map.kext")["Enabled"] = True
|
||||||
|
support.BuildSupport(self.model, self.constants, self.config).get_kext_by_bundle_path("USB-Map-Tahoe.kext")["Enabled"] = True
|
||||||
if self.model in model_array.Missing_USB_Map_Ventura and self.constants.serial_settings not in ["Moderate", "Advanced"]:
|
if self.model in model_array.Missing_USB_Map_Ventura and self.constants.serial_settings not in ["Moderate", "Advanced"]:
|
||||||
support.BuildSupport(self.model, self.constants, self.config).get_kext_by_bundle_path("USB-Map.kext")["MinKernel"] = "22.0.0"
|
support.BuildSupport(self.model, self.constants, self.config).get_kext_by_bundle_path("USB-Map.kext")["MinKernel"] = "22.0.0"
|
||||||
|
|
||||||
@@ -324,6 +331,9 @@ xw
|
|||||||
support.BuildSupport(self.model, self.constants, self.config).get_kext_by_bundle_path("USB1.1-Injector.kext/Contents/PlugIns/AppleUSBUHCI.kext")["Enabled"] = True
|
support.BuildSupport(self.model, self.constants, self.config).get_kext_by_bundle_path("USB1.1-Injector.kext/Contents/PlugIns/AppleUSBUHCI.kext")["Enabled"] = True
|
||||||
support.BuildSupport(self.model, self.constants, self.config).get_kext_by_bundle_path("USB1.1-Injector.kext/Contents/PlugIns/AppleUSBUHCIPCI.kext")["Enabled"] = True
|
support.BuildSupport(self.model, self.constants, self.config).get_kext_by_bundle_path("USB1.1-Injector.kext/Contents/PlugIns/AppleUSBUHCIPCI.kext")["Enabled"] = True
|
||||||
|
|
||||||
|
# Also remove MaxKernel from the USB-Map.kext, as USB stack will be downgraded after root patching
|
||||||
|
support.BuildSupport(self.model, self.constants, self.config).get_kext_by_bundle_path("USB-Map.kext")["MaxKernel"] = ""
|
||||||
|
|
||||||
|
|
||||||
def _debug_handling(self) -> None:
|
def _debug_handling(self) -> None:
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -67,6 +67,24 @@ class BuildSMBIOS:
|
|||||||
logging.info("- Adding -no_compat_check")
|
logging.info("- Adding -no_compat_check")
|
||||||
self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"] += " -no_compat_check"
|
self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"] += " -no_compat_check"
|
||||||
|
|
||||||
|
def _strip_usb_map(self, map_path, model, spoofed_model, serial_settings):
|
||||||
|
config = plistlib.load(Path(map_path).open("rb"))
|
||||||
|
for entry in list(config["IOKitPersonalities_x86_64"]):
|
||||||
|
if not entry.startswith(model):
|
||||||
|
config["IOKitPersonalities_x86_64"].pop(entry)
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
config["IOKitPersonalities_x86_64"][entry]["model"] = spoofed_model
|
||||||
|
if serial_settings in ["Minimal", "None"]:
|
||||||
|
if config["IOKitPersonalities_x86_64"][entry]["IONameMatch"] == "EH01":
|
||||||
|
config["IOKitPersonalities_x86_64"][entry]["IONameMatch"] = "EHC1"
|
||||||
|
if config["IOKitPersonalities_x86_64"][entry]["IONameMatch"] == "EH02":
|
||||||
|
config["IOKitPersonalities_x86_64"][entry]["IONameMatch"] = "EHC2"
|
||||||
|
if config["IOKitPersonalities_x86_64"][entry]["IONameMatch"] == "SHC1":
|
||||||
|
config["IOKitPersonalities_x86_64"][entry]["IONameMatch"] = "XHC1"
|
||||||
|
except KeyError:
|
||||||
|
continue
|
||||||
|
plistlib.dump(config, Path(map_path).open("wb"), sort_keys=True)
|
||||||
|
|
||||||
def set_smbios(self) -> None:
|
def set_smbios(self) -> None:
|
||||||
"""
|
"""
|
||||||
@@ -142,24 +160,10 @@ class BuildSMBIOS:
|
|||||||
and ((self.model in model_array.Missing_USB_Map or self.model in model_array.Missing_USB_Map_Ventura) or self.constants.serial_settings in ["Moderate", "Advanced"])
|
and ((self.model in model_array.Missing_USB_Map or self.model in model_array.Missing_USB_Map_Ventura) or self.constants.serial_settings in ["Moderate", "Advanced"])
|
||||||
):
|
):
|
||||||
new_map_ls = Path(self.constants.map_contents_folder) / Path("Info.plist")
|
new_map_ls = Path(self.constants.map_contents_folder) / Path("Info.plist")
|
||||||
map_config = plistlib.load(Path(new_map_ls).open("rb"))
|
new_map_ls_tahoe = Path(self.constants.map_contents_folder_tahoe) / Path("Info.plist")
|
||||||
# Strip unused USB maps
|
self._strip_usb_map(new_map_ls, self.model, self.spoofed_model, self.constants.serial_settings)
|
||||||
for entry in list(map_config["IOKitPersonalities_x86_64"]):
|
self._strip_usb_map(new_map_ls_tahoe, self.model, self.spoofed_model, self.constants.serial_settings)
|
||||||
if not entry.startswith(self.model):
|
|
||||||
map_config["IOKitPersonalities_x86_64"].pop(entry)
|
|
||||||
else:
|
|
||||||
try:
|
|
||||||
map_config["IOKitPersonalities_x86_64"][entry]["model"] = self.spoofed_model
|
|
||||||
if self.constants.serial_settings in ["Minimal", "None"]:
|
|
||||||
if map_config["IOKitPersonalities_x86_64"][entry]["IONameMatch"] == "EH01":
|
|
||||||
map_config["IOKitPersonalities_x86_64"][entry]["IONameMatch"] = "EHC1"
|
|
||||||
if map_config["IOKitPersonalities_x86_64"][entry]["IONameMatch"] == "EH02":
|
|
||||||
map_config["IOKitPersonalities_x86_64"][entry]["IONameMatch"] = "EHC2"
|
|
||||||
if map_config["IOKitPersonalities_x86_64"][entry]["IONameMatch"] == "SHC1":
|
|
||||||
map_config["IOKitPersonalities_x86_64"][entry]["IONameMatch"] = "XHC1"
|
|
||||||
except KeyError:
|
|
||||||
continue
|
|
||||||
plistlib.dump(map_config, Path(new_map_ls).open("wb"), sort_keys=True)
|
|
||||||
if self.constants.allow_oc_everywhere is False and self.model not in ["iMac7,1", "Xserve2,1", "Dortania1,1"] and self.constants.disallow_cpufriend is False and self.constants.serial_settings != "None":
|
if self.constants.allow_oc_everywhere is False and self.model not in ["iMac7,1", "Xserve2,1", "Dortania1,1"] and self.constants.disallow_cpufriend is False and self.constants.serial_settings != "None":
|
||||||
# Adjust CPU Friend Data to correct SMBIOS
|
# Adjust CPU Friend Data to correct SMBIOS
|
||||||
new_cpu_ls = Path(self.constants.pp_contents_folder) / Path("Info.plist")
|
new_cpu_ls = Path(self.constants.pp_contents_folder) / Path("Info.plist")
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ class CatalogProducts:
|
|||||||
catalog: dict,
|
catalog: dict,
|
||||||
install_assistants_only: bool = True,
|
install_assistants_only: bool = True,
|
||||||
only_vmm_install_assistants: bool = True,
|
only_vmm_install_assistants: bool = True,
|
||||||
max_install_assistant_version: CatalogVersion = CatalogVersion.SEQUOIA
|
max_install_assistant_version: CatalogVersion = CatalogVersion.TAHOE
|
||||||
) -> None:
|
) -> None:
|
||||||
self.catalog: dict = catalog
|
self.catalog: dict = catalog
|
||||||
self.ia_only: bool = install_assistants_only
|
self.ia_only: bool = install_assistants_only
|
||||||
@@ -251,6 +251,17 @@ class CatalogProducts:
|
|||||||
if installer in products_copy:
|
if installer in products_copy:
|
||||||
products_copy.pop(products_copy.index(installer))
|
products_copy.pop(products_copy.index(installer))
|
||||||
|
|
||||||
|
# Remove duplicates of the same version (i.e. multiple betas still in catalog), keep only latest
|
||||||
|
version_map = {}
|
||||||
|
for installer in products_copy:
|
||||||
|
version = installer.get("Version")
|
||||||
|
post_date = installer.get("PostDate")
|
||||||
|
if version is None:
|
||||||
|
continue
|
||||||
|
if version not in version_map or post_date > version_map[version].get("PostDate", ""):
|
||||||
|
version_map[version] = installer
|
||||||
|
|
||||||
|
products_copy = list(version_map.values())
|
||||||
|
|
||||||
# Remove EOL versions (older than n-3)
|
# Remove EOL versions (older than n-3)
|
||||||
for installer in products:
|
for installer in products:
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ class AppleDBProducts:
|
|||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
global_constants: constants.Constants,
|
global_constants: constants.Constants,
|
||||||
max_install_assistant_version: os_data = os_data.sequoia,
|
max_install_assistant_version: os_data = os_data.tahoe,
|
||||||
) -> None:
|
) -> None:
|
||||||
self.constants: constants.Constants = global_constants
|
self.constants: constants.Constants = global_constants
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ class CatalogURL:
|
|||||||
extension (CatalogExtension): Extension for the catalog URL
|
extension (CatalogExtension): Extension for the catalog URL
|
||||||
"""
|
"""
|
||||||
def __init__(self,
|
def __init__(self,
|
||||||
version: CatalogVersion = CatalogVersion.SEQUOIA,
|
version: CatalogVersion = CatalogVersion.TAHOE,
|
||||||
seed: SeedType = SeedType.PublicRelease,
|
seed: SeedType = SeedType.PublicRelease,
|
||||||
extension: CatalogExtension = CatalogExtension.PLIST
|
extension: CatalogExtension = CatalogExtension.PLIST
|
||||||
) -> None:
|
) -> None:
|
||||||
|
|||||||
@@ -41,6 +41,7 @@ from .hardware.misc import (
|
|||||||
gmux,
|
gmux,
|
||||||
keyboard_backlight,
|
keyboard_backlight,
|
||||||
legacy_audio,
|
legacy_audio,
|
||||||
|
modern_audio,
|
||||||
pcie_webcam,
|
pcie_webcam,
|
||||||
t1_security,
|
t1_security,
|
||||||
usb11,
|
usb11,
|
||||||
@@ -127,10 +128,12 @@ class HardwarePatchsetDetection:
|
|||||||
legacy_wireless.LegacyWireless,
|
legacy_wireless.LegacyWireless,
|
||||||
modern_wireless.ModernWireless,
|
modern_wireless.ModernWireless,
|
||||||
|
|
||||||
|
legacy_audio.LegacyAudio,
|
||||||
|
modern_audio.ModernAudio,
|
||||||
|
|
||||||
display_backlight.DisplayBacklight,
|
display_backlight.DisplayBacklight,
|
||||||
gmux.GraphicsMultiplexer,
|
gmux.GraphicsMultiplexer,
|
||||||
keyboard_backlight.KeyboardBacklight,
|
keyboard_backlight.KeyboardBacklight,
|
||||||
legacy_audio.LegacyAudio,
|
|
||||||
pcie_webcam.PCIeFaceTimeCamera,
|
pcie_webcam.PCIeFaceTimeCamera,
|
||||||
t1_security.T1SecurityChip,
|
t1_security.T1SecurityChip,
|
||||||
usb11.USB11Controller,
|
usb11.USB11Controller,
|
||||||
|
|||||||
@@ -0,0 +1,77 @@
|
|||||||
|
"""
|
||||||
|
modern_audio.py: Modern Audio patch set for macOS 26
|
||||||
|
"""
|
||||||
|
|
||||||
|
from ..base import BaseHardware, HardwareVariant
|
||||||
|
|
||||||
|
from ...base import PatchType
|
||||||
|
|
||||||
|
from .....constants import Constants
|
||||||
|
|
||||||
|
from .....datasets.os_data import os_data
|
||||||
|
|
||||||
|
|
||||||
|
class ModernAudio(BaseHardware):
|
||||||
|
|
||||||
|
def __init__(self, xnu_major, xnu_minor, os_build, global_constants: Constants) -> None:
|
||||||
|
super().__init__(xnu_major, xnu_minor, os_build, global_constants)
|
||||||
|
|
||||||
|
|
||||||
|
def name(self) -> str:
|
||||||
|
"""
|
||||||
|
Display name for end users
|
||||||
|
"""
|
||||||
|
return f"{self.hardware_variant()}: Modern Audio"
|
||||||
|
|
||||||
|
|
||||||
|
def present(self) -> bool:
|
||||||
|
"""
|
||||||
|
AppleHDA was outright removed in macOS 26, so this patch set is always present if OS requires it
|
||||||
|
"""
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def native_os(self) -> bool:
|
||||||
|
"""
|
||||||
|
- Everything before macOS Tahoe 26 is considered native
|
||||||
|
"""
|
||||||
|
if self._xnu_major < os_data.tahoe.value:
|
||||||
|
return True
|
||||||
|
|
||||||
|
# Technically, macOS Tahoe Beta 1 is also native, so return True
|
||||||
|
if self._os_build == "25A5279m":
|
||||||
|
return True
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def hardware_variant(self) -> HardwareVariant:
|
||||||
|
"""
|
||||||
|
Type of hardware variant
|
||||||
|
"""
|
||||||
|
return HardwareVariant.MISCELLANEOUS
|
||||||
|
|
||||||
|
|
||||||
|
def _modern_audio_patches(self) -> dict:
|
||||||
|
"""
|
||||||
|
Patches for Modern Audio
|
||||||
|
"""
|
||||||
|
return {
|
||||||
|
"Modern Audio": {
|
||||||
|
PatchType.OVERWRITE_SYSTEM_VOLUME: {
|
||||||
|
"/System/Library/Extensions": {
|
||||||
|
"AppleHDA.kext": "26.0 Beta 1",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def patches(self) -> dict:
|
||||||
|
"""
|
||||||
|
Patches for modern audio
|
||||||
|
"""
|
||||||
|
if self.native_os() is True:
|
||||||
|
return {}
|
||||||
|
|
||||||
|
return self._modern_audio_patches()
|
||||||
@@ -72,14 +72,22 @@ class MainFrame(wx.Frame):
|
|||||||
- Text: Copyright
|
- Text: Copyright
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
# Logo
|
||||||
|
logo = wx.StaticBitmap(self, bitmap=wx.Bitmap(str(self.constants.icns_resource_path / "OC-Patcher.icns"), wx.BITMAP_TYPE_ICON), pos=(-1, 0), size=(128, 128))
|
||||||
|
logo.Centre(wx.HORIZONTAL)
|
||||||
|
|
||||||
# Title label: OpenCore Legacy Patcher v{X.Y.Z}
|
# Title label: OpenCore Legacy Patcher v{X.Y.Z}
|
||||||
title_label = wx.StaticText(self, label=f"OpenCore Legacy Patcher {'' if self.constants.special_build else ''}{self.constants.patcher_version}{' (Nightly)' if not self.constants.commit_info[0].startswith('refs/tags') else ''}", pos=(-1, 10))
|
title_label = wx.StaticText(self, label=f"OpenCore Legacy Patcher", pos=(-1, 128))
|
||||||
title_label.SetFont(gui_support.font_factory(19, wx.FONTWEIGHT_BOLD))
|
title_label.SetFont(gui_support.font_factory(25, wx.FONTWEIGHT_BOLD))
|
||||||
title_label.Centre(wx.HORIZONTAL)
|
title_label.Centre(wx.HORIZONTAL)
|
||||||
|
|
||||||
|
version_label = wx.StaticText(self, label=f"Version {self.constants.patcher_version}{' (Nightly)' if not self.constants.commit_info[0].startswith('refs/tags') else ''}", pos=(-1, title_label.GetPosition()[1] + 32))
|
||||||
|
version_label.SetFont(gui_support.font_factory(13, wx.FONTWEIGHT_NORMAL))
|
||||||
|
version_label.Centre(wx.HORIZONTAL)
|
||||||
|
version_label.SetForegroundColour(wx.Colour(128, 128, 128))
|
||||||
|
|
||||||
# Text: Model: {Build or Host Model}
|
# Text: Model: {Build or Host Model}
|
||||||
model_label = wx.StaticText(self, label=f"Model: {self.constants.custom_model or self.constants.computer.real_model}", pos=(-1, title_label.GetPosition()[1] + 25
|
model_label = wx.StaticText(self, label=f"Model: {self.constants.custom_model or self.constants.computer.real_model}", pos=(-1, version_label.GetPosition()[1] + 30))
|
||||||
))
|
|
||||||
model_label.SetFont(gui_support.font_factory(13, wx.FONTWEIGHT_NORMAL))
|
model_label.SetFont(gui_support.font_factory(13, wx.FONTWEIGHT_NORMAL))
|
||||||
model_label.Centre(wx.HORIZONTAL)
|
model_label.Centre(wx.HORIZONTAL)
|
||||||
self.model_label = model_label
|
self.model_label = model_label
|
||||||
|
|||||||
@@ -169,6 +169,20 @@ class CheckProperties:
|
|||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
def host_is_solarium(self) -> bool:
|
||||||
|
"""
|
||||||
|
Check if running on macOS 26, and if Solarium refresh is enabled
|
||||||
|
"""
|
||||||
|
|
||||||
|
if self.constants.detected_os < os_data.os_data.tahoe:
|
||||||
|
return False
|
||||||
|
|
||||||
|
# If we are a release build, we are not Solarium for now
|
||||||
|
if self.constants.commit_info[0].startswith('refs/tags'):
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
def host_has_cpu_gen(self, gen: int) -> bool:
|
def host_has_cpu_gen(self, gen: int) -> bool:
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -753,7 +753,7 @@
|
|||||||
<key>Enabled</key>
|
<key>Enabled</key>
|
||||||
<false/>
|
<false/>
|
||||||
<key>MaxKernel</key>
|
<key>MaxKernel</key>
|
||||||
<string></string>
|
<string>24.99.99</string>
|
||||||
<key>MinKernel</key>
|
<key>MinKernel</key>
|
||||||
<string></string>
|
<string></string>
|
||||||
<key>BundlePath</key>
|
<key>BundlePath</key>
|
||||||
@@ -763,6 +763,24 @@
|
|||||||
<key>PlistPath</key>
|
<key>PlistPath</key>
|
||||||
<string>Contents/Info.plist</string>
|
<string>Contents/Info.plist</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>Arch</key>
|
||||||
|
<string>x86_64</string>
|
||||||
|
<key>Comment</key>
|
||||||
|
<string>USB Map for Tahoe</string>
|
||||||
|
<key>Enabled</key>
|
||||||
|
<false/>
|
||||||
|
<key>MaxKernel</key>
|
||||||
|
<string></string>
|
||||||
|
<key>MinKernel</key>
|
||||||
|
<string>25.0.0</string>
|
||||||
|
<key>BundlePath</key>
|
||||||
|
<string>USB-Map-Tahoe.kext</string>
|
||||||
|
<key>ExecutablePath</key>
|
||||||
|
<string></string>
|
||||||
|
<key>PlistPath</key>
|
||||||
|
<string>Contents/Info.plist</string>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>Arch</key>
|
<key>Arch</key>
|
||||||
<string>x86_64</string>
|
<string>x86_64</string>
|
||||||
@@ -2842,7 +2860,7 @@
|
|||||||
<key>APFS</key>
|
<key>APFS</key>
|
||||||
<dict>
|
<dict>
|
||||||
<key>EnableJumpstart</key>
|
<key>EnableJumpstart</key>
|
||||||
<true/>
|
<false/>
|
||||||
<key>GlobalConnect</key>
|
<key>GlobalConnect</key>
|
||||||
<false/>
|
<false/>
|
||||||
<key>HideVerbose</key>
|
<key>HideVerbose</key>
|
||||||
@@ -2936,6 +2954,18 @@
|
|||||||
<key>LoadEarly</key>
|
<key>LoadEarly</key>
|
||||||
<false/>
|
<false/>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>Comment</key>
|
||||||
|
<string></string>
|
||||||
|
<key>Path</key>
|
||||||
|
<string>apfs_aligned.efi</string>
|
||||||
|
<key>Enabled</key>
|
||||||
|
<false/>
|
||||||
|
<key>Arguments</key>
|
||||||
|
<string></string>
|
||||||
|
<key>LoadEarly</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>Comment</key>
|
<key>Comment</key>
|
||||||
<string></string>
|
<string></string>
|
||||||
|
|||||||
BIN
payloads/Drivers/apfs_aligned.efi
Normal file
BIN
payloads/Drivers/apfs_aligned.efi
Normal file
Binary file not shown.
BIN
payloads/Icon/AppIcons/Assets.car
Normal file
BIN
payloads/Icon/AppIcons/Assets.car
Normal file
Binary file not shown.
Binary file not shown.
BIN
payloads/Icon/AppIcons/Tahoe.icns
Normal file
BIN
payloads/Icon/AppIcons/Tahoe.icns
Normal file
Binary file not shown.
10655
payloads/Kexts/Plists/AppleUSBMaps/Info-Tahoe.plist
Normal file
10655
payloads/Kexts/Plists/AppleUSBMaps/Info-Tahoe.plist
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
@@ -60,6 +60,13 @@ UNUSED_DRIVERS = [
|
|||||||
"RamDiskDxe.efi",
|
"RamDiskDxe.efi",
|
||||||
"Mtftp6Dxe.efi",
|
"Mtftp6Dxe.efi",
|
||||||
"OpenNetworkBoot.efi",
|
"OpenNetworkBoot.efi",
|
||||||
|
"Virtio10.efi",
|
||||||
|
"VirtioBlkDxe.efi",
|
||||||
|
"VirtioGpuDxe.efi",
|
||||||
|
"VirtioNetDxe.efi",
|
||||||
|
"VirtioPciDeviceDxe.efi",
|
||||||
|
"VirtioScsiDxe.efi",
|
||||||
|
"VirtioSerialDxe.efi"
|
||||||
]
|
]
|
||||||
|
|
||||||
UNUSED_TOOLS = [
|
UNUSED_TOOLS = [
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user