From 1da93b1ca0d2238bbc698370bb3ef5e6b1b04f5f Mon Sep 17 00:00:00 2001
From: Mykola Grymalyuk <48863253+khronokernel@users.noreply.github.com>
Date: Thu, 16 Sep 2021 10:06:59 -0600
Subject: [PATCH 1/7] Fix Monterey Bluetooth
---
Resources/Build.py | 8 +++
Resources/Constants.py | 15 +++++-
Resources/ModelArray.py | 47 ++++++++++++++++++
Resources/Utilities.py | 8 +--
payloads/Config/config.plist | 20 +++++++-
.../Bluetooth/BlueToolFixup-2046-v2.6.1.zip | Bin 0 -> 10702 bytes
.../Kexts/Bluetooth/BlueToolFixup-2046.patch | 26 ++++++++++
.../Bluetooth/BlueToolFixup-2070-v2.6.1.zip | Bin 0 -> 10698 bytes
.../Kexts/Bluetooth/BlueToolFixup-2070.patch | 26 ++++++++++
9 files changed, 145 insertions(+), 5 deletions(-)
create mode 100644 payloads/Kexts/Bluetooth/BlueToolFixup-2046-v2.6.1.zip
create mode 100644 payloads/Kexts/Bluetooth/BlueToolFixup-2046.patch
create mode 100644 payloads/Kexts/Bluetooth/BlueToolFixup-2070-v2.6.1.zip
create mode 100644 payloads/Kexts/Bluetooth/BlueToolFixup-2070.patch
diff --git a/Resources/Build.py b/Resources/Build.py
index f61a45564..d8daed90b 100644
--- a/Resources/Build.py
+++ b/Resources/Build.py
@@ -692,6 +692,14 @@ class BuildOpenCore:
# Note this function was added in 11.3 (20E232, 20.4), older builds do not support this (ie. 11.2.3)
print("- Allowing FileVault on Root Patched systems")
self.get_item_by_kv(self.config["Kernel"]["Patch"], "Identifier", "com.apple.filesystems.apfs")["Enabled"] = True
+
+ if self.model in ModelArray.Bluetooth_BRCM2070:
+ print("- Enabling Bluetooth BRCM2070 for macOS Monterey")
+ self.enable_kext("BlueToolFixup.kext", self.constants.bluetool_version, self.constants.brcm2070_path)
+ elif self.model in ModelArray.Bluetooth_BRCM2046:
+ print("- Enabling Bluetooth BRCM2046 for macOS Monterey")
+ self.enable_kext("BlueToolFixup.kext", self.constants.bluetool_version, self.constants.brcm2046_path)
+
def set_smbios(self):
diff --git a/Resources/Constants.py b/Resources/Constants.py
index a45f8f6a2..4a21e5cea 100644
--- a/Resources/Constants.py
+++ b/Resources/Constants.py
@@ -34,6 +34,7 @@ class Constants:
self.featureunlock_version = "1.0.3" # FeatureUnlock
self.debugenhancer_version = "1.0.4" # DebugEnhancer
self.cpufriend_version = "1.2.4" # CPUFriend
+ self.bluetool_version = "2.6.1" # BlueToolFixup
## Apple
## https://www.apple.com
@@ -341,6 +342,18 @@ class Constants:
def plist_folder_path(self):
return self.payload_kexts_path / Path("Plists")
+ @property
+ def bluetooth_folder_path(self):
+ return self.payload_kexts_path / Path("Bluetooth")
+
+ @property
+ def brcm2046_path(self):
+ return self.bluetooth_folder_path / Path(f"BlueToolFixup-2046-v{self.bluetool_version}.zip")
+
+ @property
+ def brcm2070_path(self):
+ return self.bluetooth_folder_path / Path(f"BlueToolFixup-2070-v{self.bluetool_version}.zip")
+
@property
def platform_plugin_plist_path(self):
return self.plist_folder_path / Path("PlatformPlugin")
@@ -633,7 +646,7 @@ class Constants:
"j215ap", # MacBookPro16,4
"j185ap", # iMac20,1
"j185fap", # iMac20,2
- #"x86legacy", # non-T2 Macs/VMs, Monterey's boot.efi enforces this on all Macs
+ # "x86legacy", # non-T2 Macs/VMs, Monterey's boot.efi enforces this on all Macs
]
sandy_board_id = [
diff --git a/Resources/ModelArray.py b/Resources/ModelArray.py
index 688990bd1..4c1c0be42 100644
--- a/Resources/ModelArray.py
+++ b/Resources/ModelArray.py
@@ -1165,3 +1165,50 @@ dGPU_switch = [
"MacBookPro16,1",
"MacBookPro16,4",
]
+
+Bluetooth_BRCM2046 = [
+ "MacBook4,1",
+ "MacBook5,1",
+ "MacBook5,2",
+ "MacBookAir2,1",
+ "MacBookAir3,1",
+ "MacBookAir3,2",
+ "MacBookPro4,1",
+ "MacBookPro5,1",
+ "MacBookPro5,2",
+ "MacBookPro5,3",
+ "MacBookPro5,4",
+ "MacBookPro5,5",
+ "MacBookPro7,1",
+ "Macmini3,1",
+ "iMac7,1",
+ "iMac8,1",
+ "iMac9,1",
+ "iMac10,1",
+ "iMac11,1",
+ "iMac11,2",
+ "iMac11,3",
+ "iMac12,1",
+ "iMac12,2",
+ "MacPro3,1",
+ "MacPro4,1",
+ "MacPro5,1",
+ "XServer2,1",
+ "XServer3,1",
+]
+
+Bluetooth_BRCM2070 = [
+ "MacBook6,1",
+ "MacBook7,1",
+ "MacBookAir4,1",
+ "MacBookAir4,2",
+ "MacBookPro6,1",
+ "MacBookPro6,2",
+ "MacBookPro8,1",
+ "MacBookPro8,2",
+ "MacBookPro8,3",
+ "Macmini4,1",
+ "Macmini5,1",
+ "Macmini5,2",
+ "Macmini5,3",
+]
diff --git a/Resources/Utilities.py b/Resources/Utilities.py
index ab5776fe1..6b15e0b9d 100644
--- a/Resources/Utilities.py
+++ b/Resources/Utilities.py
@@ -135,6 +135,7 @@ def amfi_status():
return False
return True
+
def check_oclp_boot():
if get_nvram("OCLP-Version", "4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102", decode=False):
return True
@@ -244,10 +245,11 @@ def download_file(link, location):
chunk = file.read(1024 * 1024 * 16)
return checksum
-def enable_apfs(fw_feature, fw_mask):
- fw_feature |= 2**19
- fw_mask |= 2**19
+def enable_apfs(fw_feature, fw_mask):
+ fw_feature |= 2 ** 19
+ fw_mask |= 2 ** 19
+ return fw_feature, fw_mask
# def menu(title, prompt, menu_options, add_quit=True, auto_number=False, in_between=[], top_level=False):
diff --git a/payloads/Config/config.plist b/payloads/Config/config.plist
index 3c03d2685..1a29c5a78 100644
--- a/payloads/Config/config.plist
+++ b/payloads/Config/config.plist
@@ -948,7 +948,25 @@
MaxKernel
MinKernel
- 20.4.0
+ 16.0.0
+ PlistPath
+ Contents/Info.plist
+
+
+ Arch
+ x86_64
+ BundlePath
+ BlueToolFixup.kext
+ Comment
+ Fix Monterey Bluetooth
+ Enabled
+
+ ExecutablePath
+ Contents/MacOS/BlueToolFixup
+ MaxKernel
+
+ MinKernel
+ 21.0.0
PlistPath
Contents/Info.plist
diff --git a/payloads/Kexts/Bluetooth/BlueToolFixup-2046-v2.6.1.zip b/payloads/Kexts/Bluetooth/BlueToolFixup-2046-v2.6.1.zip
new file mode 100644
index 0000000000000000000000000000000000000000..355f0c70af3e4876554174cee90ee7d64bd8090d
GIT binary patch
literal 10702
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
literal 0
HcmV?d00001
diff --git a/payloads/Kexts/Bluetooth/BlueToolFixup-2070.patch b/payloads/Kexts/Bluetooth/BlueToolFixup-2070.patch
new file mode 100644
index 000000000..cd0dd1970
--- /dev/null
+++ b/payloads/Kexts/Bluetooth/BlueToolFixup-2070.patch
@@ -0,0 +1,26 @@
+diff --git a/BrcmPatchRAM/BlueToolFixup.cpp b/BrcmPatchRAM/BlueToolFixup.cpp
+index 0fa891a..6a9d2f3 100644
+--- a/BrcmPatchRAM/BlueToolFixup.cpp
++++ b/BrcmPatchRAM/BlueToolFixup.cpp
+@@ -50,7 +50,11 @@ bool BlueToolFixup::start(IOService *provider) {
+ static const uint8_t kSkipUpdateFilePathOriginal[] = "/etc/bluetool/SkipBluetoothAutomaticFirmwareUpdate";
+ static const uint8_t kSkipUpdateFilePathPatched[] = "/System/Library/CoreServices/boot.efi";
+
++static const uint8_t kBluetoothUSBNameOriginal[] = "Bluetooth USB Host Controller";
++static const uint8_t kBluetoothUSBNamePatched[] = "BRCM2070 Hub Host Controller";
++
+ static const char *blueToolPath = "/usr/sbin/BlueTool";
++static const char *bluetoothdPath = "/usr/sbin/bluetoothd";
+
+ static mach_vm_address_t orig_cs_validate {};
+
+@@ -74,6 +78,9 @@ static void patched_cs_validate_page(vnode_t vp, memory_object_t pager, memory_o
+ if (vn_getpath(vp, path, &pathlen) == 0 && UNLIKELY(strcmp(path, blueToolPath) == 0)) {
+ searchAndPatch(data, PAGE_SIZE, path, kSkipUpdateFilePathOriginal, kSkipUpdateFilePathPatched);
+ }
++ if (vn_getpath(vp, path, &pathlen) == 0 && UNLIKELY(strcmp(path, bluetoothdPath) == 0)) {
++ searchAndPatch(data, PAGE_SIZE, path, kBluetoothUSBNameOriginal, kBluetoothUSBNamePatched);
++ }
+ }
+
+
From 986878055ffb17732a29974201e52cc71fbefa04 Mon Sep 17 00:00:00 2001
From: Mykola Grymalyuk <48863253+khronokernel@users.noreply.github.com>
Date: Thu, 16 Sep 2021 12:21:14 -0600
Subject: [PATCH 2/7] Add basic hardware detection
---
Resources/Build.py | 25 +++++++++++++++----------
Resources/device_probe.py | 11 +++++++++++
2 files changed, 26 insertions(+), 10 deletions(-)
diff --git a/Resources/Build.py b/Resources/Build.py
index d8daed90b..28f75576f 100644
--- a/Resources/Build.py
+++ b/Resources/Build.py
@@ -582,6 +582,21 @@ class BuildOpenCore:
self.config["DeviceProperties"]["Add"][tb_device_path] = {"class-code": binascii.unhexlify("FFFFFFFF"), "device-id": binascii.unhexlify("FFFF0000")}
+ # Bluetooth Detection
+ if not self.constants.custom_model and self.computer.bluetooth:
+ if self.computer.bluetooth == "BRCM2070 Hub":
+ print("- Enabling Bluetooth BRCM2070 for macOS Monterey")
+ self.enable_kext("BlueToolFixup.kext", self.constants.bluetool_version, self.constants.brcm2070_path)
+ elif self.computer.bluetooth == "BRCM2046 Hub":
+ print("- Enabling Bluetooth BRCM2046 for macOS Mojave")
+ self.enable_kext("BlueToolFixup.kext", self.constants.bluetool_version, self.constants.brcm2046_path)
+ elif self.model in ModelArray.Bluetooth_BRCM2070:
+ print("- Enabling Bluetooth BRCM2070 for macOS Monterey")
+ self.enable_kext("BlueToolFixup.kext", self.constants.bluetool_version, self.constants.brcm2070_path)
+ elif self.model in ModelArray.Bluetooth_BRCM2046:
+ print("- Enabling Bluetooth BRCM2046 for macOS Monterey")
+ self.enable_kext("BlueToolFixup.kext", self.constants.bluetool_version, self.constants.brcm2046_path)
+
# Add XhciDxe if firmware doesn't have XHCI controller support and XCHI controller detected
# TODO: Fix XhciDxe to work on pre UEFI 2.0 Macs
# Ref: https://github.com/acidanthera/bugtracker/issues/1663
@@ -692,15 +707,6 @@ class BuildOpenCore:
# Note this function was added in 11.3 (20E232, 20.4), older builds do not support this (ie. 11.2.3)
print("- Allowing FileVault on Root Patched systems")
self.get_item_by_kv(self.config["Kernel"]["Patch"], "Identifier", "com.apple.filesystems.apfs")["Enabled"] = True
-
- if self.model in ModelArray.Bluetooth_BRCM2070:
- print("- Enabling Bluetooth BRCM2070 for macOS Monterey")
- self.enable_kext("BlueToolFixup.kext", self.constants.bluetool_version, self.constants.brcm2070_path)
- elif self.model in ModelArray.Bluetooth_BRCM2046:
- print("- Enabling Bluetooth BRCM2046 for macOS Monterey")
- self.enable_kext("BlueToolFixup.kext", self.constants.bluetool_version, self.constants.brcm2046_path)
-
-
def set_smbios(self):
spoofed_model = self.model
@@ -851,7 +857,6 @@ class BuildOpenCore:
print(f"- Could not find {efi_type}: {bundle_path}!")
raise IndexError
return efi_binary
-
def enable_kext(self, kext_name, kext_version, kext_path, check=False):
kext = self.get_kext_by_bundle_path(kext_name)
diff --git a/Resources/device_probe.py b/Resources/device_probe.py
index 54f98dcf2..73d49e477 100644
--- a/Resources/device_probe.py
+++ b/Resources/device_probe.py
@@ -313,6 +313,7 @@ class Computer:
cpu: Optional[CPU] = None
oclp_version: Optional[str] = None
opencore_version: Optional[str] = None
+ bluetooth_chipset: Optional[str] = None
@staticmethod
def probe():
@@ -324,6 +325,7 @@ class Computer:
computer.storage_probe()
computer.smbios_probe()
computer.cpu_probe()
+ computer.bluetooth()
return computer
def gpu_probe(self):
@@ -437,3 +439,12 @@ class Computer:
subprocess.run("sysctl machdep.cpu.brand_string".split(), stdout=subprocess.PIPE).stdout.decode().partition(": ")[2].strip(),
subprocess.run("sysctl machdep.cpu.features".split(), stdout=subprocess.PIPE).stdout.decode().partition(": ")[2].strip().split(" "),
)
+
+ def bluetooth(self):
+ usb_data: str = subprocess.run("system_profiler SPUSBDataType".split(), stdout=subprocess.PIPE, stderr=subprocess.STDOUT).stdout.decode()
+ if "BRCM2070 Hub" in usb_data:
+ self.bluetooth_chipset = "BRCM2070 Hub"
+ elif "BRCM2046 Hub" in usb_data:
+ self.bluetooth_chipset = "BRCM2046 Hub"
+ elif "Bluetooth":
+ self.bluetooth_chipset = "Generic"
\ No newline at end of file
From f78e8edf4ea742c619d6093968f6a28963300cec Mon Sep 17 00:00:00 2001
From: Mykola Grymalyuk <48863253+khronokernel@users.noreply.github.com>
Date: Thu, 16 Sep 2021 12:21:52 -0600
Subject: [PATCH 3/7] Fix typo
---
Resources/Build.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Resources/Build.py b/Resources/Build.py
index 28f75576f..ebbdffa63 100644
--- a/Resources/Build.py
+++ b/Resources/Build.py
@@ -588,7 +588,7 @@ class BuildOpenCore:
print("- Enabling Bluetooth BRCM2070 for macOS Monterey")
self.enable_kext("BlueToolFixup.kext", self.constants.bluetool_version, self.constants.brcm2070_path)
elif self.computer.bluetooth == "BRCM2046 Hub":
- print("- Enabling Bluetooth BRCM2046 for macOS Mojave")
+ print("- Enabling Bluetooth BRCM2046 for macOS Monterey")
self.enable_kext("BlueToolFixup.kext", self.constants.bluetool_version, self.constants.brcm2046_path)
elif self.model in ModelArray.Bluetooth_BRCM2070:
print("- Enabling Bluetooth BRCM2070 for macOS Monterey")
From 0e22a9fb00332c69a348a1187d061b68978efd9a Mon Sep 17 00:00:00 2001
From: Mykola Grymalyuk <48863253+khronokernel@users.noreply.github.com>
Date: Thu, 16 Sep 2021 14:33:55 -0600
Subject: [PATCH 4/7] Fix ModelArray
---
Resources/ModelArray.py | 8 ++------
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/Resources/ModelArray.py b/Resources/ModelArray.py
index 4c1c0be42..32e4de0be 100644
--- a/Resources/ModelArray.py
+++ b/Resources/ModelArray.py
@@ -1146,8 +1146,8 @@ Missing_USB_Map = [
"iMac12,2",
"MacPro3,1",
"MacPro4,1",
- "XServer2,1",
- "XServer3,1",
+ "XServe2,1",
+ "XServe3,1",
]
dGPU_switch = [
@@ -1181,7 +1181,6 @@ Bluetooth_BRCM2046 = [
"MacBookPro5,5",
"MacBookPro7,1",
"Macmini3,1",
- "iMac7,1",
"iMac8,1",
"iMac9,1",
"iMac10,1",
@@ -1190,11 +1189,8 @@ Bluetooth_BRCM2046 = [
"iMac11,3",
"iMac12,1",
"iMac12,2",
- "MacPro3,1",
"MacPro4,1",
"MacPro5,1",
- "XServer2,1",
- "XServer3,1",
]
Bluetooth_BRCM2070 = [
From 438ae23ee7b45812cec3fbd236dee246fb49b678 Mon Sep 17 00:00:00 2001
From: Mykola Grymalyuk <48863253+khronokernel@users.noreply.github.com>
Date: Thu, 16 Sep 2021 15:43:04 -0600
Subject: [PATCH 5/7] Rework BlueToolFixup patch
---
Resources/Build.py | 12 +++--
Resources/Constants.py | 16 ++-----
.../Acidanthera/BlueToolFixup-v2.6.1.zip | Bin 0 -> 10722 bytes
.../Kexts/Acidanthera/BlueToolFixup.patch | 42 ++++++++++++++++++
.../Bluetooth/BlueToolFixup-2046-v2.6.1.zip | Bin 10702 -> 0 bytes
.../Kexts/Bluetooth/BlueToolFixup-2046.patch | 26 -----------
.../Bluetooth/BlueToolFixup-2070-v2.6.1.zip | Bin 10698 -> 0 bytes
.../Kexts/Bluetooth/BlueToolFixup-2070.patch | 26 -----------
8 files changed, 54 insertions(+), 68 deletions(-)
create mode 100644 payloads/Kexts/Acidanthera/BlueToolFixup-v2.6.1.zip
create mode 100644 payloads/Kexts/Acidanthera/BlueToolFixup.patch
delete mode 100644 payloads/Kexts/Bluetooth/BlueToolFixup-2046-v2.6.1.zip
delete mode 100644 payloads/Kexts/Bluetooth/BlueToolFixup-2046.patch
delete mode 100644 payloads/Kexts/Bluetooth/BlueToolFixup-2070-v2.6.1.zip
delete mode 100644 payloads/Kexts/Bluetooth/BlueToolFixup-2070.patch
diff --git a/Resources/Build.py b/Resources/Build.py
index ebbdffa63..97e647166 100644
--- a/Resources/Build.py
+++ b/Resources/Build.py
@@ -586,16 +586,20 @@ class BuildOpenCore:
if not self.constants.custom_model and self.computer.bluetooth:
if self.computer.bluetooth == "BRCM2070 Hub":
print("- Enabling Bluetooth BRCM2070 for macOS Monterey")
- self.enable_kext("BlueToolFixup.kext", self.constants.bluetool_version, self.constants.brcm2070_path)
+ self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"] += " -brcm2070_patch"
+ self.enable_kext("BlueToolFixup.kext", self.constants.bluetool_version, self.constants.bluetool_path)
elif self.computer.bluetooth == "BRCM2046 Hub":
print("- Enabling Bluetooth BRCM2046 for macOS Monterey")
- self.enable_kext("BlueToolFixup.kext", self.constants.bluetool_version, self.constants.brcm2046_path)
+ self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"] += " -brcm2046_patch"
+ self.enable_kext("BlueToolFixup.kext", self.constants.bluetool_version, self.constants.bluetool_path)
elif self.model in ModelArray.Bluetooth_BRCM2070:
print("- Enabling Bluetooth BRCM2070 for macOS Monterey")
- self.enable_kext("BlueToolFixup.kext", self.constants.bluetool_version, self.constants.brcm2070_path)
+ self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"] += " -brcm2070_patch"
+ self.enable_kext("BlueToolFixup.kext", self.constants.bluetool_version, self.constants.bluetool_path)
elif self.model in ModelArray.Bluetooth_BRCM2046:
print("- Enabling Bluetooth BRCM2046 for macOS Monterey")
- self.enable_kext("BlueToolFixup.kext", self.constants.bluetool_version, self.constants.brcm2046_path)
+ self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"] += " -brcm2046_patch"
+ self.enable_kext("BlueToolFixup.kext", self.constants.bluetool_version, self.constants.bluetool_path)
# Add XhciDxe if firmware doesn't have XHCI controller support and XCHI controller detected
# TODO: Fix XhciDxe to work on pre UEFI 2.0 Macs
diff --git a/Resources/Constants.py b/Resources/Constants.py
index 4a21e5cea..4702d3942 100644
--- a/Resources/Constants.py
+++ b/Resources/Constants.py
@@ -326,6 +326,10 @@ class Constants:
def debugenhancer_path(self):
return self.payload_kexts_path / Path(f"Acidanthera/DebugEnhancer-v{self.debugenhancer_version}.zip")
+ @property
+ def bluetool_path(self):
+ return self.payload_kexts_path / Path(f"Acidanthera/BlueToolFixup-v{self.bluetool_version}.zip")
+
@property
def innie_path(self):
return self.payload_kexts_path / Path(f"Misc/Innie-v{self.innie_version}.zip")
@@ -342,18 +346,6 @@ class Constants:
def plist_folder_path(self):
return self.payload_kexts_path / Path("Plists")
- @property
- def bluetooth_folder_path(self):
- return self.payload_kexts_path / Path("Bluetooth")
-
- @property
- def brcm2046_path(self):
- return self.bluetooth_folder_path / Path(f"BlueToolFixup-2046-v{self.bluetool_version}.zip")
-
- @property
- def brcm2070_path(self):
- return self.bluetooth_folder_path / Path(f"BlueToolFixup-2070-v{self.bluetool_version}.zip")
-
@property
def platform_plugin_plist_path(self):
return self.plist_folder_path / Path("PlatformPlugin")
diff --git a/payloads/Kexts/Acidanthera/BlueToolFixup-v2.6.1.zip b/payloads/Kexts/Acidanthera/BlueToolFixup-v2.6.1.zip
new file mode 100644
index 0000000000000000000000000000000000000000..efd4f8842109432041edc7bd0976b5c8b6b01efd
GIT binary patch
literal 10722
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
literal 0
HcmV?d00001
diff --git a/payloads/Kexts/Acidanthera/BlueToolFixup.patch b/payloads/Kexts/Acidanthera/BlueToolFixup.patch
new file mode 100644
index 000000000..28c807cad
--- /dev/null
+++ b/payloads/Kexts/Acidanthera/BlueToolFixup.patch
@@ -0,0 +1,42 @@
+diff --git a/BrcmPatchRAM/BlueToolFixup.cpp b/BrcmPatchRAM/BlueToolFixup.cpp
+index 0fa891a..819eb3f 100644
+--- a/BrcmPatchRAM/BlueToolFixup.cpp
++++ b/BrcmPatchRAM/BlueToolFixup.cpp
+@@ -50,7 +50,15 @@ bool BlueToolFixup::start(IOService *provider) {
+ static const uint8_t kSkipUpdateFilePathOriginal[] = "/etc/bluetool/SkipBluetoothAutomaticFirmwareUpdate";
+ static const uint8_t kSkipUpdateFilePathPatched[] = "/System/Library/CoreServices/boot.efi";
+
++static const uint8_t kBluetoothUSBNameOriginal[] = "Bluetooth USB Host Controller";
++static const uint8_t kBluetoothUSBNamePatched2070[] = "BRCM2070 Hub Host Controller";
++static const uint8_t kBluetoothUSBNamePatched2046[] = "BRCM2046 Hub Host Controller";
++
+ static const char *blueToolPath = "/usr/sbin/BlueTool";
++static const char *bluetoothdPath = "/usr/sbin/bluetoothd";
++
++static const char brcm2046_patch = checkKernelArgument("-brcm2046_patch");
++static const char brcm2070_patch = checkKernelArgument("-brcm2070_patch");
+
+ static mach_vm_address_t orig_cs_validate {};
+
+@@ -71,8 +79,19 @@ static void patched_cs_validate_page(vnode_t vp, memory_object_t pager, memory_o
+ char path[PATH_MAX];
+ int pathlen = PATH_MAX;
+ FunctionCast(patched_cs_validate_page, orig_cs_validate)(vp, pager, page_offset, data, validated_p, tainted_p, nx_p);
+- if (vn_getpath(vp, path, &pathlen) == 0 && UNLIKELY(strcmp(path, blueToolPath) == 0)) {
+- searchAndPatch(data, PAGE_SIZE, path, kSkipUpdateFilePathOriginal, kSkipUpdateFilePathPatched);
++ if (vn_getpath(vp, path, &pathlen) == 0) {
++ if (UNLIKELY(strcmp(path, blueToolPath) == 0)) {
++ searchAndPatch(data, PAGE_SIZE, path, kSkipUpdateFilePathOriginal, kSkipUpdateFilePathPatched);
++ }
++ if (UNLIKELY(strcmp(path, bluetoothdPath) == 0)) {
++ if (brcm2046_patch) {
++ DBGLOG(MODULE_SHORT, "Patching BRCM2046 Hub into bluetoothd");
++ searchAndPatch(data, PAGE_SIZE, path, kBluetoothUSBNameOriginal, kBluetoothUSBNamePatched2046);
++ } else if (brcm2070_patch) {
++ DBGLOG(MODULE_SHORT, "Patching BRCM2070 Hub into bluetoothd");
++ searchAndPatch(data, PAGE_SIZE, path, kBluetoothUSBNameOriginal, kBluetoothUSBNamePatched2070);
++ }
++ }
+ }
+ }
+
diff --git a/payloads/Kexts/Bluetooth/BlueToolFixup-2046-v2.6.1.zip b/payloads/Kexts/Bluetooth/BlueToolFixup-2046-v2.6.1.zip
deleted file mode 100644
index 355f0c70af3e4876554174cee90ee7d64bd8090d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 10702
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