Compare commits

...

217 Commits

Author SHA1 Message Date
Mykola Grymalyuk
15ad0c509e macos_installer_handler.py: Reference full diskutil path
Thanks @niklasravnsborg for the report!
2024-09-27 11:26:43 -06:00
Mykola Grymalyuk
0e0b1436b2 bluetooth.py: Set legacy patches on Macs with upgraded chipsets 2024-09-27 10:06:31 -06:00
Mykola Grymalyuk
528d32cc9d non_metal.py: Remove Metal wallpaper 2024-09-26 16:15:55 -06:00
Mykola Grymalyuk
8e15ed6d6e constants.py: Set to bug fix release 2024-09-26 11:47:22 -06:00
Mykola Grymalyuk
796b5bcd9e gui_settings.py: Adjust pathing for root settings 2024-09-25 11:40:35 -06:00
neon ball
a37571a8a5 Edit a bit more 2024-09-25 19:09:20 +03:00
neon ball
9796ecf75e Slight edit 2024-09-25 19:03:48 +03:00
neon ball
cade003b31 Update FAQ.md 2024-09-25 18:59:44 +03:00
neon ball
2d8c9c5beb Update FAQ.md 2024-09-25 18:40:56 +03:00
neon ball
0a138ee435 Update FAQ.md 2024-09-25 18:07:01 +03:00
neon ball
6b414526ac Update FAQ.md 2024-09-25 18:02:35 +03:00
neon ball
a67a6d6c67 Fix link 2024-09-25 17:59:35 +03:00
neon ball
da887e3722 Update FAQ.md 2024-09-25 17:59:13 +03:00
neon ball
e65b8386ab Fix typo 2024-09-25 11:01:44 +03:00
neon ball
0d7edc8e09 Update FAQ.md 2024-09-25 10:58:49 +03:00
neon ball
32080fdcc3 Update FAQ.md 2024-09-25 10:56:42 +03:00
neon ball
c2d9d01a24 Fix link 2024-09-24 23:17:37 +03:00
neon ball
cdb6603ed6 Update FAQ.md 2024-09-24 23:15:57 +03:00
neon ball
dbf7444009 Update FAQ.md 2024-09-24 23:11:44 +03:00
neon ball
c46133b0b5 Update FAQ.md 2024-09-24 23:11:31 +03:00
neon ball
dde558a951 Update TROUBLESHOOTING.md 2024-09-24 23:02:59 +03:00
neon ball
9bdce62f59 Remove "currently" repetition 2024-09-24 22:58:35 +03:00
neon ball
098a4f9661 Update FAQ.md 2024-09-24 22:55:23 +03:00
neon ball
d9f23b556c Fix link 2024-09-24 22:52:58 +03:00
neon ball
0f63ce2fde Move a part to troubleshooting 2024-09-24 22:51:16 +03:00
neon ball
adc58b417b Fix typo 2024-09-24 22:16:51 +03:00
neon ball
b1bb01af69 Update FAQ.md 2024-09-24 22:15:57 +03:00
neon ball
2751ca69de Add link 2024-09-24 21:55:51 +03:00
neon ball
e9744fffd6 Update FAQ.md 2024-09-24 21:52:11 +03:00
neon ball
e0e731b13a Update FAQ.md 2024-09-24 21:48:50 +03:00
neon ball
bb34bbb6a1 Fix typo 2024-09-24 21:47:50 +03:00
neon ball
c68afc2f8e Update FAQ.md 2024-09-24 21:47:08 +03:00
neon ball
55ed78f5b4 Fix typo 2024-09-24 21:38:08 +03:00
neon ball
c065aae29f Update FAQ.md 2024-09-24 21:37:31 +03:00
neon ball
8333c3d8ec Update FAQ.md 2024-09-24 21:28:53 +03:00
neon ball
b8b591a8ed Fix title 2024-09-24 20:02:28 +03:00
neon ball
4542287613 Add FAQ 2024-09-24 20:01:02 +03:00
neon ball
597b167285 Add files via upload 2024-09-24 20:00:22 +03:00
Mykola Grymalyuk
7e5f171210 gui_settings.py: Resolve Beachball defaults write 2024-09-23 11:09:23 -06:00
Eduardo Covas
861898272b Sync PatcherSupportPkg 2024-09-23 13:58:43 -03:00
Eduardo Covas
16ab3367f8 Sync CHANGELOG 2024-09-23 13:17:37 -03:00
Mykola Grymalyuk
9d43d66f5d patchsets: Update for GCN GVA logic 2024-09-23 09:54:27 -06:00
Mykola Grymalyuk
753cd6cf3f patchsets: Avoid downgrading AppleGVA on AMD Polaris+ GPUs 2024-09-23 09:45:56 -06:00
Mykola Grymalyuk
192dfb79ae patchsets: Add reference patch
Unused, only present for referencing
2024-09-23 09:45:30 -06:00
Mykola Grymalyuk
d7f3d09c14 non_metal.py: Downgrade screencapture 2024-09-23 09:34:00 -06:00
Mykola Grymalyuk
41a5731546 metal_3802.py: Add 15.1 RenderBox metallib 2024-09-23 09:33:35 -06:00
Mykola Grymalyuk
2e513b98ca contants.py: Sync PatcherSupportPkg 2024-09-23 09:32:51 -06:00
neon ball
5c1326881a Remove duplicate explanations 2024-09-21 16:55:31 +03:00
Dhinak G
1d6631f24d Update TROUBLESHOOTING.md (#1148)
Co-authored-by: daCaPo <daCaPo@users.noreply.github.com>
2024-09-18 11:19:57 -04:00
Eduardo Covas
61872a8b94 legacy_audio.py: fix kext linking on macOS Sequoia 2024-09-18 10:16:40 -03:00
neon ball
024559885d Fix link here as well 2024-09-17 17:25:02 +03:00
neon ball
3e0a2a2198 Fix link 2024-09-17 17:24:18 +03:00
neon ball
86be4acedb Fix argument in patch sys command 2024-09-17 17:19:44 +03:00
Mykola Grymalyuk
ce08129d4b nvidia_kepler.py: Fix build comparison 2024-09-16 13:28:53 -06:00
Mykola Grymalyuk
56c9fd52d5 constants.py: Set versioning to bug fix release 2024-09-16 09:10:01 -06:00
Mykola Grymalyuk
429c213f79 detect.py: Fix Nvidia Web Drivers logic 2024-09-16 09:06:15 -06:00
Mykola Grymalyuk
2ce1f1c7f9 nvidia_kepler.py: Fix XNU minor comparison 2024-09-15 17:51:22 -06:00
neon ball
366bb6b6c2 Update POST-INSTALL.md 2024-09-16 00:20:55 +03:00
neon ball
3f7617c7c5 Fix list v2 2024-09-15 23:49:44 +03:00
neon ball
bd1e8b48b5 Fix list 2024-09-15 23:48:40 +03:00
neon ball
faba9e3200 Update POST-INSTALL.md 2024-09-15 23:47:41 +03:00
neon ball
4bda620f1e Small adjustment 2024-09-15 23:20:41 +03:00
neon ball
3a459dbdc3 Refactor BUILD.md 2024-09-15 23:18:34 +03:00
neon ball
9cc08a25db Adjust image layout 2024-09-15 22:46:03 +03:00
neon ball
1594db1624 One more adjustment 2024-09-15 22:43:49 +03:00
neon ball
5f54bdff54 Adjust wording 2024-09-15 22:43:00 +03:00
neon ball
1e0eb42c47 Refactor INSTALLER.md 2024-09-15 22:40:42 +03:00
neon ball
9e3087003c Update images 2024-09-15 22:35:09 +03:00
neon ball
7eb1ea2055 Remove duplicate guide already in BOOT.md 2024-09-15 22:13:28 +03:00
neon ball
b9c5aaa8dc Add T1 wipe image to BOOT.md note 2024-09-15 22:12:33 +03:00
Dhinak G
b0eb0fe5d9 Fix titles 2024-09-15 14:50:06 -04:00
neon ball
28ef0bb0d9 Adjust wording 2024-09-15 21:39:11 +03:00
Dhinak G
67006be28a Fix workflow permissions 2024-09-15 14:32:11 -04:00
Dhinak G
37ff4f70e7 Fix yarn cache path 2024-09-15 14:28:59 -04:00
Dhinak G
bcca5f8e2a [skip ci] Ignore docs on workflows 2024-09-15 14:28:08 -04:00
Dhinak G
a1dc492cc9 Add headers to support pages 2024-09-15 14:25:14 -04:00
Dhinak G
f394bee0f5 Sync docs config with other guides 2024-09-15 14:25:01 -04:00
neon ball
a41001130f Adjust layout 2024-09-15 20:44:28 +03:00
neon ball
e58dff05f2 Fix link 2024-09-15 20:42:40 +03:00
neon ball
9970e6806c Add T1 note 2024-09-15 20:41:20 +03:00
neon ball
1c39396ae2 Enlarge image 2024-09-15 20:34:37 +03:00
neon ball
431543057a Insert image to doc 2024-09-15 20:31:51 +03:00
neon ball
d67e2e3dee Add wipe-volume doc image 2024-09-15 20:31:34 +03:00
neon ball
6a4f2a9f02 Update build-site.yml 2024-09-15 20:20:37 +03:00
neon ball
0b68741959 Add T1 troubleshooting section 2024-09-15 20:17:26 +03:00
neon ball
9ec68a9db6 Better search plugins 2024-09-15 19:21:52 +03:00
Mykola Grymalyuk
4246f91289 nvidia_tesla.py: Fix OS detection typo 2024-09-15 10:15:16 -06:00
Mykola Grymalyuk
38657fb1c6 amd_polaris.py: Fix MacBookPro13,3 patch detection logic 2024-09-15 10:08:40 -06:00
neon ball
f6408a1054 Switch non-functional features to full headline 2024-09-15 02:35:58 +03:00
neon ball
aabb0b24ba Fix link 2024-09-15 02:13:10 +03:00
neon ball
2b39428127 Update information 2024-09-15 02:08:08 +03:00
neon ball
be53b0a034 Small change 2024-09-15 01:06:20 +03:00
neon ball
2cb3642c29 Adjust layout 2024-09-15 01:02:45 +03:00
neon ball
8feed781b2 Add note about unsupported features 2024-09-15 01:01:36 +03:00
Mykola Grymalyuk
be361d27e6 Increment build 2024-09-14 11:59:40 -06:00
neon ball
5f838259ad Add clarification 2024-09-14 20:39:01 +03:00
neon ball
f3e52a1335 Fix note and add code blocks 2024-09-14 20:33:40 +03:00
neon ball
622c56b430 Fix broken link 2024-09-14 20:31:16 +03:00
neon ball
287bca39e8 Add config.js 2024-09-14 20:30:12 +03:00
neon ball
b1325b77da Add SEQUOIA-DROP 2024-09-14 20:29:47 +03:00
neon ball
81f35aff57 Remove image folder and Sequoia image from wrong place 2024-09-14 20:29:20 +03:00
neon ball
143dba4a17 Remove doc from wrong place 2024-09-14 20:29:00 +03:00
neon ball
da3d701075 Add image 2024-09-14 20:03:33 +03:00
neon ball
c70238bd5d Add SEQUOIA-DROP.md 2024-09-14 20:00:49 +03:00
Mykola Grymalyuk
8eebf7e1e1 GUI: Add option to configure cpus=4 on MacPro3,1/Xserve2,1
If booting Sonoma or older, can toggle off the workaround
2024-09-14 10:01:52 -06:00
Mykola Grymalyuk
85cf440996 Merge branch 'main' of https://github.com/dortania/OpenCore-Legacy-Patcher 2024-09-12 10:38:36 -06:00
Mykola Grymalyuk
db2768a2bf keyboard_backlight.py: Fix patchset 2024-09-12 10:38:19 -06:00
Mykola Grymalyuk
48c74a1d75 gmux.py: Fix comment 2024-09-12 10:37:49 -06:00
Mykola Grymalyuk
73aa594ab6 install.py: Add error handling for read errors 2024-09-12 10:37:40 -06:00
Eduardo Covas
42478c726b Disable NSZoomButtonShowMenu only on Sonoma 2024-09-12 10:51:08 -03:00
Mykola Grymalyuk
00ea5a7843 Sync PatcherSupportPkg for non-Metal support 2024-09-12 07:41:26 -06:00
Mykola Grymalyuk
7f0a96126b Sync PatcherSupportPkg 2024-09-09 20:13:00 -06:00
Mykola Grymalyuk
c6f6fe4b43 nvidia_kepler.py: Remove unused import 2024-09-09 18:01:26 -06:00
Mykola Grymalyuk
c3dcb35b33 nvidia_kepler.py: Avoid downgrading AppleGVA 2024-09-09 17:12:31 -06:00
Mykola Grymalyuk
eefe49b837 metal_3802.py: Use dynamic metallib in Sequoia 2024-09-08 19:58:37 -06:00
Mykola Grymalyuk
bf3f4481dc metal_3802.py: Adjust patch method for metallib 2024-09-08 19:44:37 -06:00
Mykola Grymalyuk
ce6f65de1f metal_3802.py: Set PhotosUICore.framework correctly 2024-09-08 19:37:24 -06:00
neon ball
045cc3726e Fix note one more time 2024-09-08 12:15:27 +03:00
neon ball
60d392f969 Fix note 2024-09-08 12:12:19 +03:00
neon ball
e992fbdd14 Add SSH method to USB 1.1 troubleshooting 2024-09-08 12:09:08 +03:00
Eduardo Covas
3d40c94787 Sync CHANGELOG 2024-09-06 21:07:19 -03:00
Mykola Grymalyuk
9794cc5fb1 Merge pull request #1137 from dortania/sequoia-development
macOS Sequoia Development
2024-09-06 15:41:47 -06:00
Mykola Grymalyuk
8ae451f37f Sync CHANGELOG 2024-09-06 15:40:27 -06:00
Mykola Grymalyuk
3c309d71b9 Sync versioning to match 2024-09-06 15:27:11 -06:00
Mykola Grymalyuk
dbdddd063f model_array.py: Remove MacBookAir8,x models
As unable to install macOS Sequoia currently, removed to avoid confusion for end-users
2024-09-06 15:17:48 -06:00
Mykola Grymalyuk
0e1421f7fc Sync OpenCorePkg 2024-09-06 15:12:42 -06:00
Mykola Grymalyuk
3a3bba4c65 intel_haswell.py: Remove framebuffer hack for iMac15,1 2024-09-06 15:08:21 -06:00
Mykola Grymalyuk
1f000d893f detect.py: Avoid adding patches when hardware’s been removed 2024-09-06 15:02:35 -06:00
Mykola Grymalyuk
87469b71d0 validation.py: Add exemptions for PatchType checks 2024-09-06 09:25:51 -06:00
Mykola Grymalyuk
8d838a3148 Sync PatcherSupportPkg 2024-09-06 09:17:27 -06:00
Mykola Grymalyuk
c1f5be775d Sync IOSkywalk for Sequoia
Prevents kernel panic when using Continuity Camera, however connection issues still remain
2024-09-06 08:57:52 -06:00
Mykola Grymalyuk
7539d175b5 patchsets: Expand PatchType class to support merging
Resolves hardcoded merge/overwrite assumptions in files.py’s install_new_file()
2024-09-06 08:04:06 -06:00
Mykola Grymalyuk
5a1fa12e5b t1_security.py: Temporarily disable Touch ID patch 2024-09-05 09:09:48 -06:00
Mykola Grymalyuk
6aed21aae2 auto_patcher: Adjust formatting 2024-09-05 09:09:26 -06:00
Eduardo Covas
c0ae23367e t1_security.py: Fix SharedUtils 2024-09-05 09:30:06 -03:00
Eduardo Covas
4bbfe465fa Sync PatcherSupportPkg 2024-09-05 09:06:20 -03:00
Mykola Grymalyuk
2fb243cc00 wx_gui: Fix unpatch check 2024-09-03 21:23:39 -06:00
Mykola Grymalyuk
b74001a6e5 wx_gui: Handle spacing 2024-09-03 20:33:38 -06:00
Mykola Grymalyuk
4e4157c125 sys_patch: Standardize patch names 2024-09-03 19:15:33 -06:00
Mykola Grymalyuk
9ef569e949 wx_gui: Add handling for new patchset format 2024-09-03 17:20:20 -06:00
Mykola Grymalyuk
4b7c399ce6 patchsets: Handle non-Metal debugging 2024-09-02 19:48:16 -06:00
Mykola Grymalyuk
fcf24cef88 detect.py: Resolve Haswell + AMD GCN combo 2024-09-02 19:17:17 -06:00
Mykola Grymalyuk
1d37c5a4ee patchsets: Add handling for MacBookPro11,5 and iMac15,1 2024-09-02 18:40:11 -06:00
Mykola Grymalyuk
27d95a9aae detect.py: Remove Hell Spawn GPU check 2024-09-02 11:44:58 -06:00
Mykola Grymalyuk
8cae25b95a Merge branch 'main' into sequoia-development 2024-09-02 11:41:54 -06:00
Mykola Grymalyuk
fb0ea6bb08 detect.py: Enforce enum usage 2024-09-02 11:24:59 -06:00
Mykola Grymalyuk
303a908248 detect.py: Strip incompatible hardware combos
ie. Non-Metal with Metal, Metal 3802 with Metal 31001
2024-09-02 11:18:09 -06:00
Mykola Grymalyuk
3585053633 patchsets: Publish subclass for GPUs 2024-09-02 11:11:43 -06:00
Mykola Grymalyuk
a329e80082 patchsets: Implement new patch detection architecture
Greatly streamlines future patch set development
2024-09-01 21:00:05 -06:00
Mykola Grymalyuk
d9e91bd17e os-caching.plist: Fix Label 2024-08-30 14:54:07 -06:00
Mykola Grymalyuk
8a9db4c2a5 metallib_handler.py: Capture output 2024-08-30 14:49:09 -06:00
Mykola Grymalyuk
fccde7214b GUI Installer: Support chainloading 2024-08-30 14:45:24 -06:00
Mykola Grymalyuk
24cc303530 Sync kexts to official releases 2024-08-30 10:07:53 -06:00
Mykola Grymalyuk
2753f88bfa Sync PatcherSupportPkg 2024-08-29 16:45:20 -06:00
Mykola Grymalyuk
4056224476 validation.py: Unmount on exit 2024-08-28 17:54:58 -06:00
Mykola Grymalyuk
5b55d17e42 validation.py: Supply extra parameter 2024-08-28 17:49:55 -06:00
Mykola Grymalyuk
669cc0ac5f sys_patch.py: Save MetallibSupportPkg path to patchset file 2024-08-28 17:48:38 -06:00
Mykola Grymalyuk
9a3181d465 sys_patch.py: Remove redundant type check 2024-08-28 17:38:48 -06:00
Mykola Grymalyuk
728fef9256 sys_patch_dict.py: Use StrEnum 2024-08-28 16:31:03 -06:00
Mykola Grymalyuk
b06feb9dbe sys_patch.py: Add typing check 2024-08-28 16:22:16 -06:00
Mykola Grymalyuk
bd51332a17 sys_patch.py: Add backend for MetallibSupportPkg 2024-08-28 15:21:35 -06:00
Mykola Grymalyuk
a6503bcd97 sys_patch_dict.py: Attempt older version 2024-08-27 08:47:36 -06:00
Mykola Grymalyuk
f931c3b6c2 sys_patch.py: Test rerouting patches to root 2024-08-26 17:10:51 -06:00
Mykola Grymalyuk
132f12c885 Sync PatcherSupportPkg
Attempts to resolve AMDMTLBronze crashing in Sequoia
2024-08-20 15:26:55 -06:00
Mykola Grymalyuk
bbdfb8158f Merge branch 'main' into sequoia-development 2024-08-20 15:26:26 -06:00
Mykola Grymalyuk
1cbee930cb constants.py: Publish Metal 31001 patches 2024-08-18 14:07:08 -06:00
Mykola Grymalyuk
f77a45a587 constants.py: Adjust support 2024-08-18 14:06:34 -06:00
Mykola Grymalyuk
ef32e07ac6 Remove DortaniaInternal DMG 2024-08-18 13:59:52 -06:00
Mykola Grymalyuk
e4f1f6b288 dmg_mount.py: Fix exit loop 2024-08-14 12:27:25 -06:00
Mykola Grymalyuk
ba0a6a59e5 detect.py: Add additional check for 3802 2024-08-14 12:27:14 -06:00
Mykola Grymalyuk
1ff1934595 Sync DortaniaInternalResources.dmg 2024-08-14 09:28:28 -06:00
Mykola Grymalyuk
61eb938350 Sync with previous changes 2024-08-14 09:26:19 -06:00
Mykola Grymalyuk
5a57ee1cc9 Merge branch 'main' into sequoia-development
# Conflicts:
#	opencore_legacy_patcher/sys_patch/sys_patch.py
2024-08-14 09:24:55 -06:00
Mykola Grymalyuk
d1e721d8d7 Merge branch 'main' into sequoia-development 2024-08-11 20:00:52 -06:00
Mykola Grymalyuk
8c99335b83 Merge branch 'main' into sequoia-development 2024-08-01 12:45:22 -06:00
Mykola Grymalyuk
cdd81c5466 Merge branch 'main' into sequoia-development 2024-07-31 10:54:43 -06:00
Mykola Grymalyuk
260fcf4c93 Merge branch 'main' into sequoia-development 2024-07-25 12:21:32 -06:00
Mykola Grymalyuk
960090fd80 Merge branch 'main' into sequoia-development 2024-07-25 10:12:09 -06:00
Jazzzny
8203cbc756 Update README.md 2024-07-24 20:43:50 -04:00
Mykola Grymalyuk
fb88795923 sys_patch_helpers.py: Add fallback 2024-07-24 16:01:58 -06:00
Mykola Grymalyuk
7e6da1d056 sys_patch_dict.py: Adjust Metal XPC selection 2024-07-24 15:32:51 -06:00
Mykola Grymalyuk
a7837f1ae8 KernelRelayHost: Adjust injection order 2024-07-24 11:32:29 -06:00
Mykola Grymalyuk
4544c99fde misc.py: Resolve T1 communication on 15.0 Beta 4
Due to lack of kernel version incrementing, beta 1 through 3 will not function with this build (as we are unable to limit kext injection).

Note searchpartyd will crash on beta 4, full support not resolved yet.
2024-07-24 11:28:12 -06:00
Mykola Grymalyuk
1f2409043d Sync DortaniaInternalResources.dmg 2024-07-23 15:13:01 -06:00
Mykola Grymalyuk
414d114b85 sucatalog: Sync versioning to Sequoia 2024-07-21 12:23:25 -06:00
Mykola Grymalyuk
0749d14e1c Merge branch 'main' into sequoia-development 2024-07-21 12:18:01 -06:00
Jazzzny
4f44737f12 Add official product icon for Sequoia 2024-07-12 15:36:10 -04:00
Eduardo Covas
50e7f1d3ad Sync PatcherSupportPkg 2024-07-12 09:55:53 -03:00
Mykola Grymalyuk
3b551d565a sys_patch_dict.py: Adjust Vega MTL bin 2024-07-03 19:01:22 -06:00
Mykola Grymalyuk
b7c4ea2b89 Sync PatcherSupportPkg 2024-07-03 13:47:33 -06:00
Dhinak G
76516394fd payloads: Update AMFIPass to 1.4.1 and Lilu to 1.6.8 rolling (4256f4315b) 2024-06-28 11:52:07 -04:00
Mykola Grymalyuk
9cadfec802 Installer Backup: Add Sequoia logic 2024-06-25 21:26:48 -06:00
Mykola Grymalyuk
dbae3383d0 sys_patch.py: Adjust wording 2024-06-25 21:26:32 -06:00
Mykola Grymalyuk
99daa4c2b1 sys_patch_dict.py: Adjust GCN patchsets 2024-06-25 21:10:40 -06:00
Mykola Grymalyuk
18ec8ca665 Merge branch 'main' into sequoia-development 2024-06-25 19:02:21 -06:00
Mykola Grymalyuk
5f675ab9de constants.py: Sync versioning 2024-06-25 18:39:08 -06:00
Mykola Grymalyuk
ed002ce988 Publish internal DMG 2024-06-25 18:37:58 -06:00
Mykola Grymalyuk
9f24c8738a sys_patch_dict.py: Add Intel 31001 base 2024-06-25 18:37:39 -06:00
Mykola Grymalyuk
5551780fcb sys_patch_dict.py: Adjust formatting 2024-06-25 16:59:49 -06:00
Mykola Grymalyuk
820481a288 sys_patch_dict.py: Adjust formatting 2024-06-25 16:47:07 -06:00
Mykola Grymalyuk
a32e148ec0 sys_patch_dict.py: Add modern WiFi base 2024-06-25 16:43:35 -06:00
Mykola Grymalyuk
e7c9f4e90c sys_patch_dict.py: Add legacy GCN base 2024-06-25 16:02:56 -06:00
Mykola Grymalyuk
692c0de9f2 sys_patch_dict.py: Add T1 base 2024-06-25 16:02:42 -06:00
Mykola Grymalyuk
dbae4db28c sys_patch_dict.py: Add USB1.1 base 2024-06-25 16:02:30 -06:00
Mykola Grymalyuk
462d6f633a Add Sequoia assets 2024-06-13 16:22:28 -06:00
Mykola Grymalyuk
b2c01da5b2 macos_installer_handler.py: List n-3 apps
Thanks @jazzzny for idea and implementation
2024-06-13 16:21:58 -06:00
Mykola Grymalyuk
fc650bfd97 macos_installer_handler.py: Add Sequoia support 2024-06-13 16:20:04 -06:00
Mykola Grymalyuk
ffeec342a9 efi_builder: Add SPI trackpad support to Sequoia 2024-06-13 10:34:08 -06:00
Mykola Grymalyuk
ea12d44d68 OpenCanopy: Add Sequoia assets 2024-06-11 18:46:33 -06:00
Mykola Grymalyuk
09c3b8e3da Add MacBookAir8,x to AGPM dictionary 2024-06-10 16:50:46 -06:00
Mykola Grymalyuk
697dbec6a1 Fix indentation 2024-06-10 16:36:41 -06:00
Mykola Grymalyuk
991c059f30 Add base MacBookAir8,x support 2024-06-10 16:35:13 -06:00
Mykola Grymalyuk
40484a42dd macos_installer_handler.py: Adjust os_override 2024-06-10 16:20:52 -06:00
Mykola Grymalyuk
832232dd37 smbios_data.py: Adjust max OS for MacBookAir8,x 2024-06-10 16:20:30 -06:00
Jazzzny
f9ecafb661 Replace hardcoded os_data.sonoma with max_os 2024-06-10 16:46:32 -04:00
Mykola Grymalyuk
42c6d6b042 sys_patch_detect.py: Increase max OS support to Sequoia
Probably gonna brick your device, don’t root patch. This is for dortania developers only
2024-06-10 12:07:27 -06:00
Mykola Grymalyuk
1d9fbec9ef efi_builder: Add -lilubetaall arg 2024-06-10 12:05:18 -06:00
163 changed files with 17233 additions and 37369 deletions

View File

@@ -2,6 +2,8 @@ name: CI - Build wxPython
on:
push:
paths-ignore:
- 'docs/**'
workflow_dispatch:
release:
types: [published]

View File

@@ -1,36 +1,52 @@
name: CI - Build Site
on:
push:
branches-ignore:
- gh-pages
workflow_dispatch:
pull_request:
permissions:
contents: read
pages: write
id-token: write
concurrency:
group: "pages"
cancel-in-progress: false
jobs:
build:
name: Build Site and Deploy
runs-on: ubuntu-latest
if: github.repository_owner == 'dortania'
steps:
- uses: actions/setup-node@v4
with:
node-version: '12'
- name: Checkout Repository
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: '0'
persist-credentials: false
submodules: 'recursive'
- name: Install
run: npm install
working-directory: 'docs'
- name: Build
run: npm run build
working-directory: 'docs'
- name: Deploy
uses: JamesIves/github-pages-deploy-action@3.7.1
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main'}}
submodules: "recursive"
- name: Setup Node
uses: actions/setup-node@v4
with:
ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }}
BRANCH: gh-pages
FOLDER: docs/.vuepress/dist/
CLEAN: true
node-version: "22"
cache: "yarn"
cache-dependency-path: ./docs/yarn.lock
- name: Install Dependencies
run: yarn install --frozen-lockfile
working-directory: docs
- name: Build
run: yarn run build
working-directory: docs
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:
path: docs/.vuepress/dist/
deploy:
if: ${{ github.repository_owner == 'dortania' && github.event_name == 'push' && github.ref == 'refs/heads/main' }}
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
needs: build
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4

View File

@@ -2,6 +2,8 @@ name: CI - Validation (External)
on:
push:
paths-ignore:
- 'docs/**'
workflow_dispatch:
release:
types: [published]

View File

@@ -2,6 +2,8 @@ name: CI - Validation
on:
push:
paths-ignore:
- 'docs/**'
workflow_dispatch:
release:
types: [published]

1
.gitignore vendored
View File

@@ -17,7 +17,6 @@ __pycache__/
*$py.class
/docs/.vuepress/dist
/docs/.vuepress/.config.js.swp
/docs/yarn.lock
/docs/yarn-error.log
/docs/node_modules/
/payloads/List.txt

View File

@@ -1,6 +1,30 @@
# OpenCore Legacy Patcher changelog
## 1.6.0
## 2.0.2
- Fix Nvidia Kepler patches not installing on Monterey
- Fix `iMac7,1` and `iMac8,1` failing to apply root patches on macOS Sequoia
- Avoid downgrading AppleGVA stack on AMD GCN and newer GPUs
- Resolves VTDecoderXPC crashes
- Thanks @ausdauersportler for the catch!
- Resolve glitched widgets on 3802-based GPUs running macOS Sequoia 15.1
- Resolve CoreImage crashes on 3802-based GPUs running macOS Sequoia
- Resolve missing screen capture crop borders on non-Metal GPUs running macOS Sequoia
- Resolve TeraScale 2 HDCP kernel panic
- Resolve specific Wallpaper locking up on non-Metal GPUs running macOS Sequoia
- Removes unsupported Metal-based wallpaper (Macintosh Wallpaper)
- Resolve firmware upload incompatibilities on pre-2012 Macs with 2012+ Airport cards
- Thanks @ausdauersportler for the catch!
- Resolve `diskutil` failing to be located in the installer creation process
- Thanks @niklasravnsborg for the report!
- Increment binaries:
- PatcherSupportPkg 1.8.3 - release
## 2.0.1
- Fix MacBookPro13,3 listing 'Available patches' after having installed all applicable patches
- Fix Nvidia Tesla and Kepler patches not installing on Monterey (and older if applicable)
- Fix Nvidia Web Drivers incorrectly listing 'OpenGL', 'compat' and 'nvda_drv(_vrl)' missing
## 2.0.0
- Set `AssociatedBundleIdentifiers` property in launch services as an array
- Move to auto-generated pre/postinstall scripts for PKGs
- Streamlines PKG creation process, ensuring Install and AutoPKG scripts are always in sync
@@ -17,8 +41,44 @@
- Only affects building EFI from another machine
- Resolve AMD Navi MXM GPU detection for modded iMac9,x-12,x
- Thanks @Ausdauersportler for the patch!
- Implement early macOS Sequoia support:
- Supporting Macs with Metal and non-Metal-based graphics:
- MacBook5,x - 10,1
- MacBookAir2,x - 7,x
- MacBookPro4,1 - 14,x
- Macmini3,1 - 7,1
- iMac7,1 - 18,x
- MacPro3,1 - 6,1
- MacPro3,1 can only boot with 4 cores max currently
- 8 cores can be re-enabled for older OSes in the GUI:
- Settings -> Build -> MacPro3,1/Xserve2,1 Workaround
- Xserve2,1 - 3,1
- Xserve2,1 can only boot with 4 cores max currently
- 8 cores can be re-enabled for older OSes in the GUI:
- Settings -> Build -> MacPro3,1/Xserve2,1 Workaround
- Excludes the newly dropped MacBookAir8,x series.
- No estimate can be given when support will be added.
- For non-Metal graphics, Photos app will be broken.
- No estimate can be given when support will be added.
- Implement new MetallibSupportPkg system to support macOS Sequoia on Metal 3802-based GPUs.
- See repository for more details: [MetallibSupportPkg](https://github.com/dortania/MetallibSupportPkg).
- Implement new Patchset Detection architecture.
- Implement new kernel cache building architecture.
- Resolve "Label" error in com.dortania.opencore-legacy-patcher.os-caching.plist.
- Add macOS Sequoia icons to boot picker and GUI.
- Resolve Memoji crashes on 3802 GPUs.
- Resolve Photos Memories tab crash on Intel Ivy Bridge/Haswell iGPUs.
- Increment Binaries:
- PatcherSupportPkg 1.6.3 - release
- PatcherSupportPkg 1.8.0 - release
- OpenCorePkg 1.0.1 - release
- Lilu 1.6.8 - release
- WhateverGreen 1.6.7 - release
- RestrictEvents 1.1.4 - release
- FeatureUnlock 1.1.6 - release
- DebugEnhancer 1.0.9 - release
- CPUFriend 1.2.8 - release
- AutoPkgInstaller 1.0.4 - release
- CryptexFixup 1.0.3 - release
## 1.5.0
- Restructure project directories

View File

@@ -15,7 +15,7 @@ Our project's main goal is to breathe new life into Macs no longer supported by
Noteworthy features of OpenCore Legacy Patcher:
* Support for macOS Big Sur, Monterey, Ventura, and Sonoma
* Support for macOS Big Sur, Monterey, Ventura, Sonoma and Sequoia
* Native Over the Air (OTA) System Updates
* Supports Penryn and newer Macs
* Full support for WPA Wi-Fi and Personal Hotspot on BCM943224 and newer wireless chipsets
@@ -106,6 +106,7 @@ To run the project from source, see here: [Build and run from source](./SOURCE.m
* USB Top Case probing
* Developer root patching
* Vaulting implementation
* macOS 15 3802 Helios Research
* UEFI bootx64.efi research
* universal2 build research
* Various documentation contributions

View File

@@ -42,7 +42,8 @@ class InstallerBackup:
os_data.os_data.big_sur,
os_data.os_data.monterey,
os_data.os_data.ventura,
os_data.os_data.sonoma
os_data.os_data.sonoma,
os_data.os_data.sequoia,
],
first_run: bool = False
) -> None:
@@ -57,6 +58,7 @@ class InstallerBackup:
os_data.os_data.monterey: Path(self._directory, "12 Monterey"),
os_data.os_data.ventura: Path(self._directory, "13 Ventura"),
os_data.os_data.sonoma: Path(self._directory, "14 Sonoma"),
os_data.os_data.sequoia: Path(self._directory, "15 Sequoia"),
}
for os_version in self._supported_oses:

View File

@@ -10,5 +10,6 @@
"single-title": false,
"ul-style": {
"style": "asterisk"
}
},
"link-fragments": false
}

View File

@@ -24,29 +24,29 @@ module.exports = {
],
base: '/OpenCore-Legacy-Patcher/',
watch: {
$page(newPage, oldPage) {
if (newPage.key !== oldPage.key) {
requestAnimationFrame(() => {
if (this.$route.hash) {
const element = document.getElementById(this.$route.hash.slice(1));
watch: {
$page(newPage, oldPage) {
if (newPage.key !== oldPage.key) {
requestAnimationFrame(() => {
if (this.$route.hash) {
const element = document.getElementById(this.$route.hash.slice(1));
if (element && element.scrollIntoView) {
element.scrollIntoView();
}
}
});
}
}
},
if (element && element.scrollIntoView) {
element.scrollIntoView();
}
}
});
}
}
},
markdown: {
extendMarkdown: md => {
md.use(require('markdown-it-multimd-table'), {
rowspan: true,
});
}
},
markdown: {
extendMarkdown: md => {
md.use(require('markdown-it-multimd-table'), {
rowspan: true,
});
}
},
theme: 'vuepress-theme-succinct',
globalUIComponents: [
@@ -56,10 +56,10 @@ module.exports = {
themeConfig: {
lastUpdated: true,
repo: 'https://github.com/dortania/OpenCore-Legacy-Patcher/',
docsDir: 'docs',
docsBranch: 'main',
editLinks: true,
editLinkText: 'Help us improve this page!',
docsDir: 'docs',
docsBranch: 'main',
editLinks: true,
editLinkText: 'Help us improve this page!',
logo: 'homepage.png',
sidebar: [{
@@ -67,8 +67,9 @@ module.exports = {
collapsable: false,
sidebarDepth: 1,
children: [
'START',
'MODELS',
'START',
'MODELS',
'FAQ',
]
},
@@ -78,7 +79,7 @@ module.exports = {
sidebarDepth: 1,
children: [
'INSTALLER',
'BUILD',
'BUILD',
]
},
@@ -87,35 +88,43 @@ module.exports = {
collapsable: false,
sidebarDepth: 1,
children: [
'BOOT',
'POST-INSTALL',
'BOOT',
'POST-INSTALL',
]
},
{
title: 'macOS Sequoia',
collapsable: false,
sidebarDepth: 1,
children: [
'SEQUOIA-DROP',
]
},
{
title: 'macOS Sonoma',
collapsable: false,
sidebarDepth: 1,
children: [
['SONOMA-DROP', 'macOS Sonoma Support'],
'SONOMA-DROP',
]
},
{
{
title: 'macOS Ventura',
collapsable: false,
sidebarDepth: 1,
children: [
['VENTURA-DROP', 'macOS Ventura Support'],
'VENTURA-DROP',
]
},
{
},
{
title: 'macOS Monterey',
collapsable: false,
sidebarDepth: 1,
children: [
['MONTEREY-DROP', 'macOS Monterey Support'],
'MONTEREY-DROP',
]
},
{
@@ -123,15 +132,15 @@ module.exports = {
collapsable: false,
sidebarDepth: 1,
children: [
'ACCEL',
'TROUBLESHOOTING',
'DEBUG',
'UPDATE',
'UNINSTALL',
'ICNS',
'WINDOWS',
'UNIVERSALCONTROL',
'PROCESS',
'ACCEL',
'TROUBLESHOOTING',
'DEBUG',
'UPDATE',
'UNINSTALL',
'ICNS',
'WINDOWS',
'UNIVERSALCONTROL',
'PROCESS',
]
},
{
@@ -139,8 +148,8 @@ module.exports = {
collapsable: false,
sidebarDepth: 1,
children: [
'DONATE',
'LICENSE',
'DONATE',
'LICENSE',
]
},
@@ -149,21 +158,22 @@ module.exports = {
collapsable: false,
sidebarDepth: 1,
children: [
'ISSUES-HOLD',
'TERMS',
'HOW',
'PATCHEXPLAIN',
'ISSUES-HOLD',
'TERMS',
'HOW',
'PATCHEXPLAIN',
]
},
],
},
plugins: [
'@vuepress/plugin-back-to-top',
'@vuepress/back-to-top',
'vuepress-plugin-smooth-scroll',
['vuepress-plugin-medium-zoom',
'vuepress-plugin-fulltext-search',
['@vuepress/medium-zoom',
{
selector: "img",
selector: ".theme-succinct-content :not(a) > img",
options: {
background: 'var(--bodyBgColor)'
}

View File

@@ -47,3 +47,22 @@ tr
background-color var(--sideBgColor)!important
box-shadow 0px 0px 2px var(--bodyBgColor)
right -12%!important
@media (min-width: 1000px)
.theme-succinct-content:not(.custom)
max-width 70%
.search-box .suggestion a .suggestion-row .page-title
border-color var(--borderColor) !important
background-color: var(--sideBgColor) !important
.search-box .suggestion a .suggestion-row .suggestion-content
border-color var(--borderColor) !important
.search-box .suggestion a .parent-page-title
background-color: var(--bodyBgColor) !important
color: var(--accentColor) !important
.search-box .suggestion.focused a
color: var(--navItemHoverColor) !important

View File

@@ -22,4 +22,4 @@ $bodyBgColorDark = #2d3033
$sideBgColorDark = #363b40
$badgeTipColorDark = #023e52
$contentWidth = 900px
$contentWidth = 900px

View File

@@ -73,5 +73,18 @@ If your Mac is looping back into the beginning of the setup after the first rebo
:::
::: warning
**T1 Macs**: When installing macOS Sonoma or newer on a T1 system, full disk wipe will remove T1 functionality (touchbar etc). Therefore when installing, only wipe the volume containing the operating system.
<div align="center">
<img src="./images/wipe-volume.png" alt="WipeVolume" width="800" />
</div>
[More info here](https://dortania.github.io/OpenCore-Legacy-Patcher/TROUBLESHOOTING.html#no-t1-functionality-after-installing-sonoma-or-newer)
:::
# Once installed and booting, head to [Post-Installation](./POST-INSTALL.md)

View File

@@ -6,16 +6,20 @@ If you haven't downloaded OpenCore Patcher yet, do so now:
* [OpenCore Legacy Patcher Releases](https://github.com/dortania/Opencore-Legacy-Patcher/releases)
Next, run the `OpenCore-Patcher.app`:
Next, run the `OpenCore-Patcher.app`
![](./images/OCLP-GUI-Main-Menu.png)
Here we'll select Build and Install OpenCore and start building:
<div align="center">
<img src="./images/OCLP-GUI-Main-Menu.png" alt="OCLP GUI Main Menu" width="800" />
</div>
::: warning
OpenCore configurations are hardware specific.
If you're building OpenCore for a different model than you're currently running, it is absolutely necessary to select the proper model from Settings.
:::
Here we'll select Build and Install OpenCore and start building:
| Start Building | Finished Building |
| :--- | :--- |

75
docs/FAQ.md Normal file
View File

@@ -0,0 +1,75 @@
# FAQ
* [Why are the settings "not saving"?](#why-are-the-settings-not-saving)
* [Can I use the same USB install media as a universal installer?](#can-i-use-the-same-usb-install-media-as-a-universal-installer)
* [Can I use OTA updates?](#can-i-use-ota-updates)
* [Can I update to macOS betas?](#can-i-update-to-macos-betas)
* [Can I use automatic updates?](#can-i-use-automatic-updates)
* [Why is my system slow?](#why-is-my-system-slow)
* [Crashing in random places](#crashing-in-random-places)
* [Why isn't iPhone Mirroring working?](#why-isn-t-iphone-mirroring-working)
* [Where is Apple Intelligence?](#where-is-apple-intelligence)
## Why are the settings "not saving"?
OpenCore Legacy Patcher is a config build tool and as such the user interface always reverts to safe defaults, the user interface therefore **does not** reflect the status of settings. Settings are accounted for and saved by the OpenCore building process and you will always have to build OpenCore again after settings change.
Settings are saved to a config.plist file inside your EFI partition.
In SIP settings, booted SIP is reported in text form e.g. "0x803" but the checkboxes **do not** reflect the applied settings. Refer to [SIP Settings](https://dortania.github.io/OpenCore-Legacy-Patcher/POST-INSTALL.html#sip-settings) for more information.
## Can I use the same USB install media as a universal installer?
OpenCore configurations are device specific, due to different quirks needed for different systems. If you are building OpenCore for a different system that you're running, you will have to select the targeted model from Settings before building OpenCore on the USB media.
When building OpenCore on a different system, OCLP cannot be aware of all the hardware installed in the target, meaning safe defaults will be used. However, this may not be the most optimal experience especially with custom hardware. As such it's recommended to rebuild OpenCore **on device** to apply settings that are based on hardware detection, after the OS has been installed.
## Can I use OTA updates?
You can. However it is extremely recommended to use USB drive for major OS upgrades (such as 13 -> 14) to avoid larger issues from potentially occurring.
General updates are usually fine, though it is always a good idea to wait few days to see whether patches break and have to be fixed.
## Can I update to macOS betas?
If you are feeling brave and don't mind having to possibly recover your system. However, be advised that no help will be given in situations where a beta was installed.
## Can I use automatic updates?
It is extremely recommended to disable automatic updates (even downloading) when using OCLP, as Apple has recently changed the way automatic updates work. You can still manually initiate an update when you're ready to do so.
For a related "System version mismatch" error while root patching, refer to [System version mismatch error when root patching](https://dortania.github.io/OpenCore-Legacy-Patcher/TROUBLESHOOTING.html#system-version-mismatch-error-when-root-patching) for troubleshooting.
## Why is my system slow?
This can mean many things. Firstly, newer operating systems are harder to run and can appear more slow.
However, if your system is being **really** slow and you have no transparency in Dock and menubar, this typically indicates that root patches are not installed and as such there is no acceleration. Make sure to install root patches to get proper drivers and functionality. Refer to [Applying post install volume patches](https://dortania.github.io/OpenCore-Legacy-Patcher/POST-INSTALL.html#applying-post-install-volume-patches) and the [Troubleshooting](https://dortania.github.io/OpenCore-Legacy-Patcher/TROUBLESHOOTING.html) section for more information.
Patches can also break if automatic updates are enabled and an update modifies the system volume, refer to [System version mismatch error when root patching](https://dortania.github.io/OpenCore-Legacy-Patcher/TROUBLESHOOTING.html#system-version-mismatch-error-when-root-patching) for more information.
## Crashing in random places
There are two rather common things that can cause weird crashing. First is a process called "mediaanalysisd" on 3802-based systems* and secondly FeatureUnlock. You can try disabling these settings in OCLP to try and gain higher stability.
Be advised that by disabling FeatureUnlock, you will lose some macOS functionality. The features enabled by FeatureUnlock are listed [here](https://github.com/acidanthera/FeatureUnlock).
*3802 systems include:
* NVIDIA
* Kepler (600-800 series GPUs)
* Intel
* Ivy Bridge (3rd generation, HD 4000 series GPUs)
* Haswell (4th generation, HD/Iris 4000-5000 series GPUs)
These GPUs are typically met in systems from 2012-2015.
## Why isn't iPhone Mirroring working?
iPhone Mirroring requires a T2 chip, which means it will not be available on OCLP patched systems. The connection fails due to failure to establish T2 attestation.
## Where is Apple Intelligence?
Apple Intelligence requires Neural Engine, which is only found in Apple Silicon chips.

View File

@@ -2,39 +2,25 @@
This document is centered around downloading and writing the macOS installer to a USB drive. If you're already familiar with how to do this, you can skip this section.
* Note: 16GB+ USB drive will be required for the installer
* Note: A 32GB drive is recommended, later versions of Sonoma and Sequoia cannot fit installer and patches to a 16GB disk. 16GB drive may work for older versions.
## Creating the installer
With OpenCore Legacy Patcher, our new GUI includes a download menu for macOS installers. So to start off, you'll want to grab our app:
To start off, you'll want to grab the app:
* [OpenCore Legacy Patcher Release Apps](https://github.com/dortania/OpenCore-Legacy-Patcher/releases)
For this guide, we'll be using the standard OpenCore-Patcher (GUI).
Once downloaded, open the app and you should be greeted by the main menu.
Once downloaded, open the app and you should be greeted by this menu:
First, we'll want to select the "Create macOS Installer" button. This will present you with 2 options.
![OCLP GUI Main Menu](./images/OCLP-GUI-Main-Menu.png)
For this example, we'll assume you'll need an installer. Select the "Download macOS installer" to get you a list of installers. Click to download the version you want.
First, we'll want to select the "Create macOS Installer" button. This will present you with 2 options:
| Main menu | Installer creation menu | Available installers |
| :--- | :--- | --- |
| ![OCLP GUI Main Menu](./images/OCLP-GUI-Main-Menu.png) | ![OCLP GUI Installer Create Installer Menu](./images/OCLP-GUI-Create-Installer-Menu.png) | ![OCLP GUI Installer Download Listed Products](./images/OCLP-GUI-Installer-Download-Listed-Products.png) |
![](./images/OCLP-GUI-Create-Installer-Menu.png)
For this example, we'll assume you'll need an installer. Selecting this option will download Apple's Installer Catalogs and build a list for you to choose:
| Downloading | Listed Installers | Unsupported Installer |
| :--- | :--- | :--- |
| ![OCLP GUI Installer Download Catalog](./images/OCLP-GUI-Installer-Download-Catalog.png) | ![OCLP GUI Installer Download Listed Products](./images/OCLP-GUI-Installer-Download-Listed-Products.png) | ![](./images/OCLP-GUI-Installer-Download-Unsupported.png)
Since the patcher officially supports Big Sur and newer for patching, only those entries will be shown. For ourselves, we'll select macOS 12 as that's the latest public release at the time of writing. This will download and install the macOS installer to your applications folder.
* Note that some machines (namely 2012 and older) may not be currently supported on macOS Ventura. If you see this prompt, you'll need to use an older version of macOS.
| Downloading the Installer | Requesting to install | Finished Installing |
| :--- | :--- | :--- |
| ![OCLP GUI Installer Download Progress](./images/OCLP-GUI-Installer-Download-Progress.png) | ![OCLP GUI Installer Needs Installing](./images/OCLP-GUI-Installer-Needs-Installing.png) | ![OCLP GUI Installer Download Finished](./images/OCLP-GUI-Installer-Download-Finished.png) |
Once finished, you can proceed to write the installer onto a USB drive.
Once the download is finished, you can proceed to write the installer onto a USB drive.
* Note: The entire USB drive will be formatted
@@ -45,7 +31,7 @@ Once finished, you can proceed to write the installer onto a USB drive.
Now the patcher will start the installer flashing!
| Flashing | Success Prompt | Finished Flashing |
| :--- | :--- |
| :--- | :--- | :--- |
| ![](./images/OCLP-GUI-Installer-Flashing-Process.png) | ![](./images/OCLP-GUI-Installer-Sucess-Prompt.png) | ![](./images/OCLP-GUI-Installer-Finished-Script.png) |
# Once finished, head to [Building and installing OpenCore](./BUILD.md)

View File

@@ -4,7 +4,7 @@
The patcher application requires **OS X Yosemite 10.10** or later to run.
* **OS X El Capitan 10.11** or later is required to make installers for macOS Ventura and later.
The patcher is designed to target **macOS Big Sur 11.x to macOS Sonoma 14.x**.
The patcher is designed to target **macOS Big Sur 11.x to macOS Sequoia 15.x**.
* Other versions may work, albeit in a broken state. No support is provided for any version outside of the above.
-------
@@ -57,9 +57,9 @@ The below tables can be used to reference issues with a particular model, and se
| MacBook Air (13-inch, Mid 2013)<br>MacBook Air (13-inch, Early 2014) | `MacBookAir6,2` | ^^ |
| MacBook Air (11-inch, Early 2015) | `MacBookAir7,1` | ^^ |
| MacBook Air (13-inch, Early 2015)<br>MacBook Air (13-inch, 2017) | `MacBookAir7,2` | ^^ |
| MacBook Air (Retina, 13-inch, 2018) | `MacBookAir8,1` | - Supported by Apple |
| MacBook Air (Retina, 13-inch, 2018) | `MacBookAir8,1` | - Supported natively up to Sonoma<br>- Currently not supported on Sequoia due to T2 issues<br> |
| MacBook Air (Retina, 13-inch, 2019) | `MacBookAir8,2` | ^^ |
| MacBook Air (Retina, 13-inch, 2020) | `MacBookAir9,1` | ^^ |
| MacBook Air (Retina, 13-inch, 2020) | `MacBookAir9,1` | Supported by Apple |
### MacBook Pro

View File

@@ -1,3 +1,5 @@
# macOS Monterey Support
![](./images/macos-monterey.png)
With OpenCore Legacy Patcher v0.1.7 and newer, we've implemented beta macOS Monterey support for users. Please note that Apple has dropped a lot of hardware with this release as well as broken many of our previous patch sets. This page will be used to inform users regarding current issues and will be updated as new patch sets are developed and added to our patcher.

View File

@@ -21,7 +21,11 @@ And voila! No more USB drive required.
To do this, run the OpenCore Patcher and head to Patcher Settings, then uncheck "Show OpenCore Bootpicker" on the Build tab:
![](./images/OCLP-GUI-Settings-ShowPicker.png)
<div align="center">
<img src="./images/OCLP-GUI-Settings-ShowPicker.png" alt="GUI Settings ShowPicker" width="600" />
</div>
Once you've toggled it off, build your OpenCore EFI once again and install to your desired drive. Now to show the OpenCore selector, you can simply hold down the "ESC" key while clicking on EFI boot, and then you can release the "ESC" key when you see the cursor arrow at the top left.
@@ -42,7 +46,9 @@ SIP settings can be accessed from the Security tab shown in the images. To chang
| ![](./images/OCLP-GUI-Settings-SIP-Enabled.png) | ![](./images/OCLP-GUI-Settings-SIP-Root-Patch.png) | ![](./images/OCLP-GUI-Settings-SIP-Disabled.png) |
In the cases where SIP can be enabled, manually enabling it is needed. Easiest way to check whether you can fully enable SIP is the "Post Install Root Patch" section, if that section tells your system doesn't need patches (or you don't install the patches e.g. in case you don't need WiFi on a Mac Pro with upgraded GPU running Monterey) then it is safe to assume full SIP can be enabled.
In the cases where SIP can be enabled, manually enabling it is needed.
Easiest way to check whether you can fully enable SIP is the "Post Install Root Patch" section, if that section tells your system doesn't need patches (or you don't install the patches e.g. in case you don't need WiFi on a Mac Pro with upgraded GPU running Monterey) then it is safe to assume full SIP can be enabled.
**Ventura and newer**
@@ -51,9 +57,8 @@ All unsupported systems require lowered SIP.
**Monterey**
Majority of unsupported systems from 2013 onward can enable full SIP.
Pre-2012 systems, also known as "non-Metal" (includes Mac Pros without upgraded GPU), as well as NVIDIA Kepler and Intel HD 4000 GPUs require lowered SIP.
Some systems such as Mac Pros also require root patching for stock WiFi cards but if you do not need WiFi or you plan to upgrade the card, there is no need for root patching and as such SIP can be fully enabled.
Pre-2012 systems, also known as "non-Metal", as well as NVIDIA Kepler and Intel HD 4000 GPUs require lowered SIP. Mac Pros also require lowered SIP for stock WiFi cards and stock GPUs (due to root patching) but if you do not need WiFi (or you plan to upgrade it) and you're running on an upgraded GPU, there is no need for root patching and as such SIP can be fully enabled.
**Big Sur**
@@ -92,6 +97,21 @@ There is also an option to remove root patches, which may be required in some si
| :--- | :--- |
| ![](./images/OCLP-GUI-Root-Patch.png) | ![](./images/OCLP-GUI-Root-Patch-Finished.png) |
:::warning
With macOS Sequoia, MetallibSupportPkg is required to be downloaded for all 3802 systems. OCLP will handle this as long as you're connected to the internet.
Such systems include:
* NVIDIA
* Kepler (GTX 600 - 700 series)
* Intel
* Ivy Bridge (HD 4000 series)
* Haswell (Iris/HD 4000-5000 series)
:::
:::warning
With macOS Ventura and Macs with AMD Legacy GCN GPUs (ie. Metal), Root Patching requires a network connection to grab Apple's Kernel Debug Kit to start root patching. If your system is unable to connect to the internet, you can manually download a KDK from Apple's site:
@@ -109,19 +129,62 @@ Machines that require this are those with AMD Metal dGPUs:
Below entries represent GPUs no longer natively supported, ie. requiring root volume patching with OpenCore Legacy Patcher:
:::details GPUs requiring patching in macOS Big Sur
:::details GPUs requiring patching in different macOS versions
AMD Navi (RX 5000 - 6000 series) GPUs are non-functional in Mac Pro 2008 to 2012 using Ventura and newer due to lack of AVX2 support.
**Sequoia**
* NVIDIA:
* Tesla (8000 - 300 series)
* Kepler (600 - 800 series)
* AMD:
* TeraScale (2000 - 6000 series)
* GCN 1-3 (7000 - R9 series)
* Polaris (RX 4xx/5xx series, if CPU lacks AVX2)
* Intel:
* Iron Lake
* Sandy Bridge (2000 - 3000 series)
* Ivy Bridge (4000 series)
* Haswell (4400, 4600, 5000 series)
* Broadwell (6000 series)
* Skylake (500 series)
:::
**Sonoma**
:::details GPUs requiring patching in macOS Monterey
* NVIDIA:
* Tesla (8000 - 300 series)
* Kepler (600 - 800 series)
* AMD:
* TeraScale (2000 - 6000 series)
* GCN 1-3 (7000 - R9 series)
* Polaris (RX 4xx/5xx series, if CPU lacks AVX2)
* Intel:
* Iron Lake
* Sandy Bridge (2000 - 3000 series)
* Ivy Bridge (4000 series)
* Haswell (4400, 4600, 5000 series)
* Broadwell (6000 series)
* Skylake (500 series)
**Ventura**
* NVIDIA:
* Tesla (8000 - 300 series)
* Kepler (600 - 800 series)
* AMD:
* TeraScale (2000 - 6000 series)
* GCN 1-3 (7000 - R9 series)
* Polaris (RX 4xx/5xx series, if CPU lacks AVX2)
* Intel:
* Iron Lake
* Sandy Bridge (2000 - 3000 series)
* Ivy Bridge (4000 series)
* Haswell (4400, 4600, 5000 series)
* Broadwell (6000 series)
* Skylake (500 series)
**Monterey**
* NVIDIA:
* Tesla (8000 - 300 series)
@@ -133,6 +196,17 @@ Below entries represent GPUs no longer natively supported, ie. requiring root vo
* Sandy Bridge (2000 - 3000 series)
* Ivy Bridge (4000 series)
**Big Sur**
* NVIDIA:
* Tesla (8000 - 300 series)
* AMD:
* TeraScale (2000 - 6000 series)
* Intel:
* Iron Lake
* Sandy Bridge (2000 - 3000 series)
:::
:::details Wireless Cards requiring patching in macOS Monterey
@@ -143,18 +217,3 @@ Below entries represent GPUs no longer natively supported, ie. requiring root vo
* Atheros
:::
:::details GPUs requiring patching in macOS Ventura
* NVIDIA:
* Kepler (600 - 800 series)
* AMD:
* GCN 1-3 (7000 - R9 series)
* Polaris (RX 4xx/5xx series, if CPU lacks AVX2)
* Intel:
* Ivy Bridge (4000 series)
* Haswell (4400, 4600, 5000 series)
* Broadwell (6000 series)
* Skylake (500 series)
:::

109
docs/SEQUOIA-DROP.md Normal file
View File

@@ -0,0 +1,109 @@
# macOS Sequoia Support
![](./images/macos-sequoia.png)
Another year, another release.
This time Apple dropped surprisingly few amount of Macs. With the release of OpenCore Legacy Patcher 2.0.0, early support for macOS Sequoia has been implemented.
## Newly dropped hardware
* MacBookAir8,1 : MacBook Air (2018)
* MacBookAir8,2 : MacBook Air (2019)
## Current status
OpenCore Legacy Patcher 2.0.0 will support Sequoia for most models normally supported by the Patcher, however some challenges remain. You can find information about them below.
Unfortunately due to T2 related problems, the recently dropped MacBookAir8,x models cannot be supported at this time.
[More information here](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1136)
## Non-functional features
On majority of patched Macs, iPhone Mirroring and Apple Intelligence won't be functional.
iPhone Mirroring requires T2 for attestation and Apple Intelligence requires an NPU only found in Apple Silicon, the patcher is unable to provide a fix for these as they're hardware requirements.
## Issues
* [Dual socket CPUs with Mac Pros and Xserve](#dual-socket-cpus-with-mac-pro-2008-and-xserve-2008)
* [T2 Security chip](#t2-security-chip)
* [USB 1.1 (OHCI/UHCI) Support](#usb-1-1-ohci-uhci-support)
* [Graphics support and issues](#graphics-support-and-issues)
### Dual socket CPUs with Mac Pro 2008 and Xserve 2008
Booting Sequoia on Mac Pro 2008 (MacPro3,1) or Xserve 2008 (Xserve2,1) with more than 4 cores will cause Sequoia to panic. OpenCore Legacy Patcher will automatically disable additional cores.
This is due to the dual socket nature of the machine, and likely some firmware/ACPI table incompatibility.
**If building OpenCore for older OS, this limitation can be disabled in Settings -> Build -> "MacPro3,1/Xserve2,1 Workaround".**
::: warning Note
Dual booting Sequoia and older will not be possible with all cores enabled due to reasons described before. In these cases you will be limited to 4 cores.
:::
### T2 security chip
The current biggest issue we face with supporting the MacBookAir8,x (2018/19) series is the T2 chip's lack of communication when booted through OpenCorePkg.
What happens when one of these units boots through OpenCorePkg is that AppleKeyStore.kext panics due to timeouts with the T2 chip:
```
"AppleKeyStore":3212:0: sks timeout strike 18
"AppleKeyStore":3212:0: sks timeout strike 19
"AppleKeyStore":3212:0: sks timeout strike 20
panic(cpu 0 caller 0xffffff801cd12509): "AppleSEPManager panic for "AppleKeyStore": sks request timeout" @AppleSEPManagerIntel.cpp:809
```
This affects not only macOS Sequoia, but macOS Ventura and Sonoma are confirmed to have the same issue. Thus an underlying problem with the MacBookAir8,x's firmware where it is not happy with OpenCorePkg.
We currently do not have any leads on what exactly breaks the T2.
* MacBookPro15,2, MacBookPro16,2 and Macmini8,1 do not exhibit these issues in local testing
* MacPro7,1 does seem to surprisingly based on reports: [MacPro7,1 - OpenCorePkg](https://forums.macrumors.com/threads/manually-configured-opencore-on-the-mac-pro.2207814/post-29418464)
* Notes from this report were unsuccessful locally: [Cannot boot MacPro7,1 #1487](https://github.com/acidanthera/bugtracker/issues/1487)
### USB 1.1 (OHCI/UHCI) Support
For Penryn systems, pre-2013 Mac Pros and Xserve, USB 1.1 support was outright removed in macOS Ventura, therefore this applies all the way to Sequoia.
While USB 1.1 may seem unimportant, it handles many important devices on your system. These include:
* Keyboard and Trackpad for laptops
* IR Receivers
* Bluetooth
Users will need to use a USB hub for installation and post-OS updates when patches are cleaned:
However, the driver has recently been weakened starting from Sonoma, which means even some USB hubs may not work properly.
An alternative way is making sure to enable "Remote Login" in General -> Sharing before updating, which will enable SSH.
That means you can take control using Terminal in another system by typing `ssh username@lan-ip-address` and your password.
After that run Post Install Volume Patching by typing `/Applications/OpenCore-Patcher.app/Contents/MacOS/OpenCore-Patcher --patch_sys_vol` and finally `sudo reboot`.
![](./images/usb11-chart.png)
::: warning The following systems rely on USB 1.1
* iMac10,x and older
* Macmini4,1 and older
* MacBook7,1 and older
* MacBookAir3,1 and older
* MacPro5,1 and older
* Xserve 3,1 and older
:::
[More information here](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1021)
### Graphics support and issues
This build includes both Legacy Metal and non-Metal patches for macOS Sequoia. Refer to the following links for more information about Legacy Metal and non-Metal support and their respective issues.
* [Legacy Metal](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1008)
* [Non-Metal](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108)

View File

@@ -1,3 +1,5 @@
# macOS Sonoma Support
![](./images/sonoma.png)
*Well here we are again, it's always such a pleasure~*
@@ -31,7 +33,7 @@ OpenCore Legacy Patcher 1.0.0 will support Sonoma for all models normally suppor
* [Bluetooth](#bluetooth)
* [T1 Security chip](#t1-security-chip)
* [USB 1.1 (OHCI/UHCI) Support](#usb-11-ohciuhci-support)
* [USB 1.1 (OHCI/UHCI) Support](#usb-1-1-ohci-uhci-support)
* [Graphics support and issues](#graphics-support-and-issues)

View File

@@ -7,6 +7,7 @@ Here are some common errors that users may experience while using this patcher:
* [Stuck on `This version of Mac OS X is not supported on this platform` or (🚫) Prohibited Symbol](#stuck-on-this-version-of-mac-os-x-is-not-supported-on-this-platform-or-🚫-prohibited-symbol)
* [Cannot boot macOS without the USB](#cannot-boot-macos-without-the-usb)
* [Infinite Recovery OS Booting](#infinite-recovery-os-reboot)
* [System version mismatch error when root patching](#system-version-mismatch-error-when-root-patching)
* [Stuck on boot after root patching](#stuck-on-boot-after-root-patching)
* ["Unable to resolve dependencies, error code 71" when root patching](#unable-to-resolve-dependencies-error-code-71-when-root-patching)
* [Reboot when entering Hibernation (`Sleep Wake Failure`)](#reboot-when-entering-hibernation-sleep-wake-failure)
@@ -22,6 +23,7 @@ Here are some common errors that users may experience while using this patcher:
* [Stuck on "Less than a minute remaining..."](#stuck-on-less-than-a-minute-remaining)
* [No acceleration after a Metal GPU swap on Mac Pro](#no-acceleration-after-a-metal-gpu-swap-on-mac-pro)
* [Keyboard, Mouse and Trackpad not working in installer or after update](#keyboard-mouse-and-trackpad-not-working-in-installer-or-after-update)
* [No T1 functionality after installing Sonoma or newer](#no-t1-functionality-after-installing-sonoma-or-newer)
## OpenCore Legacy Patcher not launching
@@ -77,6 +79,14 @@ With OpenCore Legacy Patcher, we rely on Apple Secure Boot to ensure OS updates
* Note: Machines with modified root volumes will also result in an infinite recovery loop until integrity is restored.
## System version mismatch error when root patching
Updates from now on modify the system volume already while downloading, which can lead to broken patches out of a sudden as well as a "version mismatch" error while root patching, since the operating system gets into a liminal state between two versions. The "version mismatch" error is a safeguard preventing OCLP from patching on a system that is in a weird liminal state, to avoid leading to a very likely boot failure.
Currently there is a "PurgePendingUpdate" tool available [on the Discord server](https://discord.com/channels/417165963327176704/1037474131526029362/1255993208966742108) you can download and then run it in Terminal, to get rid of a pending update. This may be integrated into OCLP later on, however there is currently no ETA.
Disabling automatic macOS updates is extremely recommended once recovered, to prevent it from happening again.
## Stuck on boot after root patching
Boot into recovery by pressing space when your disk is selected on the OCLP bootpicker (if you have it hidden, hold ESC while starting up)
@@ -233,6 +243,16 @@ The reason for this is that the autopatcher will assume that you will be using t
For Macs using legacy USB 1.1 controllers, OpenCore Legacy Patcher can only restore support once it has performed root volume patches. Thus to install macOS, you need to hook up a USB hub between your Mac and Keyboard/Mouse.
::: warning Note
In macOS Sonoma, this seems to have been further weakened and some hubs may not be functional.
Alternative way is making sure to enable "Remote Login" in General -> Sharing before updating, which will enable SSH. That means you can take control using Terminal in another system by typing `ssh username@lan-ip-address` and your password. After that run Post Install Volume Patching by typing `/Applications/OpenCore-Patcher.app/Contents/MacOS/OpenCore-Patcher --patch_sys_vol` and finally `sudo reboot`.
:::
* For MacBook users, you'll need to find an external keyboard/mouse in addition to the USB hub
More information can be found here:
@@ -252,3 +272,9 @@ Applicable models include:
![](./images/usb11-chart.png)
## No T1 functionality after installing Sonoma or newer
If you notice your Touchbar etc not working, this means loss of T1 functionality.
Wiping the entire disk using Disk Utility with Sonoma or newer causes the T1 firmware to be removed, which due to removed support, the macOS Sonoma+ installer will not restore. To restore T1 functionality, Ventura or older has to be reinstalled. This can be done in another volume or external disk as well, as long as the OS is booted once. After this you can wipe the old OS or unplug the external disk.

View File

@@ -1,3 +1,5 @@
# macOS Ventura Support
![](./images/ventura.png)
With the release of OpenCore Legacy Patcher v0.5.0 and newer, early support for macOS Ventura has been implemented for most Metal-capable Macs. This page will be used to inform users regarding current issues and will be updated as new patch sets are developed and added to our patcher.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 221 KiB

After

Width:  |  Height:  |  Size: 351 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 158 KiB

After

Width:  |  Height:  |  Size: 273 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 454 KiB

BIN
docs/images/wipe-volume.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 506 KiB

34543
docs/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -33,19 +33,17 @@
},
"license": "CC-BY-NC-SA-4.0",
"devDependencies": {
"@vuepress/plugin-back-to-top": "^1.9.10",
"markdown-it-multimd-table": "^4.2.3",
"markdown-link-check": "^3.11.2",
"markdownlint-cli": "^0.37.0",
"@vuepress/plugin-back-to-top": "^1.9.8",
"@vuepress/plugin-medium-zoom": "^1.9.8",
"markdown-it-multimd-table": "^4.2.0",
"markdown-link-check": "^3.10.3",
"markdownlint-cli": "^0.33.0",
"run-script-os": "^1.1.6",
"spellchecker-cli": "^6.1.1",
"vuepress": "^1.9.10",
"vuepress-plugin-medium-zoom": "^1.1.9",
"vuepress-plugin-zooming": "^1.1.8",
"vuepress-theme-book": "0.0.9",
"vuepress-theme-dark-new": "^0.1.2",
"vuepress-theme-succinct": "^1.7.2",
"vuepress-theme-yuu": "^3.1.1"
"vuepress": "^1.9.8",
"vuepress-plugin-fulltext-search": "^2.2.1",
"vuepress-theme-succinct": "^1.7.2"
},
"homepage": "https://dortania.github.io/OpenCore-Legacy-Patcher/"
"homepage": "https://dortania.github.io/OpenCore-Legacy-Patcher/",
"packageManager": "yarn@1.22.19+sha1.4ba7fc5c6e704fce2066ecbfb0b0d8976fe62447"
}

10692
docs/yarn.lock Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -13,8 +13,8 @@ from .detections import device_probe
class Constants:
def __init__(self) -> None:
# Patcher Versioning
self.patcher_version: str = "1.6.0" # OpenCore-Legacy-Patcher
self.patcher_support_pkg_version: str = "1.6.3" # PatcherSupportPkg
self.patcher_version: str = "2.0.2" # OpenCore-Legacy-Patcher
self.patcher_support_pkg_version: str = "1.8.3" # PatcherSupportPkg
self.copyright_date: str = "Copyright © 2020-2024 Dortania"
self.patcher_name: str = "OpenCore Legacy Patcher"
@@ -28,25 +28,25 @@ class Constants:
# OpenCore Versioning
# https://github.com/acidanthera/OpenCorePkg
self.opencore_version: str = "1.0.0"
self.opencore_version: str = "1.0.1"
# Kext Versioning
## Acidanthera
## https://github.com/acidanthera
self.lilu_version: str = "1.6.7" # Lilu
self.whatevergreen_version: str = "1.6.6" # WhateverGreen
self.whatevergreen_navi_version: str = "1.6.6-Navi" # WhateverGreen (Navi Patch)
self.lilu_version: str = "1.6.8" # Lilu
self.whatevergreen_version: str = "1.6.7" # WhateverGreen
self.whatevergreen_navi_version: str = "1.6.7-Navi" # WhateverGreen (Navi Patch)
self.airportbcrmfixup_version: str = "2.1.8" # AirPortBrcmFixup
self.nvmefix_version: str = "1.1.1" # NVMeFix
self.applealc_version: str = "1.6.3" # AppleALC
self.restrictevents_version: str = "1.1.3" # RestrictEvents
self.featureunlock_version: str = "1.1.5" # FeatureUnlock
self.debugenhancer_version: str = "1.0.8" # DebugEnhancer
self.cpufriend_version: str = "1.2.7" # CPUFriend
self.restrictevents_version: str = "1.1.4" # RestrictEvents
self.featureunlock_version: str = "1.1.6" # FeatureUnlock
self.debugenhancer_version: str = "1.0.9" # DebugEnhancer
self.cpufriend_version: str = "1.2.8" # CPUFriend
self.bluetool_version: str = "2.6.8" # BlueToolFixup (BrcmPatchRAM)
self.cslvfixup_version: str = "2.6.1" # CSLVFixup
self.autopkg_version: str = "1.0.3" # AutoPkgInstaller
self.cryptexfixup_version: str = "1.0.2" # CryptexFixup
self.autopkg_version: str = "1.0.4" # AutoPkgInstaller
self.cryptexfixup_version: str = "1.0.3" # CryptexFixup
## Apple
## https://www.apple.com
@@ -61,6 +61,7 @@ class Constants:
self.apfs_zlib_v2_version: str = "12.6" # NoAVXFSCompressionTypeZlib (patched with AVXpel)
self.multitouch_version: str = "1.0.0" # AppleUSBMultitouch
self.topcase_version: str = "1.0.0" # AppleUSBTopCase
self.topcase_inj_version: str = "1.0.0" # AppleTopCaseInjector
self.intel_82574l_version: str = "1.0.0" # Intel82574L
self.intel_8254x_version: str = "1.0.0" # AppleIntel8254XEthernet
self.apple_usb_11_injector: str = "1.0.0" # AppleUSBUHCI/OHCI
@@ -73,6 +74,7 @@ class Constants:
self.t1_corecrypto_version: str = "1.0.1" # corecrypto (13.6 - T1 support)
self.apple_spi_version: str = "1.0.0" # AppleHSSPISupport (14.4 Beta 1)
self.apple_spi_hid_version: str = "1.0.0" # AppleHSSPIHIDDriver (14.4 Beta 1)
self.kernel_relay_version: str = "1.0.0" # KernelRelayHost (15.0 Beta 3)
## Apple - Dortania Modified
self.bcm570_version: str = "1.0.2" # CatalinaBCM5701Ethernet
@@ -80,7 +82,7 @@ class Constants:
self.corecaptureelcap_version: str = "1.0.2" # corecaptureElCap
self.io80211elcap_version: str = "2.0.1" # IO80211ElCap
self.io80211legacy_version: str = "1.0.0" # IO80211FamilyLegacy (Ventura)
self.ioskywalk_version: str = "1.1.0" # IOSkywalkFamily (Ventura)
self.ioskywalk_version: str = "1.2.0" # IOSkywalkFamily (Ventura)
self.bigsursdxc_version: str = "1.0.0" # BigSurSDXC
self.monterey_ahci_version: str = "1.0.0" # CatalinaAHCI
@@ -96,8 +98,8 @@ class Constants:
self.btspoof_version: str = "1.0.0" # Bluetooth-Spoof
self.aspp_override_version: str = "1.0.1" # ACPI_SMC_PlatformPlugin Override
self.ecm_override_version: str = "1.0.0" # AppleUSBECM Override
self.rsrhelper_version: str = "1.0.0" # RSRHelper
self.amfipass_version: str = "1.4.0" # AMFIPass
self.rsrhelper_version: str = "1.0.2" # RSRHelper
self.amfipass_version: str = "1.4.1" # AMFIPass
self.amfipass_compatibility_version: str = "1.2.1" # Minimum AMFIPass version required
## Syncretic
@@ -177,7 +179,7 @@ class Constants:
## SMBIOS Settings
self.serial_settings: str = "None" # Set SMBIOS level used
self.override_smbios: str = "Default" # Set SMBIOS model used
self.allow_native_spoofs: bool = False # Allow native models to recieve spoofs
self.allow_native_spoofs: bool = False # Allow native models to receive spoofs
### Serial Number Overrides
self.custom_serial_number: str = "" # Set SMBIOS serial number
@@ -232,6 +234,7 @@ class Constants:
self.disable_connectdrivers: bool = False # Disable ConnectDrivers (hibernation)
self.set_vmm_cpuid: bool = False # Set VMM bit inside CPUID
self.disable_mediaanalysisd: bool = False # Set mediaanalysisd to spawn
self.force_quad_thread: bool = False # Force quad thread mode (cpus=4)
self.set_alc_usage: bool = True # Set AppleALC usage
self.allow_3rd_party_drives: bool = True # Allow ThridPartyDrives quirk
self.allow_nvme_fixing: bool = True # Allow NVMe Kernel Space Patches
@@ -244,6 +247,7 @@ class Constants:
os_data.os_data.monterey,
os_data.os_data.ventura,
os_data.os_data.sonoma,
os_data.os_data.sequoia,
]
@property
@@ -450,6 +454,10 @@ class Constants:
def top_case_path(self):
return self.payload_kexts_path / Path(f"Misc/AppleUSBTopCase-v{self.topcase_version}.zip")
@property
def top_case_inj_path(self):
return self.payload_kexts_path / Path(f"Misc/AppleTopCaseInjector-v{self.topcase_inj_version}.zip")
@property
def t1_key_store_path(self):
return self.payload_kexts_path / Path(f"Misc/AppleKeyStore-v{self.t1_key_store_version}.zip")
@@ -474,6 +482,10 @@ class Constants:
def apple_spi_hid_path(self):
return self.payload_kexts_path / Path(f"Misc/AppleHSSPIHIDDriver-v{self.apple_spi_hid_version}.zip")
@property
def kernel_relay_path(self):
return self.payload_kexts_path / Path(f"Misc/KernelRelayHost-v{self.kernel_relay_version}.zip")
@property
def mousse_path(self):
return self.payload_kexts_path / Path(f"SSE/AAAMouSSE-v{self.mousse_version}.zip")
@@ -777,6 +789,10 @@ class Constants:
def icon_path_macos_sonoma(self):
return self.icns_resource_path / Path("Sonoma.icns")
@property
def icon_path_macos_sequoia(self):
return self.icns_resource_path / Path("Sequoia.icns")
@property
def gui_path(self):
return self.payload_path / Path("Icon/Resources.zip")
@@ -798,6 +814,10 @@ class Constants:
def kdk_download_path(self):
return self.payload_path / Path("KDK.dmg")
@property
def metallib_download_path(self):
return self.payload_path / Path("MetallibSupportPkg.pkg")
@property
def icons_path(self):
return [
@@ -805,7 +825,8 @@ class Constants:
str(self.icon_path_macos_big_sur),
str(self.icon_path_macos_monterey),
str(self.icon_path_macos_ventura),
str(self.icon_path_macos_sonoma)
str(self.icon_path_macos_sonoma),
str(self.icon_path_macos_sequoia),
]
sbm_values = [

View File

@@ -24,6 +24,8 @@ SupportedSMBIOS = [
"MacBookAir6,2",
"MacBookAir7,1",
"MacBookAir7,2",
# "MacBookAir8,1",
# "MacBookAir8,2",
# MacBook Pro
"MacBookPro4,1",
"MacBookPro5,1",

View File

@@ -507,7 +507,7 @@ smbios_dictionary = {
"FirmwareFeatures": "0x8FD8FF42E",
"SecureBootModel": "j140k",
"CPU Generation": cpu_data.CPUGen.coffee_lake.value,
"Max OS Supported": os_data.os_data.max_os,
"Max OS Supported": os_data.os_data.sonoma,
"Wireless Model": device_probe.Broadcom.Chipsets.AppleBCMWLANBusInterfacePCIe,
"Bluetooth Model": bluetooth_data.bluetooth_data.UART,
"Screen Size": 13,
@@ -524,7 +524,7 @@ smbios_dictionary = {
"FirmwareFeatures": "0x8FD8FF42E",
"SecureBootModel": "j140k", # TODO: Verify
"CPU Generation": cpu_data.CPUGen.coffee_lake.value,
"Max OS Supported": os_data.os_data.max_os,
"Max OS Supported": os_data.os_data.sonoma,
"Wireless Model": device_probe.Broadcom.Chipsets.AppleBCMWLANBusInterfacePCIe,
"Bluetooth Model": bluetooth_data.bluetooth_data.UART,
"Screen Size": 13,
@@ -543,7 +543,7 @@ smbios_dictionary = {
"FirmwareFeatures": "0x8FD8FF42E",
"SecureBootModel": "x589amlu",
"CPU Generation": cpu_data.CPUGen.coffee_lake.value,
"Max OS Supported": os_data.os_data.max_os,
"Max OS Supported": os_data.os_data.sonoma,
"Wireless Model": device_probe.Broadcom.Chipsets.AppleBCMWLANBusInterfacePCIe,
"Bluetooth Model": bluetooth_data.bluetooth_data.UART,
"Screen Size": 13,
@@ -561,7 +561,7 @@ smbios_dictionary = {
"FirmwareFeatures": "0x8FD8FF42E",
"SecureBootModel": "j140a",
"CPU Generation": cpu_data.CPUGen.coffee_lake.value,
"Max OS Supported": os_data.os_data.max_os,
"Max OS Supported": os_data.os_data.sonoma,
"Wireless Model": device_probe.Broadcom.Chipsets.AppleBCMWLANBusInterfacePCIe,
"Bluetooth Model": bluetooth_data.bluetooth_data.UART,
"Screen Size": 13,

File diff suppressed because it is too large Load Diff

View File

@@ -12,6 +12,7 @@ from .. import constants
from ..detections import device_probe
from ..datasets import (
cpu_data,
smbios_data,
bluetooth_data
)
@@ -44,19 +45,26 @@ class BuildBluetooth:
self._prebuilt_assumption()
def _bluetooth_firmware_incompatibility_workaround(self) -> None:
"""
For Mac firmwares that are unable to perform firmware uploads.
Namely Macs with BCM2070 and BCM2046 chipsets, as well as pre-2012 Macs with upgraded chipsets.
"""
self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["bluetoothInternalControllerInfo"] = binascii.unhexlify("0000000000000000000000000000")
self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["bluetoothExternalDongleFailed"] = binascii.unhexlify("00")
self.config["NVRAM"]["Delete"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"] += ["bluetoothInternalControllerInfo", "bluetoothExternalDongleFailed"]
def _on_model(self) -> None:
"""
On-Model Hardware Detection Handling
"""
if self.computer.bluetooth_chipset in ["BRCM2070 Hub", "BRCM2046 Hub"]:
logging.info("- Fixing Legacy Bluetooth for macOS Monterey")
support.BuildSupport(self.model, self.constants, self.config).enable_kext("BlueToolFixup.kext", self.constants.bluetool_version, self.constants.bluetool_path)
support.BuildSupport(self.model, self.constants, self.config).enable_kext("Bluetooth-Spoof.kext", self.constants.btspoof_version, self.constants.btspoof_path)
self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"] += " -btlfxallowanyaddr"
self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["bluetoothInternalControllerInfo"] = binascii.unhexlify("0000000000000000000000000000")
self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["bluetoothExternalDongleFailed"] = binascii.unhexlify("00")
self.config["NVRAM"]["Delete"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"] += ["bluetoothInternalControllerInfo", "bluetoothExternalDongleFailed"]
self._bluetooth_firmware_incompatibility_workaround()
elif self.computer.bluetooth_chipset == "BRCM20702 Hub":
# BCM94331 can include either BCM2070 or BRCM20702 v1 Bluetooth chipsets
# Note Monterey only natively supports BRCM20702 v2 (found with BCM94360)
@@ -65,6 +73,13 @@ class BuildBluetooth:
if self.computer.wifi.chipset == device_probe.Broadcom.Chipsets.AirPortBrcm4360:
logging.info("- Fixing Legacy Bluetooth for macOS Monterey")
support.BuildSupport(self.model, self.constants, self.config).enable_kext("BlueToolFixup.kext", self.constants.bluetool_version, self.constants.bluetool_path)
# Older Mac firmwares (pre-2012) don't support the new chipsets correctly (regardless of WiFi card)
if self.model in smbios_data.smbios_dictionary:
if smbios_data.smbios_dictionary[self.model]["CPU Generation"] < cpu_data.CPUGen.ivy_bridge.value:
logging.info("- Fixing Legacy Bluetooth for macOS Monterey")
support.BuildSupport(self.model, self.constants, self.config).enable_kext("BlueToolFixup.kext", self.constants.bluetool_version, self.constants.bluetool_path)
self._bluetooth_firmware_incompatibility_workaround()
elif self.computer.bluetooth_chipset == "3rd Party Bluetooth 4.0 Hub":
logging.info("- Detected 3rd Party Bluetooth Chipset")
support.BuildSupport(self.model, self.constants, self.config).enable_kext("BlueToolFixup.kext", self.constants.bluetool_version, self.constants.bluetool_path)
@@ -87,7 +102,5 @@ class BuildBluetooth:
support.BuildSupport(self.model, self.constants, self.config).enable_kext("BlueToolFixup.kext", self.constants.bluetool_version, self.constants.bluetool_path)
if smbios_data.smbios_dictionary[self.model]["Bluetooth Model"] <= bluetooth_data.bluetooth_data.BRCM2070.value:
self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"] += " -btlfxallowanyaddr"
self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["bluetoothInternalControllerInfo"] = binascii.unhexlify("0000000000000000000000000000")
self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["bluetoothExternalDongleFailed"] = binascii.unhexlify("00")
self.config["NVRAM"]["Delete"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"] += ["bluetoothInternalControllerInfo", "bluetoothExternalDongleFailed"]
self._bluetooth_firmware_incompatibility_workaround()
support.BuildSupport(self.model, self.constants, self.config).enable_kext("Bluetooth-Spoof.kext", self.constants.btspoof_version, self.constants.btspoof_path)

View File

@@ -67,6 +67,9 @@ class BuildOpenCore:
support.BuildSupport(self.model, self.constants, self.config).enable_kext("Lilu.kext", self.constants.lilu_version, self.constants.lilu_path)
self.config["Kernel"]["Quirks"]["DisableLinkeditJettison"] = True
# macOS Sequoia support for Lilu plugins
self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"] += " -lilubetaall"
# Call support functions
for function in [
firmware.BuildFirmware,

View File

@@ -199,6 +199,12 @@ class BuildFirmware:
logging.info("- Adding IOHIDFamily patch")
support.BuildSupport(self.model, self.constants, self.config).get_item_by_kv(self.config["Kernel"]["Patch"], "Identifier", "com.apple.iokit.IOHIDFamily")["Enabled"] = True
# MacPro3,1/Xserve2,1 cannot boot with more than 4 threads in Sequoia
# Note cpus=4 only overrides if more than 4 threads are present. So same on dual-core units
if self.constants.force_quad_thread is True:
logging.info("- Adding CPU Thread Limit Patch")
self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"] += " cpus=4"
def _firmware_driver_handling(self) -> None:
"""

View File

@@ -354,7 +354,8 @@ class BuildGraphicsAudio:
# Due to regression in AppleALC 1.6.4+, temporarily use 1.6.3 and set override
if support.BuildSupport(self.model, self.constants, self.config).get_kext_by_bundle_path("AppleALC.kext")["Enabled"] is True:
self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"] += " -lilubetaall"
if "-lilubetaall" not in self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"]:
self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"] += " -lilubetaall"
def _firmware_handling(self) -> None:

View File

@@ -18,7 +18,8 @@ from ..detections import device_probe
from ..datasets import (
model_array,
smbios_data,
cpu_data
cpu_data,
os_data
)
@@ -64,6 +65,12 @@ xw
if self.constants.fu_status is False:
return
if not self.model in smbios_data.smbios_dictionary:
return
if smbios_data.smbios_dictionary[self.model]["Max OS Supported"] >= os_data.os_data.sonoma:
return
support.BuildSupport(self.model, self.constants, self.config).enable_kext("FeatureUnlock.kext", self.constants.featureunlock_version, self.constants.featureunlock_path)
if self.constants.fu_arguments is not None:
logging.info(f"- Adding additional FeatureUnlock args: {self.constants.fu_arguments}")
@@ -199,6 +206,7 @@ xw
logging.info("- Enabling SPI-based top case support")
support.BuildSupport(self.model, self.constants, self.config).enable_kext("AppleHSSPISupport.kext", self.constants.apple_spi_version, self.constants.apple_spi_path)
support.BuildSupport(self.model, self.constants, self.config).enable_kext("AppleHSSPIHIDDriver.kext", self.constants.apple_spi_hid_version, self.constants.apple_spi_hid_path)
support.BuildSupport(self.model, self.constants, self.config).enable_kext("AppleTopCaseInjector.kext", self.constants.topcase_inj_version, self.constants.top_case_inj_path)
#On-device probing
@@ -298,7 +306,7 @@ xw
# And MacPro4,1, MacPro5,1 and Xserve3,1 are the only post-Penryn Macs that lack an internal USB hub
# - Ref: https://techcommunity.microsoft.com/t5/microsoft-usb-blog/reasons-to-avoid-companion-controllers/ba-p/270710
#
# To be paired for sys_patch_dict.py's 'Legacy USB 1.1' patchset
# To be paired for usb11.py's 'Legacy USB 1.1' patchset
#
# Note: With macOS 14.1, injection of these kexts causes a panic.
# To avoid this, a MaxKernel is configured with XNU 23.0.0 (macOS 14.0).
@@ -380,4 +388,5 @@ xw
support.BuildSupport(self.model, self.constants, self.config).enable_kext("corecrypto_T1.kext", self.constants.t1_corecrypto_version, self.constants.t1_corecrypto_path)
support.BuildSupport(self.model, self.constants, self.config).enable_kext("AppleSSE.kext", self.constants.t1_sse_version, self.constants.t1_sse_path)
support.BuildSupport(self.model, self.constants, self.config).enable_kext("AppleKeyStore.kext", self.constants.t1_key_store_version, self.constants.t1_key_store_path)
support.BuildSupport(self.model, self.constants, self.config).enable_kext("AppleCredentialManager.kext", self.constants.t1_credential_version, self.constants.t1_credential_path)
support.BuildSupport(self.model, self.constants, self.config).enable_kext("AppleCredentialManager.kext", self.constants.t1_credential_version, self.constants.t1_credential_path)
support.BuildSupport(self.model, self.constants, self.config).enable_kext("KernelRelayHost.kext", self.constants.kernel_relay_version, self.constants.kernel_relay_path)

View File

@@ -10,7 +10,8 @@ from ...detections import device_probe
from ...datasets import (
smbios_data,
cpu_data
cpu_data,
os_data
)
@@ -55,6 +56,11 @@ class BuildWiredNetworking:
# the kernel driver to prevent a kernel panic
# - DriverKit: com.apple.DriverKit.AppleUserECM.dext
# - Kext: AppleUSBECM.kext
if not self.model in smbios_data.smbios_dictionary:
return
if smbios_data.smbios_dictionary[self.model]["Max OS Supported"] >= os_data.os_data.sonoma:
return
support.BuildSupport(self.model, self.constants, self.config).enable_kext("ECM-Override.kext", self.constants.ecm_override_version, self.constants.ecm_override_path)
@@ -66,6 +72,8 @@ class BuildWiredNetworking:
# See ECM logic for why it's always enabled
if not self.model in smbios_data.smbios_dictionary:
return
if smbios_data.smbios_dictionary[self.model]["Max OS Supported"] >= os_data.os_data.sonoma:
return
support.BuildSupport(self.model, self.constants, self.config).enable_kext("CatalinaIntelI210Ethernet.kext", self.constants.i210_version, self.constants.i210_path)
# Ivy Bridge and newer natively support DriverKit, so set MinKernel to 23.0.0
if smbios_data.smbios_dictionary[self.model]["CPU Generation"] >= cpu_data.CPUGen.ivy_bridge.value:

View File

@@ -12,6 +12,11 @@ from .. import constants
from ..support import utilities
from ..detections import device_probe
from ..datasets import (
smbios_data,
os_data
)
class BuildSecurity:
"""
@@ -83,5 +88,6 @@ class BuildSecurity:
logging.info("- Disabling SecureBootModel")
self.config["Misc"]["Security"]["SecureBootModel"] = "Disabled"
logging.info("- Enabling AMFIPass")
support.BuildSupport(self.model, self.constants, self.config).enable_kext("AMFIPass.kext", self.constants.amfipass_version, self.constants.amfipass_path)
if smbios_data.smbios_dictionary[self.model]["Max OS Supported"] < os_data.os_data.sonoma:
logging.info("- Enabling AMFIPass")
support.BuildSupport(self.model, self.constants, self.config).enable_kext("AMFIPass.kext", self.constants.amfipass_version, self.constants.amfipass_path)

View File

@@ -29,7 +29,7 @@ class CatalogProducts:
catalog: dict,
install_assistants_only: bool = True,
only_vmm_install_assistants: bool = True,
max_install_assistant_version: CatalogVersion = CatalogVersion.SONOMA
max_install_assistant_version: CatalogVersion = CatalogVersion.SEQUOIA
) -> None:
self.catalog: dict = catalog
self.ia_only: bool = install_assistants_only

View File

@@ -29,7 +29,7 @@ class CatalogURL:
extension (CatalogExtension): Extension for the catalog URL
"""
def __init__(self,
version: CatalogVersion = CatalogVersion.SONOMA,
version: CatalogVersion = CatalogVersion.SEQUOIA,
seed: SeedType = SeedType.PublicRelease,
extension: CatalogExtension = CatalogExtension.PLIST
) -> None:

View File

@@ -71,6 +71,11 @@ class GenerateDefaults:
global_settings.GlobalEnviromentSettings().write_property("MacBookPro_TeraScale_2_Accel", False)
self.constants.allow_ts2_accel = False
if self.model in ["MacPro3,1", "Xserve2,1"]:
self.constants.force_quad_thread = True
else:
self.constants.force_quad_thread = False
if self.model in smbios_data.smbios_dictionary:
if smbios_data.smbios_dictionary[self.model]["CPU Generation"] >= cpu_data.CPUGen.skylake.value:
# On 2016-2017 MacBook Pros, 15" devices used a stock Samsung SSD with IONVMeController
@@ -115,7 +120,6 @@ class GenerateDefaults:
# As we don't spoof on native models, we can safely ignore this
spoof_model = self.model
if spoof_model in smbios_data.smbios_dictionary:
if smbios_data.smbios_dictionary[spoof_model]["SecureBootModel"] is not None:
if self.constants.sip_status is False:
@@ -198,7 +202,6 @@ class GenerateDefaults:
device_probe.Broadcom.Chipsets.AirportBrcmNIC,
]
):
print("Modern WiFi")
is_modern_wifi = True
if is_legacy_wifi is False and is_modern_wifi is False:
@@ -206,10 +209,13 @@ class GenerateDefaults:
# 12.0: Legacy Wireless chipsets require root patching
# 14.0: Modern Wireless chipsets require root patching
self.constants.sip_status = False
self.constants.secure_status = False
self.constants.disable_cs_lv = True
self.constants.disable_amfi = True
if self.model in smbios_data.smbios_dictionary:
if smbios_data.smbios_dictionary[self.model]["Max OS Supported"] < os_data.os_data.sonoma:
self.constants.sip_status = True
self.constants.sip_status = False
self.constants.secure_status = False
self.constants.disable_cs_lv = True
self.constants.disable_amfi = True
if is_legacy_wifi is True:
# 13.0: Enabling AirPlay to Mac patches breaks Control Center on legacy chipsets

View File

@@ -135,7 +135,7 @@ class InstallerCreation():
with script_location.open("w") as script:
script.write(f'''#!/bin/bash
erase_disk='diskutil eraseDisk HFS+ OCLP-Installer {disk}'
erase_disk='/usr/sbin/diskutil eraseDisk HFS+ OCLP-Installer {disk}'
if $erase_disk; then
"{createinstallmedia_path}" --volume /Volumes/OCLP-Installer --nointeraction{additional_args}
fi

View File

@@ -0,0 +1,274 @@
"""
metallib_handler.py: Library for handling Metal libraries
"""
import logging
import requests
import subprocess
import packaging.version
from typing import cast
from pathlib import Path
from . import network_handler, subprocess_wrapper
from .. import constants
from ..datasets import os_data
METALLIB_INSTALL_PATH: str = "/Library/Application Support/Dortania/MetallibSupportPkg"
METALLIB_API_LINK: str = "https://dortania.github.io/MetallibSupportPkg/manifest.json"
METALLIB_ASSET_LIST: list = None
class MetalLibraryObject:
def __init__(self, global_constants: constants.Constants,
host_build: str, host_version: str,
ignore_installed: bool = False, passive: bool = False
) -> None:
self.constants: constants.Constants = global_constants
self.host_build: str = host_build # ex. 20A5384c
self.host_version: str = host_version # ex. 11.0.1
self.passive: bool = passive # Don't perform actions requiring elevated privileges
self.ignore_installed: bool = ignore_installed # If True, will ignore any installed MetallibSupportPkg PKGs and download the latest
self.metallib_already_installed: bool = False
self.metallib_installed_path: str = ""
self.metallib_url: str = ""
self.metallib_url_build: str = ""
self.metallib_url_version: str = ""
self.metallib_url_is_exactly_match: bool = False
self.metallib_closest_match_url: str = ""
self.metallib_closest_match_url_build: str = ""
self.metallib_closest_match_url_version: str = ""
self.success: bool = False
self.error_msg: str = ""
self._get_latest_metallib()
def _get_remote_metallibs(self) -> dict:
"""
Get the MetallibSupportPkg list from the API
"""
global METALLIB_ASSET_LIST
logging.info("Pulling metallib list from MetallibSupportPkg API")
if METALLIB_ASSET_LIST:
return METALLIB_ASSET_LIST
try:
results = network_handler.NetworkUtilities().get(
METALLIB_API_LINK,
headers={
"User-Agent": f"OCLP/{self.constants.patcher_version}"
},
timeout=5
)
except (requests.exceptions.Timeout, requests.exceptions.TooManyRedirects, requests.exceptions.ConnectionError):
logging.info("Could not contact MetallibSupportPkg API")
return None
if results.status_code != 200:
logging.info("Could not fetch Metallib list")
return None
METALLIB_ASSET_LIST = results.json()
return METALLIB_ASSET_LIST
def _get_latest_metallib(self) -> None:
"""
Get the latest MetallibSupportPkg PKG
"""
parsed_version = cast(packaging.version.Version, packaging.version.parse(self.host_version))
if os_data.os_conversion.os_to_kernel(str(parsed_version.major)) < os_data.os_data.sequoia:
self.error_msg = "MetallibSupportPkg is not required for macOS Sonoma or older"
logging.warning(f"{self.error_msg}")
return
self.metallib_installed_path = self._local_metallib_installed()
if self.metallib_installed_path:
logging.info(f"metallib already installed ({Path(self.metallib_installed_path).name}), skipping")
self.metallib_already_installed = True
self.success = True
return
remote_metallib_version = self._get_remote_metallibs()
if remote_metallib_version is None:
logging.warning("Failed to fetch metallib list, falling back to local metallib matching")
# First check if a metallib matching the current macOS version is installed
# ex. 13.0.1 vs 13.0
loose_version = f"{parsed_version.major}.{parsed_version.minor}"
logging.info(f"Checking for metallibs loosely matching {loose_version}")
self.metallib_installed_path = self._local_metallib_installed(match=loose_version, check_version=True)
if self.metallib_installed_path:
logging.info(f"Found matching metallib: {Path(self.metallib_installed_path).name}")
self.metallib_already_installed = True
self.success = True
return
older_version = f"{parsed_version.major}.{parsed_version.minor - 1 if parsed_version.minor > 0 else 0}"
logging.info(f"Checking for metallibs matching {older_version}")
self.metallib_installed_path = self._local_metallib_installed(match=older_version, check_version=True)
if self.metallib_installed_path:
logging.info(f"Found matching metallib: {Path(self.metallib_installed_path).name}")
self.metallib_already_installed = True
self.success = True
return
logging.warning(f"Couldn't find metallib matching {self.host_version} or {older_version}, please install one manually")
self.error_msg = f"Could not contact MetallibSupportPkg API, and no metallib matching {self.host_version} ({self.host_build}) or {older_version} was installed.\nPlease ensure you have a network connection or manually install a metallib."
return
# First check exact match
for metallib in remote_metallib_version:
if (metallib["build"] != self.host_build):
continue
self.metallib_url = metallib["url"]
self.metallib_url_build = metallib["build"]
self.metallib_url_version = metallib["version"]
self.metallib_url_is_exactly_match = True
break
# If no exact match, check for closest match
if self.metallib_url == "":
for metallib in remote_metallib_version:
metallib_version = cast(packaging.version.Version, packaging.version.parse(metallib["version"]))
if metallib_version > parsed_version:
continue
if metallib_version.major != parsed_version.major:
continue
if metallib_version.minor not in range(parsed_version.minor - 1, parsed_version.minor + 1):
continue
# The metallib list is already sorted by version then date, so the first match is the closest
self.metallib_closest_match_url = metallib["url"]
self.metallib_closest_match_url_build = metallib["build"]
self.metallib_closest_match_url_version = metallib["version"]
self.metallib_url_is_exactly_match = False
break
if self.metallib_url == "":
if self.metallib_closest_match_url == "":
logging.warning(f"No metallibs found for {self.host_build} ({self.host_version})")
self.error_msg = f"No metallibs found for {self.host_build} ({self.host_version})"
return
logging.info(f"No direct match found for {self.host_build}, falling back to closest match")
logging.info(f"Closest Match: {self.metallib_closest_match_url_build} ({self.metallib_closest_match_url_version})")
self.metallib_url = self.metallib_closest_match_url
self.metallib_url_build = self.metallib_closest_match_url_build
self.metallib_url_version = self.metallib_closest_match_url_version
else:
logging.info(f"Direct match found for {self.host_build} ({self.host_version})")
# Check if this metallib is already installed
self.metallib_installed_path = self._local_metallib_installed(match=self.metallib_url_build)
if self.metallib_installed_path:
logging.info(f"metallib already installed ({Path(self.metallib_installed_path).name}), skipping")
self.metallib_already_installed = True
self.success = True
return
logging.info("Following metallib is recommended:")
logging.info(f"- metallib Build: {self.metallib_url_build}")
logging.info(f"- metallib Version: {self.metallib_url_version}")
logging.info(f"- metallib URL: {self.metallib_url}")
self.success = True
def _local_metallib_installed(self, match: str = None, check_version: bool = False) -> str:
"""
Check if a metallib is already installed
"""
if self.ignore_installed:
return None
if not Path(METALLIB_INSTALL_PATH).exists():
return None
for metallib_folder in Path(METALLIB_INSTALL_PATH).iterdir():
if not metallib_folder.is_dir():
continue
if check_version:
if match not in metallib_folder.name:
continue
else:
if not metallib_folder.name.endswith(f"-{match}"):
continue
return metallib_folder
return None
def retrieve_download(self, override_path: str = "") -> network_handler.DownloadObject:
"""
Retrieve MetallibSupportPkg PKG download object
"""
self.success = False
self.error_msg = ""
if self.metallib_already_installed:
logging.info("No download required, metallib already installed")
self.success = True
return None
if self.metallib_url == "":
self.error_msg = "Could not retrieve metallib catalog, no metallib to download"
logging.error(self.error_msg)
return None
logging.info(f"Returning DownloadObject for metallib: {Path(self.metallib_url).name}")
self.success = True
metallib_download_path = self.constants.metallib_download_path if override_path == "" else Path(override_path)
return network_handler.DownloadObject(self.metallib_url, metallib_download_path)
def install_metallib(self, metallib: str = None) -> None:
"""
Install MetallibSupportPkg PKG
"""
if not self.success:
logging.error("Cannot install metallib, no metallib was successfully retrieved")
return False
if self.metallib_already_installed:
logging.info("No installation required, metallib already installed")
return True
result = subprocess_wrapper.run_as_root([
"/usr/sbin/installer", "-pkg", metallib if metallib else self.constants.metallib_download_path, "-target", "/"
], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
if result.returncode != 0:
subprocess_wrapper.log(result)
return False
return True

View File

@@ -2,6 +2,7 @@
validation.py: Validation class for the patcher
"""
import atexit
import logging
import subprocess
@@ -18,9 +19,13 @@ from ..support import subprocess_wrapper
from ..datasets import (
example_data,
model_array,
sys_patch_dict,
os_data
)
from ..sys_patch.patchsets import (
HardwarePatchsetDetection,
PatchType,
DynamicPatchset
)
class PatcherValidation:
@@ -119,48 +124,55 @@ class PatcherValidation:
minor_kernel (int): Minor kernel version
"""
patchset = sys_patch_dict.SystemPatchDictionary(major_kernel, minor_kernel, self.constants.legacy_accel_support, self.constants.detected_os_version).patchset_dict
host_os_float = float(f"{major_kernel}.{minor_kernel}")
patch_type_merge_exempt = ["MechanismPlugins"]
patch_type_overwrite_exempt = []
for patch_subject in patchset:
for patch_core in patchset[patch_subject]:
patch_os_min_float = float(f'{patchset[patch_subject][patch_core]["OS Support"]["Minimum OS Support"]["OS Major"]}.{patchset[patch_subject][patch_core]["OS Support"]["Minimum OS Support"]["OS Minor"]}')
patch_os_max_float = float(f'{patchset[patch_subject][patch_core]["OS Support"]["Maximum OS Support"]["OS Major"]}.{patchset[patch_subject][patch_core]["OS Support"]["Maximum OS Support"]["OS Minor"]}')
if (host_os_float < patch_os_min_float or host_os_float > patch_os_max_float):
continue
for install_type in ["Install", "Install Non-Root"]:
if install_type in patchset[patch_subject][patch_core]:
for install_directory in patchset[patch_subject][patch_core][install_type]:
for install_file in patchset[patch_subject][patch_core][install_type][install_directory]:
source_file = str(self.constants.payload_local_binaries_root_path) + "/" + patchset[patch_subject][patch_core][install_type][install_directory][install_file] + install_directory + "/" + install_file
if not Path(source_file).exists():
logging.info(f"File not found: {source_file}")
raise Exception(f"Failed to find {source_file}")
if self.verify_unused_files is True:
patchset = HardwarePatchsetDetection(self.constants, xnu_major=major_kernel, xnu_minor=minor_kernel, validation=True).patches
for patch_core in patchset:
# Check if any unknown PathType is present
for install_type in patchset[patch_core]:
if install_type not in PatchType:
raise Exception(f"Unknown PatchType: {install_type}")
for install_type in [PatchType.OVERWRITE_SYSTEM_VOLUME, PatchType.OVERWRITE_DATA_VOLUME, PatchType.MERGE_SYSTEM_VOLUME, PatchType.MERGE_DATA_VOLUME]:
if install_type in patchset[patch_core]:
for install_directory in patchset[patch_core][install_type]:
for install_file in patchset[patch_core][install_type][install_directory]:
try:
if patchset[patch_core][install_type][install_directory][install_file] in DynamicPatchset:
continue
except TypeError:
pass
# Technically there is nothing wrong with using a .framework with OVERWRITE, but it's a good indicator of a mistake
if install_type in [PatchType.OVERWRITE_SYSTEM_VOLUME, PatchType.OVERWRITE_DATA_VOLUME]:
if install_file.endswith(".framework") and install_file not in patch_type_overwrite_exempt:
raise Exception(f"{install_file} used with {install_type}, are you certain this is correct?")
elif install_type in [PatchType.MERGE_SYSTEM_VOLUME, PatchType.MERGE_DATA_VOLUME]:
if not install_file.endswith(".framework") and install_file not in patch_type_merge_exempt:
raise Exception(f"{install_file} used with {install_type}, are you certain this is correct?")
source_file = str(self.constants.payload_local_binaries_root_path) + "/" + patchset[patch_core][install_type][install_directory][install_file] + install_directory + "/" + install_file
if not Path(source_file).exists():
logging.info(f"File not found: {source_file}")
raise Exception(f"Failed to find {source_file}")
if self.verify_unused_files is True:
if source_file not in self.active_patchset_files:
self.active_patchset_files.append(source_file)
logging.info(f"Validating against Darwin {major_kernel}.{minor_kernel}")
if not sys_patch_helpers.SysPatchHelpers(self.constants).generate_patchset_plist(patchset, f"OpenCore-Legacy-Patcher-{major_kernel}.{minor_kernel}.plist", None):
if not sys_patch_helpers.SysPatchHelpers(self.constants).generate_patchset_plist(patchset, f"OpenCore-Legacy-Patcher-{major_kernel}.{minor_kernel}.plist", None, None):
raise Exception("Failed to generate patchset plist")
# Remove the plist file after validation
Path(self.constants.payload_path / f"OpenCore-Legacy-Patcher-{major_kernel}.{minor_kernel}.plist").unlink()
def _validate_sys_patch(self) -> None:
def _unmount_dmg(self) -> None:
"""
Validates sys_patch modules
Unmounts the Universal-Binaries.dmg
"""
if not Path(self.constants.payload_local_binaries_root_path_dmg).exists():
dl_obj = network_handler.DownloadObject(f"https://github.com/dortania/PatcherSupportPkg/releases/download/{self.constants.patcher_support_pkg_version}/Universal-Binaries.dmg", self.constants.payload_local_binaries_root_path_dmg)
dl_obj.download(spawn_thread=False)
if dl_obj.download_complete is False:
logging.info("Failed to download Universal-Binaries.dmg")
raise Exception("Failed to download Universal-Binaries.dmg")
logging.info("Validating Root Patch File integrity")
if Path(self.constants.payload_path / Path("Universal-Binaries_overlay")).exists():
subprocess.run(
[
@@ -183,6 +195,23 @@ class PatcherValidation:
raise Exception("Failed to unmount Universal-Binaries.dmg")
def _validate_sys_patch(self) -> None:
"""
Validates sys_patch modules
"""
if not Path(self.constants.payload_local_binaries_root_path_dmg).exists():
dl_obj = network_handler.DownloadObject(f"https://github.com/dortania/PatcherSupportPkg/releases/download/{self.constants.patcher_support_pkg_version}/Universal-Binaries.dmg", self.constants.payload_local_binaries_root_path_dmg)
dl_obj.download(spawn_thread=False)
if dl_obj.download_complete is False:
logging.info("Failed to download Universal-Binaries.dmg")
raise Exception("Failed to download Universal-Binaries.dmg")
logging.info("Validating Root Patch File integrity")
self._unmount_dmg()
output = subprocess.run(
[
"/usr/bin/hdiutil", "attach", "-noverify", f"{self.constants.payload_local_binaries_root_path_dmg}",
@@ -202,8 +231,9 @@ class PatcherValidation:
logging.info("Mounted Universal-Binaries.dmg")
atexit.register(self._unmount_dmg)
for supported_os in [os_data.os_data.big_sur, os_data.os_data.monterey, os_data.os_data.ventura, os_data.os_data.sonoma]:
for supported_os in [os_data.os_data.big_sur, os_data.os_data.monterey, os_data.os_data.ventura, os_data.os_data.sonoma, os_data.os_data.sequoia]:
for i in range(0, 10):
self._validate_root_patch_files(supported_os, i)

View File

@@ -78,7 +78,11 @@ class InstallAutomaticPatchingServices:
kexts = []
for kext in Path("/Library/Extensions").glob("*.kext"):
if not Path(f"{kext}/Contents/Info.plist").exists():
try:
if not Path(f"{kext}/Contents/Info.plist").exists():
continue
except Exception as e:
logging.info(f" - Failed to check if {kext.name} is a directory: {e}")
continue
try:
kext_plist = plistlib.load(open(f"{kext}/Contents/Info.plist", "rb"))

View File

@@ -12,7 +12,6 @@ import markdown2
import subprocess
import webbrowser
from ..detections import DetectRootPatch
from ... import constants
@@ -28,6 +27,10 @@ from ...support import (
global_settings,
network_handler,
)
from ..patchsets import (
HardwarePatchsetDetection,
HardwarePatchsetValidation
)
class StartAutomaticPatching:
@@ -142,12 +145,12 @@ Please check the Github page for more information about this release."""
if utilities.check_seal() is True:
logging.info("- Detected Snapshot seal intact, detecting patches")
patches = DetectRootPatch(self.constants.computer.real_model, self.constants).detect_patch_set()
patches = HardwarePatchsetDetection(self.constants).device_properties
if not any(not patch.startswith("Settings") and not patch.startswith("Validation") and patches[patch] is True for patch in patches):
patches = {}
if patches:
logging.info("- Detected applicable patches, determining whether possible to patch")
if patches["Validation: Patching Possible"] is False:
if patches[HardwarePatchsetValidation.PATCHING_NOT_POSSIBLE] is True:
logging.info("- Cannot run patching")
return
@@ -186,10 +189,12 @@ Please check the Github page for more information about this release."""
if self._determine_if_versions_match():
self._determine_if_boot_matches()
def _onWebviewNav(self, event):
url = event.GetURL()
webbrowser.open(url)
def _determine_if_versions_match(self):
"""
Determine if the booted version of OCLP matches the installed version

View File

@@ -1,5 +0,0 @@
"""
detections: Detect and generate patch sets for the host
"""
from .detect import DetectRootPatch
from .generate import GenerateRootPatchSets

View File

@@ -1,822 +0,0 @@
"""
detect.py: Hardware Detection Logic for Root Patching
"""
import logging
import plistlib
import py_sip_xnu
import packaging.version
from pathlib import Path
from ... import constants
from ...detections import (
amfi_detect,
device_probe
)
from ...support import (
kdk_handler,
network_handler,
utilities
)
from ...datasets import (
cpu_data,
model_array,
os_data,
sip_data,
smbios_data
)
class DetectRootPatch:
"""
Library for querying root volume patches applicable for booted system
"""
def __init__(self, model: str, global_constants: constants.Constants,
os_major: int = None, os_minor: int = None,
os_build: str = None, os_version: str = None
) -> None:
self.model: str = model
self.constants: constants.Constants = global_constants
if os_major is None:
os_major = self.constants.detected_os
if os_minor is None:
os_minor = self.constants.detected_os_minor
if os_build is None:
os_build = self.constants.detected_os_build
if os_version is None:
os_version = self.constants.detected_os_version
self.os_major: int = os_major
self.os_minor: int = os_minor
self.os_build: str = os_build
self.os_version: str = os_version
self.computer = self.constants.computer
# GPU Patch Detection
self.nvidia_tesla = False
self.kepler_gpu = False
self.nvidia_web = False
self.amd_ts1 = False
self.amd_ts2 = False
self.iron_gpu = False
self.sandy_gpu = False
self.ivy_gpu = False
self.haswell_gpu = False
self.broadwell_gpu = False
self.skylake_gpu = False
self.legacy_gcn = False
self.legacy_gcn_v2 = False
self.legacy_polaris = False
self.legacy_vega = False
# Misc Patch Detection
self.brightness_legacy = False
self.legacy_audio = False
self.legacy_wifi = False
self.modern_wifi = False
self.legacy_gmux = False
self.legacy_keyboard_backlight = False
self.legacy_uhci_ohci = False
self.legacy_pcie_webcam = False
self.legacy_t1_chip = False
# Patch Requirements
self.amfi_must_disable = False
self.amfi_shim_bins = False
self.supports_metal = False
self.needs_nv_web_checks = False
self.requires_root_kc = False
# Validation Checks
self.sip_enabled = False
self.sbm_enabled = False
self.amfi_enabled = False
self.fv_enabled = False
self.dosdude_patched = False
self.missing_kdk = False
self.has_network = False
self.unsupported_os = False
self.missing_whatever_green = False
self.missing_nv_web_nvram = False
self.missing_nv_web_opengl = False
self.missing_nv_compat = False
def _detect_gpus(self):
"""
Query GPUs and set flags for applicable patches
"""
gpus = self.constants.computer.gpus
non_metal_os = os_data.os_data.catalina
for i, gpu in enumerate(gpus):
if gpu.class_code and gpu.class_code != 0xFFFFFFFF:
logging.info(f"Found GPU ({i}): {utilities.friendly_hex(gpu.vendor_id)}:{utilities.friendly_hex(gpu.device_id)}")
if gpu.arch in [device_probe.NVIDIA.Archs.Tesla] and self.constants.force_nv_web is False:
if self.os_major > non_metal_os:
self.nvidia_tesla = True
self.amfi_must_disable = True
if os_data.os_data.ventura in self.constants.legacy_accel_support:
self.amfi_shim_bins = True
self.legacy_keyboard_backlight = self._check_legacy_keyboard_backlight()
self.requires_root_kc = True
elif gpu.arch == device_probe.NVIDIA.Archs.Kepler and self.constants.force_nv_web is False:
if self.os_major > os_data.os_data.big_sur:
# Kepler drivers were dropped with Beta 7
# 12.0 Beta 5: 21.0.0 - 21A5304g
# 12.0 Beta 6: 21.1.0 - 21A5506j
# 12.0 Beta 7: 21.1.0 - 21A5522h
if (
self.os_major >= os_data.os_data.ventura or
(
"21A5506j" not in self.os_build and
self.os_major == os_data.os_data.monterey and
self.os_minor > 0
)
):
self.kepler_gpu = True
self.supports_metal = True
if self.os_major >= os_data.os_data.ventura:
self.amfi_must_disable = True
if (self.os_major == os_data.os_data.ventura and self.os_minor >= 4) or self.os_major > os_data.os_data.ventura:
self.amfi_shim_bins = True
elif gpu.arch in [
device_probe.NVIDIA.Archs.Fermi,
device_probe.NVIDIA.Archs.Kepler,
device_probe.NVIDIA.Archs.Maxwell,
device_probe.NVIDIA.Archs.Pascal,
]:
if self.os_major > os_data.os_data.mojave:
self.nvidia_web = True
self.amfi_must_disable = True
if os_data.os_data.ventura in self.constants.legacy_accel_support:
self.amfi_shim_bins = True
self.needs_nv_web_checks = True
self.requires_root_kc = True
elif gpu.arch == device_probe.AMD.Archs.TeraScale_1:
if self.os_major > non_metal_os:
self.amd_ts1 = True
self.amfi_must_disable = True
if os_data.os_data.ventura in self.constants.legacy_accel_support:
self.amfi_shim_bins = True
self.requires_root_kc = True
elif gpu.arch == device_probe.AMD.Archs.TeraScale_2:
if self.os_major > non_metal_os:
self.amd_ts2 = True
self.amfi_must_disable = True
if os_data.os_data.ventura in self.constants.legacy_accel_support:
self.amfi_shim_bins = True
self.requires_root_kc = True
elif gpu.arch in [
device_probe.AMD.Archs.Legacy_GCN_7000,
device_probe.AMD.Archs.Legacy_GCN_8000,
device_probe.AMD.Archs.Legacy_GCN_9000,
device_probe.AMD.Archs.Polaris,
]:
if self.os_major > os_data.os_data.monterey:
if self.constants.computer.rosetta_active is True:
continue
if gpu.arch == device_probe.AMD.Archs.Polaris:
# Check if host supports AVX2.0
# If not, enable legacy GCN patch
# MacBookPro13,3 does include an unsupported framebuffer, thus we'll patch to ensure
# full compatibility (namely power states, etc)
# Reference: https://github.com/dortania/bugtracker/issues/292
# TODO: Probe framebuffer families further
# Sonoma note: MacBookPro14,3 has the same issue...
# iMac18,2/3 is partially affected, however currently it seems the generic framebuffer
# is sufficient. Only MacBookPro14,3 needs this for dGPU handling
if self.model not in ["MacBookPro13,3", "MacBookPro14,3"]:
if "AVX2" in self.constants.computer.cpu.leafs:
continue
self.legacy_polaris = True
else:
if self.model == "MacBookPro13,3":
self.legacy_gcn = True
elif self.model == "MacBookPro14,3":
if self.os_major < os_data.os_data.sonoma:
continue
self.legacy_gcn_v2 = True
else:
self.legacy_gcn = True
self.supports_metal = True
self.requires_root_kc = True
self.amfi_must_disable = True
elif gpu.arch == device_probe.AMD.Archs.Vega:
if self.os_major > os_data.os_data.monterey:
if "AVX2" in self.constants.computer.cpu.leafs:
continue
self.legacy_vega = True
self.supports_metal = True
self.requires_root_kc = True
self.amfi_must_disable = True
elif gpu.arch == device_probe.Intel.Archs.Iron_Lake:
if self.os_major > non_metal_os:
self.iron_gpu = True
self.amfi_must_disable = True
if os_data.os_data.ventura in self.constants.legacy_accel_support:
self.amfi_shim_bins = True
self.legacy_keyboard_backlight = self._check_legacy_keyboard_backlight()
self.requires_root_kc = True
elif gpu.arch == device_probe.Intel.Archs.Sandy_Bridge:
if self.os_major > non_metal_os:
self.sandy_gpu = True
self.amfi_must_disable = True
if os_data.os_data.ventura in self.constants.legacy_accel_support:
self.amfi_shim_bins = True
self.legacy_keyboard_backlight = self._check_legacy_keyboard_backlight()
self.requires_root_kc = True
elif gpu.arch == device_probe.Intel.Archs.Ivy_Bridge:
if self.os_major > os_data.os_data.big_sur:
self.ivy_gpu = True
if self.os_major >= os_data.os_data.ventura:
self.amfi_must_disable = True
if (self.os_major == os_data.os_data.ventura and self.os_minor >= 4) or self.os_major > os_data.os_data.ventura:
self.amfi_shim_bins = True
self.supports_metal = True
elif gpu.arch == device_probe.Intel.Archs.Haswell:
if self.os_major > os_data.os_data.monterey:
self.haswell_gpu = True
self.amfi_must_disable = True
if (self.os_major == os_data.os_data.ventura and self.os_minor >= 4) or self.os_major > os_data.os_data.ventura:
self.amfi_shim_bins = True
self.supports_metal = True
elif gpu.arch == device_probe.Intel.Archs.Broadwell:
if self.os_major > os_data.os_data.monterey:
self.broadwell_gpu = True
self.amfi_must_disable = True
self.supports_metal = True
elif gpu.arch == device_probe.Intel.Archs.Skylake:
if self.os_major > os_data.os_data.monterey:
self.skylake_gpu = True
self.amfi_must_disable = True
self.supports_metal = True
if self.supports_metal is True:
# Avoid patching Metal and non-Metal GPUs if both present, prioritize Metal GPU
# Main concerns are for iMac12,x with Sandy iGPU and Kepler dGPU
self.nvidia_tesla = False
self.nvidia_web = False
self.amd_ts1 = False
self.amd_ts2 = False
self.iron_gpu = False
self.sandy_gpu = False
self.legacy_keyboard_backlight = False
if self.legacy_gcn is True or self.legacy_gcn_v2 is True:
# We can only support one or the other due to the nature of relying
# on portions of the native AMD stack for Polaris and Vega
# Thus we'll prioritize legacy GCN due to being the internal card
# ex. MacPro6,1 and MacBookPro11,5 with eGPUs
self.legacy_polaris = False
self.legacy_vega = False
if self.os_major <= os_data.os_data.monterey:
# Always assume Root KC requirement on Monterey and older
self.requires_root_kc = True
else:
if self.requires_root_kc is True:
self.missing_kdk = not self._check_kdk()
def _check_networking_support(self):
"""
Query for network requirement, ex. KDK downloading
On macOS Ventura, networking support is required to download KDKs.
However for machines such as BCM94322, BCM94328 and Atheros chipsets,
users may only have wifi as their only supported network interface.
Thus we'll allow for KDK-less installs for these machines on first run.
On subsequent runs, we'll require networking to be enabled.
"""
# Increase OS check if modern wifi is detected
if self.os_major < (os_data.os_data.ventura if self.legacy_wifi is True else os_data.os_data.sonoma):
return
if self.legacy_wifi is False and self.modern_wifi is False:
return
if self.requires_root_kc is False:
return
if self.missing_kdk is False:
return
if self.has_network is True:
return
# Verify whether OCLP already installed network patches to the root volume
# If so, require networking to be enabled (user just needs to connect to wifi)
oclp_patch_path = "/System/Library/CoreServices/OpenCore-Legacy-Patcher.plist"
if Path(oclp_patch_path).exists():
oclp_plist = plistlib.load(open(oclp_patch_path, "rb"))
if "Legacy Wireless" in oclp_plist or "Modern Wireless" in oclp_plist:
return
# Due to the reliance of KDKs for most older patches, we'll allow KDK-less
# installs for Legacy Wifi patches and remove others
self.missing_kdk = False
self.requires_root_kc = False
# Reset patches needing KDK
self.nvidia_tesla = False
self.nvidia_web = False
self.amd_ts1 = False
self.amd_ts2 = False
self.iron_gpu = False
self.sandy_gpu = False
self.legacy_gcn = False
self.legacy_gcn_v2 = False
self.legacy_polaris = False
self.legacy_vega = False
self.brightness_legacy = False
self.legacy_audio = False
self.legacy_gmux = False
self.legacy_keyboard_backlight = False
# Currently all graphics patches require a KDK
if self.os_major >= os_data.os_data.sonoma:
self.kepler_gpu = False
self.ivy_gpu = False
self.haswell_gpu = False
self.broadwell_gpu = False
self.skylake_gpu = False
def _check_dgpu_status(self):
"""
Query whether system has an active dGPU
"""
dgpu = self.constants.computer.dgpu
if dgpu:
if dgpu.class_code and dgpu.class_code == 0xFFFFFFFF:
# If dGPU is disabled via class-codes, assume demuxed
return False
return True
return False
def _detect_demux(self):
"""
Query whether system has been demuxed (ex. MacBookPro8,2, disabled dGPU)
"""
# If GFX0 is missing, assume machine was demuxed
# -wegnoegpu would also trigger this, so ensure arg is not present
if not "-wegnoegpu" in (utilities.get_nvram("boot-args", decode=True) or ""):
igpu = self.constants.computer.igpu
dgpu = self._check_dgpu_status()
if igpu and not dgpu:
return True
return False
def _check_legacy_keyboard_backlight(self):
"""
Query whether system has a legacy keyboard backlight
Returns:
bool: True if legacy keyboard backlight, False otherwise
"""
# iMac12,x+ have an 'ACPI0008' device, but it's not a keyboard backlight
# Best to assume laptops will have a keyboard backlight
if self.model.startswith("MacBook"):
return self.constants.computer.ambient_light_sensor
return False
def _check_nv_web_nvram(self):
"""
Query for Nvidia Web Driver property: nvda_drv_vrl or nvda_drv
Returns:
bool: True if property is present, False otherwise
"""
nv_on = utilities.get_nvram("boot-args", decode=True)
if nv_on:
if "nvda_drv_vrl=" in nv_on:
return True
nv_on = utilities.get_nvram("nvda_drv")
if nv_on:
return True
return False
def _check_nv_web_opengl(self):
"""
Query for Nvidia Web Driver property: ngfxgl
Verify Web Drivers will run in OpenGL mode
Returns:
bool: True if property is present, False otherwise
"""
nv_on = utilities.get_nvram("boot-args", decode=True)
if nv_on:
if "ngfxgl=" in nv_on:
return True
for gpu in self.constants.computer.gpus:
if isinstance(gpu, device_probe.NVIDIA):
if gpu.disable_metal is True:
return True
return False
def _check_nv_compat(self):
"""
Query for Nvidia Web Driver property: ngfxcompat
Verify Web Drivers will skip NVDAStartupWeb compatibility check
Returns:
bool: True if property is present, False otherwise
"""
nv_on = utilities.get_nvram("boot-args", decode=True)
if nv_on:
if "ngfxcompat=" in nv_on:
return True
for gpu in self.constants.computer.gpus:
if isinstance(gpu, device_probe.NVIDIA):
if gpu.force_compatible is True:
return True
return False
def _check_whatevergreen(self):
"""
Query whether WhateverGreen.kext is loaded
Returns:
bool: True if loaded, False otherwise
"""
return utilities.check_kext_loaded("as.vit9696.WhateverGreen")
def _check_os_compat(self) -> bool:
"""
Base check to ensure patcher is compatible with host OS
"""
min_os = os_data.os_data.big_sur
max_os = os_data.os_data.sonoma
if self.os_major < min_os or self.os_major > max_os:
return False
return True
def _check_kdk(self):
"""
Query whether Kernel Debug Kit is installed
Returns:
bool: True if installed, False otherwise
"""
return kdk_handler.KernelDebugKitObject(self.constants, self.os_build, self.os_version, passive=True).kdk_already_installed
def _check_sip(self):
"""
Query System Integrity checks required for patching
Returns:
tuple: (list, str, str) of SIP values, SIP hex, SIP error message
"""
if self.os_major > os_data.os_data.catalina:
if self.nvidia_web is True:
sip = sip_data.system_integrity_protection.root_patch_sip_big_sur_3rd_part_kexts
sip_hex = "0xA03"
sip_value = (
f"For Hackintoshes, please set csr-active-config to '030A0000' ({sip_hex})\nFor non-OpenCore Macs, please run 'csrutil disable' and \n'csrutil authenticated-root disable' in RecoveryOS"
)
elif self.os_major >= os_data.os_data.ventura:
sip = sip_data.system_integrity_protection.root_patch_sip_ventura
sip_hex = "0x803"
sip_value = (
f"For Hackintoshes, please set csr-active-config to '03080000' ({sip_hex})\nFor non-OpenCore Macs, please run 'csrutil disable' and \n'csrutil authenticated-root disable' in RecoveryOS"
)
else:
sip = sip_data.system_integrity_protection.root_patch_sip_big_sur
sip_hex = "0x802"
sip_value = (
f"For Hackintoshes, please set csr-active-config to '02080000' ({sip_hex})\nFor non-OpenCore Macs, please run 'csrutil disable' and \n'csrutil authenticated-root disable' in RecoveryOS"
)
else:
sip = sip_data.system_integrity_protection.root_patch_sip_mojave
sip_hex = "0x603"
sip_value = f"For Hackintoshes, please set csr-active-config to '03060000' ({sip_hex})\nFor non-OpenCore Macs, please run 'csrutil disable' in RecoveryOS"
return (sip, sip_value, sip_hex)
def _check_uhci_ohci(self):
"""
Query whether host has UHCI/OHCI controllers, and requires USB 1.1 patches
Returns:
bool: True if UHCI/OHCI patches required, False otherwise
"""
if self.os_major < os_data.os_data.ventura:
return False
# If we're on a hackintosh, check for UHCI/OHCI controllers
if self.constants.host_is_hackintosh is True:
for controller in self.constants.computer.usb_controllers:
if (
isinstance(controller, device_probe.UHCIController) or
isinstance(controller, device_probe.OHCIController)
):
return True
return False
if self.model not in smbios_data.smbios_dictionary:
return False
# If we're on a Mac, check for Penryn or older
# This is due to Apple implementing an internal USB hub on post-Penryn (excluding MacPro4,1, MacPro5,1 and Xserve3,1)
# Ref: https://techcommunity.microsoft.com/t5/microsoft-usb-blog/reasons-to-avoid-companion-controllers/ba-p/270710
if (
smbios_data.smbios_dictionary[self.model]["CPU Generation"] <= cpu_data.CPUGen.penryn.value or \
self.model in ["MacPro4,1", "MacPro5,1", "Xserve3,1"]
):
return True
return False
# Entry point for patch set detection
def detect_patch_set(self):
"""
Query patch sets required for host
Returns:
dict: Dictionary of patch sets
"""
self.has_network = network_handler.NetworkUtilities().verify_network_connection()
if self.os_major >= os_data.os_data.sonoma:
self.legacy_pcie_webcam = self.constants.computer.pcie_webcam
self.legacy_t1_chip = self.constants.computer.t1_chip
if self.legacy_t1_chip is True:
self.amfi_must_disable = True
if self._check_uhci_ohci() is True:
self.legacy_uhci_ohci = True
self.requires_root_kc = True
if self.model in model_array.LegacyBrightness:
if self.os_major > os_data.os_data.catalina:
self.brightness_legacy = True
if self.model in ["iMac7,1", "iMac8,1"] or (self.model in model_array.LegacyAudio and utilities.check_kext_loaded("as.vit9696.AppleALC") is False):
# Special hack for systems with botched GOPs
# TL;DR: No Boot Screen breaks Lilu, therefore breaking audio
if self.os_major > os_data.os_data.catalina:
self.legacy_audio = True
if (
isinstance(self.constants.computer.wifi, device_probe.Broadcom)
and self.constants.computer.wifi.chipset in [device_probe.Broadcom.Chipsets.AirPortBrcm4331, device_probe.Broadcom.Chipsets.AirPortBrcm43224]
) or (isinstance(self.constants.computer.wifi, device_probe.Atheros) and self.constants.computer.wifi.chipset == device_probe.Atheros.Chipsets.AirPortAtheros40):
if self.os_major > os_data.os_data.big_sur:
self.legacy_wifi = True
if self.os_major >= os_data.os_data.ventura:
# Due to extracted frameworks for IO80211.framework and co, check library validation
self.amfi_must_disable = True
if self.os_major > os_data.os_data.ventura:
self.amfi_shim_bins = True
if (
isinstance(self.constants.computer.wifi, device_probe.Broadcom)
and self.constants.computer.wifi.chipset in [
device_probe.Broadcom.Chipsets.AirPortBrcm4360,
device_probe.Broadcom.Chipsets.AirportBrcmNIC,
# We don't officially support this chipset, however we'll throw a bone to hackintosh users
device_probe.Broadcom.Chipsets.AirPortBrcmNICThirdParty,
]):
if self.os_major > os_data.os_data.ventura:
self.modern_wifi = True
self.amfi_shim_bins = True
# if self.model in ["MacBookPro5,1", "MacBookPro5,2", "MacBookPro5,3", "MacBookPro8,2", "MacBookPro8,3"]:
if self.model in ["MacBookPro8,2", "MacBookPro8,3"]:
# Sierra uses a legacy GMUX control method needed for dGPU switching on MacBookPro5,x
# Same method is also used for demuxed machines
# Note that MacBookPro5,x machines are extremely unstable with this patch set, so disabled until investigated further
# Ref: https://github.com/dortania/OpenCore-Legacy-Patcher/files/7360909/KP-b10-030.txt
if self.os_major > os_data.os_data.high_sierra:
if self.model in ["MacBookPro8,2", "MacBookPro8,3"]:
# Ref: https://doslabelectronics.com/Demux.html
if self._detect_demux() is True:
self.legacy_gmux = True
else:
self.legacy_gmux = True
self._detect_gpus()
# This must be performed last, as it may override previous decisions
# Namely, whether we allow patches requiring KDKs
self._check_networking_support()
self.root_patch_dict = {
"Graphics: Nvidia Tesla": self.nvidia_tesla,
"Graphics: Nvidia Kepler": self.kepler_gpu,
"Graphics: Nvidia Web Drivers": self.nvidia_web,
"Graphics: AMD TeraScale 1": self.amd_ts1,
"Graphics: AMD TeraScale 2": self.amd_ts2,
"Graphics: AMD Legacy GCN": self.legacy_gcn,
"Graphics: AMD Legacy GCN (2017)": self.legacy_gcn_v2,
"Graphics: AMD Legacy Polaris": self.legacy_polaris,
"Graphics: AMD Legacy Vega": self.legacy_vega,
"Graphics: Intel Ironlake": self.iron_gpu,
"Graphics: Intel Sandy Bridge": self.sandy_gpu,
"Graphics: Intel Ivy Bridge": self.ivy_gpu,
"Graphics: Intel Haswell": self.haswell_gpu,
"Graphics: Intel Broadwell": self.broadwell_gpu,
"Graphics: Intel Skylake": self.skylake_gpu,
"Brightness: Legacy Backlight Control": self.brightness_legacy,
"Audio: Legacy Realtek": self.legacy_audio,
"Networking: Legacy Wireless": self.legacy_wifi,
"Networking: Modern Wireless": self.modern_wifi,
"Miscellaneous: Legacy GMUX": self.legacy_gmux,
"Miscellaneous: Legacy Keyboard Backlight": self.legacy_keyboard_backlight,
"Miscellaneous: Legacy USB 1.1": self.legacy_uhci_ohci,
"Miscellaneous: PCIe FaceTime Camera": self.legacy_pcie_webcam,
"Miscellaneous: T1 Security Chip": self.legacy_t1_chip,
"Settings: Requires AMFI exemption": self.amfi_must_disable,
"Settings: Supports Auxiliary Cache": not self.requires_root_kc,
"Settings: Kernel Debug Kit missing": self.missing_kdk if self.os_major >= os_data.os_data.ventura.value else False,
"Validation: Patching Possible": self.verify_patch_allowed(),
"Validation: Unpatching Possible": self._verify_unpatch_allowed(),
f"Validation: Unsupported Host OS": self.unsupported_os,
f"Validation: SIP is enabled (Required: {self._check_sip()[2]} or higher)": self.sip_enabled,
f"Validation: Currently Booted SIP: ({hex(py_sip_xnu.SipXnu().get_sip_status().value)})": self.sip_enabled,
"Validation: SecureBootModel is enabled": self.sbm_enabled,
f"Validation: {'AMFI' if self.constants.host_is_hackintosh is True or self._get_amfi_level_needed() > 2 else 'Library Validation'} is enabled": self.amfi_enabled if self.amfi_must_disable is True else False,
"Validation: FileVault is enabled": self.fv_enabled,
"Validation: System is dosdude1 patched": self.dosdude_patched,
"Validation: WhateverGreen.kext missing": self.missing_whatever_green if self.nvidia_web is True else False,
"Validation: Force OpenGL property missing": self.missing_nv_web_opengl if self.nvidia_web is True else False,
"Validation: Force compat property missing": self.missing_nv_compat if self.nvidia_web is True else False,
"Validation: nvda_drv(_vrl) variable missing": self.missing_nv_web_nvram if self.nvidia_web is True else False,
"Validation: Network Connection Required": (not self.has_network) if (self.requires_root_kc and self.missing_kdk and self.os_major >= os_data.os_data.ventura.value) else False,
}
return self.root_patch_dict
def _get_amfi_level_needed(self):
"""
Query the AMFI level needed for the patcher to work
Returns:
int: AMFI level needed
"""
if self.amfi_must_disable is False:
return amfi_detect.AmfiConfigDetectLevel.NO_CHECK
if self.os_major < os_data.os_data.big_sur:
return amfi_detect.AmfiConfigDetectLevel.NO_CHECK
amfipass_version = utilities.check_kext_loaded("com.dhinakg.AMFIPass")
if amfipass_version:
if packaging.version.parse(amfipass_version) >= packaging.version.parse(self.constants.amfipass_compatibility_version):
# If AMFIPass is loaded, our binaries will work
return amfi_detect.AmfiConfigDetectLevel.NO_CHECK
if self.os_major >= os_data.os_data.ventura:
if self.amfi_shim_bins is True:
# Currently we require AMFI outright disabled
# in Ventura to work with shim'd binaries
return amfi_detect.AmfiConfigDetectLevel.ALLOW_ALL
return amfi_detect.AmfiConfigDetectLevel.LIBRARY_VALIDATION
def verify_patch_allowed(self, print_errors: bool = False):
"""
Validate that the patcher can be run
Parameters:
print_errors (bool): Print errors to console
Returns:
bool: True if patching is allowed, False otherwise
"""
sip_dict = self._check_sip()
sip = sip_dict[0]
sip_value = sip_dict[1]
self.sip_enabled, self.sbm_enabled, self.fv_enabled, self.dosdude_patched = utilities.patching_status(sip, self.os_major)
self.amfi_enabled = not amfi_detect.AmfiConfigurationDetection().check_config(self._get_amfi_level_needed())
self.unsupported_os = not self._check_os_compat()
if self.nvidia_web is True:
self.missing_nv_web_nvram = not self._check_nv_web_nvram()
self.missing_nv_web_opengl = not self._check_nv_web_opengl()
self.missing_nv_compat = not self._check_nv_compat()
self.missing_whatever_green = not self._check_whatevergreen()
if print_errors is True:
if self.sip_enabled is True:
logging.info("\nCannot patch! Please disable System Integrity Protection (SIP).")
logging.info("Disable SIP in Patcher Settings and Rebuild OpenCore\n")
logging.info("Ensure the following bits are set for csr-active-config:")
logging.info("\n".join(sip))
logging.info(sip_value)
if self.sbm_enabled is True:
logging.info("\nCannot patch! Please disable Apple Secure Boot.")
logging.info("Disable SecureBootModel in Patcher Settings and Rebuild OpenCore")
logging.info("For Hackintoshes, set SecureBootModel to Disabled")
if self.fv_enabled is True:
logging.info("\nCannot patch! Please disable FileVault.")
logging.info("For OCLP Macs, please rebuild your config with 0.2.5 or newer")
logging.info("For others, Go to System Preferences -> Security and disable FileVault")
if self.amfi_enabled is True and self.amfi_must_disable is True:
logging.info("\nCannot patch! Please disable AMFI.")
logging.info("For Hackintoshes, please add amfi_get_out_of_my_way=1 to boot-args")
if self.dosdude_patched is True:
logging.info("\nCannot patch! Detected machine has already been patched by another patcher")
logging.info("Please ensure your install is either clean or patched with OpenCore Legacy Patcher")
if self.nvidia_web is True:
if self.missing_nv_web_opengl is True:
logging.info("\nCannot patch! Force OpenGL property missing")
logging.info("Please ensure ngfxgl=1 is set in boot-args")
if self.missing_nv_compat is True:
logging.info("\nCannot patch! Force Nvidia compatibility property missing")
logging.info("Please ensure ngfxcompat=1 is set in boot-args")
if self.missing_nv_web_nvram is True:
logging.info("\nCannot patch! nvda_drv(_vrl) variable missing")
logging.info("Please ensure nvda_drv_vrl=1 is set in boot-args")
if self.missing_whatever_green is True:
logging.info("\nCannot patch! WhateverGreen.kext missing")
logging.info("Please ensure WhateverGreen.kext is installed")
if (not self.has_network) if (self.requires_root_kc and self.missing_kdk and self.os_major >= os_data.os_data.ventura.value) else False:
logging.info("\nCannot patch! Network Connection Required")
logging.info("Please ensure you have an active internet connection")
if self.unsupported_os is True:
logging.info("\nCannot patch! Unsupported Host OS")
logging.info("Please ensure you are running a patcher-supported OS")
if any(
[
# General patch checks
self.sip_enabled, self.sbm_enabled, self.fv_enabled, self.dosdude_patched, self.unsupported_os,
# non-Metal specific
self.amfi_enabled if self.amfi_must_disable is True else False,
# Web Driver specific
self.missing_nv_web_nvram if self.nvidia_web is True else False,
self.missing_nv_web_opengl if self.nvidia_web is True else False,
self.missing_nv_compat if self.nvidia_web is True else False,
self.missing_whatever_green if self.nvidia_web is True else False,
# KDK specific
(not self.has_network) if (self.requires_root_kc and self.missing_kdk and self.os_major >= os_data.os_data.ventura.value) else False
]
):
return False
return True
def _verify_unpatch_allowed(self):
"""
Validate that the unpatcher can be run
Preconditions:
Must be called after verify_patch_allowed()
Returns:
bool: True if unpatching is allowed, False otherwise
"""
return not self.sip_enabled

View File

@@ -1,212 +0,0 @@
"""
generate.py: Class for generating patch sets for the current host
"""
import logging
from ... import constants
from ...datasets import sys_patch_dict
from ...support import utilities
from ...detections import device_probe
class GenerateRootPatchSets:
"""
Library for generating patch sets for the current host
Parameters:
model (str): Model identifier
global_constants (constants.Constants): Global constants object
hardware_details (dict): Dictionary of hardware details generated by detect_patch_set()
Usage:
>>> from resources.sys_patch import sys_patch_generate
>>> patchset = sys_patch_generate.GenerateRootPatches("iMac7,1", self.constants, self.hardware_details).patchset
"""
def __init__(self, model: str, global_constants: constants.Constants, hardware_details: dict) -> None:
self.model: str = model
self.constants: constants.Constants = global_constants
self.hardware_details: dict = hardware_details
self.patchset: dict = self._generate_patchset()
def _generate_patchset(self) -> dict:
"""
Generate Patchset dictionary for the current system
Returns:
dict: Dictionary of patches to be applied from sys_patch_dict.py
"""
all_hardware_patchset: dict = sys_patch_dict.SystemPatchDictionary(self.constants.detected_os, self.constants.detected_os_minor, self.constants.legacy_accel_support, self.constants.detected_os_version).patchset_dict
required_patches: dict = {}
utilities.cls()
logging.info("The following patches will be applied:")
if self.hardware_details["Graphics: Intel Ironlake"] is True:
required_patches.update({"Non-Metal Common": all_hardware_patchset["Graphics"]["Non-Metal Common"]})
required_patches.update({"WebKit Monterey Common": all_hardware_patchset["Graphics"]["WebKit Monterey Common"]})
required_patches.update({"Intel Ironlake": all_hardware_patchset["Graphics"]["Intel Ironlake"]})
if self.hardware_details["Graphics: Intel Sandy Bridge"] is True:
required_patches.update({"Non-Metal Common": all_hardware_patchset["Graphics"]["Non-Metal Common"]})
required_patches.update({"High Sierra GVA": all_hardware_patchset["Graphics"]["High Sierra GVA"]})
required_patches.update({"WebKit Monterey Common": all_hardware_patchset["Graphics"]["WebKit Monterey Common"]})
required_patches.update({"Intel Sandy Bridge": all_hardware_patchset["Graphics"]["Intel Sandy Bridge"]})
# Patchset breaks Display Profiles, don't install if primary GPU is AMD. Give users option to disable patch in settings to restore Display Profiles
if self.constants.computer.real_model not in ["Macmini5,2", "iMac12,1", "iMac12,2"]:
required_patches.update({"Revert Non-Metal ColorSync Workaround": all_hardware_patchset["Graphics"]["Revert Non-Metal ColorSync Workaround"]})
if self.hardware_details["Graphics: Intel Ivy Bridge"] is True:
required_patches.update({"Metal 3802 Common": all_hardware_patchset["Graphics"]["Metal 3802 Common"]})
required_patches.update({"Metal 3802 Common Extended": all_hardware_patchset["Graphics"]["Metal 3802 Common Extended"]})
required_patches.update({"Catalina GVA": all_hardware_patchset["Graphics"]["Catalina GVA"]})
required_patches.update({"Monterey OpenCL": all_hardware_patchset["Graphics"]["Monterey OpenCL"]})
required_patches.update({"Big Sur OpenCL": all_hardware_patchset["Graphics"]["Big Sur OpenCL"]})
required_patches.update({"WebKit Monterey Common": all_hardware_patchset["Graphics"]["WebKit Monterey Common"]})
required_patches.update({"Intel Ivy Bridge": all_hardware_patchset["Graphics"]["Intel Ivy Bridge"]})
if self.hardware_details["Graphics: Intel Haswell"] is True:
required_patches.update({"Metal 3802 Common": all_hardware_patchset["Graphics"]["Metal 3802 Common"]})
required_patches.update({"Metal 3802 Common Extended": all_hardware_patchset["Graphics"]["Metal 3802 Common Extended"]})
required_patches.update({"Monterey GVA": all_hardware_patchset["Graphics"]["Monterey GVA"]})
required_patches.update({"Monterey OpenCL": all_hardware_patchset["Graphics"]["Monterey OpenCL"]})
required_patches.update({"Intel Haswell": all_hardware_patchset["Graphics"]["Intel Haswell"]})
if self.hardware_details["Graphics: Intel Broadwell"] is True:
required_patches.update({"Monterey GVA": all_hardware_patchset["Graphics"]["Monterey GVA"]})
required_patches.update({"Monterey OpenCL": all_hardware_patchset["Graphics"]["Monterey OpenCL"]})
required_patches.update({"Intel Broadwell": all_hardware_patchset["Graphics"]["Intel Broadwell"]})
if self.hardware_details["Graphics: Intel Skylake"] is True:
required_patches.update({"Revert GVA Downgrade": all_hardware_patchset["Graphics"]["Revert GVA Downgrade"]})
required_patches.update({"Monterey OpenCL": all_hardware_patchset["Graphics"]["Monterey OpenCL"]})
required_patches.update({"Intel Skylake": all_hardware_patchset["Graphics"]["Intel Skylake"]})
if self.hardware_details["Graphics: Nvidia Tesla"] is True:
required_patches.update({"Non-Metal Common": all_hardware_patchset["Graphics"]["Non-Metal Common"]})
required_patches.update({"WebKit Monterey Common": all_hardware_patchset["Graphics"]["WebKit Monterey Common"]})
required_patches.update({"Nvidia Tesla": all_hardware_patchset["Graphics"]["Nvidia Tesla"]})
if self.hardware_details["Graphics: Nvidia Web Drivers"] is True:
required_patches.update({"Non-Metal Common": all_hardware_patchset["Graphics"]["Non-Metal Common"]})
required_patches.update({"Non-Metal IOAccelerator Common": all_hardware_patchset["Graphics"]["Non-Metal IOAccelerator Common"]})
required_patches.update({"Non-Metal CoreDisplay Common": all_hardware_patchset["Graphics"]["Non-Metal CoreDisplay Common"]})
required_patches.update({"WebKit Monterey Common": all_hardware_patchset["Graphics"]["WebKit Monterey Common"]})
required_patches.update({"Nvidia Web Drivers": all_hardware_patchset["Graphics"]["Nvidia Web Drivers"]})
required_patches.update({"Non-Metal Enforcement": all_hardware_patchset["Graphics"]["Non-Metal Enforcement"]})
if self.hardware_details["Graphics: Nvidia Kepler"] is True:
required_patches.update({"Metal 3802 Common": all_hardware_patchset["Graphics"]["Metal 3802 Common"]})
required_patches.update({"Metal 3802 Common Extended": all_hardware_patchset["Graphics"]["Metal 3802 Common Extended"]})
required_patches.update({"Catalina GVA": all_hardware_patchset["Graphics"]["Catalina GVA"]})
required_patches.update({"Monterey OpenCL": all_hardware_patchset["Graphics"]["Monterey OpenCL"]})
required_patches.update({"Big Sur OpenCL": all_hardware_patchset["Graphics"]["Big Sur OpenCL"]})
required_patches.update({"WebKit Monterey Common": all_hardware_patchset["Graphics"]["WebKit Monterey Common"]})
required_patches.update({"Nvidia Kepler": all_hardware_patchset["Graphics"]["Nvidia Kepler"]})
for gpu in self.constants.computer.gpus:
# Handle mixed GPU situations (ie. MacBookPro11,3: Haswell iGPU + Kepler dGPU)
if gpu.arch == device_probe.Intel.Archs.Haswell:
if "Catalina GVA" in required_patches:
del(required_patches["Catalina GVA"])
break
if self.hardware_details["Graphics: AMD TeraScale 1"] is True:
required_patches.update({"Non-Metal Common": all_hardware_patchset["Graphics"]["Non-Metal Common"]})
required_patches.update({"WebKit Monterey Common": all_hardware_patchset["Graphics"]["WebKit Monterey Common"]})
required_patches.update({"AMD TeraScale Common": all_hardware_patchset["Graphics"]["AMD TeraScale Common"]})
required_patches.update({"AMD TeraScale 1": all_hardware_patchset["Graphics"]["AMD TeraScale 1"]})
if self.hardware_details["Graphics: AMD TeraScale 2"] is True:
required_patches.update({"Non-Metal Common": all_hardware_patchset["Graphics"]["Non-Metal Common"]})
required_patches.update({"Non-Metal IOAccelerator Common": all_hardware_patchset["Graphics"]["Non-Metal IOAccelerator Common"]})
required_patches.update({"WebKit Monterey Common": all_hardware_patchset["Graphics"]["WebKit Monterey Common"]})
required_patches.update({"AMD TeraScale Common": all_hardware_patchset["Graphics"]["AMD TeraScale Common"]})
required_patches.update({"AMD TeraScale 2": all_hardware_patchset["Graphics"]["AMD TeraScale 2"]})
if self.constants.allow_ts2_accel is False or self.constants.detected_os not in self.constants.legacy_accel_support:
# TeraScale 2 MacBooks with faulty GPUs are highly prone to crashing with AMDRadeonX3000 attached
# Additionally, AMDRadeonX3000 requires IOAccelerator downgrade which is not installed without 'Non-Metal IOAccelerator Common'
del(required_patches["AMD TeraScale 2"]["Install"]["/System/Library/Extensions"]["AMDRadeonX3000.kext"])
if self.hardware_details["Graphics: AMD Legacy GCN"] is True or self.hardware_details["Graphics: AMD Legacy Polaris"] is True:
if self.hardware_details["Graphics: Intel Skylake"] is False:
# GVA downgrade not required if Skylake is present
required_patches.update({"Monterey GVA": all_hardware_patchset["Graphics"]["Monterey GVA"]})
required_patches.update({"Monterey OpenCL": all_hardware_patchset["Graphics"]["Monterey OpenCL"]})
if self.hardware_details["Graphics: AMD Legacy GCN"] is True:
required_patches.update({"AMD Legacy GCN": all_hardware_patchset["Graphics"]["AMD Legacy GCN"]})
else:
required_patches.update({"AMD Legacy Polaris": all_hardware_patchset["Graphics"]["AMD Legacy Polaris"]})
required_patches.update({"Revert GVA Downgrade": all_hardware_patchset["Graphics"]["Revert GVA Downgrade"]})
if "AVX2" not in self.constants.computer.cpu.leafs:
required_patches.update({"AMD OpenCL": all_hardware_patchset["Graphics"]["AMD OpenCL"]})
if self.hardware_details["Graphics: AMD Legacy GCN (2017)"] is True:
required_patches.update({"AMD Legacy GCN v2": all_hardware_patchset["Graphics"]["AMD Legacy GCN v2"]})
if self.hardware_details["Graphics: AMD Legacy Vega"] is True:
required_patches.update({"Monterey GVA": all_hardware_patchset["Graphics"]["Monterey GVA"]})
required_patches.update({"Monterey OpenCL": all_hardware_patchset["Graphics"]["Monterey OpenCL"]})
required_patches.update({"AMD Legacy Vega": all_hardware_patchset["Graphics"]["AMD Legacy Vega"]})
required_patches.update({"AMD OpenCL": all_hardware_patchset["Graphics"]["AMD OpenCL"]})
if self.hardware_details["Graphics: AMD Legacy GCN"] is True:
required_patches.update({"AMD Legacy Vega Extended": all_hardware_patchset["Graphics"]["AMD Legacy Vega Extended"]})
else:
required_patches.update({"Revert GVA Downgrade": all_hardware_patchset["Graphics"]["Revert GVA Downgrade"]})
if self.hardware_details["Brightness: Legacy Backlight Control"] is True:
required_patches.update({"Legacy Backlight Control": all_hardware_patchset["Brightness"]["Legacy Backlight Control"]})
if self.hardware_details["Audio: Legacy Realtek"] is True:
if self.model in ["iMac7,1", "iMac8,1"]:
required_patches.update({"Legacy Realtek": all_hardware_patchset["Audio"]["Legacy Realtek"]})
else:
required_patches.update({"Legacy Non-GOP": all_hardware_patchset["Audio"]["Legacy Non-GOP"]})
if self.hardware_details["Networking: Legacy Wireless"] is True:
required_patches.update({"Legacy Wireless": all_hardware_patchset["Networking"]["Legacy Wireless"]})
required_patches.update({"Legacy Wireless Extended": all_hardware_patchset["Networking"]["Legacy Wireless Extended"]})
if self.hardware_details["Networking: Modern Wireless"] is True:
required_patches.update({"Legacy Wireless": all_hardware_patchset["Networking"]["Modern Wireless"]})
if self.hardware_details["Miscellaneous: Legacy GMUX"] is True:
required_patches.update({"Legacy GMUX": all_hardware_patchset["Miscellaneous"]["Legacy GMUX"]})
if self.hardware_details["Miscellaneous: Legacy Keyboard Backlight"] is True:
required_patches.update({"Legacy Keyboard Backlight": all_hardware_patchset["Miscellaneous"]["Legacy Keyboard Backlight"]})
if self.hardware_details["Miscellaneous: Legacy USB 1.1"] is True:
required_patches.update({"Legacy USB 1.1": all_hardware_patchset["Miscellaneous"]["Legacy USB 1.1"]})
required_patches.update({"Legacy USB 1.1 Extended": all_hardware_patchset["Miscellaneous"]["Legacy USB 1.1 Extended"]})
if self.hardware_details["Miscellaneous: PCIe FaceTime Camera"] is True:
required_patches.update({"PCIe FaceTime Camera": all_hardware_patchset["Miscellaneous"]["PCIe FaceTime Camera"]})
if self.hardware_details["Miscellaneous: T1 Security Chip"] is True:
required_patches.update({"T1 Security Chip": all_hardware_patchset["Miscellaneous"]["T1 Security Chip"]})
if required_patches:
host_os_float = float(f"{self.constants.detected_os}.{self.constants.detected_os_minor}")
# Prioritize Monterey GVA patches
if "Catalina GVA" in required_patches and "Monterey GVA" in required_patches:
del(required_patches["Catalina GVA"])
for patch_name in list(required_patches):
patch_os_min_float = float(f'{required_patches[patch_name]["OS Support"]["Minimum OS Support"]["OS Major"]}.{required_patches[patch_name]["OS Support"]["Minimum OS Support"]["OS Minor"]}')
patch_os_max_float = float(f'{required_patches[patch_name]["OS Support"]["Maximum OS Support"]["OS Major"]}.{required_patches[patch_name]["OS Support"]["Maximum OS Support"]["OS Minor"]}')
if (host_os_float < patch_os_min_float or host_os_float > patch_os_max_float):
del(required_patches[patch_name])
else:
if required_patches[patch_name]["Display Name"]:
logging.info(f"- {required_patches[patch_name]['Display Name']}")
else:
logging.info("- No patch sets found for booted model")
return required_patches

View File

@@ -8,6 +8,8 @@ import plistlib
from pathlib import Path
from datetime import datetime
from ...patchsets import PatchType
from ....datasets import os_data
from ....support import subprocess_wrapper
@@ -126,7 +128,7 @@ class KernelCacheSupport:
for key in oclp_plist_data:
if isinstance(oclp_plist_data[key], (bool, int)):
continue
for install_type in ["Install", "Install Non-Root"]:
for install_type in [PatchType.OVERWRITE_SYSTEM_VOLUME, PatchType.OVERWRITE_DATA_VOLUME, PatchType.MERGE_SYSTEM_VOLUME, PatchType.MERGE_DATA_VOLUME]:
if install_type not in oclp_plist_data[key]:
continue
for location in oclp_plist_data[key][install_type]:

View File

@@ -0,0 +1,6 @@
"""
patchsets module
"""
from .base import PatchType, DynamicPatchset
from .detect import HardwarePatchsetDetection, HardwarePatchsetSettings, HardwarePatchsetValidation

View File

@@ -0,0 +1,35 @@
"""
base.py: Base class for all patch sets
"""
from enum import StrEnum
class PatchType(StrEnum):
"""
Type of patch
"""
OVERWRITE_SYSTEM_VOLUME = "Overwrite System Volume"
OVERWRITE_DATA_VOLUME = "Overwrite Data Volume"
MERGE_SYSTEM_VOLUME = "Merge System Volume"
MERGE_DATA_VOLUME = "Merge Data Volume"
REMOVE_SYSTEM_VOLUME = "Remove System Volume"
REMOVE_DATA_VOLUME = "Remove Data Volume"
EXECUTE = "Execute"
class DynamicPatchset(StrEnum):
MetallibSupportPkg = "MetallibSupportPkg"
class BasePatchset:
def __init__(self) -> None:
# XNU Kernel versions
self.macOS_12_0_B7: float = 21.1
self.macOS_12_4: float = 21.5
self.macOS_12_5: float = 21.6
self.macOS_13_3: float = 22.4
self.macOS_14_1: float = 23.1
self.macOS_14_2: float = 23.2
self.macOS_14_4: float = 23.4

View File

@@ -0,0 +1,549 @@
"""
detect.py: Detects patches for a given system
"""
import logging
import plistlib
import subprocess
import py_sip_xnu
import packaging.version
from enum import StrEnum
from pathlib import Path
from functools import cache
from .hardware.base import BaseHardware, HardwareVariantGraphicsSubclass
from .hardware.graphics import (
intel_iron_lake,
intel_sandy_bridge,
intel_ivy_bridge,
intel_haswell,
intel_broadwell,
intel_skylake,
nvidia_tesla,
nvidia_kepler,
nvidia_webdriver,
amd_terascale_1,
amd_terascale_2,
amd_legacy_gcn,
amd_polaris,
amd_vega,
)
from .hardware.networking import (
legacy_wireless,
modern_wireless,
)
from .hardware.misc import (
display_backlight,
gmux,
keyboard_backlight,
legacy_audio,
pcie_webcam,
t1_security,
usb11,
)
from ... import constants
from ...datasets import sip_data
from ...datasets.os_data import os_data
from ...support import (
network_handler,
utilities,
kdk_handler,
metallib_handler
)
from ...detections import (
amfi_detect,
device_probe
)
class HardwarePatchsetSettings(StrEnum):
"""
Enum for patch settings
"""
KERNEL_DEBUG_KIT_REQUIRED = "Settings: Kernel Debug Kit required"
KERNEL_DEBUG_KIT_MISSING = "Settings: Kernel Debug Kit missing"
METALLIB_SUPPORT_PKG_REQUIRED = "Settings: MetallibSupportPkg.pkg required"
METALLIB_SUPPORT_PKG_MISSING = "Settings: MetallibSupportPkg.pkg missing"
class HardwarePatchsetValidation(StrEnum):
"""
Enum for validation settings
"""
UNSUPPORTED_HOST_OS = "Validation: Unsupported Host OS"
MISSING_NETWORK_CONNECTION = "Validation: Missing Network Connection"
FILEVAULT_ENABLED = "Validation: FileVault is enabled"
SIP_ENABLED = "Validation: System Integrity Protection is enabled"
SECURE_BOOT_MODEL_ENABLED = "Validation: SecureBootModel is enabled"
AMFI_ENABLED = "Validation: AMFI is enabled"
WHATEVERGREEN_MISSING = "Validation: WhateverGreen.kext missing"
FORCE_OPENGL_MISSING = "Validation: Force OpenGL property missing"
FORCE_COMPAT_MISSING = "Validation: Force compat property missing"
NVDA_DRV_MISSING = "Validation: nvda_drv(_vrl) variable missing"
PATCHING_NOT_POSSIBLE = "Validation: Patching not possible"
UNPATCHING_NOT_POSSIBLE = "Validation: Unpatching not possible"
class HardwarePatchsetDetection:
def __init__(self, constants: constants.Constants,
xnu_major: int = None, xnu_minor: int = None,
os_build: str = None, os_version: str = None,
validation: bool = False # Whether to run validation checks
) -> None:
self._constants = constants
self._xnu_major = xnu_major or self._constants.detected_os
self._xnu_minor = xnu_minor or self._constants.detected_os_minor
self._os_build = os_build or self._constants.detected_os_build
self._os_version = os_version or self._constants.detected_os_version
self._validation = validation
self._hardware_variants = [
intel_iron_lake.IntelIronLake,
intel_sandy_bridge.IntelSandyBridge,
intel_ivy_bridge.IntelIvyBridge,
intel_haswell.IntelHaswell,
intel_broadwell.IntelBroadwell,
intel_skylake.IntelSkylake,
nvidia_tesla.NvidiaTesla,
nvidia_kepler.NvidiaKepler,
nvidia_webdriver.NvidiaWebDriver,
amd_terascale_1.AMDTeraScale1,
amd_terascale_2.AMDTeraScale2,
amd_legacy_gcn.AMDLegacyGCN,
amd_polaris.AMDPolaris,
amd_vega.AMDVega,
legacy_wireless.LegacyWireless,
modern_wireless.ModernWireless,
display_backlight.DisplayBacklight,
gmux.GraphicsMultiplexer,
keyboard_backlight.KeyboardBacklight,
legacy_audio.LegacyAudio,
pcie_webcam.PCIeFaceTimeCamera,
t1_security.T1SecurityChip,
usb11.USB11Controller,
]
self.device_properties = None
self.patches = None
self.can_patch = False
self.can_unpatch = False
self._detect()
def _validation_check_unsupported_host_os(self) -> bool:
"""
Determine if host OS is unsupported
"""
_min_os = os_data.big_sur.value
_max_os = os_data.sequoia.value
if self._dortania_internal_check() is True:
return False
if self._xnu_major < _min_os or self._xnu_major > _max_os:
return True
return False
@cache
def _validation_check_missing_network_connection(self) -> bool:
"""
Determine if network connection is present
"""
return network_handler.NetworkUtilities().verify_network_connection() is False
@cache
def _validation_check_filevault_is_enabled(self) -> bool:
"""
Determine if FileVault is enabled
"""
# macOS 11.0 introduced a FileVault check for root patching
if self._xnu_major < os_data.big_sur.value:
return False
# OpenCore Legacy Patcher exposes whether it patched APFS.kext to allow for FileVault
nvram = utilities.get_nvram("OCLP-Settings", "4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102", decode=True)
if nvram:
if "-allow_fv" in nvram:
return False
return "FileVault is Off" not in subprocess.run(["/usr/bin/fdesetup", "status"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT).stdout.decode()
def _validation_check_system_integrity_protection_enabled(self, configs: list[str]) -> bool:
"""
Determine if System Integrity Protection is enabled
"""
return utilities.csr_decode(configs)
def _validation_check_secure_boot_model_enabled(self) -> bool:
"""
Determine if SecureBootModel is enabled
"""
return utilities.check_secure_boot_level()
def _validation_check_amfi_enabled(self, level: amfi_detect.AmfiConfigDetectLevel) -> bool:
"""
Determine if AMFI is enabled
"""
return not amfi_detect.AmfiConfigurationDetection().check_config(self._override_amfi_level(level))
def _validation_check_whatevergreen_missing(self) -> bool:
"""
Determine if WhateverGreen.kext is missing
"""
return utilities.check_kext_loaded("as.vit9696.WhateverGreen") is False
@cache
def _validation_check_force_opengl_missing(self) -> bool:
"""
Determine if Force OpenGL property is missing
"""
nv_on = utilities.get_nvram("boot-args", decode=True)
if nv_on:
if "ngfxgl=" in nv_on:
return False
for gpu in self._constants.computer.gpus:
if isinstance(gpu, device_probe.NVIDIA):
if gpu.disable_metal is True:
return False
return True
def _validation_check_force_compat_missing(self) -> bool:
"""
Determine if Force compat property is missing
"""
nv_on = utilities.get_nvram("boot-args", decode=True)
if nv_on:
if "ngfxcompat=" in nv_on:
return False
for gpu in self._constants.computer.gpus:
if isinstance(gpu, device_probe.NVIDIA):
if gpu.force_compatible is True:
return False
return True
def _validation_check_nvda_drv_missing(self) -> bool:
"""
Determine if nvda_drv(_vrl) variable is missing
"""
nv_on = utilities.get_nvram("boot-args", decode=True)
if nv_on:
if "nvda_drv_vrl=" in nv_on:
return False
nv_on = utilities.get_nvram("nvda_drv")
if nv_on:
return False
return True
@cache
def _override_amfi_level(self, level: amfi_detect.AmfiConfigDetectLevel) -> amfi_detect.AmfiConfigDetectLevel:
"""
Override level required based on whether AMFIPass is loaded
"""
amfipass_version = utilities.check_kext_loaded("com.dhinakg.AMFIPass")
if amfipass_version:
if packaging.version.parse(amfipass_version) >= packaging.version.parse(self._constants.amfipass_compatibility_version):
# If AMFIPass is loaded, our binaries will work
return amfi_detect.AmfiConfigDetectLevel.NO_CHECK
return level
def _dortania_internal_check(self) -> None:
"""
Determine whether to unlock Dortania Developer mode
"""
return Path("~/.dortania_developer").expanduser().exists()
def _already_has_networking_patches(self) -> bool:
"""
Check if network patches are already applied
"""
oclp_patch_path = "/System/Library/CoreServices/OpenCore-Legacy-Patcher.plist"
if not Path(oclp_patch_path).exists():
return False
try:
oclp_plist = plistlib.load(open(oclp_patch_path, "rb"))
except Exception as e:
return False
if "Legacy Wireless" in oclp_plist or "Modern Wireless" in oclp_plist:
return True
return False
def _is_cached_kernel_debug_kit_present(self) -> bool:
"""
Check if Kernel Debug Kit is present
"""
return kdk_handler.KernelDebugKitObject(self._constants, self._os_build, self._os_version, passive=True).kdk_already_installed
def _is_cached_metallib_support_pkg_present(self) -> bool:
"""
Check if MetallibSupportPkg is present
"""
return metallib_handler.MetalLibraryObject(self._constants, self._os_build, self._os_version).metallib_already_installed
def _can_patch(self, requirements: dict, ignore_keys: list[str] = []) -> bool:
"""
Check if patching is possible
"""
for key, value in requirements.items():
if key in ignore_keys:
continue
if not key.startswith("Validation:"):
continue
if value is True:
return False
return True
def _convert_required_sip_config_to_int(self, configs: list[str]) -> int:
"""
Convert required SIP configurations to integer
"""
value = 0
for config in configs:
if config in sip_data.system_integrity_protection.csr_values_extended:
value += sip_data.system_integrity_protection.csr_values_extended[config]["value"]
return value
def _strip_incompatible_hardware(self, present_hardware: list[BaseHardware]) -> list[BaseHardware]:
"""
Strip out incompatible hardware. Priority is given to Metal GPUs (specifically 31001 when applicable)
Notes:
- Non-Metal GPUs are stripped out if any Metal GPUs are present
- Metal 3802 GPUs are stripped out if Metal 31001 GPUs are present on macOS Sequoia or newer
- Exception is made for "Graphics: AMD Legacy GCN" on Sequoia or newer
- Special handling is done in amd_legacy_gcn.py
"""
non_metal_gpu_present = False
metal_gpu_present = False
metal_3802_gpu_present = False
metal_31001_gpu_present = False
metal_31001_name = None
for hardware in present_hardware:
hardware: BaseHardware
sub_variant = hardware.hardware_variant_graphics_subclass()
if sub_variant == HardwareVariantGraphicsSubclass.METAL_31001_GRAPHICS:
metal_31001_gpu_present = True
metal_31001_name = hardware.name()
elif sub_variant == HardwareVariantGraphicsSubclass.METAL_3802_GRAPHICS:
metal_3802_gpu_present = True
elif sub_variant == HardwareVariantGraphicsSubclass.NON_METAL_GRAPHICS:
non_metal_gpu_present = True
metal_gpu_present = metal_31001_gpu_present or metal_3802_gpu_present
if metal_gpu_present and non_metal_gpu_present:
logging.error("Cannot mix Metal and Non-Metal GPUs")
logging.error("Stripping out Non-Metal GPUs")
for hardware in list(present_hardware):
if hardware.hardware_variant_graphics_subclass() == HardwareVariantGraphicsSubclass.NON_METAL_GRAPHICS:
print(f" Stripping out {hardware.name()}")
present_hardware.remove(hardware)
if metal_3802_gpu_present and metal_31001_gpu_present and self._xnu_major >= os_data.sequoia.value:
if metal_31001_name != "Graphics: AMD Legacy GCN":
logging.error("Cannot mix Metal 3802 and Metal 31001 GPUs on macOS Sequoia or newer")
logging.error("Stripping out Metal 3802 GPUs")
for hardware in list(present_hardware):
if hardware.hardware_variant_graphics_subclass() == HardwareVariantGraphicsSubclass.METAL_3802_GRAPHICS:
logging.error(f" Stripping out {hardware.name()}")
present_hardware.remove(hardware)
return present_hardware
def _handle_missing_network_connection(self, requirements: dict, device_properties: dict) -> tuple[dict, dict]:
"""
Sync network connection requirements
"""
if self._can_patch(requirements, ignore_keys=[HardwarePatchsetValidation.MISSING_NETWORK_CONNECTION]) is False:
return requirements, device_properties
logging.info("Network connection missing, checking whether network patches are applicable")
if self._already_has_networking_patches() is True:
logging.info("Network patches are already applied, requiring network connection")
return requirements, device_properties
if not any([key.startswith("Networking:") for key in device_properties.keys()]):
logging.info("Network patches are not applicable, requiring network connection")
return requirements, device_properties
logging.info("Network patches are applicable, removing other patches")
for key in list(device_properties.keys()):
if key.startswith("Networking:"):
continue
device_properties.pop(key, None)
requirements[HardwarePatchsetValidation.MISSING_NETWORK_CONNECTION] = False
requirements[HardwarePatchsetSettings.KERNEL_DEBUG_KIT_REQUIRED] = False
requirements[HardwarePatchsetSettings.KERNEL_DEBUG_KIT_MISSING] = False
requirements[HardwarePatchsetSettings.METALLIB_SUPPORT_PKG_REQUIRED] = False
requirements[HardwarePatchsetSettings.METALLIB_SUPPORT_PKG_MISSING] = False
return requirements, device_properties
def _handle_sip_breakdown(self, requirements: dict, required_sip_configs: list[str]) -> dict:
"""
Handle SIP breakdown
"""
current_sip_status = hex(py_sip_xnu.SipXnu().get_sip_status().value)
expected_sip_status = hex(self._convert_required_sip_config_to_int(required_sip_configs))
sip_string = f"Validation: Booted SIP: {current_sip_status} vs expected: {expected_sip_status}"
index = list(requirements.keys()).index(HardwarePatchsetValidation.SIP_ENABLED)
return dict(list(requirements.items())[:index+1] + [(sip_string, True)] + list(requirements.items())[index+1:])
def _detect(self) -> None:
"""
Detect patches for a given system
"""
present_hardware = []
device_properties = {}
patches = {}
requires_metallib_support_pkg = False
missing_metallib_support_pkg = False
requires_kernel_debug_kit = False
missing_kernel_debug_kit = False
requires_network_connection = False
has_nvidia_web_drivers = False
highest_amfi_level = amfi_detect.AmfiConfigDetectLevel.NO_CHECK
required_sip_configs = []
# First pass to find all present hardware
for hardware in self._hardware_variants:
item: BaseHardware = hardware(
xnu_major = self._xnu_major,
xnu_minor = self._xnu_minor,
os_build = self._os_build,
global_constants = self._constants
)
# During validation, don't skip missing items
# This is to ensure we can validate all files
if self._validation is False:
if item.present() is False: # Skip if not present
continue
if item.native_os() is True: # Skip if native OS
continue
present_hardware.append(item)
if self._validation is False:
present_hardware = self._strip_incompatible_hardware(present_hardware)
# Second pass to determine requirements
for item in present_hardware:
item: BaseHardware
device_properties[item.name()] = True
if item.name() == "Graphics: Nvidia Web Drivers":
has_nvidia_web_drivers = True
for config in item.required_system_integrity_protection_configurations():
if config not in required_sip_configs:
required_sip_configs.append(config)
if item.requires_metallib_support_pkg() is True:
requires_metallib_support_pkg = True
if item.requires_kernel_debug_kit() is True:
requires_kernel_debug_kit = True
if item.required_amfi_level() > highest_amfi_level:
highest_amfi_level = item.required_amfi_level()
if self._validation is False:
if requires_metallib_support_pkg is True:
missing_metallib_support_pkg = not self._is_cached_metallib_support_pkg_present()
if requires_kernel_debug_kit is True:
missing_kernel_debug_kit = not self._is_cached_kernel_debug_kit_present()
requires_network_connection = missing_metallib_support_pkg or missing_kernel_debug_kit
requirements = {
HardwarePatchsetSettings.KERNEL_DEBUG_KIT_REQUIRED: requires_kernel_debug_kit,
HardwarePatchsetSettings.KERNEL_DEBUG_KIT_MISSING: missing_kernel_debug_kit,
HardwarePatchsetSettings.METALLIB_SUPPORT_PKG_REQUIRED: requires_metallib_support_pkg,
HardwarePatchsetSettings.METALLIB_SUPPORT_PKG_MISSING: missing_metallib_support_pkg,
HardwarePatchsetValidation.UNSUPPORTED_HOST_OS: self._validation_check_unsupported_host_os(),
HardwarePatchsetValidation.MISSING_NETWORK_CONNECTION: self._validation_check_missing_network_connection() if requires_network_connection else False,
HardwarePatchsetValidation.FILEVAULT_ENABLED: self._validation_check_filevault_is_enabled(),
HardwarePatchsetValidation.SIP_ENABLED: self._validation_check_system_integrity_protection_enabled(required_sip_configs),
HardwarePatchsetValidation.SECURE_BOOT_MODEL_ENABLED: self._validation_check_secure_boot_model_enabled(),
HardwarePatchsetValidation.AMFI_ENABLED: self._validation_check_amfi_enabled(highest_amfi_level),
HardwarePatchsetValidation.WHATEVERGREEN_MISSING: self._validation_check_whatevergreen_missing() if has_nvidia_web_drivers is True else False,
HardwarePatchsetValidation.FORCE_OPENGL_MISSING: self._validation_check_force_opengl_missing() if has_nvidia_web_drivers is True else False,
HardwarePatchsetValidation.FORCE_COMPAT_MISSING: self._validation_check_force_compat_missing() if has_nvidia_web_drivers is True else False,
HardwarePatchsetValidation.NVDA_DRV_MISSING: self._validation_check_nvda_drv_missing() if has_nvidia_web_drivers is True else False,
}
_cant_patch = False
_cant_unpatch = requirements[HardwarePatchsetValidation.SIP_ENABLED]
if self._validation is False:
if requirements[HardwarePatchsetValidation.SIP_ENABLED] is True:
requirements = self._handle_sip_breakdown(requirements, required_sip_configs)
if requirements[HardwarePatchsetValidation.MISSING_NETWORK_CONNECTION] is True:
requirements, device_properties = self._handle_missing_network_connection(requirements, device_properties)
# Third pass to sync stripped hardware (ie. '_handle_missing_network_connection()')
for item in present_hardware:
item: BaseHardware
if item.name() not in device_properties:
continue
patches.update(item.patches())
_cant_patch = not self._can_patch(requirements)
requirements[HardwarePatchsetValidation.PATCHING_NOT_POSSIBLE] = _cant_patch
requirements[HardwarePatchsetValidation.UNPATCHING_NOT_POSSIBLE] = _cant_unpatch
self.can_patch = not _cant_patch
self.can_unpatch = not _cant_unpatch
device_properties.update(requirements)
self.device_properties = device_properties
self.patches = patches
def detailed_errors(self) -> None:
"""
Print out detailed errors
"""
logging.error("- Breakdown:")
for key, value in self.device_properties.items():
if not key.startswith("Validation:"):
continue
if key in [HardwarePatchsetValidation.PATCHING_NOT_POSSIBLE, HardwarePatchsetValidation.UNPATCHING_NOT_POSSIBLE]:
continue
if value is False:
continue
logging.error(f" - {key.replace('Validation: ', '')}")

View File

@@ -0,0 +1,176 @@
"""
base.py: Base class for hardware patch set detection
"""
from enum import StrEnum
from pathlib import Path
from ..base import BasePatchset
from ....constants import Constants
from ....datasets.os_data import os_data
from ....datasets.sip_data import system_integrity_protection
from ....detections.amfi_detect import AmfiConfigDetectLevel
from ....detections import device_probe
class HardwareVariant(StrEnum):
"""
Hardware variant for patch set
"""
GRAPHICS: str = "Graphics"
NETWORKING: str = "Networking"
AUDIO: str = "Audio"
MISCELLANEOUS: str = "Miscellaneous"
class HardwareVariantGraphicsSubclass(StrEnum):
"""
Graphics hardware variant subclass
"""
NON_METAL_GRAPHICS: str = "Non-Metal Graphics"
METAL_3802_GRAPHICS: str = "Metal 3802 Graphics"
METAL_31001_GRAPHICS: str = "Metal 31001 Graphics"
HEADLESS_GRAPHICS: str = "Headless Graphics"
NOT_APPLICABLE: str = "N/A"
class BaseHardware(BasePatchset):
def __init__(self, xnu_major, xnu_minor, os_build, global_constants: Constants) -> None:
super().__init__()
self._xnu_major = xnu_major
self._xnu_minor = xnu_minor
self._os_build = os_build
self._constants = global_constants
self._computer = global_constants.computer
self._xnu_float = float(f"{self._xnu_major}.{self._xnu_minor}")
def name(self) -> str:
"""
Name of the patch set
"""
raise NotImplementedError
def present(self) -> bool:
"""
Whether the hardware is present in the system
"""
raise NotImplementedError
def native_os(self) -> bool:
"""
Is on native OS
"""
raise NotImplementedError
def hardware_variant(self) -> HardwareVariant:
"""
What hardware variant is this patch set for
"""
raise NotImplementedError
def hardware_variant_graphics_subclass(self) -> HardwareVariantGraphicsSubclass:
"""
What subclass of graphics
"""
return HardwareVariantGraphicsSubclass.NOT_APPLICABLE
def required_amfi_level(self) -> AmfiConfigDetectLevel:
"""
What level of AMFI configuration is required for this patch set
Currently defaulted to AMFI needing to be disabled
"""
return AmfiConfigDetectLevel.ALLOW_ALL
def requires_primary_kernel_cache(self) -> bool:
"""
Whether patch set requires access to the primary kernel cache
ex. Boot/System Kernel Collection on Big Sur and newer
"""
return False
def requires_kernel_debug_kit(self) -> bool:
"""
Whether patch set requires access to the Kernel Debug Kit
"""
return False
def requires_metallib_support_pkg(self) -> bool:
"""
Whether patch set requires access to the MetallibSupportPkg PKG
"""
return False
def required_system_integrity_protection_configurations(self) -> list[str]:
"""
List of required SIP configurations for the patch set
"""
if self._xnu_major >= os_data.ventura.value:
return system_integrity_protection.root_patch_sip_ventura
if self._xnu_major >= os_data.big_sur.value:
return system_integrity_protection.root_patch_sip_big_sur
return system_integrity_protection.root_patch_sip_mojave
def patches(self) -> dict:
"""
Dictionary of patches
"""
raise NotImplementedError
def _is_gpu_architecture_present(self, gpu_architectures: list[device_probe.GPU]) -> bool:
"""
Check if a GPU architecture is present
"""
for gpu in self._computer.gpus:
if not gpu.class_code:
continue
if not gpu.arch:
continue
if gpu.class_code == 0xFFFFFFFF:
continue
if gpu.arch in gpu_architectures:
return True
return False
def _resolve_monterey_framebuffers(self) -> str:
"""
Resolve patchset directory for framebuffers last supported in Monterey:
- AppleIntelBDWGraphics.kext
- AppleIntelBDWGraphicsFramebuffer.kext
- AppleIntelFramebufferAzul.kext
- AppleIntelHD5000Graphics.kext
- AppleIntelSKLGraphics.kext
- AppleIntelSKLGraphicsFramebuffer.kext
- AMDRadeonX4000.kext
- AMDRadeonX5000.kext
"""
if self._xnu_major < os_data.sonoma.value:
return "12.5"
if self._xnu_float < self.macOS_14_4:
return "12.5-23"
return "12.5-23.4"
def _dortania_internal_check(self) -> None:
"""
Determine whether to unlock Dortania Developer mode
"""
return Path("~/.dortania_developer").expanduser().exists()

View File

@@ -0,0 +1,134 @@
"""
amd_legacy_gcn.py: AMD Legacy GCN detection
"""
from ..base import BaseHardware, HardwareVariant, HardwareVariantGraphicsSubclass
from ...base import PatchType
from ...shared_patches.monterey_gva import MontereyGVA
from ...shared_patches.monterey_opencl import MontereyOpenCL
from ...shared_patches.amd_opencl import AMDOpenCL
from .....constants import Constants
from .....detections import device_probe
from .....datasets.os_data import os_data
class AMDLegacyGCN(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()}: AMD Legacy GCN"
def present(self) -> bool:
"""
Targeting AMD Legacy GCN GPUs
"""
return self._is_gpu_architecture_present(
gpu_architectures=[
device_probe.AMD.Archs.Legacy_GCN_7000,
device_probe.AMD.Archs.Legacy_GCN_8000,
device_probe.AMD.Archs.Legacy_GCN_9000
]
) and self._computer.rosetta_active is False # Rosetta 2 mimics an AMD R9 270X
def native_os(self) -> bool:
"""
Dropped support with macOS 13, Ventura
"""
return self._xnu_major < os_data.ventura.value
def hardware_variant(self) -> HardwareVariant:
"""
Type of hardware variant
"""
return HardwareVariant.GRAPHICS
def hardware_variant_graphics_subclass(self) -> HardwareVariantGraphicsSubclass:
"""
Type of hardware variant subclass
"""
return HardwareVariantGraphicsSubclass.METAL_31001_GRAPHICS
def requires_kernel_debug_kit(self) -> bool:
"""
Apple no longer provides standalone kexts in the base OS
"""
return self._xnu_major >= os_data.ventura.value
def _model_specific_patches(self) -> dict:
"""
Model specific patches
"""
# If 3802 GPU present, use stock Monterey bronze bundle even on Sequoia
bronze_bundle_source = "12.5"
if self._is_gpu_architecture_present(
[
device_probe.Intel.Archs.Ivy_Bridge,
device_probe.Intel.Archs.Haswell,
device_probe.NVIDIA.Archs.Kepler,
]
) is False:
if self._xnu_major >= os_data.sequoia:
bronze_bundle_source = "12.5-24"
return {
"AMD Legacy GCN": {
PatchType.OVERWRITE_SYSTEM_VOLUME: {
"/System/Library/Extensions": {
"AMD7000Controller.kext": "12.5",
"AMD8000Controller.kext": "12.5",
"AMD9000Controller.kext": "12.5",
"AMD9500Controller.kext": "12.5",
"AMD10000Controller.kext": "12.5",
"AMDRadeonX4000.kext": self._resolve_monterey_framebuffers(),
"AMDRadeonX4000HWServices.kext": "12.5",
"AMDFramebuffer.kext": "12.5" if self._xnu_float < self.macOS_13_3 else "12.5-GCN",
"AMDSupport.kext": "12.5",
"AMDRadeonVADriver.bundle": "12.5",
"AMDRadeonVADriver2.bundle": "12.5",
"AMDRadeonX4000GLDriver.bundle": "12.5",
"AMDMTLBronzeDriver.bundle": bronze_bundle_source,
"AMDShared.bundle": "12.5",
},
},
},
}
def patches(self) -> dict:
"""
Patches for AMD Legacy GCN GPUs
"""
if self.native_os() is True:
return {}
_base = {}
# AMD GCN and newer GPUs can still use the native GVA stack
_base.update({
**MontereyGVA(self._xnu_major, self._xnu_minor, self._constants.detected_os_version).revert_patches(),
})
_base.update({
**MontereyOpenCL(self._xnu_major, self._xnu_minor, self._constants.detected_os_version).patches(),
**AMDOpenCL(self._xnu_major, self._xnu_minor, self._constants.detected_os_version).patches(),
**self._model_specific_patches(),
})
return _base

View File

@@ -0,0 +1,127 @@
"""
amd_navi.py: AMD Navi detection (Not implemented, only present for reference)
"""
from ..base import BaseHardware, HardwareVariant, HardwareVariantGraphicsSubclass
from ...base import PatchType
from ...shared_patches.monterey_opencl import MontereyOpenCL
from ...shared_patches.amd_opencl import AMDOpenCL
from .....constants import Constants
from .....detections import device_probe
from .....datasets.os_data import os_data
class AMDNavi(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()}: AMD Navi"
def present(self) -> bool:
"""
Targeting AMD Navi GPUs with CPUs lacking AVX2.0
"""
return self._is_gpu_architecture_present(
gpu_architectures=[
device_probe.AMD.Archs.Navi
]
) and "AVX2" not in self._computer.cpu.leafs and self._dortania_internal_check() is True
def native_os(self) -> bool:
"""
Dropped support with macOS 13, Ventura
"""
return self._xnu_major < os_data.ventura.value
def hardware_variant(self) -> HardwareVariant:
"""
Type of hardware variant
"""
return HardwareVariant.GRAPHICS
def hardware_variant_graphics_subclass(self) -> HardwareVariantGraphicsSubclass:
"""
Type of hardware variant subclass
"""
return HardwareVariantGraphicsSubclass.METAL_31001_GRAPHICS
def requires_kernel_debug_kit(self) -> bool:
"""
Apple no longer provides standalone kexts in the base OS
"""
return self._xnu_major >= os_data.ventura.value
def _model_specific_patches(self) -> dict:
"""
Model specific patches
"""
return {
"AMD Navi": {
PatchType.OVERWRITE_SYSTEM_VOLUME: {
"AMDRadeonX6000.kext": self._resolve_monterey_framebuffers(),
"AMDRadeonX6000Framebuffer.kext": "12.5",
"AMDRadeonVADriver2.bundle": "12.5",
"AMDRadeonX6000GLDriver.bundle": "12.5",
"AMDRadeonX6000MTLDriver.bundle": "12.5" if self._xnu_major < os_data.sequoia else "12.5-24",
"AMDRadeonX6000Shared.bundle": "12.5",
"AMDShared.bundle": "12.5",
}
}
}
def _model_specific_patches_extended(self) -> dict:
"""
Support mixed legacy and modern AMD GPUs
Specifically systems using AMD GCN 1-3 and Navi (ex. MacPro6,1 with eGPU)
Assume 'AMD Legacy GCN' patchset is installed alongside this
"""
if self._is_gpu_architecture_present([
device_probe.AMD.Archs.Legacy_GCN_7000,
device_probe.AMD.Archs.Legacy_GCN_8000,
device_probe.AMD.Archs.Legacy_GCN_9000
]) is False:
return {}
return {
"AMD Navi Extended": {
PatchType.OVERWRITE_SYSTEM_VOLUME: {
"/System/Library/Extensions": {
"AMDRadeonX6000HWServices.kext": "12.5",
},
},
},
}
def patches(self) -> dict:
"""
Patches for AMD Navi GPUs
"""
if self.native_os() is True:
return {}
return {
**MontereyOpenCL(self._xnu_major, self._xnu_minor, self._constants.detected_os_version).patches(),
**AMDOpenCL(self._xnu_major, self._xnu_minor, self._constants.detected_os_version).patches(),
**self._model_specific_patches(),
**self._model_specific_patches_extended(),
}

View File

@@ -0,0 +1,147 @@
"""
amd_polaris.py: AMD Polaris detection
"""
from .amd_legacy_gcn import AMDLegacyGCN
from ..base import BaseHardware, HardwareVariant, HardwareVariantGraphicsSubclass
from ...base import PatchType
from ...shared_patches.monterey_gva import MontereyGVA
from ...shared_patches.monterey_opencl import MontereyOpenCL
from ...shared_patches.amd_opencl import AMDOpenCL
from .....constants import Constants
from .....detections import device_probe
from .....datasets.os_data import os_data
class AMDPolaris(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()}: AMD Polaris"
def present(self) -> bool:
"""
Targeting AMD Polaris GPUs with CPUs lacking AVX2.0 or missing Framebuffer patches (ie. MacBookPro13,3 and MacBookPro14,3)
"""
return self._is_gpu_architecture_present(
gpu_architectures=[
device_probe.AMD.Archs.Polaris
]
) and ("AVX2" not in self._computer.cpu.leafs or self._computer.real_model in ["MacBookPro13,3", "MacBookPro14,3"])
def native_os(self) -> bool:
"""
Dropped support with macOS 13, Ventura
"""
return self._xnu_major < os_data.ventura.value
def hardware_variant(self) -> HardwareVariant:
"""
Type of hardware variant
"""
return HardwareVariant.GRAPHICS
def hardware_variant_graphics_subclass(self) -> HardwareVariantGraphicsSubclass:
"""
Type of hardware variant subclass
"""
return HardwareVariantGraphicsSubclass.METAL_31001_GRAPHICS
def requires_kernel_debug_kit(self) -> bool:
"""
Apple no longer provides standalone kexts in the base OS
"""
return self._xnu_major >= os_data.ventura.value
def _model_specific_patches(self) -> dict:
"""
Model specific patches
"""
# For MacBookPro13,3 missing framebuffers (ex. 'ATY,Berbice')
if self._computer.real_model in ["MacBookPro13,3"]:
# Since dropped at the same time, we can use the same patches
result = AMDLegacyGCN(self._xnu_major, self._xnu_minor, self._os_build, self._constants)._model_specific_patches()
# Have to rename 'AMD Legacy GCN' to 'AMD Polaris' for model detection
return {"AMD Polaris": result["AMD Legacy GCN"]}
# For MacBookPro14,3 (and other AMD dGPUs that no longer function in Sonoma)
# iMac18,2/3 still function with the generic framebuffer, however if issues arise
# we'll downgrade them as well.
if self._computer.real_model in ["MacBookPro14,3"]:
if self._xnu_major < os_data.sonoma.value:
return {}
return {
"AMD Polaris": {
PatchType.OVERWRITE_SYSTEM_VOLUME: {
"/System/Library/Extensions": {
"AMD9500Controller.kext": "13.5.2",
"AMD10000Controller.kext": "13.5.2",
"AMDFramebuffer.kext": "13.5.2",
"AMDSupport.kext": "13.5.2",
},
},
},
}
# Assuming non-AVX2.0 CPUs
# Note missing framebuffers are not restored (ex. 'ATY,Berbice')
return {
"AMD Polaris": {
PatchType.OVERWRITE_SYSTEM_VOLUME: {
"/System/Library/Extensions": {
"AMDRadeonX4000.kext": self._resolve_monterey_framebuffers(),
"AMDRadeonX4000HWServices.kext": "12.5",
"AMDRadeonVADriver2.bundle": "12.5",
"AMDRadeonX4000GLDriver.bundle": "12.5",
"AMDMTLBronzeDriver.bundle": "12.5" if self._xnu_major < os_data.sequoia else "12.5-24",
"AMDShared.bundle": "12.5",
},
},
},
}
def patches(self) -> dict:
"""
Patches for AMD Polaris GPUs
"""
if self.native_os() is True:
return {}
# Minimal amount of patches required for 2017 Polaris
if self._computer.real_model in ["MacBookPro14,3"]:
return self._model_specific_patches()
_base = {
**MontereyOpenCL(self._xnu_major, self._xnu_minor, self._constants.detected_os_version).patches(),
**self._model_specific_patches(),
}
if "AVX2" not in self._computer.cpu.leafs:
_base.update({
**AMDOpenCL(self._xnu_major, self._xnu_minor, self._constants.detected_os_version).patches(),
})
# AMD GCN and newer GPUs can still use the native GVA stack
_base.update({
**MontereyGVA(self._xnu_major, self._xnu_minor, self._constants.detected_os_version).revert_patches(),
})
return _base

View File

@@ -0,0 +1,112 @@
"""
amd_terascale_1.py: AMD TeraScale 1 detection
"""
from ..base import BaseHardware, HardwareVariant, HardwareVariantGraphicsSubclass
from ...base import PatchType
from ...shared_patches.non_metal import NonMetal
from ...shared_patches.monterey_webkit import MontereyWebKit
from ...shared_patches.amd_terascale import AMDTeraScale
from .....constants import Constants
from .....detections import device_probe
from .....datasets.os_data import os_data
class AMDTeraScale1(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()}: AMD TeraScale 1"
def present(self) -> bool:
"""
Targeting AMD TeraScale GPUs
"""
return self._is_gpu_architecture_present(
gpu_architectures=[
device_probe.AMD.Archs.TeraScale_1
]
)
def native_os(self) -> bool:
"""
Dropped support with macOS 10.14, Mojave
"""
return self._xnu_major < os_data.mojave.value
def hardware_variant(self) -> HardwareVariant:
"""
Type of hardware variant
"""
return HardwareVariant.GRAPHICS
def hardware_variant_graphics_subclass(self) -> HardwareVariantGraphicsSubclass:
"""
Type of hardware variant subclass
"""
return HardwareVariantGraphicsSubclass.NON_METAL_GRAPHICS
def requires_kernel_debug_kit(self) -> bool:
"""
Apple no longer provides standalone kexts in the base OS
"""
return self._xnu_major >= os_data.ventura.value
def _model_specific_patches(self) -> dict:
"""
Model specific patches
"""
return {
"AMD TeraScale 1": {
PatchType.OVERWRITE_SYSTEM_VOLUME: {
"/System/Library/Extensions": {
"AMD2400Controller.kext": "10.13.6",
"AMD2600Controller.kext": "10.13.6",
"AMD3800Controller.kext": "10.13.6",
"AMD4600Controller.kext": "10.13.6",
"AMD4800Controller.kext": "10.13.6",
"ATIRadeonX2000.kext": "10.13.6" if self._xnu_major < os_data.ventura else "10.13.6 TS1",
"ATIRadeonX2000GA.plugin": "10.13.6",
"ATIRadeonX2000GLDriver.bundle": "10.13.6",
"ATIRadeonX2000VADriver.bundle": "10.13.6",
},
},
},
}
def patches(self) -> dict:
"""
Patches for AMD TeraScale 1 GPUs
"""
if self.native_os() is True:
return {}
if self._xnu_major not in self._constants.legacy_accel_support and self._dortania_internal_check() is False:
return {
**AMDTeraScale(self._xnu_major, self._xnu_minor, self._os_build).patches(),
**self._model_specific_patches()
}
return {
**NonMetal(self._xnu_major, self._xnu_minor, self._os_build).patches(),
**MontereyWebKit(self._xnu_major, self._xnu_minor, self._os_build).patches(),
**AMDTeraScale(self._xnu_major, self._xnu_minor, self._os_build).patches(),
**self._model_specific_patches(),
}

View File

@@ -0,0 +1,117 @@
"""
amd_terascale_2.py: AMD TeraScale 2 detection
"""
from ..base import BaseHardware, HardwareVariant, HardwareVariantGraphicsSubclass
from ...base import PatchType
from ...shared_patches.non_metal import NonMetal
from ...shared_patches.non_metal_ioaccel import NonMetalIOAccelerator
from ...shared_patches.monterey_webkit import MontereyWebKit
from ...shared_patches.amd_terascale import AMDTeraScale
from .....constants import Constants
from .....detections import device_probe
from .....datasets.os_data import os_data
class AMDTeraScale2(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()}: AMD TeraScale 2"
def present(self) -> bool:
"""
Targeting AMD TeraScale GPUs
"""
return self._is_gpu_architecture_present(
gpu_architectures=[
device_probe.AMD.Archs.TeraScale_2
]
)
def native_os(self) -> bool:
"""
Dropped support with macOS 10.14, Mojave
"""
return self._xnu_major < os_data.mojave.value
def hardware_variant(self) -> HardwareVariant:
"""
Type of hardware variant
"""
return HardwareVariant.GRAPHICS
def hardware_variant_graphics_subclass(self) -> HardwareVariantGraphicsSubclass:
"""
Type of hardware variant subclass
"""
return HardwareVariantGraphicsSubclass.NON_METAL_GRAPHICS
def requires_kernel_debug_kit(self) -> bool:
"""
Apple no longer provides standalone kexts in the base OS
"""
return self._xnu_major >= os_data.ventura.value
def _model_specific_patches(self) -> dict:
"""
Model specific patches
"""
_base = {
"AMD TeraScale 2": {
PatchType.OVERWRITE_SYSTEM_VOLUME: {
"/System/Library/Extensions": {
"AMD5000Controller.kext": "10.13.6",
"AMD6000Controller.kext": "10.13.6",
"AMDRadeonVADriver.bundle": "10.13.6",
"AMDRadeonVADriver2.bundle": "10.13.6",
"AMDRadeonX3000.kext": "10.13.6",
"AMDRadeonX3000GLDriver.bundle": "10.13.6",
},
},
},
}
# TeraScale 2 MacBooks with faulty GPUs are highly prone to crashing with AMDRadeonX3000 attached
if self._constants.allow_ts2_accel is False and self._constants.host_is_hackintosh is False:
_base["AMD TeraScale 2"][PatchType.OVERWRITE_SYSTEM_VOLUME]["/System/Library/Extensions"].pop("AMDRadeonX3000.kext")
return _base
def patches(self) -> dict:
"""
Patches for AMD TeraScale 2 GPUs
"""
if self.native_os() is True:
return {}
if self._xnu_major not in self._constants.legacy_accel_support and self._dortania_internal_check() is False:
return {
**AMDTeraScale(self._xnu_major, self._xnu_minor, self._os_build).patches(),
**self._model_specific_patches()
}
return {
**NonMetal(self._xnu_major, self._xnu_minor, self._os_build).patches(),
**NonMetalIOAccelerator(self._xnu_major, self._xnu_minor, self._os_build).patches(),
**MontereyWebKit(self._xnu_major, self._xnu_minor, self._os_build).patches(),
**AMDTeraScale(self._xnu_major, self._xnu_minor, self._os_build).patches(),
**self._model_specific_patches(),
}

View File

@@ -0,0 +1,132 @@
"""
amd_vega.py: AMD Vega detection
"""
from ..base import BaseHardware, HardwareVariant, HardwareVariantGraphicsSubclass
from ...base import PatchType
from ...shared_patches.monterey_gva import MontereyGVA
from ...shared_patches.monterey_opencl import MontereyOpenCL
from ...shared_patches.amd_opencl import AMDOpenCL
from .....constants import Constants
from .....detections import device_probe
from .....datasets.os_data import os_data
class AMDVega(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()}: AMD Vega"
def present(self) -> bool:
"""
Targeting AMD Vega GPUs with CPUs lacking AVX2.0
"""
return self._is_gpu_architecture_present(
gpu_architectures=[
device_probe.AMD.Archs.Vega
]
) and "AVX2" not in self._computer.cpu.leafs
def native_os(self) -> bool:
"""
Dropped support with macOS 13, Ventura
"""
return self._xnu_major < os_data.ventura.value
def hardware_variant(self) -> HardwareVariant:
"""
Type of hardware variant
"""
return HardwareVariant.GRAPHICS
def hardware_variant_graphics_subclass(self) -> HardwareVariantGraphicsSubclass:
"""
Type of hardware variant subclass
"""
return HardwareVariantGraphicsSubclass.METAL_31001_GRAPHICS
def requires_kernel_debug_kit(self) -> bool:
"""
Apple no longer provides standalone kexts in the base OS
"""
return self._xnu_major >= os_data.ventura.value
def _model_specific_patches(self) -> dict:
"""
Model specific patches
"""
return {
"AMD Vega": {
PatchType.OVERWRITE_SYSTEM_VOLUME: {
"/System/Library/Extensions": {
"AMDRadeonX5000.kext": self._resolve_monterey_framebuffers(),
"AMDRadeonVADriver2.bundle": "12.5",
"AMDRadeonX5000GLDriver.bundle": "12.5",
"AMDRadeonX5000MTLDriver.bundle": "12.5" if self._xnu_major < os_data.sequoia else "12.5-24",
"AMDRadeonX5000Shared.bundle": "12.5",
"AMDShared.bundle": "12.5",
},
},
},
}
def _model_specific_patches_extended(self) -> dict:
"""
Support mixed legacy and modern AMD GPUs
Specifically systems using AMD GCN 1-3 and Vega (ex. MacPro6,1 with eGPU)
Assume 'AMD Legacy GCN' patchset is installed alongside this
"""
if self._is_gpu_architecture_present([
device_probe.AMD.Archs.Legacy_GCN_7000,
device_probe.AMD.Archs.Legacy_GCN_8000,
device_probe.AMD.Archs.Legacy_GCN_9000
]) is False:
return {}
return {
"AMD Vega Extended": {
PatchType.OVERWRITE_SYSTEM_VOLUME: {
"/System/Library/Extensions": {
"AMDRadeonX5000HWServices.kext": "12.5",
},
},
},
}
def patches(self) -> dict:
"""
Patches for AMD Vega GPUs
"""
if self.native_os() is True:
return {}
return {
# AMD GCN and newer GPUs can still use the native GVA stack
**MontereyGVA(self._xnu_major, self._xnu_minor, self._constants.detected_os_version).revert_patches(),
**MontereyOpenCL(self._xnu_major, self._xnu_minor, self._constants.detected_os_version).patches(),
**AMDOpenCL(self._xnu_major, self._xnu_minor, self._constants.detected_os_version).patches(),
**self._model_specific_patches(),
**self._model_specific_patches_extended(),
}

View File

@@ -0,0 +1,94 @@
"""
intel_broadwell.py: Intel Broadwell detection
"""
from ..base import BaseHardware, HardwareVariant, HardwareVariantGraphicsSubclass
from ...base import PatchType
from ...shared_patches.monterey_gva import MontereyGVA
from ...shared_patches.monterey_opencl import MontereyOpenCL
from .....constants import Constants
from .....detections import device_probe
from .....datasets.os_data import os_data
class IntelBroadwell(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()}: Intel Broadwell"
def present(self) -> bool:
"""
Targeting Intel Broadwell GPUs
"""
return self._is_gpu_architecture_present(
gpu_architectures=[
device_probe.Intel.Archs.Broadwell
]
)
def hardware_variant(self) -> HardwareVariant:
"""
Type of hardware variant
"""
return HardwareVariant.GRAPHICS
def hardware_variant_graphics_subclass(self) -> HardwareVariantGraphicsSubclass:
"""
Type of hardware variant subclass
"""
return HardwareVariantGraphicsSubclass.METAL_31001_GRAPHICS
def native_os(self) -> bool:
"""
Dropped support with macOS 13, Ventura
"""
return self._xnu_major < os_data.ventura.value
def _model_specific_patches(self) -> dict:
"""
Model specific patches
"""
return {
"Intel Broadwell": {
PatchType.OVERWRITE_SYSTEM_VOLUME: {
"/System/Library/Extensions": {
"AppleIntelBDWGraphics.kext": self._resolve_monterey_framebuffers(),
"AppleIntelBDWGraphicsFramebuffer.kext": self._resolve_monterey_framebuffers(),
"AppleIntelBDWGraphicsGLDriver.bundle": "12.5",
"AppleIntelBDWGraphicsMTLDriver.bundle": "12.5-22" if self._xnu_major < os_data.sequoia else "12.5-24",
"AppleIntelBDWGraphicsVADriver.bundle": "12.5",
"AppleIntelBDWGraphicsVAME.bundle": "12.5",
"AppleIntelGraphicsShared.bundle": "12.5",
},
},
},
}
def patches(self) -> dict:
"""
Patches for Intel Broadwell iGPUs
"""
if self.native_os() is True:
return {}
return {
**MontereyGVA(self._xnu_major, self._xnu_minor, self._constants.detected_os_version).patches(),
**MontereyOpenCL(self._xnu_major, self._xnu_minor, self._constants.detected_os_version).patches(),
**self._model_specific_patches(),
}

View File

@@ -0,0 +1,120 @@
"""
intel_haswell.py: Intel Haswell detection
"""
from ..base import BaseHardware, HardwareVariant, HardwareVariantGraphicsSubclass
from ...base import PatchType
from ...shared_patches.metal_3802 import LegacyMetal3802
from ...shared_patches.monterey_gva import MontereyGVA
from ...shared_patches.monterey_opencl import MontereyOpenCL
from .....constants import Constants
from .....detections import device_probe
from .....datasets.os_data import os_data
class IntelHaswell(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()}: Intel Haswell"
def present(self) -> bool:
"""
Targeting Intel Haswell GPUs
"""
return self._is_gpu_architecture_present(
gpu_architectures=[
device_probe.Intel.Archs.Haswell
]
)
def native_os(self) -> bool:
"""
Dropped support with macOS 13, Ventura
"""
return self._xnu_major < os_data.ventura.value
def hardware_variant(self) -> HardwareVariant:
"""
Type of hardware variant
"""
return HardwareVariant.GRAPHICS
def hardware_variant_graphics_subclass(self) -> HardwareVariantGraphicsSubclass:
"""
Type of hardware variant subclass
"""
return HardwareVariantGraphicsSubclass.METAL_3802_GRAPHICS
def requires_metallib_support_pkg(self) -> bool:
"""
New compiler format introduced in macOS 15, Sequoia
"""
return self._xnu_major >= os_data.sequoia.value
def _model_specific_patches(self) -> dict:
"""
Model specific patches
"""
return {
"Intel Haswell": {
PatchType.OVERWRITE_SYSTEM_VOLUME: {
"/System/Library/Extensions": {
"AppleIntelFramebufferAzul.kext": self._resolve_monterey_framebuffers(),
"AppleIntelHD5000Graphics.kext": self._resolve_monterey_framebuffers(),
"AppleIntelHD5000GraphicsGLDriver.bundle": "12.5",
"AppleIntelHD5000GraphicsMTLDriver.bundle": "12.5",
"AppleIntelHD5000GraphicsVADriver.bundle": "12.5",
"AppleIntelHSWVA.bundle": "12.5",
"AppleIntelGraphicsShared.bundle": "12.5",
},
},
},
}
def _framebuffer_only_patches(self) -> dict:
"""
Framebuffer only patches
"""
return {
"Intel Haswell": {
PatchType.OVERWRITE_SYSTEM_VOLUME: {
"/System/Library/Extensions": {
"AppleIntelFramebufferAzul.kext": self._resolve_monterey_framebuffers(),
},
},
},
}
def patches(self) -> dict:
"""
Patches for Intel Haswell iGPUs
"""
if self.native_os() is True:
return {}
return {
**LegacyMetal3802(self._xnu_major, self._xnu_minor, self._constants.detected_os_version).patches(),
**MontereyGVA(self._xnu_major, self._xnu_minor, self._constants.detected_os_version).patches(),
**MontereyOpenCL(self._xnu_major, self._xnu_minor, self._constants.detected_os_version).patches(),
**self._model_specific_patches(),
}

View File

@@ -0,0 +1,103 @@
"""
intel_iron_lake.py: Intel Iron Lake detection
"""
from ..base import BaseHardware, HardwareVariant, HardwareVariantGraphicsSubclass
from ...base import PatchType
from ...shared_patches.non_metal import NonMetal
from ...shared_patches.monterey_webkit import MontereyWebKit
from .....constants import Constants
from .....detections import device_probe
from .....datasets.os_data import os_data
class IntelIronLake(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()}: Intel Iron Lake"
def present(self) -> bool:
"""
Targeting Intel Iron Lake GPUs
"""
return self._is_gpu_architecture_present(
gpu_architectures=[
device_probe.Intel.Archs.Iron_Lake
]
)
def native_os(self) -> bool:
"""
Dropped support with macOS 10.14, Mojave
"""
return self._xnu_major < os_data.mojave.value
def hardware_variant(self) -> HardwareVariant:
"""
Type of hardware variant
"""
return HardwareVariant.GRAPHICS
def hardware_variant_graphics_subclass(self) -> HardwareVariantGraphicsSubclass:
"""
Type of hardware variant subclass
"""
return HardwareVariantGraphicsSubclass.NON_METAL_GRAPHICS
def requires_kernel_debug_kit(self) -> bool:
"""
Apple no longer provides standalone kexts in the base OS
"""
return self._xnu_major >= os_data.ventura.value
def _model_specific_patches(self) -> dict:
"""
Model specific patches
"""
return {
"Intel Iron Lake": {
PatchType.OVERWRITE_SYSTEM_VOLUME: {
"/System/Library/Extensions": {
"AppleIntelHDGraphics.kext": "10.13.6",
"AppleIntelHDGraphicsFB.kext": "10.13.6",
"AppleIntelHDGraphicsGA.plugin": "10.13.6",
"AppleIntelHDGraphicsGLDriver.bundle": "10.13.6",
"AppleIntelHDGraphicsVADriver.bundle": "10.13.6",
},
},
},
}
def patches(self) -> dict:
"""
Patches for Intel Iron Lake iGPUs
"""
if self.native_os() is True:
return {}
if self._xnu_major not in self._constants.legacy_accel_support and self._dortania_internal_check() is False:
return {**self._model_specific_patches()}
return {
**NonMetal(self._xnu_major, self._xnu_minor, self._os_build).patches(),
**MontereyWebKit(self._xnu_major, self._xnu_minor, self._os_build).patches(),
**self._model_specific_patches(),
}

View File

@@ -0,0 +1,121 @@
"""
intel_ivy_bridge.py: Intel Ivy Bridge detection
"""
from ..base import BaseHardware, HardwareVariant, HardwareVariantGraphicsSubclass
from ...base import PatchType
from ...shared_patches.metal_3802 import LegacyMetal3802
from ...shared_patches.big_sur_gva import BigSurGVA
from ...shared_patches.monterey_opencl import MontereyOpenCL
from ...shared_patches.big_sur_opencl import BigSurOpenCL
from ...shared_patches.monterey_webkit import MontereyWebKit
from .....constants import Constants
from .....detections import device_probe
from .....datasets.os_data import os_data
class IntelIvyBridge(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()}: Intel Ivy Bridge"
def present(self) -> bool:
"""
Targeting Intel Ivy Bridge GPUs
"""
return self._is_gpu_architecture_present(
gpu_architectures=[
device_probe.Intel.Archs.Ivy_Bridge
]
)
def native_os(self) -> bool:
"""
Dropped support with macOS 12, Monterey
"""
return self._xnu_major < os_data.monterey.value
def hardware_variant(self) -> HardwareVariant:
"""
Type of hardware variant
"""
return HardwareVariant.GRAPHICS
def hardware_variant_graphics_subclass(self) -> HardwareVariantGraphicsSubclass:
"""
Type of hardware variant subclass
"""
return HardwareVariantGraphicsSubclass.METAL_3802_GRAPHICS
def requires_metallib_support_pkg(self) -> bool:
"""
New compiler format introduced in macOS 15, Sequoia
"""
return self._xnu_major >= os_data.sequoia.value
def _resolve_ivy_bridge_framebuffers(self) -> str:
"""
Resolve patchset directory for Ivy Bridge framebuffers:
- AppleIntelFramebufferCapri.kext
- AppleIntelHD4000Graphics.kext
"""
if self._xnu_major < os_data.sonoma:
return "11.7.10"
if self._xnu_float < self.macOS_14_4:
return "11.7.10-23"
return "11.7.10-23.4"
def _model_specific_patches(self) -> dict:
"""
Model specific patches
"""
return {
"Intel Ivy Bridge": {
PatchType.OVERWRITE_SYSTEM_VOLUME: {
"/System/Library/Extensions": {
"AppleIntelHD4000GraphicsGLDriver.bundle": "11.7.10",
"AppleIntelHD4000GraphicsMTLDriver.bundle": "11.7.10" if self._xnu_major < os_data.ventura else "11.7.10-22",
"AppleIntelHD4000GraphicsVADriver.bundle": "11.7.10",
"AppleIntelFramebufferCapri.kext": self._resolve_ivy_bridge_framebuffers(),
"AppleIntelHD4000Graphics.kext": self._resolve_ivy_bridge_framebuffers(),
"AppleIntelIVBVA.bundle": "11.7.10",
"AppleIntelGraphicsShared.bundle": "11.7.10", # libIGIL-Metal.dylib pulled from 11.0 Beta 6
},
},
},
}
def patches(self) -> dict:
"""
Patches for Intel Ivy Bridge iGPUs
"""
if self.native_os() is True:
return {}
return {
**LegacyMetal3802(self._xnu_major, self._xnu_minor, self._constants.detected_os_version).patches(),
**BigSurGVA(self._xnu_major, self._xnu_minor, self._constants.detected_os_version).patches(),
**MontereyOpenCL(self._xnu_major, self._xnu_minor, self._constants.detected_os_version).patches(),
**BigSurOpenCL(self._xnu_major, self._xnu_minor, self._constants.detected_os_version).patches(),
**MontereyWebKit(self._xnu_major, self._xnu_minor, self._os_build).patches(),
**self._model_specific_patches(),
}

View File

@@ -0,0 +1,108 @@
"""
intel_sandy_bridge.py: Intel Sandy Bridge detection
"""
from ..base import BaseHardware, HardwareVariant, HardwareVariantGraphicsSubclass
from ...base import PatchType
from ...shared_patches.non_metal import NonMetal
from ...shared_patches.monterey_webkit import MontereyWebKit
from ...shared_patches.high_sierra_gva import HighSierraGVA
from .....constants import Constants
from .....detections import device_probe
from .....datasets.os_data import os_data
class IntelSandyBridge(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()}: Intel Sandy Bridge"
def present(self) -> bool:
"""
Targeting Intel Sandy Bridge GPUs
"""
return self._is_gpu_architecture_present(
gpu_architectures=[
device_probe.Intel.Archs.Sandy_Bridge
]
)
def native_os(self) -> bool:
"""
Dropped support with macOS 10.14, Mojave
"""
return self._xnu_major < os_data.mojave.value
def hardware_variant(self) -> HardwareVariant:
"""
Type of hardware variant
"""
return HardwareVariant.GRAPHICS
def hardware_variant_graphics_subclass(self) -> HardwareVariantGraphicsSubclass:
"""
Type of hardware variant subclass
"""
return HardwareVariantGraphicsSubclass.NON_METAL_GRAPHICS
def requires_kernel_debug_kit(self) -> bool:
"""
Requires replacing a number of kexts in the BootKC
"""
if self._xnu_major >= os_data.ventura.value:
return True
return False
def _model_specific_patches(self) -> dict:
"""
Model specific patches
"""
return {
"Intel Sandy Bridge": {
PatchType.OVERWRITE_SYSTEM_VOLUME: {
"/System/Library/Extensions": {
"AppleIntelHD3000Graphics.kext": "10.13.6",
"AppleIntelHD3000GraphicsGA.plugin": "10.13.6",
"AppleIntelHD3000GraphicsGLDriver.bundle": "10.13.6",
"AppleIntelHD3000GraphicsVADriver.bundle": "10.13.6",
"AppleIntelSNBGraphicsFB.kext": "10.13.6",
"AppleIntelSNBVA.bundle": "10.13.6",
},
},
},
}
def patches(self) -> dict:
"""
Patches for Intel Sandy Bridge GPUs
"""
if self.native_os() is True:
return {}
if self._xnu_major not in self._constants.legacy_accel_support and self._dortania_internal_check() is False:
return {**self._model_specific_patches()}
return {
**NonMetal(self._xnu_major, self._xnu_minor, self._os_build).patches(),
**HighSierraGVA(self._xnu_major, self._xnu_minor, self._os_build).patches(),
**MontereyWebKit(self._xnu_major, self._xnu_minor, self._os_build).patches(),
**self._model_specific_patches(),
}

View File

@@ -0,0 +1,93 @@
"""
intel_skylake.py: Intel Skylake detection
"""
from ..base import BaseHardware, HardwareVariant, HardwareVariantGraphicsSubclass
from ...base import PatchType
from ...shared_patches.monterey_opencl import MontereyOpenCL
from .....constants import Constants
from .....detections import device_probe
from .....datasets.os_data import os_data
class IntelSkylake(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()}: Intel Skylake"
def present(self) -> bool:
"""
Targeting Intel Skylake GPUs
"""
return self._is_gpu_architecture_present(
gpu_architectures=[
device_probe.Intel.Archs.Skylake
]
)
def native_os(self) -> bool:
"""
Dropped support with macOS 13, Ventura
"""
return self._xnu_major < os_data.ventura.value
def hardware_variant(self) -> HardwareVariant:
"""
Type of hardware variant
"""
return HardwareVariant.GRAPHICS
def hardware_variant_graphics_subclass(self) -> HardwareVariantGraphicsSubclass:
"""
Type of hardware variant subclass
"""
return HardwareVariantGraphicsSubclass.METAL_31001_GRAPHICS
def _model_specific_patches(self) -> dict:
"""
Model specific patches
"""
return {
"Intel Skylake": {
PatchType.OVERWRITE_SYSTEM_VOLUME: {
"/System/Library/Extensions": {
"AppleIntelSKLGraphics.kext": self._resolve_monterey_framebuffers(),
"AppleIntelSKLGraphicsFramebuffer.kext": self._resolve_monterey_framebuffers(),
"AppleIntelSKLGraphicsGLDriver.bundle": "12.5",
"AppleIntelSKLGraphicsMTLDriver.bundle": "12.5" if self._xnu_major < os_data.sequoia else "12.5-24",
"AppleIntelSKLGraphicsVADriver.bundle": "12.5",
"AppleIntelSKLGraphicsVAME.bundle": "12.5",
"AppleIntelGraphicsShared.bundle": "12.5",
},
},
},
}
def patches(self) -> dict:
"""
Patches for Intel Skylake iGPUs
"""
if self.native_os() is True:
return {}
return {
**MontereyOpenCL(self._xnu_major, self._xnu_minor, self._constants.detected_os_version).patches(),
**self._model_specific_patches(),
}

View File

@@ -0,0 +1,136 @@
"""
nvidia_kepler.py: Nvidia Kepler detection
"""
from ..base import BaseHardware, HardwareVariant, HardwareVariantGraphicsSubclass
from ...base import PatchType
from ...shared_patches.metal_3802 import LegacyMetal3802
from ...shared_patches.monterey_opencl import MontereyOpenCL
from ...shared_patches.big_sur_opencl import BigSurOpenCL
from ...shared_patches.monterey_webkit import MontereyWebKit
from .....constants import Constants
from .....detections import device_probe
from .....datasets.os_data import os_data
class NvidiaKepler(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()}: Nvidia Kepler"
def present(self) -> bool:
"""
Targeting Nvidia Kepler GPUs
"""
return self._is_gpu_architecture_present(
gpu_architectures=[
device_probe.NVIDIA.Archs.Kepler
]
)
def native_os(self) -> bool:
"""
Dropped support with macOS 12.0 Beta 7, Monterey
"""
if self._xnu_major < os_data.monterey:
return True
if self._xnu_major == os_data.monterey:
if self._xnu_minor <= 0: # 12.0 Beta 8 increased XNU minor
if self._os_build != "21A5522h": # 12.0 Beta 7
return True
return False
def hardware_variant(self) -> HardwareVariant:
"""
Type of hardware variant
"""
return HardwareVariant.GRAPHICS
def hardware_variant_graphics_subclass(self) -> HardwareVariantGraphicsSubclass:
"""
Type of hardware variant subclass
"""
return HardwareVariantGraphicsSubclass.METAL_3802_GRAPHICS
def requires_metallib_support_pkg(self) -> bool:
"""
New compiler format introduced in macOS 15, Sequoia
"""
return self._xnu_major >= os_data.sequoia.value
def _resolve_kepler_geforce_framebuffers(self) -> str:
"""
Resolve patchset directory for GeForce.kext
"""
if self._xnu_major < os_data.sonoma:
return "12.0 Beta 6"
if self._xnu_float < self.macOS_14_4:
return "12.0 Beta 6-23"
return "12.0 Beta 6-23.4"
def _model_specific_patches(self) -> dict:
"""
Model specific patches
"""
return {
"Nvidia Kepler": {
PatchType.OVERWRITE_SYSTEM_VOLUME: {
"/System/Library/Extensions": {
"GeForce.kext": self._resolve_kepler_geforce_framebuffers(),
"NVDAGF100Hal.kext": "12.0 Beta 6",
"NVDAGK100Hal.kext": "12.0 Beta 6",
"NVDAResman.kext": "12.0 Beta 6",
"NVDAStartup.kext": "12.0 Beta 6",
"GeForceAIRPlugin.bundle": "11.0 Beta 3",
"GeForceGLDriver.bundle": "11.0 Beta 3",
"GeForceMTLDriver.bundle": "11.0 Beta 3" if self._xnu_major <= os_data.monterey else f"11.0 Beta 3-22",
"GeForceVADriver.bundle": "12.0 Beta 6",
},
},
PatchType.MERGE_SYSTEM_VOLUME: {
"/System/Library/Frameworks": {
# XNU 21.6 (macOS 12.5)
**({ "Metal.framework": "12.5 Beta 2"} if (self._xnu_float >= self.macOS_12_5 and self._xnu_major < os_data.ventura) else {}),
},
"/System/Library/PrivateFrameworks": {
"GPUCompiler.framework": "11.6",
},
}
},
}
def patches(self) -> dict:
"""
Patches for Nvidia Kepler GPUs
"""
if self.native_os() is True:
return {}
return {
**LegacyMetal3802(self._xnu_major, self._xnu_minor, self._constants.detected_os_version).patches(),
**MontereyOpenCL(self._xnu_major, self._xnu_minor, self._constants.detected_os_version).patches(),
**BigSurOpenCL(self._xnu_major, self._xnu_minor, self._constants.detected_os_version).patches(),
**MontereyWebKit(self._xnu_major, self._xnu_minor, self._os_build).patches(),
**self._model_specific_patches(),
}

View File

@@ -0,0 +1,106 @@
"""
nvidia_tesla.py: Nvidia Tesla detection
"""
from ..base import BaseHardware, HardwareVariant, HardwareVariantGraphicsSubclass
from ...base import PatchType
from ...shared_patches.non_metal import NonMetal
from ...shared_patches.monterey_webkit import MontereyWebKit
from .....constants import Constants
from .....detections import device_probe
from .....datasets.os_data import os_data
class NvidiaTesla(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()}: Nvidia Tesla"
def present(self) -> bool:
"""
Targeting Nvidia Tesla GPUs
"""
return self._is_gpu_architecture_present(
gpu_architectures=[
device_probe.NVIDIA.Archs.Tesla
]
)
def native_os(self) -> bool:
"""
Dropped support with macOS 10.14, Mojave
"""
return self._xnu_major < os_data.mojave.value
def hardware_variant(self) -> HardwareVariant:
"""
Type of hardware variant
"""
return HardwareVariant.GRAPHICS
def hardware_variant_graphics_subclass(self) -> HardwareVariantGraphicsSubclass:
"""
Type of hardware variant subclass
"""
return HardwareVariantGraphicsSubclass.NON_METAL_GRAPHICS
def requires_kernel_debug_kit(self) -> bool:
"""
Apple no longer provides standalone kexts in the base OS
"""
return self._xnu_major >= os_data.ventura.value
def _model_specific_patches(self) -> dict:
"""
Model specific patches
"""
return {
"Nvidia Tesla": {
PatchType.OVERWRITE_SYSTEM_VOLUME: {
"/System/Library/Extensions": {
"GeForceGA.bundle": "10.13.6",
"GeForceTesla.kext": "10.13.6",
"GeForceTeslaGLDriver.bundle": "10.13.6",
"GeForceTeslaVADriver.bundle": "10.13.6",
"NVDANV50HalTesla.kext": "10.13.6",
"NVDAResmanTesla.kext": "10.13.6",
# Apple dropped NVDAStartup in 12.0 Beta 7 (XNU 21.1)
**({ "NVDAStartup.kext": "12.0 Beta 6" } if self._xnu_float >= self.macOS_12_0_B7 else {})
},
},
},
}
def patches(self) -> dict:
"""
Patches for Nvidia Tesla GPUs
"""
if self.native_os() is True:
return {}
if self._xnu_major not in self._constants.legacy_accel_support and self._dortania_internal_check() is False:
return {**self._model_specific_patches()}
return {
**NonMetal(self._xnu_major, self._xnu_minor, self._os_build).patches(),
**MontereyWebKit(self._xnu_major, self._xnu_minor, self._os_build).patches(),
**self._model_specific_patches(),
}

View File

@@ -0,0 +1,164 @@
"""
nvidia_webdriver.py: Nvidia Web Driver detection
"""
from ..base import BaseHardware, HardwareVariant, HardwareVariantGraphicsSubclass
from ...base import PatchType
from ...shared_patches.non_metal import NonMetal
from ...shared_patches.monterey_webkit import MontereyWebKit
from ...shared_patches.non_metal_ioaccel import NonMetalIOAccelerator
from ...shared_patches.non_metal_coredisplay import NonMetalCoreDisplay
from ...shared_patches.non_metal_enforcement import NonMetalEnforcement
from .....constants import Constants
from .....detections import device_probe
from .....datasets.os_data import os_data
from .....datasets.sip_data import system_integrity_protection
class NvidiaWebDriver(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()}: Nvidia Web Drivers"
def present(self) -> bool:
"""
Targeting Nvidia Fermi, Maxwell, Pascal GPUs
"""
return self._is_gpu_architecture_present(
gpu_architectures=[
device_probe.NVIDIA.Archs.Fermi,
device_probe.NVIDIA.Archs.Maxwell,
device_probe.NVIDIA.Archs.Pascal,
]
)
def native_os(self) -> bool:
"""
Dropped support with macOS 10.14, Mojave
"""
return self._xnu_major < os_data.mojave.value
def hardware_variant(self) -> HardwareVariant:
"""
Type of hardware variant
"""
return HardwareVariant.GRAPHICS
def hardware_variant_graphics_subclass(self) -> HardwareVariantGraphicsSubclass:
"""
Type of hardware variant subclass
"""
return HardwareVariantGraphicsSubclass.NON_METAL_GRAPHICS
def requires_kernel_debug_kit(self) -> bool:
"""
Apple no longer provides standalone kexts in the base OS
"""
return self._xnu_major >= os_data.ventura.value
def required_system_integrity_protection_configurations(self) -> list[str]:
"""
List of required SIP configurations for the patch set
"""
return system_integrity_protection.root_patch_sip_big_sur_3rd_part_kexts
def _model_specific_patches(self) -> dict:
"""
Model specific patches
"""
return {
"Nvidia Web Drivers": {
PatchType.OVERWRITE_SYSTEM_VOLUME: {
"/System/Library/Extensions": {
"GeForceAIRPluginWeb.bundle": "WebDriver-387.10.10.10.40.140",
"GeForceGLDriverWeb.bundle": "WebDriver-387.10.10.10.40.140",
"GeForceMTLDriverWeb.bundle": "WebDriver-387.10.10.10.40.140",
"GeForceVADriverWeb.bundle": "WebDriver-387.10.10.10.40.140",
# Tesla-only files
"GeForceTeslaGAWeb.bundle": "WebDriver-387.10.10.10.40.140",
"GeForceTeslaGLDriverWeb.bundle": "WebDriver-387.10.10.10.40.140",
"GeForceTeslaVADriverWeb.bundle": "WebDriver-387.10.10.10.40.140",
},
},
PatchType.OVERWRITE_DATA_VOLUME: {
"/Library/Extensions": {
"GeForceWeb.kext": "WebDriver-387.10.10.10.40.140",
"NVDAGF100HalWeb.kext": "WebDriver-387.10.10.10.40.140",
"NVDAGK100HalWeb.kext": "WebDriver-387.10.10.10.40.140",
"NVDAGM100HalWeb.kext": "WebDriver-387.10.10.10.40.140",
"NVDAGP100HalWeb.kext": "WebDriver-387.10.10.10.40.140",
"NVDAResmanWeb.kext": "WebDriver-387.10.10.10.40.140",
"NVDAStartupWeb.kext": "WebDriver-387.10.10.10.40.140",
# Tesla-only files
"GeForceTeslaWeb.kext": "WebDriver-387.10.10.10.40.140",
"NVDANV50HalTeslaWeb.kext": "WebDriver-387.10.10.10.40.140",
"NVDAResmanTeslaWeb.kext": "WebDriver-387.10.10.10.40.140",
},
# Disabled due to issues with Pref pane stripping 'nvda_drv' NVRAM
# variables
# "/Library/PreferencePanes": {
# "NVIDIA Driver Manager.prefPane": "WebDriver-387.10.10.10.40.140",
# },
# "/Library/LaunchAgents": {
# "com.nvidia.nvagent.plist": "WebDriver-387.10.10.10.40.140",
# },
# "/Library/LaunchDaemons": {
# "com.nvidia.nvroothelper.plist": "WebDriver-387.10.10.10.40.140",
# },
},
PatchType.MERGE_SYSTEM_VOLUME: {
"/System/Library/PrivateFrameworks": {
# Restore OpenCL by adding missing compiler files
**({ "GPUCompiler.framework": "11.6"} if self._xnu_major >= os_data.monterey else {}),
},
},
PatchType.REMOVE_SYSTEM_VOLUME: {
"/System/Library/Extensions": [
# Due to how late the Auxiliary cache loads, NVDAStartup will match first and then the Web Driver kexts.
# This has no effect for Maxwell and Pascal, however for development purposes, Tesla and Kepler are partially supported.
"NVDAStartup.kext",
],
},
},
}
def patches(self) -> dict:
"""
Patches for Nvidia Web Drivers
"""
if self.native_os() is True:
return {}
if self._xnu_major not in self._constants.legacy_accel_support and self._dortania_internal_check() is False:
return {**self._model_specific_patches()}
return {
**NonMetal(self._xnu_major, self._xnu_minor, self._os_build).patches(),
**NonMetalIOAccelerator(self._xnu_major, self._xnu_minor, self._os_build).patches(),
**NonMetalCoreDisplay(self._xnu_major, self._xnu_minor, self._os_build).patches(),
**MontereyWebKit(self._xnu_major, self._xnu_minor, self._os_build).patches(),
**self._model_specific_patches(),
**NonMetalEnforcement(self._xnu_major, self._xnu_minor, self._os_build).patches(),
}

View File

@@ -0,0 +1,86 @@
"""
display_backlight.py: Legacy Backlight Control detection
"""
from ..base import BaseHardware, HardwareVariant
from ...base import PatchType
from .....constants import Constants
from .....datasets.os_data import os_data
class DisplayBacklight(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()}: Legacy Backlight Control"
def present(self) -> bool:
"""
Targeting Legacy Backlight Controllers
"""
return self._computer.real_model in [
"MacBook5,2",
"iMac7,1",
"iMac8,1",
"iMac9,1",
]
def native_os(self) -> bool:
"""
Dropped support with macOS 10.13, High Sierra
"""
return self._xnu_major < os_data.high_sierra.value
def hardware_variant(self) -> HardwareVariant:
"""
Type of hardware variant
"""
return HardwareVariant.MISCELLANEOUS
def requires_kernel_debug_kit(self) -> bool:
"""
Apple no longer provides standalone kexts in the base OS
"""
return self._xnu_major >= os_data.ventura.value
def patches(self) -> dict:
"""
Patches for Legacy Backlight Control
"""
if self.native_os() is True:
return {}
return {
"Legacy Backlight Control": {
PatchType.OVERWRITE_SYSTEM_VOLUME: {
"/System/Library/Extensions": {
"AppleBacklight.kext": "10.12.6",
"AppleBacklightExpert.kext": "10.12.6",
},
},
PatchType.MERGE_SYSTEM_VOLUME: {
"/System/Library/PrivateFrameworks": {
"DisplayServices.framework": "10.12.6",
},
},
PatchType.REMOVE_SYSTEM_VOLUME: {
"/System/Library/Extensions/AppleGraphicsControl.kext/Contents/PlugIns": [
"AGDCBacklightControl.kext",
],
},
},
}

View File

@@ -0,0 +1,116 @@
"""
gmux.py: Legacy GMUX detection
"""
from ..base import BaseHardware, HardwareVariant
from ...base import PatchType
from .....constants import Constants
from .....support import utilities
from .....datasets.os_data import os_data
class GraphicsMultiplexer(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()}: Legacy GMUX"
def _check_dgpu_status(self) -> bool:
"""
Query whether system has an active dGPU
"""
dgpu = self._computer.dgpu
if dgpu:
if dgpu.class_code and dgpu.class_code == 0xFFFFFFFF:
# If dGPU is disabled via class-codes, assume demuxed
return False
return True
return False
def _detect_demux(self) -> bool:
"""
Query whether system has been demuxed (ex. MacBookPro8,2, disabled dGPU)
"""
# If GFX0 is missing, assume machine was demuxed
# -wegnoegpu would also trigger this, so ensure arg is not present
if not "-wegnoegpu" in (utilities.get_nvram("boot-args", decode=True) or ""):
igpu = self._constants.computer.igpu
dgpu = self._check_dgpu_status()
if igpu and not dgpu:
return True
return False
def present(self) -> bool:
"""
Targeting Legacy GMUX Controllers
Ref: https://doslabelectronics.com/Demux.html
Sierra uses a legacy GMUX control method needed for dGPU switching on MacBookPro5,x
Same method is also used for demuxed machines
Note that MacBookPro5,x machines are extremely unstable with this patch set, so disabled until investigated further
Ref: https://github.com/dortania/OpenCore-Legacy-Patcher/files/7360909/KP-b10-030.txt
"""
return self._computer.real_model in ["MacBookPro8,2", "MacBookPro8,3"] and self._detect_demux()
def native_os(self) -> bool:
"""
Dropped support with macOS 10.13, High Sierra
"""
return self._xnu_major < os_data.sierra.value
def hardware_variant(self) -> HardwareVariant:
"""
Type of hardware variant
"""
return HardwareVariant.MISCELLANEOUS
def requires_kernel_debug_kit(self) -> bool:
"""
Apple no longer provides standalone kexts in the base OS
"""
return self._xnu_major >= os_data.ventura.value
def patches(self) -> dict:
"""
Patches for Legacy GMUX Controllers
"""
if self.native_os() is True:
return {}
if self._xnu_major not in self._constants.legacy_accel_support:
return {}
return {
"Legacy GMUX": {
PatchType.OVERWRITE_SYSTEM_VOLUME: {
"/System/Library/Extensions/AppleGraphicsControl.kext/Contents/PlugIns": {
"AppleMuxControl.kext": "10.12.6",
},
},
PatchType.REMOVE_SYSTEM_VOLUME: {
"/System/Library/Extensions": [
"AppleBacklight.kext",
],
"/System/Library/Extensions/AppleGraphicsControl.kext/Contents/PlugIns": [
"AGDCBacklightControl.kext",
"AppleMuxControl.kext",
],
},
},
}

View File

@@ -0,0 +1,80 @@
"""
keyboard_backlight.py: Legacy Keyboard Backlight detection
"""
from ..base import BaseHardware, HardwareVariant
from ...base import PatchType
from .....constants import Constants
from .....detections import device_probe
from .....datasets.os_data import os_data
class KeyboardBacklight(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()}: Legacy Keyboard Backlight"
def present(self) -> bool:
"""
Targeting Legacy Keyboard Backlight (ie. non-Metal Macs)
"""
return self._computer.real_model.startswith("MacBook") and self._is_gpu_architecture_present(
gpu_architectures=[
device_probe.Intel.Archs.Iron_Lake,
device_probe.Intel.Archs.Sandy_Bridge,
device_probe.AMD.Archs.TeraScale_1,
device_probe.AMD.Archs.TeraScale_2,
device_probe.NVIDIA.Archs.Tesla,
]
)
def native_os(self) -> bool:
"""
Dropped support with macOS 11, Big Sur
"""
return self._xnu_major < os_data.big_sur.value
def hardware_variant(self) -> HardwareVariant:
"""
Type of hardware variant
"""
return HardwareVariant.MISCELLANEOUS
def requires_kernel_debug_kit(self) -> bool:
"""
Apple no longer provides standalone kexts in the base OS
"""
return self._xnu_major >= os_data.ventura.value
def patches(self) -> dict:
"""
Patches for Legacy Keyboard Backlight
"""
if self.native_os() is True:
return {}
if self._xnu_major not in self._constants.legacy_accel_support:
return {}
return {
"Legacy Keyboard Backlight": {
PatchType.EXECUTE: {
"/usr/bin/defaults write /Library/Preferences/.GlobalPreferences.plist Moraea_BacklightHack -bool true": True,
}
},
}

View File

@@ -0,0 +1,137 @@
"""
legacy_audio.py: Legacy Audio detection
"""
from ..base import BaseHardware, HardwareVariant
from ...base import PatchType
from .....constants import Constants
from .....support import utilities
from .....datasets.os_data import os_data
class LegacyAudio(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()}: Legacy Audio"
def present(self) -> bool:
"""
Targeting Realtek Audio and machines without AppleALC
"""
return self._computer.real_model in ["iMac7,1", "iMac8,1"] or (
self._computer.real_model in ["MacBook5,1",
"MacBook5,2",
"MacBook6,1",
"MacBook7,1",
"MacBookAir2,1",
"MacBookAir3,1",
"MacBookAir3,2",
"MacBookAir4,1",
"MacBookAir4,2",
"MacBookPro4,1",
"MacBookPro5,1",
"MacBookPro5,2",
"MacBookPro5,3",
"MacBookPro5,4",
"MacBookPro5,5",
"MacBookPro6,1",
"MacBookPro6,2",
"MacBookPro7,1",
"MacBookPro8,1",
"MacBookPro8,2",
"MacBookPro8,3",
"Macmini3,1",
"Macmini4,1",
"Macmini5,1",
"Macmini5,2",
"Macmini5,3",
"iMac9,1",
"iMac10,1",
"iMac11,1",
"iMac11,2",
"iMac11,3",
"iMac12,1",
"iMac12,2",
"MacPro3,1"
] and utilities.check_kext_loaded("as.vit9696.AppleALC") is False)
def native_os(self) -> bool:
"""
- iMac7,1 and iMac8,1 last supported in macOS 10.11, El Capitan
- All other models pre-2012 models last supported in macOS 10.13, High Sierra
"""
if self._computer.real_model in ["iMac7,1", "iMac8,1"]:
return self._xnu_major < os_data.sierra.value
return self._xnu_major < os_data.mojave.value
def hardware_variant(self) -> HardwareVariant:
"""
Type of hardware variant
"""
return HardwareVariant.MISCELLANEOUS
def _missing_gop_patches(self) -> dict:
"""
Patches for graphics cards with missing GOP (ie. breaking AppleALC functionality)
"""
return {
"Legacy Non-GOP": {
PatchType.OVERWRITE_SYSTEM_VOLUME: {
"/System/Library/Extensions": {
"AppleHDA.kext": "10.13.6",
},
},
},
}
def _realtek_audio_patches(self) -> dict:
"""
Patches for Realtek Audio
"""
return {
"Legacy Realtek": {
PatchType.OVERWRITE_SYSTEM_VOLUME: {
"/System/Library/Extensions": {
"AppleHDA.kext": "10.11.6",
"IOAudioFamily.kext": "10.11.6",
},
},
PatchType.REMOVE_SYSTEM_VOLUME: {
"/System/Library/Extensions": [
"AppleVirtIO.kext",
"AppleVirtualGraphics.kext",
"AppleVirtualPlatform.kext",
"ApplePVPanic.kext",
"AppleVirtIOStorage.kext",
"AvpFairPlayDriver.kext",
],
},
},
}
def patches(self) -> dict:
"""
Patches for legacy audio
"""
if self.native_os() is True:
return {}
if self._computer.real_model in ["iMac7,1", "iMac8,1"]:
return self._realtek_audio_patches()
return self._missing_gop_patches()

View File

@@ -0,0 +1,66 @@
"""
pci_webcam.py: PCIe FaceTime Camera detection
"""
from ..base import BaseHardware, HardwareVariant
from ...base import PatchType
from .....constants import Constants
from .....datasets.os_data import os_data
class PCIeFaceTimeCamera(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()}: PCIe FaceTime Camera"
def present(self) -> bool:
"""
Targeting PCIe FaceTime Cameras
"""
return self._computer.pcie_webcam
def native_os(self) -> bool:
"""
Dropped support with macOS 14 Developer Beta 1 (23A5257q)
"""
return self._xnu_major < os_data.sonoma.value or self._os_build == "23A5257q"
def hardware_variant(self) -> HardwareVariant:
"""
Type of hardware variant
"""
return HardwareVariant.MISCELLANEOUS
def patches(self) -> dict:
"""
Patches for PCIe FaceTime Camera
"""
if self.native_os() is True:
return {}
return {
"PCIe FaceTime Camera": {
PatchType.OVERWRITE_SYSTEM_VOLUME: {
"/System/Library/Frameworks/CoreMediaIO.framework/Versions/A/Resources": {
"AppleCamera.plugin": "14.0 Beta 1"
},
"/System/Library/LaunchDaemons": {
"com.apple.cmio.AppleCameraAssistant.plist": "14.0 Beta 1"
},
},
},
}

View File

@@ -0,0 +1,93 @@
"""
t1_security.py: T1 Security Chip detection
"""
from ..base import BaseHardware, HardwareVariant
from ...base import PatchType
from .....constants import Constants
from .....datasets.os_data import os_data
class T1SecurityChip(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()}: T1 Security Chip"
def present(self) -> bool:
"""
Targeting T1 Security Chip
"""
return self._computer.t1_chip
def native_os(self) -> bool:
"""
Dropped support with macOS 14, Sonoma
"""
return self._xnu_major < os_data.sonoma.value
def hardware_variant(self) -> HardwareVariant:
"""
Type of hardware variant
"""
return HardwareVariant.MISCELLANEOUS
def patches(self) -> dict:
"""
Patches for T1 Security Chip
"""
if self.native_os() is True:
return {}
return {
"T1 Security Chip": {
PatchType.OVERWRITE_SYSTEM_VOLUME: {
# Required for Apple Pay
"/usr/lib": {
"libNFC_Comet.dylib": "13.6",
"libNFC_HAL.dylib": "13.6",
"libnfshared.dylib": "13.6",
"libnfshared.dylibOld.dylib": "13.6",
"libnfstorage.dylib": "13.6",
"libnfrestore.dylib": "13.6",
"libPN548_API.dylib": "13.6"
},
"/usr/libexec": {
"biometrickitd": "13.6", # Required for Touch ID
"nfcd": "13.6", # Required for Apple Pay
"nfrestore_service": "13.6", # Required for Apple Pay
},
"/usr/standalone/firmware/nfrestore/firmware/fw": {
"PN549_FW_02_01_5A_rev88207.bin": "13.6",
"SN100V_FW_A3_01_01_81_rev127208.bin": "13.6",
"SN200V_FW_B1_02_01_86_rev127266.bin": "13.6",
"SN300V_FW_B0_02_01_22_rev129172.bin": "13.6",
}
},
PatchType.MERGE_SYSTEM_VOLUME: {
"/System/Library/Frameworks/LocalAuthentication.framework/Support": {
"SharedUtils.framework": f"13.6-{self._xnu_major}", # Required for Password Authentication (SharedUtils.framework)
**({ "MechanismPlugins": "15.0 Beta 4" } if self._xnu_major >= os_data.sequoia else {}), # Required to add a TouchID fingerprint
},
"/System/Library/PrivateFrameworks": {
"EmbeddedOSInstall.framework": "13.6", # Required for biometrickitd
**({ "NearField.framework": "14.5" } if self._xnu_major >= os_data.sequoia else {}),
},
}
},
}

View File

@@ -0,0 +1,125 @@
"""
usb11.py: Legacy USB 1.1 Controller detection
"""
from ..base import BaseHardware, HardwareVariant
from ...base import PatchType
from .....constants import Constants
from .....detections import device_probe
from .....datasets.os_data import os_data
from .....datasets import smbios_data, cpu_data
class USB11Controller(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()}: Legacy USB 1.1"
def present(self) -> bool:
"""
Targeting UHCI/OHCI controllers
"""
# If we're on a hackintosh, check for UHCI/OHCI controllers
if self._constants.host_is_hackintosh is True:
for controller in self._computer.usb_controllers:
if (
isinstance(controller, device_probe.UHCIController) or
isinstance(controller, device_probe.OHCIController)
):
return True
return False
if self._computer.real_model not in smbios_data.smbios_dictionary:
return False
# If we're on a Mac, check for Penryn or older
# This is due to Apple implementing an internal USB hub on post-Penryn (excluding MacPro4,1, MacPro5,1 and Xserve3,1)
# Ref: https://techcommunity.microsoft.com/t5/microsoft-usb-blog/reasons-to-avoid-companion-controllers/ba-p/270710
if (
smbios_data.smbios_dictionary[self._computer.real_model]["CPU Generation"] <= cpu_data.CPUGen.penryn.value or \
self._computer.real_model in ["MacPro4,1", "MacPro5,1", "Xserve3,1"]
):
return True
return False
def native_os(self) -> bool:
"""
Dropped support with macOS 13, Ventura
"""
return self._xnu_major < os_data.ventura.value
def hardware_variant(self) -> HardwareVariant:
"""
Type of hardware variant
"""
return HardwareVariant.MISCELLANEOUS
def _base_patches(self) -> dict:
"""
Base patches for USB 1.1 Controller
"""
return {
"Legacy USB 1.1": {
PatchType.OVERWRITE_SYSTEM_VOLUME: {
"/System/Library/Extensions": {
"IOUSBHostFamily.kext": "12.6.2" if self._xnu_float < self.macOS_14_4 else "12.6.2-23.4",
},
},
},
}
def _extended_patches(self) -> dict:
"""
Extended patches for USB 1.1 Controller
"""
if self._xnu_float < self.macOS_14_1:
return {}
return {
# Injection of UHCI/OHCI causes a panic on 14.1+
"Legacy USB 1.1 Extended": {
PatchType.OVERWRITE_SYSTEM_VOLUME: {
"/System/Library/Extensions/IOUSBHostFamily.kext/Contents/PlugIns": {
"AppleUSBOHCI.kext": "12.6.2-USB",
"AppleUSBOHCIPCI.kext": "12.6.2-USB",
"AppleUSBUHCI.kext": "12.6.2-USB",
"AppleUSBUHCIPCI.kext": "12.6.2-USB",
},
"/System/Library/Extensions": {
**({ "AppleUSBAudio.kext": "14.5" } if self._xnu_major >= os_data.sequoia else {}),
**({ "AppleUSBCDC.kext": "14.5" } if self._xnu_major >= os_data.sequoia else {}),
},
},
},
}
def patches(self) -> dict:
"""
Patches for USB 1.1 Controller
"""
if self.native_os() is True:
return {}
return {
**self._base_patches(),
**self._extended_patches(),
}

View File

@@ -0,0 +1,149 @@
"""
legacy_wireless.py: Legacy Wireless detection
"""
import packaging.version
from ..base import BaseHardware, HardwareVariant
from ...base import PatchType
from .....constants import Constants
from .....detections import device_probe
from .....datasets.os_data import os_data
class LegacyWireless(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()}: Legacy Wireless"
def present(self) -> bool:
"""
Targeting Legacy Wireless
"""
if (
isinstance(self._computer.wifi, device_probe.Broadcom)
and self._computer.wifi.chipset in [device_probe.Broadcom.Chipsets.AirPortBrcm4331, device_probe.Broadcom.Chipsets.AirPortBrcm43224]
):
return True
if (
isinstance(self._computer.wifi, device_probe.Atheros)
and self._computer.wifi.chipset == device_probe.Atheros.Chipsets.AirPortAtheros40
):
return True
return False
def native_os(self) -> bool:
"""
Dropped support with macOS 12, Monterey
"""
return self._xnu_major < os_data.monterey.value
def hardware_variant(self) -> HardwareVariant:
"""
Type of hardware variant
"""
return HardwareVariant.NETWORKING
def _affected_by_cve_2024_23227(self) -> bool:
"""
CVE-2024-23227 broke our airportd patches for 12.7.4, 13.6.5 and 14.4
Note that since the XNU version's security patch level is not increment
"""
if self._xnu_major > os_data.sonoma:
return True
marketing_version = self._constants.detected_os_version
parsed_version = packaging.version.parse(marketing_version)
if marketing_version.startswith("12"):
return parsed_version >= packaging.version.parse("12.7.4")
if marketing_version.startswith("13"):
return parsed_version >= packaging.version.parse("13.6.5")
if marketing_version.startswith("14"):
return parsed_version >= packaging.version.parse("14.4")
return False
def _base_patch(self) -> dict:
"""
Base patches for Legacy Wireless
"""
return {
"Legacy Wireless": {
PatchType.OVERWRITE_SYSTEM_VOLUME: {
"/usr/libexec": {
"airportd": "11.7.10" if self._affected_by_cve_2024_23227 is False else "11.7.10-Sandbox",
},
"/System/Library/CoreServices": {
"WiFiAgent.app": "11.7.10",
},
},
PatchType.OVERWRITE_DATA_VOLUME: {
"/Library/Application Support/SkyLightPlugins": {
**({ "CoreWLAN.dylib": "SkyLightPlugins" } if self._xnu_major == os_data.monterey else {}),
**({ "CoreWLAN.txt": "SkyLightPlugins" } if self._xnu_major == os_data.monterey else {}),
},
},
},
}
def _extended_patch(self) -> dict:
"""
Extended patches for Legacy Wireless
"""
if self._xnu_major < os_data.ventura:
return {}
return {
"Legacy Wireless Extended": {
PatchType.OVERWRITE_SYSTEM_VOLUME: {
"/usr/libexec": {
"wps": "12.7.2",
"wifip2pd": "12.7.2",
},
},
PatchType.MERGE_SYSTEM_VOLUME: {
"/System/Library/Frameworks": {
"CoreWLAN.framework": "12.7.2",
},
"/System/Library/PrivateFrameworks": {
"CoreWiFi.framework": "12.7.2",
"IO80211.framework": "12.7.2",
"WiFiPeerToPeer.framework": "12.7.2",
},
}
},
}
def patches(self) -> dict:
"""
Patches for Legacy Wireless
"""
if self.native_os() is True:
return {}
return {
**self._base_patch(),
**self._extended_patch(),
}

View File

@@ -0,0 +1,85 @@
"""
modern_wireless.py: Modern Wireless detection
"""
from ..base import BaseHardware, HardwareVariant
from ...base import PatchType
from .....constants import Constants
from .....detections import device_probe
from .....datasets.os_data import os_data
class ModernWireless(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 Wireless"
def present(self) -> bool:
"""
Targeting Modern Wireless
"""
return isinstance(self._computer.wifi, device_probe.Broadcom) and (
self._computer.wifi.chipset in [
device_probe.Broadcom.Chipsets.AirPortBrcm4360,
device_probe.Broadcom.Chipsets.AirportBrcmNIC,
# We don't officially support this chipset, however we'll throw a bone to hackintosh users
device_probe.Broadcom.Chipsets.AirPortBrcmNICThirdParty,
]
)
def native_os(self) -> bool:
"""
Dropped support with macOS 14, Sonoma
"""
return self._xnu_major < os_data.sonoma.value
def hardware_variant(self) -> HardwareVariant:
"""
Type of hardware variant
"""
return HardwareVariant.NETWORKING
def patches(self) -> dict:
"""
Patches for Modern Wireless
"""
if self.native_os() is True:
return {}
return {
"Modern Wireless": {
PatchType.OVERWRITE_SYSTEM_VOLUME: {
"/usr/libexec": {
"airportd": "13.6.5",
"wifip2pd": "13.6.5",
},
"/System/Library/CoreServices": {
**({ "WiFiAgent.app": "14.5" } if self._xnu_major >= os_data.sequoia else {}),
},
},
PatchType.MERGE_SYSTEM_VOLUME: {
"/System/Library/Frameworks": {
"CoreWLAN.framework": f"13.6.5-{self._xnu_major}",
},
"/System/Library/PrivateFrameworks": {
"CoreWiFi.framework": f"13.6.5-{self._xnu_major}",
"IO80211.framework": f"13.6.5-{self._xnu_major}",
"WiFiPeerToPeer.framework": f"13.6.5-{self._xnu_major}",
},
}
},
}

View File

@@ -0,0 +1,41 @@
"""
amd_opencl.py: AMD OpenCL patches
"""
from .base import BaseSharedPatchSet
from ..base import PatchType
from ....datasets.os_data import os_data
class AMDOpenCL(BaseSharedPatchSet):
def __init__(self, xnu_major: int, xnu_minor: int, marketing_version: str) -> None:
super().__init__(xnu_major, xnu_minor, marketing_version)
def _os_requires_patches(self) -> bool:
"""
Check if the current OS requires
"""
return self._xnu_major >= os_data.ventura.value
def patches(self) -> dict:
"""
In Ventura, Apple added AVX2.0 code to AMD's OpenCL/GL compilers
"""
if self._os_requires_patches() is False:
return {}
return {
"AMD OpenCL": {
PatchType.MERGE_SYSTEM_VOLUME: {
"/System/Library/Frameworks": {
"OpenCL.framework": "12.5 non-AVX2.0",
"OpenGL.framework": "12.5 non-AVX2.0",
},
},
},
}

View File

@@ -0,0 +1,53 @@
"""
amd_terascale.py: AMD TeraScale patches
"""
from .base import BaseSharedPatchSet
from ..base import PatchType
from ....datasets.os_data import os_data
class AMDTeraScale(BaseSharedPatchSet):
def __init__(self, xnu_major: int, xnu_minor: int, marketing_version: str) -> None:
super().__init__(xnu_major, xnu_minor, marketing_version)
def _os_requires_patches(self) -> bool:
"""
Dropped support with macOS 10.14, Mojave
"""
return self._xnu_major >= os_data.mojave.value
def patches(self) -> dict:
"""
Shared patches between TeraScale 1 and 2
"""
if self._os_requires_patches() is False:
return {}
return {
"AMD TeraScale Common": {
PatchType.OVERWRITE_SYSTEM_VOLUME: {
"/System/Library/Extensions": {
"AMDFramebuffer.kext": "10.13.6",
"AMDLegacyFramebuffer.kext": "10.13.6" if self._xnu_float < self.macOS_13_3 else "10.13.6 TS2",
"AMDLegacySupport.kext": "10.13.6",
"AMDShared.bundle": "10.13.6",
"AMDSupport.kext": "10.13.6",
},
},
PatchType.REMOVE_SYSTEM_VOLUME: {
"/System/Library/Extensions": [
"AMD7000Controller.kext",
"AMD8000Controller.kext",
"AMD9000Controller.kext",
"AMD9500Controller.kext",
"AMD10000Controller.kext",
],
},
},
}

View File

@@ -0,0 +1,30 @@
"""
base.py: Base class for shared patch sets
"""
from ..base import BasePatchset
class BaseSharedPatchSet(BasePatchset):
def __init__(self, xnu_major: int, xnu_minor: int, marketing_version: str) -> None:
super().__init__()
self._xnu_major = xnu_major
self._xnu_minor = xnu_minor
self._marketing_version = marketing_version
self._xnu_float = float(f"{self._xnu_major}.{self._xnu_minor}")
def _os_requires_patches(self) -> bool:
"""
Check if the current OS requires patches
"""
raise NotImplementedError
def patches(self) -> dict:
"""
Dictionary of patches
"""
raise NotImplementedError

View File

@@ -0,0 +1,42 @@
"""
big_sur_gva.py: Big Sur GVA patches
"""
from .base import BaseSharedPatchSet
from ..base import PatchType
from ....datasets.os_data import os_data
class BigSurGVA(BaseSharedPatchSet):
def __init__(self, xnu_major: int, xnu_minor: int, marketing_version: str) -> None:
super().__init__(xnu_major, xnu_minor, marketing_version)
def _os_requires_patches(self) -> bool:
"""
Check if the current OS requires
"""
return self._xnu_major >= os_data.monterey.value
def patches(self) -> dict:
"""
For GPUs last natively supported in Catalina/Big Sur
Restores DRM support for these GPUs
"""
if self._os_requires_patches() is False:
return {}
return {
"Big Sur GVA": {
PatchType.MERGE_SYSTEM_VOLUME: {
"/System/Library/PrivateFrameworks": {
"AppleGVA.framework": "11.7.10",
"AppleGVACore.framework": "11.7.10",
},
},
},
}

View File

@@ -0,0 +1,40 @@
"""
big_sur_opencl.py: Big Sur OpenCL patches
"""
from .base import BaseSharedPatchSet
from ..base import PatchType
from ....datasets.os_data import os_data
class BigSurOpenCL(BaseSharedPatchSet):
def __init__(self, xnu_major: int, xnu_minor: int, marketing_version: str) -> None:
super().__init__(xnu_major, xnu_minor, marketing_version)
def _os_requires_patches(self) -> bool:
"""
Check if the current OS requires
"""
return self._xnu_major >= os_data.monterey.value
def patches(self) -> dict:
"""
For graphics cards dropped in Monterey
"""
if self._os_requires_patches() is False:
return {}
return {
"Big Sur OpenCL": {
PatchType.MERGE_SYSTEM_VOLUME: {
"/System/Library/Frameworks": {
"OpenCL.framework": "11.6",
},
},
},
}

View File

@@ -0,0 +1,43 @@
"""
high_sierra_gva.py: High Sierra GVA patches
"""
from .base import BaseSharedPatchSet
from ..base import PatchType
from ....datasets.os_data import os_data
class HighSierraGVA(BaseSharedPatchSet):
def __init__(self, xnu_major: int, xnu_minor: int, marketing_version: str) -> None:
super().__init__(xnu_major, xnu_minor, marketing_version)
def _os_requires_patches(self) -> bool:
"""
Dropped support with macOS 11.0, Big Sur
"""
return self._xnu_major >= os_data.big_sur.value
def patches(self) -> dict:
"""
For GPUs last natively supported in High Sierra/Catalina
"""
if self._os_requires_patches() is False:
return {}
return {
# For GPUs last natively supported in High Sierra/Catalina
# Restores DRM support
"High Sierra GVA": {
PatchType.MERGE_SYSTEM_VOLUME: {
"/System/Library/PrivateFrameworks": {
"AppleGVA.framework": "10.13.6",
"AppleGVACore.framework": "10.15.7",
},
},
},
}

View File

@@ -0,0 +1,487 @@
"""
metal_3802.py: Metal 3802 patches
"""
import packaging.version
from .base import BaseSharedPatchSet
from ..base import PatchType, DynamicPatchset
from ....datasets.os_data import os_data
class LegacyMetal3802(BaseSharedPatchSet):
def __init__(self, xnu_major: int, xnu_minor: int, marketing_version: str) -> None:
super().__init__(xnu_major, xnu_minor, marketing_version)
def _os_requires_patches(self) -> bool:
"""
Check if the current OS requires
"""
return self._xnu_major >= os_data.ventura.value
def _patches_metal_3802_common(self) -> dict:
"""
Intel Ivy Bridge, Haswell and Nvidia Kepler are Metal 3802-based GPUs
Due to this, we need to re-add 3802 compiler support to the Metal stack
"""
if self._os_requires_patches() is False:
return {}
return {
"Metal 3802 Common": {
PatchType.OVERWRITE_SYSTEM_VOLUME: {
"/System/Library/Sandbox/Profiles": {
"com.apple.mtlcompilerservice.sb": "12.5-3802",
}
},
PatchType.MERGE_SYSTEM_VOLUME: {
"/System/Library/Frameworks": {
"Metal.framework": "12.5-3802-22" if self._xnu_major < os_data.sonoma else "12.5-3802-23",
},
"/System/Library/PrivateFrameworks": {
"MTLCompiler.framework": "12.7.6-3802",
"GPUCompiler.framework": "12.7.6-3802",
},
}
}
}
def _patches_metal_3802_common_extended(self) -> dict:
"""
Support for 3802 GPUs were broken with 13.3+
Downgrades 31001 stack to 13.2.1, however nukes AMFI support
"""
if self._xnu_float < self.macOS_13_3:
return {}
return {
"Metal 3802 Common Extended": {
PatchType.MERGE_SYSTEM_VOLUME: {
"/System/Library/Frameworks": {
"Metal.framework": f"13.2.1-{self._xnu_major}",
**({ "CoreImage.framework": "14.0 Beta 3" if self._xnu_major < os_data.sequoia.value else "14.0 Beta 3-24"} if self._xnu_major >= os_data.sonoma.value else {}),
},
"/System/Library/PrivateFrameworks": {
**({ "MTLCompiler.framework": "13.2.1" } if self._xnu_major == os_data.ventura.value else {}),
**({ "GPUCompiler.framework": "13.2.1" } if self._xnu_major == os_data.ventura.value else {}),
"RenderBox.framework": "13.2.1-3802" if self._xnu_major == os_data.ventura.value else "14.0-3802",
# More issues for 3802, now with 14.2 Beta 2+...
# If there is a god, they clearly despise us and legacy Macs.
**({ "MTLCompiler.framework": "14.2 Beta 1" } if self._xnu_float >= self.macOS_14_2 else {}),
**({ "GPUCompiler.framework": "14.2 Beta 1" } if self._xnu_float >= self.macOS_14_2 else {}),
},
},
PatchType.OVERWRITE_SYSTEM_VOLUME: {
"/System/Library/PrivateFrameworks/PhotosUICore.framework/Versions/A/Resources": {
**({ "default.metallib": "14.6.1" } if self._xnu_major == os_data.sonoma.value else {}),
},
}
}
}
def _patches_metal_3802_metallibs(self) -> dict:
"""
With macOS Sequoia, a new .metallib compiler format was introduced (V27)
Thus we need to patch all .metallib files to support 3802 GPUs using MetallibSupportPkg
Reference:
https://github.com/dortania/MetallibSupportPkg
"""
if self._xnu_major < os_data.sequoia.value:
return {}
return {
"Metal 3802 .metallibs": {
PatchType.OVERWRITE_SYSTEM_VOLUME: {
"/System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSCore.framework/Versions/A/Resources": {
"default.metallib": "14.6.1",
},
"/System/Library/Frameworks/MLCompute.framework/Versions/A/Resources": {
"default.metallib": "14.6.1"
},
"/System/Library/PrivateFrameworks/CoreUI.framework/Versions/A/Resources": {
"default.metallib": "14.6.1",
},
"/System/Library/Frameworks/CoreImage.framework/Versions/A": {
"CoreImage.metallib": "14.6.1",
},
"/System/Library/Frameworks/CoreImage.framework/Versions/A/Resources": {
"default.metallib": "14.6.1",
"ci_filters.metallib": "14.6.1",
"ci_stdlib_stitchable_h.metallib": "14.6.1",
"ci_stdlib_stitchable.metallib": "14.6.1",
"CIPortraitBlurStitchableV3.metallib": "14.6.1",
"CIPortraitBlurStitchableV2.metallib": "14.6.1",
"ci_stdlib_h.metallib": "14.6.1",
"ci_filters_stitchable.metallib": "14.6.1",
"CIPortraitBlurV2.metallib": "14.6.1",
"CIPortraitBlurV3.metallib": "14.6.1",
"ci_stdlib.metallib": "14.6.1",
},
"/System/Library/PrivateFrameworks/Tungsten.framework/Versions/A/Resources": {
"default.metallib": "15.0 Beta 7",
},
"/System/Library/PrivateFrameworks/RenderBox.framework/Versions/A/Resources": {
"default.metallib": "15.0 Beta 8" if packaging.version.parse(self._marketing_version) < packaging.version.parse("15.1") else "15.1 Beta 4",
},
"/System/iOSSupport/System/Library/PrivateFrameworks/VFX.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/iOSSupport/System/Library/PrivateFrameworks/VisionKitInternal.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/iOSSupport/System/Library/PrivateFrameworks/TSReading.framework/Versions/A/Resources": {
"TSDDefaultMetalLibrary.metallib": DynamicPatchset.MetallibSupportPkg,
"KeynoteMetalLibrary.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/iOSSupport/System/Library/PrivateFrameworks/WeatherUI.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
"ForegroundEffectShaders.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/iOSSupport/System/Library/PrivateFrameworks/AvatarKit.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/iOSSupport/System/Library/PrivateFrameworks/Tungsten.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/iOSSupport/System/Library/PrivateFrameworks/TextInputUI.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/iOSSupport/System/Library/PrivateFrameworks/ActivityRingsUI.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/iOSSupport/System/Library/PrivateFrameworks/ChatKit.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/iOSSupport/System/Library/PrivateFrameworks/WeatherMaps.framework/Versions/A/Resources": {
"WeatherMapsMetalLib.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/iOSSupport/System/Library/PrivateFrameworks/HomeAccessoryControlUI.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/iOSSupport/System/Library/PrivateFrameworks/PassKitUIFoundation.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/iOSSupport/System/Library/PrivateFrameworks/MediaCoreUI.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/iOSSupport/System/Library/Frameworks/ARKit.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/iOSSupport/System/Library/Frameworks/SpriteKit.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/iOSSupport/System/Library/Frameworks/PencilKit.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/iOSSupport/System/Library/Frameworks/SwiftUI.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/iOSSupport/System/Library/Frameworks/SceneKit.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/Video/Plug-Ins/AppleGVAHEVCEncoder.bundle/Contents/Resources": {
"AppleGVAHEVCFrameStatistics.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/Video/Plug-Ins/AV1DecoderSW.bundle/Contents/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/Video/Plug-Ins/AppleAVEEncoder.bundle/Contents/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/CoreServices/MTLReplayer.app/Contents/Frameworks/MTLReplayController.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/CoreImage/CIPassThrough.cifilter/Contents/Resources": {
"CIPassThrough.ci.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/CoreImage/PortraitFilters.cifilter/Contents/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
"portrait_filters.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/ScreenCaptureKitMetal/ScreenCaptureKitMetal.bundle/Contents/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/ExtensionKit/Extensions/Monterey.appex/Contents/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/ExtensionKit/Extensions/Drift.appex/Contents/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/ExtensionKit/Extensions/WallpaperMacintoshExtension.appex/Contents/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/ExtensionKit/Extensions/WallpaperSequoiaExtension.appex/Contents/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/SetupAssistantSupportUI.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/GESS.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/VFX.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/VisionCore.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/CMImaging.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/CoreRE.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/HDRProcessing.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/AvatarKit.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/SkyLight.framework/Versions/A/Resources": {
"SkyLightShaders.air64.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/AppleISPEmulator.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/NeutrinoCore.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/ImageHarmonizationKit.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/VideoProcessing.framework/Versions/A/PlugIns/Codecs/VCPRealtimeEncoder.bundle/Contents/Resources": {
"ProcessAccelerate.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/VideoProcessing.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
"ProcessAccelerate.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/Portrait.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/VisualGeneration.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
"NonMaxLineSuppress.ci.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/AccelerateGPU.framework": {
"GPUBLAS.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/AccelerateGPU.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/ShaderGraph.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/Hydra.framework/Plugins/HydraQLThumbnailExtension.appex/Contents/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/Hydra.framework/Plugins/HydraQLPreviewExtension.appex/Contents/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/Hydra.framework/Versions/C/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/SiriUI.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/TextRecognition.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/Leonardo.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/VectorKit.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/VectorKit.framework/Versions/A/Resources/metal_libraries": {
"AlloyCommonLibrary.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/GPUToolsCapture.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/PhotoImaging.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/PhotosUICore.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/MetalTools.framework/Versions/A/Resources": {
"MTLLegacySVICBSupport.metallib": DynamicPatchset.MetallibSupportPkg,
"MTLGPUDebugICBSupport.metallib": DynamicPatchset.MetallibSupportPkg,
"MTLGPUDebugAccelerationStructureSupport.metallib": DynamicPatchset.MetallibSupportPkg,
"MTLDebugShaders.metallib": DynamicPatchset.MetallibSupportPkg,
"MTLLegacySVAccelerationStructureSupport.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/AppleDepth.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/Human.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/CorePhotogrammetry.framework/Versions/A/Resources": {
"ComputerVision_Tess_Kernels.metallib": DynamicPatchset.MetallibSupportPkg,
"Photogrammetry_Matching_Kernels.metallib": DynamicPatchset.MetallibSupportPkg,
"Photogrammetry_Texturing_Kernels.metallib": DynamicPatchset.MetallibSupportPkg,
"Photogrammetry_MVS_Kernels.metallib": DynamicPatchset.MetallibSupportPkg,
"Photogrammetry_Meshing_Kernels.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/HumanUI.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/Quagga.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/Espresso.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/CMPhoto.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/MediaAnalysis.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/AltruisticBodyPoseKit.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/MusicUI.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/FRC.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/H13ISPServices.framework/Versions/A/Resources": {
"CalibrateRgbIr.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/SiriUICore.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/PassKitUIFoundation.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/H16ISPServices.framework/Versions/A/Resources": {
"CalibrateRgbIr.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/CoreOCModules.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/PhotosensitivityProcessing.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/PrivateFrameworks/MediaCoreUI.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/Frameworks/Metal.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
"MTLMeshShaderEmulator.metallib": DynamicPatchset.MetallibSupportPkg,
"MTLBVHBuilder.metallib": DynamicPatchset.MetallibSupportPkg,
"MTLECBE.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/Frameworks/QuartzCore.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/Frameworks/CoreMediaIO.framework/Versions/A/Resources/ACD.plugin/Contents/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSFunctions.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSRayIntersector.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSNeuralNetwork.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSNDArray.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSImage.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/Frameworks/MetalPerformanceShaders.framework/Versions/A/Frameworks/MPSMatrix.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/Frameworks/MetalFX.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/Frameworks/ParavirtualizedGraphics.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/Frameworks/ImageIO.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/Frameworks/SpriteKit.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/Frameworks/PencilKit.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/Frameworks/CoreDisplay.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/Frameworks/SwiftUICore.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/Frameworks/SwiftUI.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/Frameworks/Vision.framework/Versions/A/Resources": {
"ImageFilters.metallib": DynamicPatchset.MetallibSupportPkg,
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/Frameworks/StickerKit.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/Frameworks/VideoToolbox.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/Frameworks/SceneKit.framework/Versions/A/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Library/VideoProcessors/CCPortrait.bundle/Contents/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
"CoreImageKernels_only.ci.metallib": DynamicPatchset.MetallibSupportPkg,
"CoreImageKernels.ci.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Applications/Music.app/Contents/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Applications/Chess.app/Contents/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Applications/Freeform.app/Contents/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
"coreimage.metallib": DynamicPatchset.MetallibSupportPkg,
},
"/System/Applications/Freeform.app/Contents/Extensions/USDRendererExtension.appex/Contents/Resources": {
"default.metallib": DynamicPatchset.MetallibSupportPkg,
},
},
PatchType.REMOVE_SYSTEM_VOLUME: {
"/System/Library/PrivateFrameworks/RenderBox.framework/Versions/A/Resources": [
# For some reason Ivy Bridge can't tell the metallib lacks AIR64 support, and errors out
"archive.metallib",
],
},
}
}
def patches(self) -> dict:
"""
Dictionary of patches
"""
return {
**self._patches_metal_3802_common(),
**self._patches_metal_3802_common_extended(),
**self._patches_metal_3802_metallibs(),
}

View File

@@ -0,0 +1,63 @@
"""
monterey_gva.py: Monterey GVA patches
"""
from .base import BaseSharedPatchSet
from ..base import PatchType
from ....datasets.os_data import os_data
class MontereyGVA(BaseSharedPatchSet):
def __init__(self, xnu_major: int, xnu_minor: int, marketing_version: str) -> None:
super().__init__(xnu_major, xnu_minor, marketing_version)
def _os_requires_patches(self) -> bool:
"""
Check if the current OS requires
"""
return self._xnu_major >= os_data.ventura.value
def patches(self) -> dict:
"""
For GPUs last natively supported in Monterey
Restores DRM support
"""
if self._os_requires_patches() is False:
return {}
return {
"Monterey GVA": {
PatchType.MERGE_SYSTEM_VOLUME: {
"/System/Library/PrivateFrameworks": {
"AppleGVA.framework": "12.5",
"AppleGVACore.framework": "12.5",
},
},
},
}
def revert_patches(self) -> dict:
"""
Revert if patches are no longer required/misapplied
"""
if self._os_requires_patches() is False:
return {}
return {
"Revert Monterey GVA": {
PatchType.REMOVE_SYSTEM_VOLUME: {
"/System/Library/PrivateFrameworks/AppleGVA.framework/Versions/A": [
"AppleGVA"
],
"/System/Library/PrivateFrameworks/AppleGVACore.framework/Versions/A": [
"AppleGVACore"
],
}
}
}

View File

@@ -0,0 +1,40 @@
"""
monterey_opencl.py: Monterey OpenCL patches
"""
from .base import BaseSharedPatchSet
from ..base import PatchType
from ....datasets.os_data import os_data
class MontereyOpenCL(BaseSharedPatchSet):
def __init__(self, xnu_major: int, xnu_minor: int, marketing_version: str) -> None:
super().__init__(xnu_major, xnu_minor, marketing_version)
def _os_requires_patches(self) -> bool:
"""
Check if the current OS requires
"""
return self._xnu_major >= os_data.ventura.value
def patches(self) -> dict:
"""
For graphics cards dropped in Ventura
"""
if self._os_requires_patches() is False:
return {}
return {
"Monterey OpenCL": {
PatchType.MERGE_SYSTEM_VOLUME: {
"/System/Library/Frameworks": {
"OpenCL.framework": "12.5",
},
},
},
}

View File

@@ -0,0 +1,47 @@
"""
monterey_opencl.py: Monterey OpenCL patches
"""
from .base import BaseSharedPatchSet
from ..base import PatchType
from ....datasets.os_data import os_data
class MontereyWebKit(BaseSharedPatchSet):
def __init__(self, xnu_major: int, xnu_minor: int, marketing_version: str) -> None:
super().__init__(xnu_major, xnu_minor, marketing_version)
def _os_requires_patches(self) -> bool:
"""
Check if the current OS requires
"""
return self._xnu_major == os_data.monterey.value
def patches(self) -> dict:
"""
Monterey has a WebKit sandboxing issue where many UI elements fail to render
This patch simple replaces the sandbox profile with one supporting our GPUs
Note: Neither Big Sur nor Ventura have this issue
"""
if self._os_requires_patches() is False:
return {}
return {
"WebKit Monterey Common": {
PatchType.MERGE_SYSTEM_VOLUME: {
"/System/Library/Frameworks": {
"WebKit.framework": "11.6"
},
},
PatchType.MERGE_DATA_VOLUME: {
"/Library/Apple/System/Library/StagedFrameworks/Safari": {
"WebKit.framework": "11.6"
},
},
},
}

View File

@@ -0,0 +1,106 @@
"""
non_metal.py: Non-Metal patches
"""
from .base import BaseSharedPatchSet
from ..base import PatchType
from ....datasets.os_data import os_data
class NonMetal(BaseSharedPatchSet):
def __init__(self, xnu_major: int, xnu_minor: int, marketing_version: str) -> None:
super().__init__(xnu_major, xnu_minor, marketing_version)
def _os_requires_patches(self) -> bool:
"""
Dropped support with macOS 10.14, Mojave
"""
return self._xnu_major >= os_data.mojave.value
def patches(self) -> dict:
"""
General non-Metal GPU patches
"""
if self._os_requires_patches() is False:
return {}
return {
"Non-Metal Common": {
PatchType.OVERWRITE_SYSTEM_VOLUME: {
"/System/Library/Extensions": {
"IOSurface.kext": "10.15.7",
},
"/System/Applications": {
**({ "Photo Booth.app": "11.7.9"} if self._xnu_major >= os_data.monterey else {}),
},
"/usr/sbin": {
**({ "screencapture": "14.7"} if self._xnu_major >= os_data.sequoia else {}),
},
},
PatchType.REMOVE_SYSTEM_VOLUME: {
"/System/Library/Extensions": [
"AMDRadeonX4000.kext",
"AMDRadeonX4000HWServices.kext",
"AMDRadeonX5000.kext",
"AMDRadeonX5000HWServices.kext",
"AMDRadeonX6000.kext",
"AMDRadeonX6000Framebuffer.kext",
"AMDRadeonX6000HWServices.kext",
"AppleIntelBDWGraphics.kext",
"AppleIntelBDWGraphicsFramebuffer.kext",
"AppleIntelCFLGraphicsFramebuffer.kext",
"AppleIntelHD4000Graphics.kext",
"AppleIntelHD5000Graphics.kext",
"AppleIntelICLGraphics.kext",
"AppleIntelICLLPGraphicsFramebuffer.kext",
"AppleIntelKBLGraphics.kext",
"AppleIntelKBLGraphicsFramebuffer.kext",
"AppleIntelSKLGraphics.kext",
"AppleIntelSKLGraphicsFramebuffer.kext",
"AppleIntelFramebufferAzul.kext",
"AppleIntelFramebufferCapri.kext",
"AppleParavirtGPU.kext",
"GeForce.kext",
"IOAcceleratorFamily2.kext",
"IOGPUFamily.kext",
"AppleAfterburner.kext",
],
"/System/Library/ExtensionKit/Extensions/": [
"WallpaperMacintoshExtension.appex"
],
},
PatchType.OVERWRITE_DATA_VOLUME: {
"/Library/Application Support/SkyLightPlugins": {
**({ "DropboxHack.dylib": "SkyLightPlugins" } if self._xnu_major >= os_data.monterey else {}),
**({ "DropboxHack.txt": "SkyLightPlugins" } if self._xnu_major >= os_data.monterey else {}),
},
},
PatchType.MERGE_SYSTEM_VOLUME: {
"/System/Library/Frameworks": {
"OpenGL.framework": "10.14.3",
"CoreDisplay.framework": f"10.14.4-{self._xnu_major}",
"IOSurface.framework": f"10.15.7-{self._xnu_major}",
"QuartzCore.framework": f"10.15.7-{self._xnu_major}",
},
"/System/Library/PrivateFrameworks": {
"GPUSupport.framework": "10.14.3",
"SkyLight.framework": f"10.14.6-{self._xnu_major}",
**({"FaceCore.framework": f"13.5"} if self._xnu_major >= os_data.sonoma else {}),
},
},
PatchType.EXECUTE: {
# 'When Space Allows' option introduced in 12.4 (XNU 21.5)
**({"/usr/bin/defaults write /Library/Preferences/.GlobalPreferences.plist ShowDate -int 1": True } if self._xnu_float >= self.macOS_12_4 else {}),
"/usr/bin/defaults write /Library/Preferences/.GlobalPreferences.plist InternalDebugUseGPUProcessForCanvasRenderingEnabled -bool false": True,
"/usr/bin/defaults write /Library/Preferences/.GlobalPreferences.plist WebKitExperimentalUseGPUProcessForCanvasRenderingEnabled -bool false": True,
**({"/usr/bin/defaults write /Library/Preferences/.GlobalPreferences.plist WebKitPreferences.acceleratedDrawingEnabled -bool false": True} if self._xnu_major >= os_data.sonoma else {}),
**({"/usr/bin/defaults write /Library/Preferences/.GlobalPreferences.plist NSEnableAppKitMenus -bool false": True} if self._xnu_major >= os_data.sonoma else {}),
**({"/usr/bin/defaults write /Library/Preferences/.GlobalPreferences.plist NSZoomButtonShowMenu -bool false": True} if self._xnu_major == os_data.sonoma else {}),
},
},
}

View File

@@ -0,0 +1,40 @@
"""
non_metal_coredisplay.py: Non-Metal CoreDisplay patches
"""
from .base import BaseSharedPatchSet
from ..base import PatchType
from ....datasets.os_data import os_data
class NonMetalCoreDisplay(BaseSharedPatchSet):
def __init__(self, xnu_major: int, xnu_minor: int, marketing_version: str) -> None:
super().__init__(xnu_major, xnu_minor, marketing_version)
def _os_requires_patches(self) -> bool:
"""
Dropped support with macOS 10.14, Mojave
"""
return self._xnu_major >= os_data.mojave.value
def patches(self) -> dict:
"""
Nvidia Web Drivers require an older build of CoreDisplay
"""
if self._os_requires_patches() is False:
return {}
return {
"Non-Metal CoreDisplay Common": {
PatchType.MERGE_SYSTEM_VOLUME: {
"/System/Library/Frameworks": {
"CoreDisplay.framework": f"10.13.6-{self._xnu_major}",
},
},
},
}

View File

@@ -0,0 +1,44 @@
"""
non_metal_enforcement.py: Non-Metal Enforcement patches
"""
from .base import BaseSharedPatchSet
from ..base import PatchType
from ....datasets.os_data import os_data
class NonMetalEnforcement(BaseSharedPatchSet):
def __init__(self, xnu_major: int, xnu_minor: int, marketing_version: str) -> None:
super().__init__(xnu_major, xnu_minor, marketing_version)
def _os_requires_patches(self) -> bool:
"""
Dropped support with macOS 10.14, Mojave
"""
return self._xnu_major >= os_data.mojave.value
def patches(self) -> dict:
"""
Forces Metal kexts from High Sierra to run in the fallback non-Metal mode
Verified functional with HD4000 and Iris Plus 655
Only used for internal development purposes, not suitable for end users
Note: Metal kexts in High Sierra rely on IOAccelerator, thus 'Non-Metal IOAccelerator Common'
is needed for proper linking
"""
if self._os_requires_patches() is False:
return {}
return {
"Non-Metal Enforcement": {
PatchType.EXECUTE: {
"/usr/bin/defaults write /Library/Preferences/com.apple.CoreDisplay useMetal -boolean no": True,
"/usr/bin/defaults write /Library/Preferences/com.apple.CoreDisplay useIOP -boolean no": True,
},
},
}

View File

@@ -0,0 +1,57 @@
"""
non_metal_ioaccel.py: Non-Metal IOAccelerator patches
"""
from .base import BaseSharedPatchSet
from ..base import PatchType
from ....datasets.os_data import os_data
class NonMetalIOAccelerator(BaseSharedPatchSet):
def __init__(self, xnu_major: int, xnu_minor: int, marketing_version: str) -> None:
super().__init__(xnu_major, xnu_minor, marketing_version)
def _os_requires_patches(self) -> bool:
"""
Dropped support with macOS 10.14, Mojave
"""
return self._xnu_major >= os_data.mojave.value
def patches(self) -> dict:
"""
TeraScale 2 and Nvidia Web Drivers broke in Mojave due to mismatched structs in
the IOAccelerator stack
"""
if self._os_requires_patches() is False:
return {}
return {
"Non-Metal IOAccelerator Common": {
PatchType.OVERWRITE_SYSTEM_VOLUME: {
"/System/Library/Extensions": {
"IOAcceleratorFamily2.kext": "10.13.6",
"IOSurface.kext": "10.14.6",
},
},
PatchType.MERGE_SYSTEM_VOLUME: {
"/System/Library/Frameworks": {
"IOSurface.framework": f"10.14.6-{self._xnu_major}",
"OpenCL.framework": "10.13.6",
},
"/System/Library/PrivateFrameworks": {
"GPUSupport.framework": "10.13.6",
"IOAccelerator.framework": f"10.13.6-{self._xnu_major}",
},
},
PatchType.REMOVE_SYSTEM_VOLUME: {
"/System/Library/Extensions": [
"AppleCameraInterface.kext"
],
},
},
}

View File

@@ -39,7 +39,8 @@ import logging
import plistlib
import subprocess
from pathlib import Path
from pathlib import Path
from functools import cache
from .mount import (
RootVolumeMount,
@@ -54,19 +55,27 @@ from .utilities import (
from .. import constants
from ..datasets import os_data
from ..volume import generate_copy_arguments
from ..datasets import (
os_data
)
from ..support import (
utilities,
subprocess_wrapper
subprocess_wrapper,
metallib_handler
)
from .patchsets import (
HardwarePatchsetDetection,
HardwarePatchsetSettings,
PatchType,
DynamicPatchset
)
from . import (
sys_patch_helpers,
kernelcache
)
from .auto_patcher import InstallAutomaticPatchingServices
from .detections import DetectRootPatch, GenerateRootPatchSets
class PatchSysVolume:
@@ -80,15 +89,16 @@ class PatchSysVolume:
self.patch_set_dictionary = {}
self.needs_kmutil_exemptions = False # For '/Library/Extensions' rebuilds
self.kdk_path = None
self.metallib_path = None
# GUI will detect hardware patches before starting PatchSysVolume()
# However the TUI will not, so allow for data to be passed in manually avoiding multiple calls
if hardware_details is None:
hardware_details = DetectRootPatch(self.computer.real_model, self.constants).detect_patch_set()
hardware_details = HardwarePatchsetDetection(self.constants).device_properties
self.hardware_details = hardware_details
self._init_pathing()
self.skip_root_kmutil_requirement = self.hardware_details["Settings: Supports Auxiliary Cache"]
self.skip_root_kmutil_requirement = not self.hardware_details[HardwarePatchsetSettings.KERNEL_DEBUG_KIT_REQUIRED] if self.constants.detected_os >= os_data.os_data.ventura else False
self.mount_obj = RootVolumeMount(self.constants.detected_os)
@@ -309,13 +319,13 @@ class PatchSysVolume:
Write patchset information to Root Volume
Parameters:
patchset (dict): Patchset information (generated by GenerateRootPatchSets)
patchset (dict): Patchset information (generated by HardwarePatchsetDetection)
"""
destination_path = f"{self.mount_location}/System/Library/CoreServices"
file_name = "OpenCore-Legacy-Patcher.plist"
destination_path_file = f"{destination_path}/{file_name}"
if sys_patch_helpers.SysPatchHelpers(self.constants).generate_patchset_plist(patchset, file_name, self.kdk_path):
if sys_patch_helpers.SysPatchHelpers(self.constants).generate_patchset_plist(patchset, file_name, self.kdk_path, self.metallib_path):
logging.info("- Writing patchset information to Root Volume")
if Path(destination_path_file).exists():
subprocess_wrapper.run_as_root_and_verify(["/bin/rm", destination_path_file], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
@@ -331,7 +341,7 @@ class PatchSysVolume:
if self.patch_set_dictionary != {}:
self._execute_patchset(self.patch_set_dictionary)
else:
self._execute_patchset(GenerateRootPatchSets(self.computer.real_model, self.constants, self.hardware_details).patchset)
self._execute_patchset(HardwarePatchsetDetection(self.constants).patches)
if self.constants.wxpython_variant is True and self.constants.detected_os >= os_data.os_data.big_sur:
needs_daemon = False
@@ -347,7 +357,7 @@ class PatchSysVolume:
Executes provided patchset
Parameters:
required_patches (dict): Patchset to execute (generated by sys_patch_generate.GenerateRootPatchSets)
required_patches (dict): Patchset to execute (generated by HardwarePatchsetDetection)
"""
kc_support_obj = kernelcache.KernelCacheSupport(
@@ -357,30 +367,34 @@ class PatchSysVolume:
)
source_files_path = str(self.constants.payload_local_binaries_root_path)
self._preflight_checks(required_patches, source_files_path)
required_patches = self._preflight_checks(required_patches, source_files_path)
for patch in required_patches:
logging.info("- Installing Patchset: " + patch)
for method_remove in ["Remove", "Remove Non-Root"]:
for method_remove in [PatchType.REMOVE_SYSTEM_VOLUME, PatchType.REMOVE_DATA_VOLUME]:
if method_remove in required_patches[patch]:
for remove_patch_directory in required_patches[patch][method_remove]:
logging.info("- Remove Files at: " + remove_patch_directory)
for remove_patch_file in required_patches[patch][method_remove][remove_patch_directory]:
if method_remove == "Remove":
if method_remove == PatchType.REMOVE_SYSTEM_VOLUME:
destination_folder_path = str(self.mount_location) + remove_patch_directory
else:
destination_folder_path = str(self.mount_location_data) + remove_patch_directory
remove_file(destination_folder_path, remove_patch_file)
for method_install in ["Install", "Install Non-Root"]:
for method_install in [PatchType.OVERWRITE_SYSTEM_VOLUME, PatchType.OVERWRITE_DATA_VOLUME, PatchType.MERGE_SYSTEM_VOLUME, PatchType.MERGE_DATA_VOLUME]:
if method_install not in required_patches[patch]:
continue
for install_patch_directory in list(required_patches[patch][method_install]):
logging.info(f"- Handling Installs in: {install_patch_directory}")
for install_file in list(required_patches[patch][method_install][install_patch_directory]):
source_folder_path = source_files_path + "/" + required_patches[patch][method_install][install_patch_directory][install_file] + install_patch_directory
if method_install == "Install":
source_folder_path = required_patches[patch][method_install][install_patch_directory][install_file] + install_patch_directory
# Check whether to source from root
if not required_patches[patch][method_install][install_patch_directory][install_file].startswith("/"):
source_folder_path = source_files_path + "/" + source_folder_path
if method_install in [PatchType.OVERWRITE_SYSTEM_VOLUME, PatchType.MERGE_SYSTEM_VOLUME]:
destination_folder_path = str(self.mount_location) + install_patch_directory
else:
if install_patch_directory == "/Library/Extensions":
@@ -404,13 +418,13 @@ class PatchSysVolume:
destination_folder_path = updated_destination_folder_path
install_new_file(source_folder_path, destination_folder_path, install_file)
install_new_file(source_folder_path, destination_folder_path, install_file, method_install)
if "Processes" in required_patches[patch]:
for process in required_patches[patch]["Processes"]:
if PatchType.EXECUTE in required_patches[patch]:
for process in required_patches[patch][PatchType.EXECUTE]:
# Some processes need sudo, however we cannot directly call sudo in some scenarios
# Instead, call elevated funtion if string's boolean is True
if required_patches[patch]["Processes"][process] is True:
if required_patches[patch][PatchType.EXECUTE][process] is True:
logging.info(f"- Running Process as Root:\n{process}")
subprocess_wrapper.run_as_root_and_verify(process.split(" "), stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
else:
@@ -425,21 +439,88 @@ class PatchSysVolume:
self._write_patchset(required_patches)
def _preflight_checks(self, required_patches: dict, source_files_path: Path) -> None:
def _resolve_metallib_support_pkg(self) -> str:
"""
Resolves MetalLibSupportPkg
"""
metallib_obj = metallib_handler.MetalLibraryObject(self.constants, self.constants.detected_os_build, self.constants.detected_os_version)
if metallib_obj.success is False:
logging.error(f"Failed to find MetalLibSupportPkg: {metallib_obj.error_msg}")
raise Exception(f"Failed to find MetalLibSupportPkg: {metallib_obj.error_msg}")
metallib_download_obj = metallib_obj.retrieve_download()
if not metallib_download_obj:
# Already downloaded, return path
logging.info(f"Using MetalLibSupportPkg: {metallib_obj.metallib_installed_path}")
self.metallib_path = metallib_obj.metallib_installed_path
return str(metallib_obj.metallib_installed_path)
metallib_download_obj.download(spawn_thread=False)
if metallib_download_obj.download_complete is False:
error_msg = metallib_download_obj.error_msg
logging.error(f"Could not download MetalLibSupportPkg: {error_msg}")
raise Exception(f"Could not download MetalLibSupportPkg: {error_msg}")
if metallib_obj.install_metallib() is False:
logging.error("Failed to install MetalLibSupportPkg")
raise Exception("Failed to install MetalLibSupportPkg")
# After install, check if it's present
return self._resolve_metallib_support_pkg()
@cache
def _resolve_dynamic_patchset(self, variant: DynamicPatchset) -> str:
"""
Resolves dynamic patchset to a path
"""
if variant == DynamicPatchset.MetallibSupportPkg:
return self._resolve_metallib_support_pkg()
raise Exception(f"Unknown Dynamic Patchset: {variant}")
def _preflight_checks(self, required_patches: dict, source_files_path: Path) -> dict:
"""
Runs preflight checks before patching
Parameters:
required_patches (dict): Patchset dictionary (from sys_patch_generate.GenerateRootPatchSets)
required_patches (dict): Patchset dictionary (from HardwarePatchsetDetection)
source_files_path (Path): Path to the source files (PatcherSupportPkg)
Returns:
dict: Updated patchset dictionary
"""
logging.info("- Running Preflight Checks before patching")
for patch in required_patches:
# Check if all files are present
for method_type in [PatchType.OVERWRITE_SYSTEM_VOLUME, PatchType.OVERWRITE_DATA_VOLUME, PatchType.MERGE_SYSTEM_VOLUME, PatchType.MERGE_DATA_VOLUME]:
if method_type not in required_patches[patch]:
continue
for install_patch_directory in required_patches[patch][method_type]:
for install_file in required_patches[patch][method_type][install_patch_directory]:
try:
if required_patches[patch][method_type][install_patch_directory][install_file] in DynamicPatchset:
required_patches[patch][method_type][install_patch_directory][install_file] = self._resolve_dynamic_patchset(required_patches[patch][method_type][install_patch_directory][install_file])
except TypeError:
pass
source_file = required_patches[patch][method_type][install_patch_directory][install_file] + install_patch_directory + "/" + install_file
# Check whether to source from root
if not required_patches[patch][method_type][install_patch_directory][install_file].startswith("/"):
source_file = source_files_path + "/" + source_file
if not Path(source_file).exists():
raise Exception(f"Failed to find {source_file}")
# Make sure old SkyLight plugins aren't being used
self._clean_skylight_plugins()
# Make sure non-Metal Enforcement preferences are not present
self._delete_nonmetal_enforcement()
# Make sure we clean old kexts in /L*/E* that are not in the patchset
kernelcache.KernelCacheSupport(
mount_location_data=self.mount_location_data,
@@ -451,22 +532,13 @@ class PatchSysVolume:
if "Intel Sandy Bridge" in required_patches:
sys_patch_helpers.SysPatchHelpers(self.constants).snb_board_id_patch(source_files_path)
for patch in required_patches:
# Check if all files are present
for method_type in ["Install", "Install Non-Root"]:
if method_type not in required_patches[patch]:
continue
for install_patch_directory in required_patches[patch][method_type]:
for install_file in required_patches[patch][method_type][install_patch_directory]:
source_file = source_files_path + "/" + required_patches[patch][method_type][install_patch_directory][install_file] + install_patch_directory + "/" + install_file
if not Path(source_file).exists():
raise Exception(f"Failed to find {source_file}")
# Ensure KDK is properly installed
self._merge_kdk_with_root(save_hid_cs=True if "Legacy USB 1.1" in required_patches else False)
logging.info("- Finished Preflight, starting patching")
return required_patches
# Entry Function
def start_patch(self):
@@ -476,15 +548,17 @@ class PatchSysVolume:
logging.info("- Starting Patch Process")
logging.info(f"- Determining Required Patch set for Darwin {self.constants.detected_os}")
self.patch_set_dictionary = GenerateRootPatchSets(self.computer.real_model, self.constants, self.hardware_details).patchset
patchset_obj = HardwarePatchsetDetection(self.constants)
self.patch_set_dictionary = patchset_obj.patches
if self.patch_set_dictionary == {}:
logging.info("- No Root Patches required for your machine!")
return
logging.info("- Verifying whether Root Patching possible")
if DetectRootPatch(self.computer.real_model, self.constants).verify_patch_allowed(print_errors=not self.constants.wxpython_variant) is False:
if patchset_obj.can_patch is False:
logging.error("- Cannot continue with patching!!!")
patchset_obj.detailed_errors()
return
logging.info("- Patcher is capable of patching")
@@ -511,8 +585,10 @@ class PatchSysVolume:
"""
logging.info("- Starting Unpatch Process")
if DetectRootPatch(self.computer.real_model, self.constants).verify_patch_allowed(print_errors=True) is False:
patchset_obj = HardwarePatchsetDetection(self.constants)
if patchset_obj.can_unpatch is False:
logging.error("- Cannot continue with unpatching!!!")
patchset_obj.detailed_errors()
return
if self._mount_root_vol() is False:

View File

@@ -77,12 +77,12 @@ class SysPatchHelpers:
f.write(data)
def generate_patchset_plist(self, patchset: dict, file_name: str, kdk_used: Path):
def generate_patchset_plist(self, patchset: dict, file_name: str, kdk_used: Path, metallib_used: Path):
"""
Generate patchset file for user reference
Parameters:
patchset (dict): Dictionary of patchset, see detect.py and sys_patch_dict.py
patchset (dict): Dictionary of patchset, sys_patch/patchsets
file_name (str): Name of the file to write to
kdk_used (Path): Path to the KDK used, if any
@@ -98,12 +98,17 @@ class SysPatchHelpers:
if kdk_used:
kdk_string = kdk_used
metallib_used_string = "Not applicable"
if metallib_used:
metallib_used_string = metallib_used
data = {
"OpenCore Legacy Patcher": f"v{self.constants.patcher_version}",
"PatcherSupportPkg": f"v{self.constants.patcher_support_pkg_version}",
"Time Patched": f"{datetime.now().strftime('%B %d, %Y @ %H:%M:%S')}",
"Commit URL": f"{self.constants.commit_info[2]}",
"Kernel Debug Kit Used": f"{kdk_string}",
"Metal Library Used": f"{metallib_used_string}",
"OS Version": f"{self.constants.detected_os}.{self.constants.detected_os_minor} ({self.constants.detected_os_build})",
"Custom Signature": bool(Path(self.constants.payload_local_binaries_root_path / ".signed").exists()),
}
@@ -212,6 +217,10 @@ class SysPatchHelpers:
return
BASE_VERSION = "32023"
GPU_VERSION = f"{BASE_VERSION}.26"
else:
# Fall back for newer versions
BASE_VERSION = "32023"
GPU_VERSION = f"{BASE_VERSION}.26"
LIBRARY_DIR = f"{mount_point}/System/Library/PrivateFrameworks/GPUCompiler.framework/Versions/{BASE_VERSION}/Libraries/lib/clang"
DEST_DIR = f"{LIBRARY_DIR}/{GPU_VERSION}"

View File

@@ -81,6 +81,8 @@ class PatcherSupportPkgMount:
if i == 2:
self._display_too_many_attempts()
return False
continue
break
logging.info("- Mounted DortaniaInternal resources")
return self._merge_dortania_internal_resources()
@@ -114,7 +116,7 @@ class PatcherSupportPkgMount:
return Path("~/.dortania_developer_key").expanduser().read_text().strip()
password = ""
msg = "Welcome to the DortaniaInternal Program, please provided the decryption key to access internal resources. Press cancel to skip."
msg = "Welcome to the DortaniaInternal Program, please provide the decryption key to access internal resources. Press cancel to skip."
if attempt > 0:
msg = f"Decryption failed, please try again. {2 - attempt} attempts remaining. "

View File

@@ -7,17 +7,19 @@ import subprocess
from pathlib import Path
from ..patchsets.base import PatchType
from ...volume import generate_copy_arguments
from ...support import subprocess_wrapper
def install_new_file(source_folder: Path, destination_folder: Path, file_name: str) -> None:
def install_new_file(source_folder: Path, destination_folder: Path, file_name: str, method: PatchType) -> None:
"""
Installs a new file to the destination folder
File handling logic:
- .frameworks are merged with the destination folder
- Other files are deleted and replaced (ex. .kexts, .apps)
- PatchType.MERGE_* are merged with the destination folder
- Other files are deleted and replaced
Parameters:
source_folder (Path): Path to the source folder
@@ -31,7 +33,7 @@ def install_new_file(source_folder: Path, destination_folder: Path, file_name: s
logging.info(f" - Skipping {file_name}, cannot locate {source_folder}")
return
if file_name_str.endswith(".framework"):
if method in [PatchType.MERGE_SYSTEM_VOLUME, PatchType.MERGE_DATA_VOLUME]:
# merge with rsync
logging.info(f" - Installing: {file_name}")
subprocess_wrapper.run_as_root(["/usr/bin/rsync", "-r", "-i", "-a", f"{source_folder}/{file_name}", f"{destination_folder}/"], stdout=subprocess.PIPE)

View File

@@ -12,9 +12,11 @@ import threading
from pathlib import Path
from .. import constants
from ..support import kdk_handler, utilities
from ..support import kdk_handler, utilities, metallib_handler
from ..wx_gui import gui_support, gui_download
from ..sys_patch.patchsets import HardwarePatchsetDetection, HardwarePatchsetSettings
class OSUpdateFrame(wx.Frame):
"""
@@ -40,29 +42,68 @@ class OSUpdateFrame(wx.Frame):
logging.info(f"Staged update found: {os_data[0]} ({os_data[1]})")
self.os_data = os_data
# Check if we need to patch the system volume
results = HardwarePatchsetDetection(
constants=self.constants,
xnu_major=int(self.os_data[1][:2]),
xnu_minor=0, # We can't determine this from the build number
os_build=self.os_data[1],
os_version=self.os_data[0],
).device_properties
if results[HardwarePatchsetSettings.KERNEL_DEBUG_KIT_REQUIRED] is True:
logging.info("KDK required")
if results[HardwarePatchsetSettings.METALLIB_SUPPORT_PKG_REQUIRED] is True:
# TODO: Download MetalLibSupportPkg
logging.info("MetallibSupportPkg required")
if not any([results[HardwarePatchsetSettings.KERNEL_DEBUG_KIT_REQUIRED], results[HardwarePatchsetSettings.METALLIB_SUPPORT_PKG_REQUIRED]]):
logging.info("No additional resources required")
self._exit()
self._generate_ui()
self.kdk_obj: kdk_handler.KernelDebugKitObject = None
def _kdk_thread_spawn():
self.kdk_obj = kdk_handler.KernelDebugKitObject(self.constants, self.os_data[1], self.os_data[0], passive=True, check_backups_only=True)
kdk_thread = threading.Thread(target=_kdk_thread_spawn)
kdk_thread.start()
while kdk_thread.is_alive():
wx.Yield()
self.metallib_obj: metallib_handler.MetalLibraryObject = None
def _metallib_thread_spawn():
self.metallib_obj = metallib_handler.MetalLibraryObject(self.constants, self.os_data[1], self.os_data[0])
if self.kdk_obj.success is False:
if results[HardwarePatchsetSettings.KERNEL_DEBUG_KIT_REQUIRED] is True:
kdk_thread = threading.Thread(target=_kdk_thread_spawn)
kdk_thread.start()
while kdk_thread.is_alive():
wx.Yield()
if results[HardwarePatchsetSettings.METALLIB_SUPPORT_PKG_REQUIRED] is True:
metallib_thread = threading.Thread(target=_metallib_thread_spawn)
metallib_thread.start()
while metallib_thread.is_alive():
wx.Yield()
download_objects = {
# Name: xxx
# download_obj: xxx
}
if self.kdk_obj:
if self.kdk_obj.success is True:
result = self.kdk_obj.retrieve_download()
if result is not None:
download_objects[f"KDK Build {self.kdk_obj.kdk_url_build}"] = result
if self.metallib_obj:
if self.metallib_obj.success is True:
result = self.metallib_obj.retrieve_download()
if result is not None:
download_objects[f"Metallib Build {self.metallib_obj.metallib_url_build}"] = result
if len(download_objects) == 0:
self._exit()
kdk_download_obj = self.kdk_obj.retrieve_download()
if not kdk_download_obj:
# KDK is already downloaded
# Return false since we didn't display anything
self._exit()
self.kdk_download_obj = kdk_download_obj
self.frame.Show()
self.did_cancel = -1
@@ -76,20 +117,34 @@ class OSUpdateFrame(wx.Frame):
if self.did_cancel == -1:
time.sleep(1)
gui_download.DownloadFrame(
self,
title=self.title,
global_constants=self.constants,
download_obj=kdk_download_obj,
item_name=f"KDK Build {self.kdk_obj.kdk_url_build}"
)
if kdk_download_obj.download_complete is False:
self._exit()
for item in download_objects:
name = item
download_obj = download_objects[item]
self.download_obj = download_obj
gui_download.DownloadFrame(
self,
title=self.title,
global_constants=self.constants,
download_obj=download_obj,
item_name=name
)
if download_obj.download_complete is True:
if item.startswith("KDK"):
self._handle_kdk(self.kdk_obj)
if item.startswith("Metallib"):
self._handle_metallib(self.metallib_obj)
self._exit()
def _handle_kdk(self, kdk_obj: kdk_handler.KernelDebugKitObject) -> None:
"""
Handle KDK installation
"""
logging.info("KDK download complete, validating with hdiutil")
self.kdk_checksum_result = False
def _validate_kdk_checksum_thread():
self.kdk_checksum_result = self.kdk_obj.validate_kdk_checksum()
self.kdk_checksum_result = kdk_obj.validate_kdk_checksum()
kdk_checksum_thread = threading.Thread(target=_validate_kdk_checksum_thread)
kdk_checksum_thread.start()
@@ -99,15 +154,16 @@ class OSUpdateFrame(wx.Frame):
if self.kdk_checksum_result is False:
logging.error("KDK checksum validation failed")
logging.error(self.kdk_obj.error_msg)
logging.error(kdk_obj.error_msg)
self._exit()
logging.info("KDK checksum validation passed")
logging.info("Mounting KDK")
if not Path(self.constants.kdk_download_path).exists():
logging.error("KDK download path does not exist")
self._exit()
return
self.kdk_install_result = False
def _install_kdk_thread():
@@ -121,10 +177,31 @@ class OSUpdateFrame(wx.Frame):
if self.kdk_install_result is False:
logging.info("Failed to install KDK")
self._exit()
return
logging.info("KDK installed successfully")
self._exit()
def _handle_metallib(self, metallib_obj: metallib_handler.MetalLibraryObject) -> None:
"""
Handle Metallib installation
"""
self.metallib_install_result = False
def _install_metallib_thread():
self.metallib_install_result = metallib_obj.install_metallib()
metallib_install_thread = threading.Thread(target=_install_metallib_thread)
metallib_install_thread.start()
while metallib_install_thread.is_alive():
wx.Yield()
if self.metallib_install_result is False:
logging.info("Failed to install Metallib")
return
logging.info("Metallib installed successfully")
def _generate_ui(self) -> None:
@@ -179,7 +256,8 @@ class OSUpdateFrame(wx.Frame):
result = dlg.ShowModal()
if result == wx.ID_NO:
logging.info("User cancelled OS caching")
self.kdk_download_obj.stop()
if hasattr(self, "download_obj"):
self.download_obj.stop()
self.did_cancel = 1
else:
self.did_cancel = 0

Some files were not shown because too many files have changed in this diff Show More