diff --git a/data/smbios_data.py b/data/smbios_data.py index c3ef68851..03af3377c 100644 --- a/data/smbios_data.py +++ b/data/smbios_data.py @@ -1787,6 +1787,7 @@ smbios_dictionary = { "Bluetooth Model": bluetooth_data.bluetooth_data.BRCM2046, "UGA Graphics": True, "Ethernet Chipset": "Marvell", + "Socketed GPUs": "MXM", "Stock GPUs": [ device_probe.AMD.Archs.TeraScale_1, device_probe.NVIDIA.Archs.Tesla, @@ -1806,6 +1807,7 @@ smbios_dictionary = { "Bluetooth Model": bluetooth_data.bluetooth_data.BRCM2046, "UGA Graphics": True, "Ethernet Chipset": "Marvell", + "Socketed GPUs": "MXM", "Stock GPUs": [ device_probe.AMD.Archs.TeraScale_1, device_probe.NVIDIA.Archs.Tesla, @@ -1825,6 +1827,7 @@ smbios_dictionary = { "Bluetooth Model": bluetooth_data.bluetooth_data.BRCM2046, "UGA Graphics": True, "Ethernet Chipset": "Marvell", + "Socketed GPUs": "MXM", "Stock GPUs": [ device_probe.AMD.Archs.TeraScale_1, device_probe.NVIDIA.Archs.Tesla, @@ -1844,6 +1847,7 @@ smbios_dictionary = { "Bluetooth Model": bluetooth_data.bluetooth_data.BRCM2046, "UGA Graphics": True, "Ethernet Chipset": "Marvell", + "Socketed GPUs": "MXM", "Stock GPUs": [ device_probe.AMD.Archs.TeraScale_1, device_probe.NVIDIA.Archs.Tesla, @@ -1932,6 +1936,7 @@ smbios_dictionary = { "Bluetooth Model": bluetooth_data.bluetooth_data.BRCM2046, "Ethernet Chipset": "Nvidia", "nForce Chipset": True, + "Socketed GPUs": "MXM", "Stock GPUs": [ device_probe.NVIDIA.Archs.Tesla, ], @@ -1949,6 +1954,7 @@ smbios_dictionary = { "Bluetooth Model": bluetooth_data.bluetooth_data.BRCM2046, "Ethernet Chipset": "Nvidia", "nForce Chipset": True, + "Socketed GPUs": "MXM", "Stock GPUs": [ device_probe.NVIDIA.Archs.Tesla, ], @@ -1966,6 +1972,7 @@ smbios_dictionary = { "Bluetooth Model": bluetooth_data.bluetooth_data.BRCM2046, "Ethernet Chipset": "Nvidia", "nForce Chipset": True, + "Socketed GPUs": "MXM", "Stock GPUs": [ device_probe.NVIDIA.Archs.Tesla, ], @@ -1982,6 +1989,7 @@ smbios_dictionary = { "Wireless Model": device_probe.Atheros.Chipsets.AirPortAtheros40, "Bluetooth Model": bluetooth_data.bluetooth_data.BRCM2046, "Ethernet Chipset": "Broadcom", + "Socketed GPUs": "MXM", "Stock GPUs": [ device_probe.AMD.Archs.TeraScale_1, ], @@ -1998,6 +2006,7 @@ smbios_dictionary = { "Wireless Model": device_probe.Atheros.Chipsets.AirPortAtheros40, "Bluetooth Model": bluetooth_data.bluetooth_data.BRCM2046, "Ethernet Chipset": "Broadcom", + "Socketed GPUs": "MXM", "Stock GPUs": [ device_probe.AMD.Archs.TeraScale_1, device_probe.AMD.Archs.TeraScale_2, @@ -2015,6 +2024,7 @@ smbios_dictionary = { "Wireless Model": device_probe.Atheros.Chipsets.AirPortAtheros40, "Bluetooth Model": bluetooth_data.bluetooth_data.BRCM2046, "Ethernet Chipset": "Broadcom", + "Socketed GPUs": "MXM", "Stock GPUs": [ device_probe.AMD.Archs.TeraScale_1, device_probe.AMD.Archs.TeraScale_2, @@ -2032,6 +2042,7 @@ smbios_dictionary = { "Wireless Model": device_probe.Atheros.Chipsets.AirPortAtheros40, "Bluetooth Model": bluetooth_data.bluetooth_data.BRCM2046, "Ethernet Chipset": "Broadcom", + "Socketed GPUs": "MXM", "Stock GPUs": [ device_probe.Intel.Archs.Sandy_Bridge, device_probe.AMD.Archs.TeraScale_2, @@ -2049,6 +2060,7 @@ smbios_dictionary = { "Wireless Model": device_probe.Atheros.Chipsets.AirPortAtheros40, "Bluetooth Model": bluetooth_data.bluetooth_data.BRCM2046, "Ethernet Chipset": "Broadcom", + "Socketed GPUs": "MXM", "Stock GPUs": [ device_probe.Intel.Archs.Sandy_Bridge, device_probe.AMD.Archs.TeraScale_2, @@ -2068,6 +2080,7 @@ smbios_dictionary = { "Wireless Model": device_probe.Atheros.Chipsets.AirPortAtheros40, "Bluetooth Model": bluetooth_data.bluetooth_data.BRCM2046, "Ethernet Chipset": "Broadcom", + "Socketed GPUs": "MXM", "Stock GPUs": [ device_probe.Intel.Archs.Sandy_Bridge, device_probe.AMD.Archs.TeraScale_2, @@ -2535,6 +2548,7 @@ smbios_dictionary = { "Bluetooth Model": bluetooth_data.bluetooth_data.BRCM2045, "UGA Graphics": True, "Ethernet Chipset": "Intel 80003ES2LAN", + "Socketed GPUs": "PCIe", "Stock GPUs": [ device_probe.NVIDIA.Archs.Curie ], @@ -2553,6 +2567,7 @@ smbios_dictionary = { "Bluetooth Model": bluetooth_data.bluetooth_data.BRCM2045, "UGA Graphics": True, "Ethernet Chipset": "Intel 80003ES2LAN", + "Socketed GPUs": "PCIe", "Stock GPUs": [ device_probe.NVIDIA.Archs.Curie ], @@ -2571,6 +2586,7 @@ smbios_dictionary = { "Bluetooth Model": bluetooth_data.bluetooth_data.BRCM2045, "UGA Graphics": True, "Ethernet Chipset": "Intel 80003ES2LAN", + "Socketed GPUs": "PCIe", "Stock GPUs": [ device_probe.AMD.Archs.TeraScale_1 ], @@ -2588,6 +2604,7 @@ smbios_dictionary = { "Wireless Model": device_probe.Atheros.Chipsets.AirPortAtheros40, "Bluetooth Model": bluetooth_data.bluetooth_data.BRCM2046, "Ethernet Chipset": "Intel 82574L", + "Socketed GPUs": "PCIe", "Stock GPUs": [ device_probe.NVIDIA.Archs.Tesla ], @@ -2604,6 +2621,7 @@ smbios_dictionary = { "Wireless Model": device_probe.Broadcom.Chipsets.AirPortBrcm4331, "Bluetooth Model": bluetooth_data.bluetooth_data.BRCM2046, "Ethernet Chipset": "Intel 82574L", + "Socketed GPUs": "PCIe", "Stock GPUs": [ device_probe.AMD.Archs.TeraScale_2 ], @@ -2636,6 +2654,7 @@ smbios_dictionary = { "Wireless Model": device_probe.Broadcom.Chipsets.AppleBCMWLANBusInterfacePCIe, "Bluetooth Model": bluetooth_data.bluetooth_data.UART, "Ethernet Chipset": "Aquantia", + "Socketed GPUs": "PCIe", "Stock GPUs": [ device_probe.AMD.Archs.Polaris, device_probe.AMD.Archs.Vega, @@ -2656,6 +2675,7 @@ smbios_dictionary = { "Bluetooth Model": bluetooth_data.bluetooth_data.NonApplicable, "UGA Graphics": True, "Ethernet Chipset": "Intel 80003ES2LAN", + "Socketed GPUs": "PCIe", "Stock GPUs": [ device_probe.AMD.Archs.R500 ], @@ -2674,6 +2694,7 @@ smbios_dictionary = { "Bluetooth Model": bluetooth_data.bluetooth_data.NonApplicable, "UGA Graphics": True, "Ethernet Chipset": "Intel 80003ES2LAN", + "Socketed GPUs": "PCIe", "Stock GPUs": [ device_probe.AMD.Archs.R500 ], @@ -2691,6 +2712,7 @@ smbios_dictionary = { "Wireless Model": None, "Bluetooth Model": bluetooth_data.bluetooth_data.NonApplicable, "Ethernet Chipset": "Intel 82574L", + "Socketed GPUs": "PCIe", "Stock GPUs": [ device_probe.NVIDIA.Archs.Tesla ], @@ -2706,6 +2728,7 @@ smbios_dictionary = { "Max OS Supported": os_data.os_data.leopard, "Wireless Model": None, "Bluetooth Model": bluetooth_data.bluetooth_data.NonApplicable, + "Socketed GPUs": "PCIe", "Stock GPUs": [ device_probe.Intel.Archs.GMA_950 ], diff --git a/payloads/Drivers/diags.efi b/payloads/Drivers/diags.efi new file mode 100644 index 000000000..1a28a9b3f Binary files /dev/null and b/payloads/Drivers/diags.efi differ diff --git a/resources/build.py b/resources/build.py index 071d221f0..24529fba6 100644 --- a/resources/build.py +++ b/resources/build.py @@ -53,6 +53,16 @@ class BuildOpenCore: else: print("- Adding Internal Drive icon") shutil.copy(self.constants.icon_path_internal, self.constants.opencore_release_folder) + + def chainload_diags(self): + Path(self.constants.opencore_release_folder / Path("System/Library/CoreServices/.diagnostics/Drivers/HardwareDrivers")).mkdir(parents=True, exist_ok=True) + if self.constants.boot_efi is True: + path_oc_loader = self.constants.opencore_release_folder / Path("EFI/BOOT/BOOTx64.efi") + else: + path_oc_loader = self.constants.opencore_release_folder / Path("System/Library/CoreServices/boot.efi") + shutil.move(path_oc_loader, self.constants.opencore_release_folder / Path("System/Library/CoreServices/.diagnostics/Drivers/HardwareDrivers/Product.efi")) + shutil.copy(self.constants.diags_launcher_path, self.constants.opencore_release_folder) + shutil.move(self.constants.opencore_release_folder / Path("diags.efi"), self.constants.opencore_release_folder / Path("boot.efi")) def build_efi(self): utilities.cls() @@ -726,6 +736,30 @@ class BuildOpenCore: except KeyError: pass + # Check if model has 5K display + # Apple has 2 modes for display handling on 5K iMacs and iMac Pro + # If at any point in the boot chain an "unsupported" entry is loaded, the firmware will tell the + # Display Controller to enter a 4K compatible mode that only uses a single DisplayPort 1.2 stream internally. + # This is to prevent situations where the system would boot into an enviroment that cannot handle the custom + # dual DisplayPort 1.2 streams the 5k Display uses + + # To work around this issue, we trick the firmware into loading OpenCore through Apple's Hardware Diagnostic Tests + # Specifically hiding as Product.efi under '/System/Library/CoreServices/.diagnostics/Drivers/HardwareDrivers/Product.efi' + # The reason chainloading via ./Drivers/HardwareDrivers is possible is thanks to it being loaded via an encrypted file buffer + # whereas other drivers like ./qa_logger.efi is invoked via Device Path. + + try: + smbios_data.smbios_dictionary[self.model]["5K Display"] + print("- Adding 5K Display Patch") + # Set LauncherPath to '/boot.efi' + # This is to ensure that only the Mac's firmware presents the boot option, but not OpenCore + # https://github.com/acidanthera/OpenCorePkg/blob/0.7.6/Library/OcAppleBootPolicyLib/OcAppleBootPolicyLib.c#L50-L73 + self.config["Misc"]["Boot"]["LauncherPath"] = "\\boot.efi" + # Setup diags.efi chainloading + self.chainload_diags() + except KeyError: + pass + # ThirdPartDrives Check for drive in ["SATA 2.5", "SATA 3.5", "mSATA"]: if drive in smbios_data.smbios_dictionary[self.model]["Stock Storage"]: diff --git a/resources/constants.py b/resources/constants.py index 3b51cddc5..66b9a6ef2 100644 --- a/resources/constants.py +++ b/resources/constants.py @@ -125,12 +125,12 @@ class Constants: self.latebloom_debug = 0 # Debug Setting ## Security Settings - self.apecid_support = False # ApECID - self.amfi_status = True # Apple Mobile File Integrity - self.sip_status = True # System Integrity Protection - self.secure_status = False # Secure Boot Model - self.vault = False # EFI Vault - self.disable_cs_lv = False # Disable Library validation + self.apecid_support = False # ApECID + self.amfi_status = True # Apple Mobile File Integrity + self.sip_status = True # System Integrity Protection + self.secure_status = False # Secure Boot Model + self.vault = False # EFI Vault + self.disable_cs_lv = False # Disable Library validation ## OS Settings self.os_support = 12.0 @@ -215,6 +215,10 @@ class Constants: def xhci_driver_path(self): return self.payload_path / Path("Drivers/XhciDxe.efi") + @property + def diags_launcher_path(self): + return self.payload_path / Path("Drivers/diags.efi") + # Kexts @property def payload_kexts_path(self): diff --git a/resources/defaults.py b/resources/defaults.py index 7b2fcc6ca..822b5929e 100644 --- a/resources/defaults.py +++ b/resources/defaults.py @@ -41,7 +41,11 @@ class generate_defaults: device_probe.AMD.Archs.Navi, ]: # Allow H.265 on AMD - settings.serial_settings = "Minimal" + try: + smbios_data.smbios_dictionary[model]["Socketed GPUs"] + settings.serial_settings = "Minimal" + except KeyError: + pass break elif model in ["MacPro4,1", "MacPro5,1"]: # Allow H.265 on AMD diff --git a/resources/install.py b/resources/install.py index 1f7c0a4c5..7d919f3ad 100644 --- a/resources/install.py +++ b/resources/install.py @@ -5,6 +5,7 @@ import plistlib import subprocess import shutil +import os from pathlib import Path from resources import utilities, constants from data import os_data @@ -168,9 +169,14 @@ Please build OpenCore first!""" if (mount_path / Path("System")).exists(): print("- Removing preexisting System folder") shutil.rmtree(mount_path / Path("System"), onerror=rmtree_handler) + if (mount_path / Path("boot.efi")).exists(): + print("- Removing preexisting boot.efi") + os.remove(mount_path / Path("boot.efi")) print("- Copying OpenCore onto EFI partition") shutil.copytree(self.constants.opencore_release_folder / Path("EFI/OC"), mount_path / Path("EFI/OC")) shutil.copytree(self.constants.opencore_release_folder / Path("System"), mount_path / Path("System")) + if Path(self.constants.opencore_release_folder / Path("boot.efi")).exists(): + shutil.copy(self.constants.opencore_release_folder / Path("boot.efi"), mount_path / Path("boot.efi")) if self.constants.boot_efi is True: print("- Converting Bootstrap to BOOTx64.efi") if (mount_path / Path("EFI/BOOT")).exists(): @@ -190,6 +196,7 @@ Please build OpenCore first!""" else: print("- Adding Internal Drive icon") shutil.copy(self.constants.icon_path_internal, mount_path) + print("- Cleaning install location") if not self.constants.recovery_status: print("- Unmounting EFI partition")