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] 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);
++ }
+ }
+
+