Compare commits

...

481 Commits
1.5.0 ... 2.4.0

Author SHA1 Message Date
Mykola Grymalyuk
342177b092 Sync CHANGELOG 2025-05-12 09:58:57 -06:00
neon ball
b5698d4a14 Small adjustments 2025-05-12 12:12:50 +03:00
neon ball
a665baaed5 Move Sequoia warning higher 2025-05-12 12:06:59 +03:00
neon ball
c73a86d07f Small wording change 2025-05-12 12:02:34 +03:00
neon ball
2215d8ea67 Change headline layouts 2025-05-12 11:58:03 +03:00
neon ball
b877fc0f45 Add new method to Time Machine with root patches 2025-05-12 11:51:28 +03:00
Mykola Grymalyuk
b8200ad262 usb11.py: Add USB webcam test patch 2025-05-11 20:36:45 -06:00
Mykola Grymalyuk
09cd863752 Sync CHANGELOG 2025-05-10 21:46:23 -06:00
Mykola Grymalyuk
9bc816f353 Sync PatcherSupportPkg 2025-05-10 21:37:56 -06:00
Mykola Grymalyuk
b19543cac0 Add credit to CHANGELOG 2025-05-10 21:26:56 -06:00
neon ball
26e917b2b0 Tiny addition 2025-05-02 02:14:01 +03:00
neon ball
ac615959a1 Add a minor headline 2025-05-02 02:09:15 +03:00
neon ball
99f5dbd01f Improve USB 1.1 troubleshoot explainers 2025-05-02 02:03:42 +03:00
neon ball
ff20aab2e8 Small adjustments plus one new method 2025-04-30 13:04:16 +03:00
neon ball
4435c469a2 Add macOS Sequoia auto update note to FAQ 2025-04-28 16:12:44 +03:00
neon ball
9cae696255 Small layout adjustment 2025-04-28 16:11:59 +03:00
neon ball
cad87ba6c0 Add a more thorough explainer for version mismatch err 2025-04-28 16:07:01 +03:00
neon ball
20fdd25444 Remove outdated link leading nowhere 2025-04-26 12:38:41 +03:00
neon ball
0dc904c21e Add link 2025-04-25 15:32:50 +03:00
neon ball
c822fc0fd7 Move app versioning explainer to FAQ
Was previously in SONOMA-DROP.
2025-04-25 15:30:45 +03:00
neon ball
7f9e36e086 A bit more shrinking 2025-04-25 15:11:57 +03:00
neon ball
f35d8495d4 Layout fix 2025-04-25 15:08:16 +03:00
neon ball
6f2353d874 Reduce repetition of USB 1.1 issue explanation
Replace OS specific explainers with a link to general troubleshooting section
2025-04-25 15:04:28 +03:00
neon ball
17899778d2 Small change 2025-04-24 14:00:50 +03:00
neon ball
790a932574 Add note about FeatureUnlock race condition possibility 2025-04-24 13:58:13 +03:00
neon ball
3678b72888 Models to collapsible list, other small changes 2025-04-24 13:49:25 +03:00
neon ball
c83658b891 Small layout change 2025-04-24 13:43:43 +03:00
neon ball
6ed2c04ae1 Put the GPUs into collapsible list 2025-04-24 13:38:10 +03:00
neon ball
7491de6b4a Fix link 2025-04-19 04:38:47 +03:00
neon ball
f6cebfff03 Add Maps note to non-Metal troubleshooting 2025-04-19 04:34:44 +03:00
neon ball
153b3a3823 Add a link to requirements FAQ before installer creation guide 2025-04-19 04:21:54 +03:00
neon ball
77c19e32a0 Restructure and add a note about Maps non-Metal 2025-04-19 04:08:25 +03:00
neon ball
a1d267e7c9 Remove outdated text 2025-04-15 07:18:49 +03:00
neon ball
d43ab53682 Fix outdated OCLP app path 2025-04-15 07:18:10 +03:00
neon ball
91c9aaec1e Fix sorting and small change 2025-04-15 07:08:19 +03:00
neon ball
4b60389653 Small enhancements 2025-04-15 07:06:16 +03:00
Mykola Grymalyuk
2be8934e9b Merge pull request #1163 from goneng/fix_high_cpu
GUI: Reduce CPU usage II - have smoother UX with faster refresh rate
2025-04-12 18:30:30 -06:00
Gonen
9ac02b0f6b GUI: Reduce CPU usage II - have smoother UX with faster refresh rate
* Set thread_sleep_interval to 0.01s for better UI responsiveness
* Improve thread waiting with thread.join() where applicable (thanks to @sbytnar)
2025-04-05 20:29:07 +03:00
Mykola Grymalyuk
d41d19b3e1 Merge pull request #1157 from goneng/fix_high_cpu
GUI: Reduce CPU usage by adding sleep intervals to UI wait loops
2025-04-04 06:58:43 -06:00
neon ball
da8299db27 Add warning about 2GB RAM for newer OS 2025-04-04 02:19:35 +03:00
Gonen
4ce91cad3d [WIP] GUI: Reduce CPU usage by adding sleep intervals to UI wait loops
Fix issue where the GUI main thread was consuming excessive CPU while
waiting for background tasks to complete.
By adding a configurable sleep interval between UI updates,
CPU usage is significantly reduced while maintaining responsiveness.

- Add thread_sleep_interval constant to global Constants class
- Implement wait_for_thread utility function in gui_support
- Update all wxPython event loops to use the new helper
- Test shows approximately 60% CPU usage reduction during waits
2025-04-03 23:18:48 +03:00
Mykola Grymalyuk
95bf012438 CHANGELOG: Fix versioning 2025-04-03 14:03:46 -06:00
Mykola Grymalyuk
f87f803cf2 Sync PatcherSupportPkg 2025-04-03 13:59:13 -06:00
Mykola Grymalyuk
7f80c6ba3b Increment build 2025-04-02 11:24:23 -06:00
Mykola Grymalyuk
1a871fd93c Sync CHANGELOG
Ref: 35bcb134f1
2025-04-01 19:31:31 -06:00
Mykola Grymalyuk
c2f773aa6e Merge pull request #1156 from dortania/jazzzny-vault-2
Fix vaulting
2025-04-01 19:26:47 -06:00
Jazzzny
3635fc1d0c Update sign.command 2025-04-01 18:35:16 -04:00
Mykola Grymalyuk
67bf7c5095 Increment build 2025-04-01 08:37:55 -06:00
Mykola Grymalyuk
d1459344e4 Sync PatcherSupportPkg 2025-03-30 14:14:04 -06:00
neon ball
27b48c97f9 Minor additions 2025-03-28 16:58:23 +02:00
Mykola Grymalyuk
8098cc6520 sys_patch.py: Fix Metallib logic 2025-03-24 11:19:28 -06:00
Mykola Grymalyuk
d1bf5abd2b Sync CHANGELOG 2025-03-23 11:53:36 -06:00
Mykola Grymalyuk
28e57d5d00 Sync OpenCorePkg 2025-03-23 11:52:58 -06:00
Mykola Grymalyuk
33d1b294eb Sync kexts 2025-03-23 11:35:06 -06:00
Mykola Grymalyuk
3c91e6e9ed Sync copyright label 2025-02-15 11:08:04 -07:00
Mykola Grymalyuk
803cfcb255 Merge pull request #1155 from dortania/remove-shim
CI: Remove deprecated application
2025-02-15 11:04:18 -07:00
Mykola Grymalyuk
653f7cc56a CI: Remove deprecated application 2025-02-15 10:48:44 -07:00
neon ball
bb715537bc Fix typo 2025-01-04 10:41:10 +02:00
neon ball
16c0e880cd Update TROUBLESHOOTING.md 2025-01-04 10:39:28 +02:00
neon ball
3881fcfad1 Update TROUBLESHOOTING.md 2025-01-04 10:34:11 +02:00
neon ball
1f6bff465a Fix one more link 2025-01-02 09:36:36 +02:00
neon ball
664444edbc Fix couple links 2025-01-02 09:35:21 +02:00
Mykola Grymalyuk
bad8d24edd Merge branch 'main' of https://github.com/dortania/OpenCore-Legacy-Patcher 2025-01-01 11:10:12 -07:00
Mykola Grymalyuk
743076a411 Disable crash analytics client side 2025-01-01 11:10:02 -07:00
neon ball
10af52634f Fix typo 2024-12-31 00:18:08 +02:00
neon ball
87fad93941 Add note about High Sierra required for Sonoma installers 2024-12-29 11:04:40 +02:00
neon ball
df4e30a814 Update UNINSTALL.md 2024-12-25 19:18:50 +02:00
neon ball
041a291a14 Add link 2024-12-25 04:31:33 +02:00
neon ball
ff4a875704 Couple fixes 2024-12-22 10:24:53 +02:00
neon ball
0673714d5b Update FAQ.md 2024-12-22 10:03:16 +02:00
neon ball
12d0bbc155 Update FAQ.md 2024-12-22 10:01:54 +02:00
neon ball
12d57e0c66 Fix typo 2024-12-22 09:56:42 +02:00
neon ball
4437eaaf69 Update FAQ.md 2024-12-22 09:53:41 +02:00
neon ball
73babf41fd FAQ point about AVX/AVX2 and list of Macs supporting them 2024-12-22 09:38:06 +02:00
neon ball
77c53d393c Re-title 2024-12-18 21:51:03 +02:00
neon ball
fdc45f928d Restructure 2024-12-18 21:45:26 +02:00
neon ball
886e9a6341 Change formatting 2024-12-17 15:52:35 +02:00
neon ball
f8242874ab Add note about Big Sur not supporting reversion 2024-12-17 15:46:30 +02:00
neon ball
9c0b4f4ff2 Summary for patches included in root patching 2024-12-16 02:38:52 +02:00
neon ball
550686c88c Fix typo 2024-12-11 23:32:22 +02:00
neon ball
e39247960b Improve FeatureUnlock/mediaanalysisd doc 2024-12-11 23:07:52 +02:00
Mykola Grymalyuk
5f1e21eb09 Sync PatcherSupportPkg 2024-12-09 12:45:30 -07:00
neon ball
213e161458 Improve explanation 2024-12-04 18:40:56 +02:00
Amy
40841407c9 Squashed commit of the following:
commit 07c274ccd388e83d9054aed09a03c40384c3fad3
Author: Amy <asentientbot@gmail.com>
Date:   Fri Nov 29 12:05:29 2024 -0500

    fix typo

    vega is gcn 5 not 4

commit d929f044a585a24c8cd3c25e5776e009a02aa195
Author: Amy <asentientbot@gmail.com>
Date:   Thu Nov 28 21:45:31 2024 -0500

    split and update moraea credits

    address outdated credits in areas im personally familiar with; this isn't exhaustive and other people's need updates too
2024-11-29 12:09:21 -05:00
neon ball
5fc24214af Couple more fixes 2024-11-22 00:33:26 +02:00
neon ball
1383d6ac00 Fix Sequoia part saying "Sonoma" 2024-11-22 00:31:15 +02:00
neon ball
04bd4da742 Update POST-INSTALL.md 2024-11-22 00:14:16 +02:00
neon ball
67b44851fe Update POST-INSTALL.md 2024-11-22 00:09:53 +02:00
neon ball
38def456e0 Adjust images back 2024-11-22 00:03:18 +02:00
neon ball
ab864bd3c2 Move warning, adjust images 2024-11-22 00:00:31 +02:00
neon ball
29e75171f3 Add one more thing 2024-11-21 23:44:02 +02:00
neon ball
1bfeac3f09 Change text location 2024-11-21 23:42:48 +02:00
neon ball
82310eac1a Update INSTALLER.md 2024-11-21 23:37:21 +02:00
neon ball
46c350ba32 Fix a word 2024-11-21 23:21:29 +02:00
neon ball
6661089f89 Adjust image size and title 2024-11-21 22:58:38 +02:00
neon ball
069f191359 Add troubleshooting steps for missing EFI. 2024-11-21 22:53:34 +02:00
neon ball
01035019b2 Change note location 2024-11-21 22:32:28 +02:00
neon ball
0632d1ff7e Add note about new disk wiping and internal EFI 2024-11-21 22:28:14 +02:00
neon ball
028999f666 Link fix 2024-11-20 17:36:19 +02:00
neon ball
b686016222 Update FAQ.md 2024-11-20 17:33:07 +02:00
neon ball
9d9226cc83 Update README.md 2024-11-20 12:16:57 +02:00
neon ball
2d597501c4 Update OTA update info on front page 2024-11-20 12:13:15 +02:00
Mykola Grymalyuk
e9e681c272 Increment build 2024-11-17 10:39:22 -07:00
neon ball
4a9564fe4e Restructure 2024-11-09 13:25:29 +02:00
neon ball
66435494cc Add note about root patch 2nd run 2024-11-09 13:16:12 +02:00
neon ball
a863b5cd54 Remove random "to" 2024-11-07 16:32:02 +02:00
Mykola Grymalyuk
e94f6ac63d Merge branch 'main' of https://github.com/dortania/OpenCore-Legacy-Patcher 2024-11-06 10:18:51 -07:00
Mykola Grymalyuk
5e4b124b2a defaults.py: Implement additional error handling for 2.1.0 bug 2024-11-06 10:18:17 -07:00
neon ball
67df72290f Add update disabling locations for troubleshooting 2024-11-06 03:54:30 +02:00
neon ball
ab740371c8 Unify OS version image sizes 2024-11-03 11:31:56 +02:00
neon ball
d508e8e9f9 Adjust image sizes 2024-11-03 10:57:18 +02:00
neon ball
39c03e3f8b Small fix 2024-11-03 10:42:14 +02:00
neon ball
94f77c20a0 Add explainer about Spotlight indexing slowness 2024-11-03 10:40:10 +02:00
neon ball
2dc9961ffe Add FAT partition note about booting Windows 2024-11-03 10:18:11 +02:00
neon ball
24bc4432ab Small edit 2024-11-03 03:06:44 +02:00
Mykola Grymalyuk
2a578734b9 gui_settings.py: Fix typing for boolean values 2024-11-02 18:19:43 -06:00
neon ball
bb56544182 Add troubleshooting step for greyed out buttons in disk selection 2024-11-03 01:04:56 +02:00
neon ball
70e62c946a Change text location 2024-11-02 12:26:12 +02:00
neon ball
d24eb642ce Small edit 2024-11-02 12:23:57 +02:00
neon ball
81fee375a1 Fix link 2024-11-02 12:20:22 +02:00
neon ball
581c7fcb4e Change FeatureUnlock/mediaanalysisd explainer 2024-11-02 12:17:26 +02:00
neon ball
4939c1dc0f Remove mention of default settings reset as outdated information 2024-11-02 12:01:28 +02:00
neon ball
f635c21f29 Slight edits 2024-11-02 11:47:51 +02:00
neon ball
ed0e3ff66a Slight rewording 2024-11-02 11:35:59 +02:00
neon ball
7ac83d8dd6 Add note about manual config edits being not accounted for 2024-11-02 11:27:02 +02:00
neon ball
b7bca45910 Change to inform about new setting save feature 2024-11-02 11:17:53 +02:00
Mykola Grymalyuk
737aed5635 gui_settings.py: Add error handling for invalid value 2024-10-31 16:03:44 -06:00
Mykola Grymalyuk
868cfa62c1 Sync PatcherSupportPkg 2024-10-31 15:55:31 -06:00
Mykola Grymalyuk
b561a35ca9 products.py: Better handle Apple Silicon installers 2024-10-31 15:55:19 -06:00
neon ball
5542f10ea1 Ventura repatching note 2024-10-31 21:45:57 +02:00
neon ball
bccf1dc31d Monterey -> macOS 2024-10-31 21:43:27 +02:00
neon ball
b50ddb6e26 Documented Python version 3.10 -> 3.11 2024-10-23 19:03:53 +03:00
neon ball
4f980d7562 Slight changes 2024-10-21 02:12:22 +03:00
neon ball
6780fe307f Manual SIP config under details menu 2024-10-21 02:07:37 +03:00
neon ball
dfcb7fdb0c Add link 2024-10-21 01:58:33 +03:00
neon ball
97d956190e Change title 2024-10-21 01:56:17 +03:00
neon ball
41b9fcb85f Add Metal and Non-Metal explainer 2024-10-21 01:49:03 +03:00
neon ball
4015b8bb25 Align images 2024-10-21 01:26:37 +03:00
neon ball
be155127cf Adjust image sizes 2024-10-21 01:24:03 +03:00
neon ball
203b5cf127 Add link to Time Machine guide and adjust formatting 2024-10-21 01:09:54 +03:00
neon ball
fbec713b43 Adjust image 2024-10-21 01:04:12 +03:00
neon ball
734e14b0cf Adjust image 2024-10-21 00:59:21 +03:00
neon ball
ad1faf2ea2 Adjust images 2024-10-21 00:57:12 +03:00
neon ball
58435188eb Remove duplication 2024-10-21 00:49:45 +03:00
neon ball
0b92e022e9 Add more clarification and adjust images 2024-10-21 00:45:30 +03:00
neon ball
4db2e97662 Add new Sequoia image again because skill issue 2024-10-11 18:51:32 +03:00
neon ball
d1ba89049c Add Sequoia image with better crop 2024-10-11 18:48:51 +03:00
neon ball
33d60f19d0 Fix one image 2024-10-11 18:41:59 +03:00
neon ball
15d4e201f4 Align some images to flow better with the side width 2024-10-11 18:32:08 +03:00
neon ball
af67ec2bbe Adjust image sizes 2024-10-11 18:21:22 +03:00
neon ball
e30434a70e Adjust formatting 2024-10-11 18:15:12 +03:00
neon ball
3a442e67c6 Change order 2024-10-11 18:12:41 +03:00
neon ball
32a98e5b34 Update FAQ.md 2024-10-11 18:11:13 +03:00
neon ball
d9828999eb Fix capitalization 2024-10-10 20:21:15 +03:00
neon ball
07daef6f63 Change title 2024-10-10 20:19:06 +03:00
neon ball
2cccd34870 Adjust sidebar 2024-10-10 20:16:38 +03:00
neon ball
31790190be Adjust sidebar 2024-10-10 20:09:08 +03:00
neon ball
b7ecafb5ec Fix layout 2024-10-10 20:04:03 +03:00
neon ball
4f6e8c4fb8 Change MBA7,x spoof and add note 2024-10-10 20:01:37 +03:00
neon ball
e142702c3d Update titles 2024-10-10 01:17:09 +03:00
neon ball
8b5663c3c7 Rename title 2024-10-10 01:14:08 +03:00
neon ball
7c89ab6ba3 Restructure sidebar 2024-10-10 01:12:25 +03:00
neon ball
80e2aa9447 Some proof read fixes 2024-10-09 02:32:23 +03:00
neon ball
170b00694b Shorten title and move a sentence 2024-10-09 02:22:37 +03:00
neon ball
f5ffdd158a Edit note styling 2024-10-09 02:17:22 +03:00
neon ball
c504c95b50 Add new config.js
Because it just didn't want to go first time
2024-10-09 02:13:47 +03:00
neon ball
9da6c85c98 Add Time Machine guide and reorder sidebar items 2024-10-09 02:12:38 +03:00
Mykola Grymalyuk
6a58ef1dab gui_settings.py: Handle saving values of None 2024-10-05 12:21:34 -06:00
Mykola Grymalyuk
a8f76af6bc GUI: Support saving settings on-model 2024-10-05 11:14:46 -06:00
Mykola Grymalyuk
1ec6b02cd7 Increment build 2024-10-05 10:24:20 -06:00
neon ball
8ff76ba3cd Add macOS downgrade FAQ 2024-10-03 17:32:24 +03:00
neon ball
6742372e91 Remove unnecessary link section 2024-10-03 17:29:01 +03:00
neon ball
65caa6d028 Update UNINSTALL.md 2024-10-03 17:28:20 +03:00
neon ball
31cb5f9367 Fix headline 2024-10-03 17:26:11 +03:00
neon ball
9aacf826f2 Update UNINSTALL.md 2024-10-03 17:24:41 +03:00
neon ball
ca34c57fde Update UPDATE.md 2024-10-03 01:40:37 +03:00
neon ball
49c138bd19 Update UPDATE.md 2024-10-03 01:40:01 +03:00
neon ball
c8db4663ce Fix typo 2024-10-03 01:37:29 +03:00
neon ball
7fcf5fcab4 Make text match image 2024-10-03 01:35:09 +03:00
neon ball
7fcb824dc2 Fix link 2024-10-03 01:33:06 +03:00
neon ball
9455d5357b Center images 2024-10-03 01:32:03 +03:00
neon ball
3a7265e985 Reword 2024-10-03 01:29:20 +03:00
neon ball
03ac2ec155 Add info about updating 2024-10-03 01:28:49 +03:00
neon ball
cfde6978f5 Slight rewordings 2024-10-03 01:24:39 +03:00
neon ball
8ca7a2ebbb Remove random pipe 2024-10-03 01:19:22 +03:00
neon ball
7d50f96cf1 Overhaul UPDATE.md 2024-10-03 01:17:13 +03:00
neon ball
0eb351f270 Update FAQ.md 2024-09-30 23:25:10 +03:00
neon ball
3bfa50950a Add images 2024-09-30 23:18:25 +03:00
neon ball
2fb9fb866f Add sections 2024-09-30 22:52:36 +03:00
neon ball
87b5b49f06 Add a period lol 2024-09-30 22:47:25 +03:00
neon ball
4cc88d18a0 Add FAQ link to start page and other small changes 2024-09-30 22:46:27 +03:00
neon ball
5b332eeac5 Move application requirements to FAQ 2024-09-30 22:43:47 +03:00
neon ball
8f88444ac3 Clarify things 2024-09-30 22:26:53 +03:00
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
8332b714b5 graphics_audio.py: Add AMD Navi patch 2024-09-01 09:54:20 -06:00
neon ball
4add945fa0 Fix typo 2024-08-31 12:18:12 +03:00
neon ball
807d394bdb Fix link 2024-08-31 12:13:17 +03:00
neon ball
0ba78bae68 Fix formatting 2024-08-31 12:08:54 +03:00
neon ball
d73b3dcc69 Add Error Code 71 solution 2024-08-31 12:07:41 +03: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
c8aa13664d Merge pull request #1147 from crystall1nedev/s3x-patch
Increase model range of S1X/S3X kext inclusion
2024-08-22 17:04:21 -06:00
Eva Luna
f32a813a0c Add note in CHANGELOG.md 2024-08-22 19:02:20 -04:00
Eva Luna
2696879109 Add note for S1X/S3X changes and clarify if statement 2024-08-22 18:58:31 -04:00
Eva Isabella Luna
df28ea288a Increase model range of S1X/S3X kext inclusion
While stock systems with S1X/S3X drives only include Broadwell to Kaby Lake Macs, Haswell Macs and MacPro6,1 are able to use these drives as well, causing issues when building OpenCore for those models from a different machine.
2024-08-22 18:18:57 -04:00
Mykola Grymalyuk
fc5b250d41 sys_patch.py: Fix AuxKC check 2024-08-20 15:52:44 -06:00
neon ball
b349459da6 Increase visibility of app requirements and add a note about firmware 2024-08-21 00:44:08 +03: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
be7493f74a macOS Installer: Add handling for reqading Sequoia installer versions 2024-08-20 15:26:14 -06:00
Mykola Grymalyuk
fbe216164a support.py: Ignore non-kext files 2024-08-20 15:25:36 -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
258b0309ab Merge pull request #1146 from dortania/kernel-management
Modularize System Volume Patching System
2024-08-14 09:18:38 -06:00
Mykola Grymalyuk
53dd5d3477 Further modularize sys_patch 2024-08-13 13:07:58 -06:00
Mykola Grymalyuk
c4cda81df6 Modularize sys_patch_mount.py 2024-08-12 16:38:05 -06:00
Mykola Grymalyuk
35b365c8ca Rework Kernel Cache management 2024-08-12 15:46:52 -06:00
Mykola Grymalyuk
1653fec580 sys_patch_helpers.py: Use full pathing 2024-08-12 08:37:55 -06:00
Mykola Grymalyuk
d1e721d8d7 Merge branch 'main' into sequoia-development 2024-08-11 20:00:52 -06:00
Mykola Grymalyuk
e453bd1b51 Sync PatcherSupportPkg 2024-08-11 19:57:39 -06:00
Jazzzny
1a576c72a2 Provide additional resilience in USB detection code (#1144)
* Add fallback, don't bail out

* Part 2

* Part 3

* Fix import

* Move encoding
2024-08-09 18:13:53 -04:00
neon ball
9a55317f86 Fix typo 2024-08-07 21:01:14 +03:00
neon ball
23d7f9f07c Fix some links 2024-08-07 21:00:35 +03:00
Mykola Grymalyuk
8c99335b83 Merge branch 'main' into sequoia-development 2024-08-01 12:45:22 -06:00
Mykola Grymalyuk
5fd7ad0b4b Sync CHANGELOG 2024-08-01 12:44:15 -06:00
Mykola Grymalyuk
b065da6dbf Merge pull request #1143 from dortania/copy-on-write
Implement improved Copy on Write detection
2024-08-01 12:42:04 -06:00
Mykola Grymalyuk
90092a296d Implement getattrlist for improved CoW detection 2024-08-01 11:16:00 -06:00
Mykola Grymalyuk
57356bcceb products.py: Streamline beta removal
Reduce additional loops to clear beta builds
2024-07-31 20:11:05 -06:00
Mykola Grymalyuk
d726851d9c products.py: Add extra sanity check 2024-07-31 10:58:40 -06:00
Mykola Grymalyuk
cdd81c5466 Merge branch 'main' into sequoia-development 2024-07-31 10:54:43 -06:00
Mykola Grymalyuk
7897cd14b6 products.py: Work around index being offset on deletion
Resolves non-latest builds appearing in latest dictionary
2024-07-31 10:54:15 -06:00
Mykola Grymalyuk
628fe4f8fc products.py: Verify item exists before removal 2024-07-31 09:05:41 -06:00
Mykola Grymalyuk
260fcf4c93 Merge branch 'main' into sequoia-development 2024-07-25 12:21:32 -06:00
Mykola Grymalyuk
a074baa2e9 sys_patch: Remove unused bplist code 2024-07-25 12:19:28 -06:00
Jazzzny
e81c138d2e Update README.md 2024-07-25 13:31:09 -04:00
Jazzzny
aa4fd137d1 Update README.md 2024-07-25 13:16:05 -04: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
neon ball
580fb83b4d Remove repetition and small change 2024-07-22 00:34:33 +03:00
neon ball
de3875279a Swap OS version names from heading to bold 2024-07-22 00:24:24 +03:00
neon ball
cdfefe1612 Add a thing 2024-07-22 00:14:56 +03:00
neon ball
6f7f309a4d Change a bit 2024-07-22 00:13:39 +03:00
neon ball
86a7e306f6 Improve SIP documentation
Previous one was a bit of a jumbled mess, added some cohesiveness and version based information
2024-07-22 00:08:26 +03:00
Mykola Grymalyuk
8d88fbbfa4 Remove unused imports 2024-07-21 13:53:52 -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
Mykola Grymalyuk
ae423888d7 Merge pull request #1142 from dortania/sucatalog-rewrite
sucatalog: Implement more robust Software Update Catalog library
2024-07-21 12:16:59 -06:00
Mykola Grymalyuk
4583a743be sucatalog: Publish initial version 2024-07-21 11:54:54 -06:00
neon ball
537853418d Fix typo 2024-07-16 11:41:12 +03:00
neon ball
6603df4cce Fix link v2 2024-07-16 11:39:54 +03:00
neon ball
21e144ee5f Fix link 2024-07-16 11:39:08 +03: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
Dhinak G
18157fe5aa Fix mislabeled MBA Identifiers (#1140)
Co-authored-by: ROSeaboyer <ryan.seaboyer@icloud.com>
2024-07-05 13:42:56 -04: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
66f0009c65 disk_images.py: Do not include EFI 2024-06-28 12:10:57 -04:00
Dhinak G
49da508bde sys_patch.py: Better wording for staged update sanity check 2024-06-28 12:10:15 -04: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
f46f4cf857 Merge pull request #1138 from dortania/bsd
Mention contributors in license
2024-06-27 13:34:32 -06:00
Jazzzny
4f104de405 Reword 2024-06-27 14:28:27 -04:00
Jazzzny
4f2f9a8763 Merge branch 'main' into bsd 2024-06-27 12:55:16 -04:00
Jazzzny
ceeef7c1a5 Update LICENSE.txt to include individual contributors 2024-06-27 12:51:19 -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
neon ball
ded1e8c2c7 Adjust size 2024-06-23 20:30:55 +03:00
neon ball
0f83e77f1a Fix path 2024-06-23 20:28:27 +03:00
neon ball
1fc1595ffb Fix image size 2024-06-23 20:23:49 +03:00
neon ball
1c147819f7 Add troubleshooting section about "Bless failed"
Possible solution to fix "You have no premission to save..." error
2024-06-23 20:18:44 +03:00
neon ball
4aaf658c8f Move sidebar location 2024-06-16 15:01:11 +03:00
neon ball
2fb193692b Update PROCESS.md 2024-06-16 14:55:46 +03:00
neon ball
7f6a2e393c Update PROCESS.md 2024-06-16 14:48:29 +03:00
neon ball
0a48986ddb Fix note again 2024-06-16 14:46:11 +03:00
neon ball
edd9814f12 Fix note 2024-06-16 14:43:47 +03:00
neon ball
f32f94e588 Fix typos 2024-06-16 14:42:21 +03:00
neon ball
5fb4bbf7f4 Add note highlight 2024-06-16 14:40:56 +03:00
neon ball
7d8d9324e0 Rename PROCESS to PROCESS.md 2024-06-16 14:34:37 +03:00
neon ball
f717bdceae Update config.js 2024-06-16 14:26:08 +03:00
neon ball
d015f8d1e4 Create PROCESS 2024-06-16 14:25:47 +03: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
Mykola Grymalyuk
9a2fca8d18 os_data.py: Add macOS Sequoia constant 2024-06-10 11:52:48 -06:00
Mykola Grymalyuk
475b9e793f sys_patch: Fix patches typing 2024-06-08 20:24:04 -06:00
Mykola Grymalyuk
73ce7e5bda package_scripts.py: Adjust formatting 2024-06-02 12:29:56 -06:00
Mykola Grymalyuk
3bffad8001 GUI: Add side spacing for wx.TextCtrl elements 2024-06-02 12:19:44 -06:00
Mykola Grymalyuk
aa40e9328a CI: Programatically create PKG scripts
Additionally move all PKG assets to ci_tooling/pkg_assets
2024-06-02 12:16:25 -06:00
Mykola Grymalyuk
ec103c1d2e Launch Services: Adjust AssociatedBundleIdentifiers 2024-06-02 12:04:26 -06:00
Mykola Grymalyuk
dd88879dc0 Increment version 2024-05-31 11:43:54 -06:00
258 changed files with 21475 additions and 39858 deletions

View File

@@ -2,6 +2,8 @@ name: CI - Build wxPython
on:
push:
paths-ignore:
- 'docs/**'
workflow_dispatch:
release:
types: [published]
@@ -82,23 +84,6 @@ jobs:
--run-as-individual-steps
--prepare-package
- name: Prepare Update Shim (--prepare-shim)
run: >
/Library/Frameworks/Python.framework/Versions/3.11/bin/python3 Build-Project.command
--application-signing-identity "${{ env.ORG_MAC_DEVELOPER_ID_APPLICATION_IDENTITY }}"
--notarization-apple-id "${{ env.ORG_MAC_NOTARIZATION_APPLE_ID }}" --notarization-password "${{ env.ORG_MAC_NOTARIZATION_PASSWORD }}" --notarization-team-id "${{ env.ORG_MAC_NOTARIZATION_TEAM_ID }}"
--run-as-individual-steps
--prepare-shim
- name: Prepare App for Upload
run: /bin/mv ./dist/OpenCore-Patcher.app.zip ./OpenCore-Patcher-GUI.app.zip
- name: Upload App to Artifacts
uses: actions/upload-artifact@v4
with:
name: OpenCore-Patcher.app (GUI)
path: OpenCore-Patcher-GUI.app.zip
- name: Upload AutoPkg Package to Artifacts
uses: actions/upload-artifact@v4
with:
@@ -117,15 +102,6 @@ jobs:
name: OpenCore-Patcher-Uninstaller.pkg
path: ./dist/OpenCore-Patcher-Uninstaller.pkg
- name: Upload Binary to Release
if: github.event_name == 'release'
uses: svenstaro/upload-release-action@e74ff71f7d8a4c4745b560a485cc5fdb9b5b999d
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: OpenCore-Patcher-GUI.app.zip
tag: ${{ github.ref }}
file_glob: true
- name: Upload AutoPkg Package to Release
if: github.event_name == 'release'
uses: svenstaro/upload-release-action@e74ff71f7d8a4c4745b560a485cc5fdb9b5b999d

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

@@ -7,7 +7,6 @@ import os
import sys
import time
import argparse
import plistlib
from pathlib import Path
@@ -15,12 +14,9 @@ from ci_tooling.build_modules import (
application,
disk_images,
package,
sign_notarize,
shim
sign_notarize
)
from opencore_legacy_patcher import constants
def main() -> None:
"""
@@ -55,10 +51,6 @@ def main() -> None:
parser.add_argument("--prepare-package", action="store_true", help="CI: Prepare Package", default=False)
parser.add_argument("--prepare-assets", action="store_true", help="CI: Prepare Assets", default=False)
# CI/CD Parameters for additional steps
# If not specified, will not run additional steps
parser.add_argument("--prepare-shim", action="store_true", help="CI: Prepare Update Shim", default=False)
# Analytics Parameters
parser.add_argument("--analytics-key", type=str, help="Analytics Key", default=None)
parser.add_argument("--analytics-endpoint", type=str, help="Analytics Endpoint", default=None)
@@ -136,31 +128,6 @@ def main() -> None:
notarization_team_id=args.notarization_team_id,
).sign_and_notarize()
# Create Update Shim
if args.prepare_shim:
shim.GenerateShim().generate()
if Path("dist/OpenCore-Patcher.app").exists():
if Path("dist/OpenCore-Patcher (Original).app").exists():
Path("dist/OpenCore-Patcher (Original).app").unlink()
Path("dist/OpenCore-Patcher.app").rename("dist/OpenCore-Patcher (Original).app")
Path("dist/OpenCore-Patcher (Shim).app").rename("dist/OpenCore-Patcher.app")
# Update app version in Info.plist
plist_path = Path("dist/OpenCore-Patcher.app/Contents/Info.plist")
contents = plistlib.load(plist_path.open("rb"))
contents["CFBundleVersion"] = constants.Constants().patcher_version
contents["CFBundleShortVersionString"] = constants.Constants().patcher_version
plistlib.dump(contents, plist_path.open("wb"))
sign_notarize.SignAndNotarize(
path=Path("dist/OpenCore-Patcher.app"),
signing_identity=args.application_signing_identity,
notarization_apple_id=args.notarization_apple_id,
notarization_password=args.notarization_password,
notarization_team_id=args.notarization_team_id,
entitlements=Path("./ci_tooling/entitlements/entitlements.plist"),
).sign_and_notarize()
if __name__ == '__main__':
_start = time.time()

View File

@@ -1,5 +1,174 @@
# OpenCore Legacy Patcher changelog
## 2.4.0
- Reduce CPU usage on main UI thread
- Thanks [goneng](https://github.com/goneng) for the implementation!
- Resolve T1 issues:
- coreautha crashes on macOS 14.4 or later
- ApplePay on macOS 15.5
- Resolve USB Camera support on USB 1.1 Macs in macOS Sequoia
- Increment binaries:
- PatcherSupportPkg 1.9.5 - release
## 2.3.2
- Resolve erroring in Passwords app and Safari Autofill on T1 Macs running 15.4 or later
- Increment binaries:
- PatcherSupportPkg 1.9.3 - release
## 2.3.1
- Resolve error on OpenCore Vaulted configs
- Regression from 2.3.0
## 2.3.0
- Disable crash analytics
- Disabled server side for years, removing client side
- `OpenCore-Patcher-GUI.app.zip` removed from release
- Deprecated in 1.5.0, use `OpenCore-Patcher.pkg` for installation
- Sync copyright label to 2025
- Resolve MetallibSupportPkg failing to be cached on units without Kernel Debug Kit requirements
- Resolve Broadwell widget rendering on macOS Sequoia
- Resolve non-Metal crashing on macOS Big Sur and Sequoia (15.4)
- Resolve T1 erroring on macOS Sequoia (15.4)
- Enabled non-metal beta menubar styling globally
- No changes to GUI settings
- Increment binaries:
- OpenCorePkg 1.0.4 - release
- Lilu 1.7.0 - release
- WhateverGreen 1.6.9 - release
- AirPortBrcmFixup 2.1.9 - release
- NVMeFix 1.1.2 - release
- RestrictEvents 1.1.5 - release
- FeatureUnlock 1.1.7 - release
- DebugEnhancer 1.1.0 - release
- CPUFriend 1.2.9 - release
- BlueToolFixup 2.6.9 - release
- CryptexFixup 1.0.4 - release
- PatcherSupportPkg 1.9.2 - release
## 2.2.0
- Resolved non-metal accessibility zoom on macOS Sonoma/Sequoia
- Resolved non-metal photos app on macOS Sequoia
- Resolved non-metal Screen Sharing on macOS Sequoia
- Resolved non-metal inverted screenshots on macOS Sequoia
- Improved non-metal beta menubar reliability
- Disabled non-metal broken weather background animations on macOS Sequoia
- Resolved non-metal safari hide distracting items crash on macOS Sequoia
- Resolved non-metal full screen transition on macOS Sonoma/Sequoia
- Resolved T1 Apple Pay on macOS Sequoia
- Resolved T1 TouchID support on macOS Sequoia 15.2
- Resolved iCloud sync problems
- Resolved JavaScriptCore on pre-AVX Macs on macOS Sequoia 15.2/Safari 18.2
- Increment binaries:
- PatcherSupportPkg 1.9.1 - release
## 2.1.2
- Add additional error handling for when building OpenCore errors out
- Prevents broken EFI from being installed to disk
- Add additional error handling for broken settings file from OCLP 2.1.0
- If typing for settings is wrong, app will skip setting it, delete from settings file and use default
- Delete `/Users/Shared/.com.dortania.opencore-legacy-patcher.plist` and restart app to avoid this issue
- Add additional warning about OCLP 2.1.0 bug where certain settings saved incorrectly
- Delete `/Users/Shared/.com.dortania.opencore-legacy-patcher.plist` and restart app if `TypeError: unsupported type: <class 'NoneType'>` error occurs
## 2.1.1
- Resolve boolean GUI settings saving incorrectly as Python's None type
## 2.1.0
- Disable FeatureUnlock by default
- Intended to maintain long term stability
- If features unlocked by FeatureUnlock desired, can be enabled in settings
- Disable mediaanalysisd on Metal 3802-based GPUs
- Intended to maintain long term stability
- If Live Text support desired, can be enabled in settings
- Support for retaining GUI settings when building on-model
- When switching to a different model, model-specific GUI settings will be reset
- Note resetting saved settings not implemented yet
- Delete `/Users/Shared/.com.dortania.opencore-legacy-patcher.plist` and restart app to reset settings
- Resolve macOS 15.1 (24B2083) Apple Silicon installer appearing as download option
- Resolve WhatsApp crashing on 15.1
- Increment binaries:
- PatcherSupportPkg 1.8.4 - release
## 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
- Add support for `gktool` in PKG postinstall scripts
- Removes Gatekeeper "verifying" prompt on first launch after PKG installation
- Note `gktool` is only available on macOS Sonoma and newer
- Resolve unpatching crash edge case when host doesn't require patches.
- Implement new Software Update Catalog Parser for macOS Installers
- Implement new Copy on Write detection mechanism for all file copying operations
- Implemented using `getattrlist` and `VOL_CAP_INT_CLONE` flag
- Helps improve performance on APFS volumes
- Increase model range for S1X/S3X patching to include Haswell Macs and `MacPro6,1`
- Helps avoid an issue where older machines with newer, unsupported SSDs would fail to boot
- 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.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
- Python:

View File

@@ -1,5 +1,4 @@
Copyright (c) 2020-2024, Dhinak G
Copyright (c) 2020-2024, Mykola Grymalyuk
Copyright (c) 2020-2025 Dhinak G, Mykola Grymalyuk, and individual contributors.
All rights reserved.

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
@@ -67,8 +67,22 @@ To run the project from source, see here: [Build and run from source](./SOURCE.m
* Great amounts of help with debugging, and code suggestions
* [vit9696](https://github.com/vit9696)
* Endless amount of help troubleshooting, determining fixes and writing patches
* [ASentientBot](https://github.com/ASentientBot), [EduCovas](https://github.com/educovas) and [ASentientHedgehog](https://github.com/moosethegoose2213)
* Legacy Acceleration Patch set and documentation, [Moraea Organization](https://github.com/moraea)
* [EduCovas](https://github.com/covasedu)
* [non-Metal patch set](https://github.com/moraea/non-metal-frameworks) for nVidia Tesla/Fermi/Maxwell/Pascal, AMD TeraScale 1/2, and Intel Core 1st/2nd Generation GPUs
* [3802 Metal patch set](https://github.com/moraea/misc-patches/tree/main/3802-Metal-15) and [MetallibSupportPkg](https://github.com/dortania/MetallibSupportPkg) for nVidia Kepler and Intel Core 3rd/4th Generation GPUs
* Metal bundle patches and shims for [nVidia Kepler](https://github.com/moraea/misc-patches/tree/main/Kepler%2013%2B), [AMD GCN 1 - 4](https://github.com/moraea/misc-patches/tree/main/GCN%2013%2B), and [AMD GCN 5 (Vega)](https://github.com/moraea/misc-patches/tree/main/vega%2013%2B)
* [IOSurface offset patches](https://github.com/moraea/misc-patches/tree/main/Sonoma%2014.4%20IOSurface) for nVidia Kepler, AMD GCN 1 - 5, and Intel Core 3rd - 6th Generation GPUs
* [legacy Wi-Fi patch set](https://github.com/moraea/unsupported-wifi-patches) restores functionality for Wi-Fi cards in all 2007 - 2017 models
* [T1 patch set](https://github.com/moraea/misc-patches/tree/main/T1-Patch) restores Touch ID, Apple Pay, and other secure functionality in 2016 - 2017 models
* AppleGVA downgrade for accelerated video decoding on 2012 - 2016 models
* OpenCL and OpenGL downgrade for AMD GCN
* [USB 1 patch](https://github.com/moraea/misc-patches/tree/main/IOUSBHostFamily-14.4)
* [ASentientHedgehog](https://github.com/moosethegoose2213)
* [non-Metal patch set](https://github.com/moraea/non-metal-frameworks) for nVidia Tesla/Fermi/Maxwell/Pascal, AMD TeraScale 1/2, and Intel Core 1st/2nd Generation GPUs
* [ASentientBot](https://github.com/ASentientBot)
* [non-Metal patch set](https://github.com/moraea/non-metal-frameworks) for nVidia Tesla/Fermi/Maxwell/Pascal, AMD TeraScale 1/2, and Intel Core 1st/2nd Generation GPUs
* [Metal bundle interposer](https://github.com/moraea/misc-patches/tree/main/sequoia%2031001%20interposer) for AMD GCN 1 - 5 and Intel Core 5th/6th Generation GPUs
* [dsce](https://github.com/moraea/dsce) and [shared code](https://github.com/moraea/moraea-common) used by some other patches
* [cdf](https://github.com/cdf)
* Mac Pro on OpenCore Patch set and documentation
* [Innie](https://github.com/cdf/Innie) and [NightShiftEnabler](https://github.com/cdf/NightShiftEnabler)
@@ -89,6 +103,9 @@ To run the project from source, see here: [Build and run from source](./SOURCE.m
* Endless hours helping architect and troubleshoot many portions of the project
* [flagers](https://github.com/flagersgit)
* Aid with Nvidia Web Driver research and development
* [non-Metal patch set](https://github.com/moraea/non-metal-frameworks) for nVidia Tesla/Fermi/Maxwell/Pascal, AMD TeraScale 1/2, and Intel Core 1st/2nd Generation GPUs
* [Metal bundle interposer](https://github.com/moraea/misc-patches/tree/main/sequoia%2031001%20interposer) for AMD GCN 1 - 5 and Intel Core 5th/6th Generation GPUs
* LegacyRVPL, SnapshotIsKill, etc. to aid in rapid testing and development
* [joevt](https://github.com/joevt)
* [FixPCIeLinkrate](https://github.com/joevt/joevtApps)
* [Jazzzny](https://github.com/Jazzzny)
@@ -100,7 +117,16 @@ To run the project from source, see here: [Build and run from source](./SOURCE.m
* Pre-Ivy Bridge Aquantia Ethernet Patch
* Non-Metal Photo Booth Patch for Monterey+
* GUI and Backend Development
* Updater UI
* macOS Downloader UI
* Downloader UI
* USB Top Case probing
* Developer root patching
* Vaulting implementation
* macOS 15 3802 Helios Research
* UEFI bootx64.efi research
* universal2 build research
* Various documentation contributions
* Amazing users who've graciously donate hardware:
* [JohnD](https://forums.macrumors.com/members/johnd.53633/) - 2013 Mac Pro
* [SpiGAndromeda](https://github.com/SpiGAndromeda) - AMD Vega 64

View File

@@ -31,8 +31,8 @@ pip3 install -r requirements.txt
If you have any installation errors, see the following troubleshooting options:
* Use Python 3.10
* Our build server currently uses Python 3.10 for generating binaries used in releases
* Use Python 3.11
* Our build server currently uses Python 3.11 for generating binaries used in releases
* Use .whl snapshots for installing additional dependencies
## Running OpenCore Legacy Patcher

View File

@@ -1,103 +0,0 @@
#!/bin/zsh --no-rcs
# ------------------------------------------------------
# AutoPkg Assets Postinstall Script
# ------------------------------------------------------
# Create alias for app, start patching and reboot.
# ------------------------------------------------------
# MARK: PackageKit Parameters
# ---------------------------
pathToScript=$0 # ex. /tmp/PKInstallSandbox.*/Scripts/*/preinstall
pathToPackage=$1 # ex. ~/Downloads/Installer.pkg
pathToTargetLocation=$2 # ex. '/', '/Applications', etc (depends on pkgbuild's '--install-location' argument)
pathToTargetVolume=$3 # ex. '/', '/Volumes/MyVolume', etc
pathToStartupDisk=$4 # ex. '/'
# MARK: Variables
# ---------------------------
helperPath="Library/PrivilegedHelperTools/com.dortania.opencore-legacy-patcher.privileged-helper"
mainAppPath="Library/Application Support/Dortania/OpenCore-Patcher.app"
shimAppPath="Applications/OpenCore-Patcher.app"
executablePath="$mainAppPath/Contents/MacOS/OpenCore-Patcher"
# MARK: Functions
# ---------------------------
function _setSUIDBit() {
local binaryPath=$1
echo "Setting SUID bit on: $binaryPath"
# Check if path is a directory
if [[ -d $binaryPath ]]; then
/bin/chmod -R +s $binaryPath
else
/bin/chmod +s $binaryPath
fi
}
function _createAlias() {
local mainPath=$1
local aliasPath=$2
# Check if alias path exists
if [[ -e $aliasPath ]]; then
# Check if alias path is a symbolic link
if [[ -L $aliasPath ]]; then
echo "Removing old symbolic link: $aliasPath"
/bin/rm -f $aliasPath
else
echo "Removing old file: $aliasPath"
/bin/rm -rf $aliasPath
fi
fi
# Create symbolic link
echo "Creating symbolic link: $aliasPath"
/bin/ln -s $mainPath $aliasPath
}
function _startPatching() {
local executable=$1
local logPath=$(_logFile)
# Start patching
"$executable" "--patch_sys_vol" &> $logPath
}
function _logFile() {
echo "/Users/Shared/.OCLP-AutoPatcher-Log-$(/bin/date +"%Y_%m_%d_%I_%M_%p").txt"
}
function _fixSettingsFilePermission() {
local settingsPath="$pathToTargetVolume/Users/Shared/.com.dortania.opencore-legacy-patcher.plist"
if [[ -e $settingsPath ]]; then
echo "Fixing settings file permissions: $settingsPath"
/bin/chmod 666 $settingsPath
fi
}
function _reboot() {
/sbin/reboot
}
function _main() {
_setSUIDBit "$pathToTargetVolume/$helperPath"
_createAlias "$pathToTargetVolume/$mainAppPath" "$pathToTargetVolume/$shimAppPath"
_startPatching "$pathToTargetVolume/$executablePath"
_fixSettingsFilePermission
_reboot
}
# MARK: Main
# ---------------------------
echo "Starting postinstall script..."
_main

View File

@@ -1,80 +0,0 @@
#!/bin/zsh --no-rcs
# ------------------------------------------------------
# AutoPkg Assets Preinstall Script
# ------------------------------------------------------
# Remove old files, and prepare directories.
# ------------------------------------------------------
# MARK: PackageKit Parameters
# ---------------------------
pathToScript=$0 # ex. /tmp/PKInstallSandbox.*/Scripts/*/preinstall
pathToPackage=$1 # ex. ~/Downloads/Installer.pkg
pathToTargetLocation=$2 # ex. '/', '/Applications', etc (depends on pkgbuild's '--install-location' argument)
pathToTargetVolume=$3 # ex. '/', '/Volumes/MyVolume', etc
pathToStartupDisk=$4 # ex. '/'
# MARK: Variables
# ---------------------------
filesToRemove=(
"Applications/OpenCore-Patcher.app"
"Library/Application Support/Dortania/Update.plist"
"Library/Application Support/Dortania/OpenCore-Patcher.app"
"Library/LaunchAgents/com.dortania.opencore-legacy-patcher.auto-patch.plist"
"Library/PrivilegedHelperTools/com.dortania.opencore-legacy-patcher.privileged-helper"
)
# MARK: Functions
# ---------------------------
function _removeFile() {
local file=$1
if [[ ! -e $file ]]; then
# Check if file is a symbolic link
if [[ -L $file ]]; then
echo "Removing symbolic link: $file"
/bin/rm -f $file
fi
return
fi
echo "Removing file: $file"
# Check if file is a directory
if [[ -d $file ]]; then
/bin/rm -rf $file
else
/bin/rm -f $file
fi
}
function _createParentDirectory() {
local file=$1
local parentDirectory="$(/usr/bin/dirname $file)"
# Check if parent directory exists
if [[ ! -d $parentDirectory ]]; then
echo "Creating parent directory: $parentDirectory"
/bin/mkdir -p $parentDirectory
fi
}
function _main() {
for file in $filesToRemove; do
_removeFile $pathToTargetVolume/$file
_createParentDirectory $pathToTargetVolume/$file
done
}
# MARK: Main
# ---------------------------
echo "Starting preinstall script..."
_main

View File

@@ -5,7 +5,7 @@ import subprocess
from pathlib import Path
from opencore_legacy_patcher import constants
from opencore_legacy_patcher.volume import generate_copy_arguments
from opencore_legacy_patcher.support import subprocess_wrapper
@@ -158,7 +158,7 @@ class GenerateApplication:
print("Embedding resources")
for file in Path("payloads/Icon/AppIcons").glob("*.icns"):
subprocess_wrapper.run_and_verify(
["/bin/cp", str(file), self._application_output / "Contents" / "Resources/"],
generate_copy_arguments(str(file), self._application_output / "Contents" / "Resources/"),
stdout=subprocess.PIPE, stderr=subprocess.PIPE
)

View File

@@ -78,6 +78,7 @@ class GenerateDiskImages:
'-format', 'UDZO', '-ov',
'-volname', 'OpenCore Patcher Resources (Base)',
'-fs', 'HFS+',
'-layout', 'NONE',
'-srcfolder', './payloads',
'-passphrase', 'password', '-encryption'
], stdout=subprocess.PIPE, stderr=subprocess.PIPE)

View File

@@ -2,9 +2,13 @@
package.py: Generate packages (Installer, Uninstaller, AutoPkg-Assets)
"""
import tempfile
import macos_pkg_builder
from opencore_legacy_patcher import constants
from .package_scripts import GenerateScripts
class GeneratePackage:
"""
@@ -63,48 +67,82 @@ class GeneratePackage:
return _welcome
def _generate_autopkg_welcome(self) -> str:
"""
Generate Welcome message for AutoPkg-Assets PKG
"""
_welcome = ""
_welcome += "# DO NOT RUN AUTOPKG-ASSETS MANUALLY!\n\n"
_welcome += "## THIS CAN BREAK YOUR SYSTEM'S INSTALL!\n\n"
_welcome += "This package should only ever be invoked by the Patcher itself, never downloaded or run by the user. Download the OpenCore-Patcher.pkg on the Github Repository.\n\n"
_welcome += f"[OpenCore Legacy Patcher GitHub Release]({constants.Constants().repo_link})"
return _welcome
def generate(self) -> None:
"""
Generate OpenCore-Patcher.pkg
"""
print("Generating OpenCore-Patcher-Uninstaller.pkg")
_tmp_uninstall = tempfile.NamedTemporaryFile(delete=False)
with open(_tmp_uninstall.name, "w") as f:
f.write(GenerateScripts().uninstall())
assert macos_pkg_builder.Packages(
pkg_output="./dist/OpenCore-Patcher-Uninstaller.pkg",
pkg_bundle_id="com.dortania.opencore-legacy-patcher-uninstaller",
pkg_version=constants.Constants().patcher_version,
pkg_background="./ci_tooling/installation_pkg/PkgBackgroundUninstaller.png",
pkg_preinstall_script="./ci_tooling/installation_pkg/uninstall.sh",
pkg_background="./ci_tooling/pkg_assets/PkgBackground-Uninstaller.png",
pkg_preinstall_script=_tmp_uninstall.name,
pkg_as_distribution=True,
pkg_title="OpenCore Legacy Patcher Uninstaller",
pkg_welcome=self._generate_uninstaller_welcome(),
).build() is True
print("Generating OpenCore-Patcher.pkg")
_tmp_pkg_preinstall = tempfile.NamedTemporaryFile(delete=False)
_tmp_pkg_postinstall = tempfile.NamedTemporaryFile(delete=False)
with open(_tmp_pkg_preinstall.name, "w") as f:
f.write(GenerateScripts().preinstall_pkg())
with open(_tmp_pkg_postinstall.name, "w") as f:
f.write(GenerateScripts().postinstall_pkg())
assert macos_pkg_builder.Packages(
pkg_output="./dist/OpenCore-Patcher.pkg",
pkg_bundle_id="com.dortania.opencore-legacy-patcher",
pkg_version=constants.Constants().patcher_version,
pkg_allow_relocation=False,
pkg_as_distribution=True,
pkg_background="./ci_tooling/installation_pkg/PkgBackground.png",
pkg_preinstall_script="./ci_tooling/installation_pkg/preinstall.sh",
pkg_postinstall_script="./ci_tooling/installation_pkg/postinstall.sh",
pkg_background="./ci_tooling/pkg_assets/PkgBackground-Installer.png",
pkg_preinstall_script=_tmp_pkg_preinstall.name,
pkg_postinstall_script=_tmp_pkg_postinstall.name,
pkg_file_structure=self._files,
pkg_title="OpenCore Legacy Patcher",
pkg_welcome=self._generate_installer_welcome(),
).build() is True
print("Generating AutoPkg-Assets.pkg")
_tmp_auto_pkg_preinstall = tempfile.NamedTemporaryFile(delete=False)
_tmp_auto_pkg_postinstall = tempfile.NamedTemporaryFile(delete=False)
with open(_tmp_auto_pkg_preinstall.name, "w") as f:
f.write(GenerateScripts().preinstall_autopkg())
with open(_tmp_auto_pkg_postinstall.name, "w") as f:
f.write(GenerateScripts().postinstall_autopkg())
assert macos_pkg_builder.Packages(
pkg_output="./dist/AutoPkg-Assets.pkg",
pkg_bundle_id="com.dortania.pkg.AutoPkg-Assets",
pkg_version=constants.Constants().patcher_version,
pkg_allow_relocation=False,
pkg_as_distribution=True,
pkg_background="./ci_tooling/autopkg/PkgBackground.png",
pkg_preinstall_script="./ci_tooling/autopkg/preinstall.sh",
pkg_postinstall_script="./ci_tooling/autopkg/postinstall.sh",
pkg_background="./ci_tooling/pkg_assets/PkgBackground-AutoPkg.png",
pkg_preinstall_script=_tmp_auto_pkg_preinstall.name,
pkg_postinstall_script=_tmp_auto_pkg_postinstall.name,
pkg_file_structure=self._autopkg_files,
pkg_title="AutoPkg Assets",
pkg_welcome="# DO NOT RUN AUTOPKG-ASSETS MANUALLY!\n\n## THIS CAN BREAK YOUR SYSTEM'S INSTALL!\n\nThis package should only ever be invoked by the Patcher itself, never downloaded or run by the user. Download the OpenCore-Patcher.pkg on the Github Repository.\n\n[OpenCore Legacy Patcher GitHub Release](https://github.com/dortania/OpenCore-Legacy-Patcher/releases/)",
pkg_welcome=self._generate_autopkg_welcome(),
).build() is True

View File

@@ -0,0 +1,556 @@
"""
package_scripts.py: Generate pre/postinstall scripts for PKG and AutoPkg
"""
class ZSHFunctions:
def __init__(self) -> None:
pass
def generate_standard_pkg_parameters(self) -> str:
"""
ZSH variables for standard PackageKit parameters
"""
_script = ""
_script += "# MARK: PackageKit Parameters\n"
_script += "# " + "-" * 27 + "\n\n"
_script += "pathToScript=$0 # ex. /tmp/PKInstallSandbox.*/Scripts/*/preinstall\n"
_script += "pathToPackage=$1 # ex. ~/Downloads/Installer.pkg\n"
_script += "pathToTargetLocation=$2 # ex. '/', '/Applications', etc (depends on pkgbuild's '--install-location' argument)\n"
_script += "pathToTargetVolume=$3 # ex. '/', '/Volumes/MyVolume', etc\n"
_script += "pathToStartupDisk=$4 # ex. '/'\n"
return _script
def generate_script_remove_file(self) -> str:
"""
ZSH function to remove files
"""
_script = ""
_script += "function _removeFile() {\n"
_script += " local file=$1\n\n"
_script += " if [[ ! -e $file ]]; then\n"
_script += " # Check if file is a symbolic link\n"
_script += " if [[ -L $file ]]; then\n"
_script += " echo \"Removing symbolic link: $file\"\n"
_script += " /bin/rm -f $file\n"
_script += " fi\n"
_script += " return\n"
_script += " fi\n\n"
_script += " echo \"Removing file: $file\"\n\n"
_script += " # Check if file is a directory\n"
_script += " if [[ -d $file ]]; then\n"
_script += " /bin/rm -rf $file\n"
_script += " else\n"
_script += " /bin/rm -f $file\n"
_script += " fi\n"
_script += "}\n"
return _script
def generate_script_create_parent_directory(self) -> str:
"""
ZSH function to create parent directory
"""
_script = ""
_script += "function _createParentDirectory() {\n"
_script += " local file=$1\n\n"
_script += " local parentDirectory=\"$(/usr/bin/dirname $file)\"\n\n"
_script += " # Check if parent directory exists\n"
_script += " if [[ ! -d $parentDirectory ]]; then\n"
_script += " echo \"Creating parent directory: $parentDirectory\"\n"
_script += " /bin/mkdir -p $parentDirectory\n"
_script += " fi\n"
_script += "}\n"
return _script
def generate_set_suid_bit(self) -> str:
"""
ZSH function to set SUID bit
"""
_script = ""
_script += "function _setSUIDBit() {\n"
_script += " local binaryPath=$1\n\n"
_script += " echo \"Setting SUID bit on: $binaryPath\"\n\n"
_script += " # Check if path is a directory\n"
_script += " if [[ -d $binaryPath ]]; then\n"
_script += " /bin/chmod -R +s $binaryPath\n"
_script += " else\n"
_script += " /bin/chmod +s $binaryPath\n"
_script += " fi\n"
_script += "}\n"
return _script
def generate_create_alias(self) -> str:
"""
ZSH function to create alias
"""
_script = ""
_script += "function _createAlias() {\n"
_script += " local mainPath=$1\n"
_script += " local aliasPath=$2\n\n"
_script += " # Check if alias path exists\n"
_script += " if [[ -e $aliasPath ]]; then\n"
_script += " # Check if alias path is a symbolic link\n"
_script += " if [[ -L $aliasPath ]]; then\n"
_script += " echo \"Removing old symbolic link: $aliasPath\"\n"
_script += " /bin/rm -f $aliasPath\n"
_script += " else\n"
_script += " echo \"Removing old file: $aliasPath\"\n"
_script += " /bin/rm -rf $aliasPath\n"
_script += " fi\n"
_script += " fi\n\n"
_script += " # Create symbolic link\n"
_script += " echo \"Creating symbolic link: $aliasPath\"\n"
_script += " /bin/ln -s $mainPath $aliasPath\n"
_script += "}\n"
return _script
def generate_start_patching(self) -> str:
"""
ZSH function to start patching
"""
_script = ""
_script += "function _startPatching() {\n"
_script += " local executable=$1\n"
_script += " local logPath=$(_logFile)\n\n"
_script += " # Start patching\n"
_script += " \"$executable\" \"--patch_sys_vol\" &> $logPath\n"
_script += "}\n"
return _script
def generate_log_file(self) -> str:
"""
ZSH function to generate log file
"""
_script = ""
_script += "function _logFile() {\n"
_script += " echo \"/Users/Shared/.OCLP-AutoPatcher-Log-$(/bin/date +\"%Y_%m_%d_%I_%M_%p\").txt\"\n"
_script += "}\n"
return _script
def generate_fix_settings_file_permission(self) -> str:
"""
ZSH function to fix settings file permission
"""
_script = ""
_script += "function _fixSettingsFilePermission() {\n"
_script += " local settingsPath=\"$pathToTargetVolume/Users/Shared/.com.dortania.opencore-legacy-patcher.plist\"\n\n"
_script += " if [[ -e $settingsPath ]]; then\n"
_script += " echo \"Fixing settings file permissions: $settingsPath\"\n"
_script += " /bin/chmod 666 $settingsPath\n"
_script += " fi\n"
_script += "}\n"
return _script
def generate_reboot(self) -> str:
"""
ZSH function to reboot
"""
_script = ""
_script += "function _reboot() {\n"
_script += " /sbin/reboot\n"
_script += "}\n"
return _script
def generate_prewarm_gatekeeper(self) -> str:
"""
ZSH function to prewarm Gatekeeper
"""
_script = ""
_script += "function _prewarmGatekeeper() {\n"
_script += " local appPath=$1\n\n"
_script += " # Check if /usr/bin/gktool exists\n"
_script += " if [[ ! -e /usr/bin/gktool ]]; then\n"
_script += " echo \"Host doesn't support Gatekeeper prewarming, skipping...\"\n"
_script += " return\n"
_script += " fi\n\n"
_script += " echo \"Prewarming Gatekeeper for application: $appPath\"\n"
_script += " /usr/bin/gktool scan $appPath\n"
_script += "}\n"
return _script
def generate_clean_launch_service(self) -> str:
"""
ZSH function to clean Launch Service
"""
_script = ""
_script += "function _cleanLaunchService() {\n"
_script += " local domain=\"com.dortania.opencore-legacy-patcher\"\n\n"
_script += " # Iterate over launch agents and daemons\n"
_script += " for launchServiceVariant in \"$pathToTargetVolume/Library/LaunchAgents\" \"$pathToTargetVolume/Library/LaunchDaemons\"; do\n"
_script += " # Check if directory exists\n"
_script += " if [[ ! -d $launchServiceVariant ]]; then\n"
_script += " continue\n"
_script += " fi\n\n"
_script += " # Iterate over launch service files\n"
_script += " for launchServiceFile in $(/bin/ls -1 $launchServiceVariant | /usr/bin/grep $domain); do\n"
_script += " local launchServicePath=\"$launchServiceVariant/$launchServiceFile\"\n\n"
_script += " # Remove launch service file\n"
_script += " _removeFile $launchServicePath\n"
_script += " done\n"
_script += " done\n"
_script += "}\n"
return _script
def generate_preinstall_main(self) -> str:
"""
ZSH function for preinstall's main
"""
_script = ""
_script += "function _main() {\n"
_script += " for file in $filesToRemove; do\n"
_script += " _removeFile $pathToTargetVolume/$file\n"
_script += " _createParentDirectory $pathToTargetVolume/$file\n"
_script += " done\n"
_script += "}\n"
return _script
def generate_postinstall_main(self, is_autopkg: bool = False) -> str:
"""
ZSH function for postinstall's main
"""
_script = ""
_script += "function _main() {\n"
_script += " _setSUIDBit \"$pathToTargetVolume/$helperPath\"\n"
_script += " _createAlias \"$pathToTargetVolume/$mainAppPath\" \"$pathToTargetVolume/$shimAppPath\"\n"
_script += " _prewarmGatekeeper \"$pathToTargetVolume/$mainAppPath\"\n"
if is_autopkg:
_script += " _startPatching \"$pathToTargetVolume/$executablePath\"\n"
_script += " _fixSettingsFilePermission\n"
_script += " _reboot\n"
_script += "}\n"
return _script
def generate_uninstall_main(self) -> str:
"""
ZSH function for uninstall's main
"""
_script = ""
_script += "function _main() {\n"
_script += " _cleanLaunchService\n"
_script += " for file in $filesToRemove; do\n"
_script += " _removeFile $pathToTargetVolume/$file\n"
_script += " done\n"
_script += "}\n"
return _script
class GenerateScripts:
def __init__(self):
self.zsh_functions = ZSHFunctions()
self.files = [
"Applications/OpenCore-Patcher.app",
"Library/Application Support/Dortania/Update.plist",
"Library/Application Support/Dortania/OpenCore-Patcher.app",
"Library/PrivilegedHelperTools/com.dortania.opencore-legacy-patcher.privileged-helper"
]
self.additional_auto_pkg_files = [
"Library/LaunchAgents/com.dortania.opencore-legacy-patcher.auto-patch.plist"
]
def __generate_shebang(self) -> str:
"""
Standard shebang for ZSH
"""
return "#!/bin/zsh --no-rcs\n"
def _generate_header_bar(self) -> str:
"""
# ------------------------------------------------------
"""
return "# " + "-" * 54 + "\n"
def _generate_label_bar(self) -> str:
"""
# ------------------------------
"""
return "# " + "-" * 27 + "\n"
def _generate_preinstall_script(self, is_autopkg: bool = False) -> str:
"""
Generate preinstall script for PKG
"""
_script = ""
_script += self.__generate_shebang()
_script += self._generate_header_bar()
_script += f"# {'AutoPkg Assets' if is_autopkg else 'OpenCore Legacy Patcher'} Preinstall Script\n"
_script += self._generate_header_bar()
_script += "# Remove old files, and prepare directories.\n"
_script += self._generate_header_bar()
_script += "\n\n"
_script += self.zsh_functions.generate_standard_pkg_parameters()
_script += "\n\n"
_script += "# MARK: Variables\n"
_script += self._generate_label_bar()
_script += "\n"
_files = self.files
if is_autopkg:
_files += self.additional_auto_pkg_files
_script += f"filesToRemove=(\n"
for _file in _files:
_script += f" \"{_file}\"\n"
_script += ")\n"
_script += "\n\n"
_script += "# MARK: Functions\n"
_script += self._generate_label_bar()
_script += "\n"
_script += self.zsh_functions.generate_script_remove_file()
_script += "\n"
_script += self.zsh_functions.generate_script_create_parent_directory()
_script += "\n"
_script += self.zsh_functions.generate_preinstall_main()
_script += "\n\n"
_script += "# MARK: Main\n"
_script += self._generate_label_bar()
_script += "\n"
_script += "echo \"Starting preinstall script...\"\n"
_script += "_main\n"
return _script
def _generate_postinstall_script(self, is_autopkg: bool = False) -> str:
"""
"""
_script = ""
_script += self.__generate_shebang()
_script += self._generate_header_bar()
_script += f"# {'AutoPkg Assets' if is_autopkg else 'OpenCore Legacy Patcher'} Post Install Script\n"
_script += self._generate_header_bar()
if is_autopkg:
_script += "# Set UID, create alias, start patching, and reboot.\n"
else:
_script += "# Set SUID bit on helper tool, and create app alias.\n"
_script += self._generate_header_bar()
_script += "\n\n"
_script += self.zsh_functions.generate_standard_pkg_parameters()
_script += "\n\n"
_script += "# MARK: Variables\n"
_script += self._generate_label_bar()
_script += "\n"
_script += "helperPath=\"Library/PrivilegedHelperTools/com.dortania.opencore-legacy-patcher.privileged-helper\"\n"
_script += "mainAppPath=\"Library/Application Support/Dortania/OpenCore-Patcher.app\"\n"
_script += "shimAppPath=\"Applications/OpenCore-Patcher.app\"\n"
if is_autopkg:
_script += "executablePath=\"$mainAppPath/Contents/MacOS/OpenCore-Patcher\"\n"
_script += "\n\n"
_script += "# MARK: Functions\n"
_script += self._generate_label_bar()
_script += "\n"
_script += self.zsh_functions.generate_set_suid_bit()
_script += "\n"
_script += self.zsh_functions.generate_create_alias()
_script += "\n"
_script += self.zsh_functions.generate_prewarm_gatekeeper()
_script += "\n"
if is_autopkg:
_script += self.zsh_functions.generate_start_patching()
_script += "\n"
_script += self.zsh_functions.generate_log_file()
_script += "\n"
_script += self.zsh_functions.generate_fix_settings_file_permission()
_script += "\n"
_script += self.zsh_functions.generate_reboot()
_script += "\n"
_script += self.zsh_functions.generate_postinstall_main(is_autopkg)
_script += "\n\n"
_script += "# MARK: Main\n"
_script += self._generate_label_bar()
_script += "\n"
_script += "echo \"Starting postinstall script...\"\n"
_script += "_main\n"
return _script
def _generate_uninstall_script(self) -> str:
"""
"""
_script = ""
_script += self.__generate_shebang()
_script += self._generate_header_bar()
_script += f"# OpenCore Legacy Patcher Uninstall Script\n"
_script += self._generate_header_bar()
_script += "# Remove OpenCore Legacy Patcher files and directories.\n"
_script += self._generate_header_bar()
_script += "\n\n"
_script += self.zsh_functions.generate_standard_pkg_parameters()
_script += "\n\n"
_script += "# MARK: Variables\n"
_script += self._generate_label_bar()
_script += "\n"
_files = self.files
_script += "filesToRemove=(\n"
for _file in _files:
_script += f" \"{_file}\"\n"
_script += ")\n"
_script += "\n\n"
_script += "# MARK: Functions\n"
_script += self._generate_label_bar()
_script += "\n"
_script += self.zsh_functions.generate_script_remove_file()
_script += "\n"
_script += self.zsh_functions.generate_clean_launch_service()
_script += "\n"
_script += self.zsh_functions.generate_uninstall_main()
_script += "\n\n"
_script += "# MARK: Main\n"
_script += self._generate_label_bar()
_script += "\n"
_script += "echo \"Starting uninstall script...\"\n"
_script += "_main\n"
return _script
def preinstall_pkg(self) -> str:
"""
Generate preinstall script for PKG
"""
return self._generate_preinstall_script()
def preinstall_autopkg(self) -> str:
"""
Generate preinstall script for AutoPkg
"""
return self._generate_preinstall_script(is_autopkg=True)
def postinstall_pkg(self) -> str:
"""
Generate postinstall script for PKG
"""
return self._generate_postinstall_script()
def postinstall_autopkg(self) -> str:
"""
Generate postinstall script for AutoPkg
"""
return self._generate_postinstall_script(is_autopkg=True)
def uninstall(self) -> str:
"""
Generate uninstall script
"""
return self._generate_uninstall_script()

View File

@@ -1,33 +0,0 @@
"""
shim.py: Generate Update Shim
"""
from pathlib import Path
from opencore_legacy_patcher.support import subprocess_wrapper
class GenerateShim:
def __init__(self) -> None:
self._shim_path = "./ci_tooling/update_shim/OpenCore-Patcher.app"
self._shim_pkg = f"{self._shim_path}/Contents/Resources/OpenCore-Patcher.pkg"
self._build_pkg = "./dist/OpenCore-Patcher.pkg"
self._output_shim = "./dist/OpenCore-Patcher (Shim).app"
def generate(self) -> None:
"""
Generate Update Shim
"""
print("Generating Update Shim")
if Path(self._shim_pkg).exists():
Path(self._shim_pkg).unlink()
subprocess_wrapper.run_and_verify(["/bin/cp", "-R", self._build_pkg, self._shim_pkg])
if Path(self._output_shim).exists():
Path(self._output_shim).unlink()
subprocess_wrapper.run_and_verify(["/bin/cp", "-R", self._shim_path, self._output_shim])

View File

@@ -1,74 +0,0 @@
#!/bin/zsh --no-rcs
# ------------------------------------------------------
# OpenCore Legacy Patcher PKG Post Install Script
# ------------------------------------------------------
# Set SUID bit on helper tool, and create app alias.
# ------------------------------------------------------
# MARK: PackageKit Parameters
# ---------------------------
pathToScript=$0 # ex. /tmp/PKInstallSandbox.*/Scripts/*/preinstall
pathToPackage=$1 # ex. ~/Downloads/Installer.pkg
pathToTargetLocation=$2 # ex. '/', '/Applications', etc (depends on pkgbuild's '--install-location' argument)
pathToTargetVolume=$3 # ex. '/', '/Volumes/MyVolume', etc
pathToStartupDisk=$4 # ex. '/'
# MARK: Variables
# ---------------------------
helperPath="Library/PrivilegedHelperTools/com.dortania.opencore-legacy-patcher.privileged-helper"
mainAppPath="Library/Application Support/Dortania/OpenCore-Patcher.app"
shimAppPath="Applications/OpenCore-Patcher.app"
# MARK: Functions
# ---------------------------
function _setSUIDBit() {
local binaryPath=$1
echo "Setting SUID bit on: $binaryPath"
# Check if path is a directory
if [[ -d $binaryPath ]]; then
/bin/chmod -R +s $binaryPath
else
/bin/chmod +s $binaryPath
fi
}
function _createAlias() {
local mainPath=$1
local aliasPath=$2
# Check if alias path exists
if [[ -e $aliasPath ]]; then
# Check if alias path is a symbolic link
if [[ -L $aliasPath ]]; then
echo "Removing old symbolic link: $aliasPath"
/bin/rm -f $aliasPath
else
echo "Removing old file: $aliasPath"
/bin/rm -rf $aliasPath
fi
fi
# Create symbolic link
echo "Creating symbolic link: $aliasPath"
/bin/ln -s $mainPath $aliasPath
}
function _main() {
_setSUIDBit "$pathToTargetVolume/$helperPath"
_createAlias "$pathToTargetVolume/$mainAppPath" "$pathToTargetVolume/$shimAppPath"
}
# MARK: Main
# ---------------------------
echo "Starting postinstall script..."
_main

View File

@@ -1,79 +0,0 @@
#!/bin/zsh --no-rcs
# ------------------------------------------------------
# OpenCore Legacy Patcher PKG Preinstall Script
# ------------------------------------------------------
# Remove old files, and prepare directories.
# ------------------------------------------------------
# MARK: PackageKit Parameters
# ---------------------------
pathToScript=$0 # ex. /tmp/PKInstallSandbox.*/Scripts/*/preinstall
pathToPackage=$1 # ex. ~/Downloads/Installer.pkg
pathToTargetLocation=$2 # ex. '/', '/Applications', etc (depends on pkgbuild's '--install-location' argument)
pathToTargetVolume=$3 # ex. '/', '/Volumes/MyVolume', etc
pathToStartupDisk=$4 # ex. '/'
# MARK: Variables
# ---------------------------
filesToRemove=(
"Applications/OpenCore-Patcher.app"
"Library/Application Support/Dortania/Update.plist"
"Library/Application Support/Dortania/OpenCore-Patcher.app"
"Library/PrivilegedHelperTools/com.dortania.opencore-legacy-patcher.privileged-helper"
)
# MARK: Functions
# ---------------------------
function _removeFile() {
local file=$1
if [[ ! -e $file ]]; then
# Check if file is a symbolic link
if [[ -L $file ]]; then
echo "Removing symbolic link: $file"
/bin/rm -f $file
fi
return
fi
echo "Removing file: $file"
# Check if file is a directory
if [[ -d $file ]]; then
/bin/rm -rf $file
else
/bin/rm -f $file
fi
}
function _createParentDirectory() {
local file=$1
local parentDirectory="$(/usr/bin/dirname $file)"
# Check if parent directory exists
if [[ ! -d $parentDirectory ]]; then
echo "Creating parent directory: $parentDirectory"
/bin/mkdir -p $parentDirectory
fi
}
function _main() {
for file in $filesToRemove; do
_removeFile $pathToTargetVolume/$file
_createParentDirectory $pathToTargetVolume/$file
done
}
# MARK: Main
# ---------------------------
echo "Starting preinstall script..."
_main

View File

@@ -1,85 +0,0 @@
#!/bin/zsh --no-rcs
# ------------------------------------------------------
# OpenCore Legacy Patcher PKG Uninstall Script
# ------------------------------------------------------
# MARK: PackageKit Parameters
# ---------------------------
pathToScript=$0 # ex. /tmp/PKInstallSandbox.*/Scripts/*/preinstall
pathToPackage=$1 # ex. ~/Downloads/Installer.pkg
pathToTargetLocation=$2 # ex. '/', '/Applications', etc (depends on pkgbuild's '--install-location' argument)
pathToTargetVolume=$3 # ex. '/', '/Volumes/MyVolume', etc
pathToStartupDisk=$4 # ex. '/'
# MARK: Variables
# ---------------------------
filesToRemove=(
"Applications/OpenCore-Patcher.app"
"Library/Application Support/Dortania/Update.plist"
"Library/Application Support/Dortania/OpenCore-Patcher.app"
"Library/PrivilegedHelperTools/com.dortania.opencore-legacy-patcher.privileged-helper"
)
# MARK: Functions
# ---------------------------
function _removeFile() {
local file=$1
if [[ ! -e $file ]]; then
# Check if file is a symbolic link
if [[ -L $file ]]; then
echo "Removing symbolic link: $file"
/bin/rm -f $file
fi
return
fi
echo "Removing file: $file"
# Check if file is a directory
if [[ -d $file ]]; then
/bin/rm -rf $file
else
/bin/rm -f $file
fi
}
function _cleanLaunchService() {
local domain="com.dortania.opencore-legacy-patcher"
# Iterate over launch agents and daemons
for launchServiceVariant in "$pathToTargetVolume/Library/LaunchAgents" "$pathToTargetVolume/Library/LaunchDaemons"; do
# Check if directory exists
if [[ ! -d $launchServiceVariant ]]; then
continue
fi
# Iterate over launch service files
for launchServiceFile in $(/bin/ls -1 $launchServiceVariant | /usr/bin/grep $domain); do
local launchServicePath="$launchServiceVariant/$launchServiceFile"
# Remove launch service file
_removeFile $launchServicePath
done
done
}
function _main() {
_cleanLaunchService
for file in $filesToRemove; do
_removeFile "$pathToTargetVolume/$file"
done
}
# MARK: Main
# ---------------------------
echo "Starting uninstall script..."
_main

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

Before

Width:  |  Height:  |  Size: 156 KiB

After

Width:  |  Height:  |  Size: 156 KiB

View File

Before

Width:  |  Height:  |  Size: 320 KiB

After

Width:  |  Height:  |  Size: 320 KiB

View File

Before

Width:  |  Height:  |  Size: 160 KiB

After

Width:  |  Height:  |  Size: 160 KiB

View File

@@ -1,30 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDisplayName</key>
<string>OpenCore-Patcher</string>
<key>CFBundleExecutable</key>
<string>OpenCore-Patcher</string>
<key>CFBundleIconFile</key>
<string>AppIcon.icns</string>
<key>CFBundleIdentifier</key>
<string>com.dortania.opencore-legacy-patcher</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>OpenCore Legacy Patcher</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>LSMinimumSystemVersion</key>
<string>10.10.0</string>
<key>NSHighResolutionCapable</key>
<true/>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2020-2024 Dortania</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<key>NSRequiresAquaSystemAppearance</key>
<false/>
</dict>
</plist>

View File

@@ -1,8 +0,0 @@
# OpenCore-Patcher Update Shim
To handle the new PKG installation method, old versions of OpenCore Legacy Patcher updating to newer versions will still require 'OpenCore-Patcher.app' to be available for download.
Thus the goal of this app is to install an embedded PKG under ./OpenCore-Patcher.app/Contents/Resources/OpenCore-Patcher.pkg to handle the update process.
Source is available at:
* https://github.com/dortania/OCLP-Helper

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,70 +67,65 @@ module.exports = {
collapsable: false,
sidebarDepth: 1,
children: [
'START',
'MODELS',
'START',
'MODELS',
'FAQ',
]
},
{
title: 'Setting up',
title: 'How to install',
collapsable: false,
sidebarDepth: 1,
children: [
'INSTALLER',
'BUILD',
'BUILD',
'BOOT',
'POST-INSTALL',
]
},
{
title: 'Installation',
title: 'macOS Support',
collapsable: false,
sidebarDepth: 1,
children: [
'BOOT',
'POST-INSTALL',
'SEQUOIA-DROP',
'SONOMA-DROP',
'VENTURA-DROP',
'MONTEREY-DROP',
]
},
{
title: 'macOS Sonoma',
{
title: 'Application',
collapsable: false,
sidebarDepth: 1,
children: [
['SONOMA-DROP', 'macOS Sonoma Support'],
'UPDATE',
'UNINSTALL',
'PROCESS',
]
},
{
title: 'macOS Ventura',
title: 'Troubleshooting',
collapsable: false,
sidebarDepth: 1,
children: [
['VENTURA-DROP', 'macOS Ventura Support'],
'TROUBLESHOOTING',
'ACCEL',
'DEBUG',
]
},
{
title: 'macOS Monterey',
collapsable: false,
sidebarDepth: 1,
children: [
['MONTEREY-DROP', 'macOS Monterey Support'],
]
},
},
{
title: 'Misc',
collapsable: false,
sidebarDepth: 1,
children: [
'ACCEL',
'TROUBLESHOOTING',
'DEBUG',
'UPDATE',
'UNINSTALL',
'ICNS',
'WINDOWS',
'UNIVERSALCONTROL',
'TIMEMACHINE',
'ICNS',
'WINDOWS',
'UNIVERSALCONTROL',
]
},
{
@@ -138,8 +133,8 @@ module.exports = {
collapsable: false,
sidebarDepth: 1,
children: [
'DONATE',
'LICENSE',
'DONATE',
'LICENSE',
]
},
@@ -148,21 +143,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

@@ -1,11 +1,11 @@
# Working Around Legacy Acceleration Issues
# Working Around Non-Metal Issues
* [Broken Background Blurs](#broken-background-blurs)
* [Downloading older non-Metal Apps](#downloading-older-non-metal-apps)
* [Unable to run Zoom](#unable-to-run-zoom)
* [Unable to grant special permissions to apps (ie. Camera Access to Zoom)](#unable-to-grant-special-permissions-to-apps-ie-camera-access-to-zoom)
* [Keyboard Backlight broken](#keyboard-backlight-broken)
* [Photos and Maps Apps Heavily Distorted](#photos-and-maps-apps-heavily-distorted)
* [Photos and Maps app issues](#photos-and-maps-app-issues)
* [Cannot press "Done" when editing a Sidebar Widget](#cannot-press-done-when-editing-a-sidebar-widget)
* [Wake from sleep heavily distorted on AMD/ATI from macOS 11.3 to Monterey](#wake-from-sleep-heavily-distorted-on-amd-ati-from-macos-11-3-to-monterey)
* [Unable to switch GPUs on 2011 15" and 17" MacBook Pros](#unable-to-switch-gpus-on-2011-15-and-17-macbook-pros)
@@ -46,7 +46,11 @@ Metal is Apple's in-house graphics API that acts as a replacement for OpenGL/Ope
By default with the non-Metal acceleration patches, many background blur menus may act distorted when moving a cursor over it. With 0.4.1 and newer, users can enable a new Beta Blur feature to try and resolve the issue:
![](./images/OCLP-GUI-Settings-Beta-Blur.png)
![]()
<div align="left">
<img src="./images/OCLP-GUI-Settings-Beta-Blur.png" alt="Beta Blur settings" width="600" />
</div>
Do note that enabling beta blurs can be more demanding on slower hardware
## Downloading older non-Metal Apps
@@ -101,10 +105,16 @@ $ sudo sqlite3 ~/Library/Application\ Support/com.apple.TCC/TCC.db "INSERT or RE
Due to forcing `hidd` into spinning up with the fallback mode enabled, this can break the OS's recognition of backlight keyboards. Thankfully the drivers themselves still do operate so applications such as [LabTick](https://www.macupdate.com/app/mac/22151/lab-tick) are able to set the brightness manually.
## Photos and Maps Apps Heavily Distorted
## Photos and Maps app issues
**Starting from macOS Monterey, Maps and everything relying on it (such as Find My or 'Places' in Photos) are non-functional on non-Metal due to Metal reliance.**
::: details For Big Sur (click to expand)
Due to the Metal Backend, the enhanced color output of these apps seems to heavily break overall UI usage. To work around this, [users reported](https://forums.macrumors.com/threads/macos-11-big-sur-on-unsupported-macs-thread.2242172/post-29870324) forcing the color output of their monitor from Billions to Millions of colors helped greatly. Apps easily allowing this customization are [SwitchResX](https://www.madrau.com), [ResXreme](https://macdownload.informer.com/resxtreme/) and [EasyRes](http://easyresapp.com).
:::
## Cannot press "Done" when editing a Sidebar Widget
Workaround: Press some combination of Tab, or Tab and then Shift-Tab, or just Shift-Tab until the "Done" button is highlighted. Then press spacebar to activate the button, the same as in any other dialog with a highlighted button halo.

View File

@@ -6,7 +6,10 @@ Reboot the machine while holding `Option` to select the EFI Boot entry with the
* This will be the Mac Boot Picker
![](./images/efi-boot.png)
<div align="left">
<img src="./images/efi-boot.png" alt="EFI boot" width="800" />
</div>
::: details Note for Mac Pros/Xserves/iMacs with unflashed GPUs
@@ -27,7 +30,10 @@ Now you'll want to get a list of drive identifiers. To do so, run the following
diskutil list
```
The command should produce a list of drives installed in your system:
![](./images/Unflashed-Boot-1.png)
<div align="left">
<img src="./images/Unflashed-Boot-1.png" alt="Unflashed boot" width="800" />
</div>
Keep track of the drive with the OCLP install. You will need the drive identifer for later.
@@ -37,7 +43,11 @@ Run the following command (Replace X with the drive number):
```sh
diskutil mount diskXs1
```
![](./images/Unflashed-Boot-2.png)
<div align="left">
<img src="./images/Unflashed-Boot-2.png" alt="Unflashed boot 2" width="800" />
</div>
If everything is correct, the EFI partion should be mounted.
Now you'll want to use the `bless` command to set the default boot device:
@@ -45,7 +55,10 @@ Now you'll want to use the `bless` command to set the default boot device:
bless --mount /Volumes/EFI --setBoot --file /Volumes/EFI/System/Library/CoreServices/boot.efi
```
Once the command is run, it should produce no output.
![](./images/Unflashed-Boot-3.png)
<div align="left">
<img src="./images/Unflashed-Boot-3.png" alt="Unflashed boot 3" width="800" />
</div>
If the command produces an output, ensure that you've typed it in correctly.
@@ -56,15 +69,40 @@ Now that you've loaded OpenCore, "select Install macOS":
* This will be the OpenCore Picker
![](./images/oc-boot.png)
<div align="left">
<img src="./images/oc-boot.png" alt="OpenCore boot" width="800" />
</div>
You will soon reach the installer screen! If you enabled verbose mode when building OCLP, a lot of text will run across the screen. From there, it's just like any normal macOS install. For an example of how the boot process looks, see the following video:
* [OpenCore Legacy Patcher Boot Process](https://www.youtube.com/watch?v=AN3zsbQV_n4)
If your Mac is looping back into the beginning of the setup after the first reboot, turn it off, start it again and hold `Option`. This time, select the option with a grey hard disk icon, it can say "macOS Installer" or the name you gave the disk during the installer process. Keep repeating this step after every reboot if necessary.
**Important:** If you're using a brand new disk that has not been used before, choose "View -> Show all devices" in Disk Utility and format the entire disk by choosing the topmost option in the sidebar to avoid a missing internal EFI later when trying to boot OpenCore to internal disk.
![](./images/oclp-stuck-firstreboot.png)
<div align="left">
<img src="./images/wipe-disk.png" alt="Wipe disk" width="800" />
</div>
::: warning Warning for T1 Macs
When installing macOS Sonoma or newer on a T1 system (2016-2017), full disk wipe will remove T1 functionality (touchbar etc). Therefore when installing, only wipe the volume containing the operating system.
<div align="left">
<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)
:::
If your Mac is looping back into the beginning of the setup after the first reboot, turn it off, start it again and hold Option. This time (after choosing `EFI Boot` first) select the option with a grey hard disk icon in the OpenCore picker. It can either say `macOS Installer` or the name you gave the disk during the installer process. Keep repeating this step after every reboot if necessary.
<div align="left">
<img src="./images/oclp-stuck-firstreboot.png" alt="Stuck on first reboot" width="800" />
</div>
::: warning
@@ -73,5 +111,6 @@ If your Mac is looping back into the beginning of the setup after the first rebo
:::
# Once installed and booting, head to [Post-Installation](./POST-INSTALL.md)

View File

@@ -6,20 +6,25 @@ 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="left">
<img src="./images/OCLP-GUI-Main-Menu.png" alt="OCLP GUI Main Menu" width="700" />
</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 |
| :--- | :--- |
| ![](./images/OCLP-GUI-Build-Start.png) | ![OCLP GUI Build Finished](./images/OCLP-GUI-Build-Finished.png) |
| <img src="./images/OCLP-GUI-Build-Start.png" alt="Build start" width="600" /> | <img src="./images/OCLP-GUI-Build-Finished.png" alt="Build finished" width="600" /> |
Once it finishes building, you'll want to select the Install OpenCore button:
@@ -28,6 +33,8 @@ Once it finishes building, you'll want to select the Install OpenCore button:
| Select Drive | Select Partition |
| :--- | :--- |
| ![](./images/OCLP-GUI-EFI-Select-Disk.png) | ![](./images/OCLP-GUI-EFI-Select-Partition.png) |
| <img src="./images/OCLP-GUI-EFI-Select-Disk.png" alt="Select disk" width="600" /> | <img src="./images/OCLP-GUI-EFI-Select-Partition.png" alt="Select partition" width="600" /> |
# Once finished, head to [Booting OpenCore and macOS](./BOOT.md)

View File

@@ -10,7 +10,10 @@ The easiest way to debug yourself is via Patcher Settings. Here there are many d
* "Enable OpenCore DEBUG"
* "Enable Kext DEBUG"
![](./images/ocdebugimage.png)
<div align="left">
<img src="./images/ocdebugimage.png" alt="OCLP debug" width="600" />
</div>
When you've enabled these 3 options, rebuild OpenCore and install to your drive. This will provide much greater debug information as well as write logs to the EFI Partition.
@@ -18,11 +21,15 @@ When you've enabled these 3 options, rebuild OpenCore and install to your drive.
With "Enable OpenCore DEBUG" set, on every boot there will be a .txt file generated on the EFI Partition. To grab these logs, [download and run MountEFI](https://github.com/corpnewt/MountEFI):
![](./images/mountefi.png)
<div align="left">
<img src="./images/mountefi.png" alt="Mount EFI" width="600" />
</div>
Once you've mounted the EFI Partition of the drive you have macOS on, you should see some nice logs:
![](./images/logs-efi.png)
<div align="left">
<img src="./images/logs-efi.png" alt="Mount EFI" width="800" />
</div>
## Obtaining Kernel logs from macOS

214
docs/FAQ.md Normal file
View File

@@ -0,0 +1,214 @@
# FAQ
* [Application requirements](#application-requirements)
* [Application versioning](#application-versioning)
* [How do I make sure I'm all up to date?](#how-do-i-make-sure-i-m-all-up-to-date)
* [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 use automatic updates?](#can-i-use-automatic-updates)
* [Why are macOS updates so large?](#why-are-macos-updates-so-large)
* [Can I update to macOS betas?](#can-i-update-to-macos-betas)
* [Can I downgrade macOS while keeping data?](#can-i-downgrade-macos-while-keeping-data)
* [Why is my system slow?](#why-is-my-system-slow)
* [Applications crashing with "illegal instruction"](#applications-crashing-with-illegal-instruction)
* [What is Metal and non-Metal?](#what-is-metal-and-non-metal)
* [What are FeatureUnlock and mediaanalysisd?](#what-are-featureunlock-and-mediaanalysisd)
* [Why isn't iPhone Mirroring working?](#why-isn-t-iphone-mirroring-working)
* [Where is Apple Intelligence?](#where-is-apple-intelligence)
## Application requirements
The patcher application requires **OS X Yosemite 10.10** or later to run.
* **El Capitan 10.11** or later is required to make installers for macOS Ventura
* **High Sierra 10.13** or later is required to make installers for macOS Sonoma and newer.
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.
## Application versioning
Since 1.0.0, OCLP adheres to a proper versioning scheme with major, minor and bug fix system ([Semantic Versioning](https://semver.org/)).
- First digit: Major changes, including new OS support, API changes, and significant patch set changes, etc
- Second digit: Minor changes, including incoming OS update fixes, minor patch set changes, etc
- Third digit: Bug fixes, primarily hot fixes either due to a regression in prior release or resolving issues in already released OS updates
## How do I make sure I'm all up to date?
Updating the OCLP installation is a three step process, first the application, second the bootloader and finally root patches.
Refer to [Updating OpenCore and patches](https://dortania.github.io/OpenCore-Legacy-Patcher/UPDATE.html) for how to update the application and patches.
## Why are the settings "not saving"?
Starting with OpenCore Legacy Patcher 2.1.0, the status of settings in the GUI will now be saved under ```/Users/Shared/.com.dortania.opencore-legacy-patcher.plist```. The application will utilize this file to keep track of and retain settings for relaunches and application updates, no longer requiring a reconfiguring each time. The user interface will reset if any model other than "Host Model" is selected, as building for a different model will require different settings.
In case of issues, delete the file and restart the application to revert the GUI to default settings, then rebuild OpenCore with newly configured settings.
::: warning
Only settings made within OCLP are accounted for, modifications made directly into the ```config.plist``` file in the EFI partition outside of OCLP **will continue to reset**. Additionally, modifying ```config.plist``` manually may lead to a state where settings showed in the GUI are not in sync compared to settings in use, due to the application not knowing whether the file has been manually modified.
:::
::: details Explainer for older versions (click to expand)
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 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. Updates are now getting staged during the download process and are already modifying the system volume, which can lead to broken system out of nowhere since the operating system gets into a liminal state between two versions. You can still manually initiate an update when you're ready to do so.
For a related "System version mismatch" error while root patching and more information, 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.
* Note: macOS Sequoia has begun prompting to enable automatic updates from 15.4 onward after an update install has finished and isn't giving a choice to fully decline, this means you may have to keep doing it again after updating to newer versions.
::: details How to disable updates (click to expand)
**macOS Ventura and newer:**
System Settings -> General -> Software Update -> (i) button next to Automatic Updates -> Disable "Download new updates when available".
**macOS Big Sur and Monterey:**
System Preferences -> Software Update -> Advanced -> Disable "Download new updates when available".
:::
## Why are macOS updates so large?
macOS by default uses a sealed system volume that is unwritable. When the seal is broken, macOS thinks the volume is broken and downloads a full copy of macOS for every update to "repair" it to a known state. In order for root patching to work, this seal has to be broken since root patching by design requires on-disk file manipulation. This is also why root patches have to be reinstalled after each update.
## Can I update to macOS betas?
OCLP patch development and testing happens at the beta phase in order to target a stable release, as such it is impossible for OCLP to support betas properly and previous versions may be incompatible. Only install a beta if you know what you're doing, have your expectations in check and don't mind having to fully reset to recover your system.
Be advised that no help will be given in situations where a beta was installed.
## Can I downgrade macOS while keeping data?
macOS doesn't allow direct downgrades, as such you will have to wipe the disk in order to revert. Backup your data beforehand either via Time Machine, ASR or some other solution.
## Why is my system slow?
This can mean many things. Firstly, newer operating systems are harder to run and can appear more slow.
Additionally if your macOS installation is recent, Spotlight starts creating a full disk index which can cause high CPU load, high temps and general slowness. It's recommended to keep the system running for few hours, once Spotlight has indexed the load will ease. A way to check whether it's caused by Spotlight is to open Activity Monitor, choosing "All Processes" from the "View" menu item, then sorting by the CPU value to see if a process called ```mds_stores``` is using a lot of CPU resources.
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.
## Applications crashing with "illegal instruction"
If the crash log includes a string saying "illegal instruction", this typically means the application requires AVX or AVX2 CPU instructions.
Since macOS Ventura, AVX2 is required from all Macs supported by it. While OCLP is able to patch macOS to boot without it, many applications are beginning to utilize AVX and AVX2 as well in newer versions because all supported Macs are expected to have them. This creates an issue for older systems where some applications cannot be ran on CPUs lacking such instructions. Some older Macs may need older versions of applications and cannot update to newer versions. AVX was introduced in Sandy Bridge CPU generation and AVX2 in Haswell generation.
In essence, this means that some models are now aging rapidly and newer OS won't always provide support for newer applications because of hardware requirements. If an application still supports macOS versions older than Ventura, it may have a chance of running on an older OS version on the old system, since some Macs running them natively don't support AVX2 and the app takes a different path.
::: details Earliest Mac models supporting AVX instruction (click to expand)
- Macmini5,x (2011)
- iMac12,x (2011)
- MacBookPro8,x (2011)
- MacBookAir4,x (2011)
- MacBook8,x (2015)
- MacPro6,1 (2013)
:::
::: details Earliest Mac models supporting AVX2 instruction (click to expand)
- Macmini7,x (2014)
- iMac14,x (2013)
- MacBookPro11,x (2013)
- MacBookAir6,x (2013)
- MacBook8,x (2015)
- MacPro7,1 (2019)
:::
## What is Metal and Non-Metal?
Metal is Apple's proprietary graphics API which fully superseded OpenGL rendering of the operating system starting from macOS Mojave. When the word "Non-Metal" is used, it describes GPUs that are not Metal supported and require using OpenGL instead. Due to deprecation of OpenGL, many newer applications may require Metal rendering and as such will fail to run on systems with Non-Metal GPUs. Some built-in apps like Maps and everything relying on it (such as Find My) will fail to render as well on versions later than Big Sur.
A great rule of thumb is that Macs older than 2012 are non-Metal, with the exception of systems having upgradable GPUs.
::: details Metal supported GPUs (click to expand)
* Intel HD 4000 series (Ivy Bridge/3rd gen) and newer
* AMD HD 7000 series (GCN 1) and newer
* NVIDIA GTX 600 and 700 series (Kepler)
Everything older than mentioned are Non-Metal and therefore only support OpenGL. Non-Metal also includes NVIDIA Maxwell (GTX 900 series) and Pascal (GTX 1000 series) when used with patched Web Drivers on newer than macOS High Sierra.
:::
Refer to [Supported models,](https://dortania.github.io/OpenCore-Legacy-Patcher/MODELS.html) the [Non-Metal GitHub issue](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108) and [Working Around Non-Metal Issues](https://dortania.github.io/OpenCore-Legacy-Patcher/ACCEL.html) pages for more information.
## What are FeatureUnlock and mediaanalysisd?
**Important:** These features have the potential to cause instability in many places and as such a decision has been made to disable them by default (mediaanalysisd only on 3802-based* systems) starting from OpenCore Legacy Patcher version 2.1.0. If you want to enable these features at the risk of additional instability, you can do so in the OCLP settings and rebuilding OpenCore.
FeatureUnlock may also have issues functioning with some OS versions and systems due to race condition during system bootup. If this happens to you, try rebooting multiple times or different (older) OS versions to see if it will remedy the issue.
FeatureUnlock is an extension to enable some macOS features, including:
- Sidecar
- Universal Control
- AirPlay to Mac
- Continuity Camera
- NightShift (non-Metal)
Further information, requirements and the models affected for FeatureUnlock features can be found [here](https://github.com/acidanthera/FeatureUnlock).
Medianalysisd is utilized for
- Face detection in Photos
- Live Text
| FeatureUnlock | mediaanalysisd |
| :--- | :--- |
| ![FeatureUnlock](./images/OCLP_FeatureUnlock_Setting.png) | ![mediaanalysisd](./images/OCLP_Disable_mediaanalysisd_Setting.png) |
::: details *3802 systems list (click to expand)
* 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

@@ -1,51 +1,44 @@
# Download and build macOS Installers
# Creating macOS Installers
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.
This document is centered around downloading and writing the macOS installer to a USB drive. If you're planning to install macOS on other system than you're currently running, it is recommended to choose the Mac model in Settings now before proceeding, so that automatic root patching works correctly later on.
* 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
Before proceeding, please read the application and macOS installer creation requirements [from the FAQ.](https://dortania.github.io/OpenCore-Legacy-Patcher/FAQ.html#application-requirements) Newer macOS versions require you to be on a newer base OS before you can create an installer, due to requirements of Apple's `createinstallmedia` tool OCLP uses as its backbone.
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:
## Downloading the installer
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:
## Creating the installer
| 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
| Select Downloaded Installer | Select disk to format |
| :--- | :--- |
| ![](./images/OCLP-GUI-Installer-Select-Local-Installer.png) | ![](./images/OCLP-GUI-Installer-Format-USB.png) |
| <img src="./images/OCLP-GUI-Installer-Select-Local-Installer.png" alt="Select local installer" width="600" /> | <img src="./images/OCLP-GUI-Installer-Format-USB.png" alt="Select disk to format" width="600" /> |
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

@@ -1,9 +1,18 @@
# Supported Models
Any Intel-based Mac listed below can install and make use of OpenCore Legacy Patcher. To check your hardware model, open System Information and look for the `Model Identifier` key.
* This applies even if Apple supports the model natively.
* OpenCore Legacy Patcher does not support PowerPC- or Apple Silicon-based Macs.
* If your model is not listed below, it is not supported by this patcher.
::: warning Note
It is **extremely recommended** to update your Mac to its latest native version before using OpenCore Legacy Patcher, to ensure you're on the highest firmware.
:::
::: warning 3GB+ RAM required for macOS Sonoma 14.5+ installers and macOS Sequoia
Models with 2GB RAM will not be able to install macOS Sonoma 14.5+ and macOS Sequoia will be unable to boot. macOS Sonoma 14.5+ may be installed using a disk swap method where installation is done on another system but your mileage may vary and this is not recommended.
:::
The below tables can be used to reference issues with a particular model, and see which OS would work best on your machine.
* [MacBook](#macbook)
* [MacBook Air](#macbook-air)
@@ -13,18 +22,10 @@ The below tables can be used to reference issues with a particular model, and se
* [Mac Pro](#mac-pro)
* [Xserve](#xserve)
::: details OpenCore Patcher application
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**.
* Other versions may work, albeit in a broken state. No support is provided for any version outside of the above.
:::
### MacBook
| Model Name | Identifier | Tagged Issues |
| Model Name | Identifier | Additional info |
| :--- | :--- | :--- |
| MacBook (13-inch, Aluminum, Late 2008) | `MacBook5,1` | - [non-Metal GPU (macOS 11+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108)<br>- [USB 1.1 (macOS 13+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1021)|
| MacBook (13-inch, Early 2009)<br>MacBook (13-inch, Mid 2009) | `MacBook5,2` | - [non-Metal GPU (macOS 11+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108)<br>- [USB 1.1 (macOS 13+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1021)<br>- Trackpad gestures are partially broken |
@@ -32,11 +33,11 @@ The patcher is designed to target **macOS Big Sur 11.x to macOS Sonoma 14.x**.
| MacBook (13-inch, Mid 2010) | `MacBook7,1` | ^^ |
| MacBook (Retina, 12-inch, Early 2015) | `MacBook8,1` | - [Legacy Metal (macOS 13+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1008) |
| MacBook (Retina, 12-inch, Early 2016) | `MacBook9,1` | ^^ |
| MacBook (Retina, 12-inch, 2017) | `MacBook10,1` | - Supported by OpenCore Legacy Patcher |
| MacBook (Retina, 12-inch, 2017) | `MacBook10,1` | - Native graphics support |
### MacBook Air
| Model Name | Identifier | Tagged Issues |
| Model Name | Identifier | Additional info |
| :--- | :--- | :--- |
| MacBook Air (13-inch, Late 2008)<br>MacBook Air (13-inch, Mid 2009) | `MacBookAir2,1` | - [non-Metal GPU (macOS 11+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108)<br>- [USB 1.1 (macOS 13+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1021)|
| MacBook Air (11-inch, Late 2010) | `MacBookAir3,1` | ^^ |
@@ -49,13 +50,13 @@ The patcher is designed to target **macOS Big Sur 11.x to macOS Sonoma 14.x**.
| 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, 2019) | `MacBookAir9,1` | ^^ |
| MacBook Air (Retina, 13-inch, 2020) | `MacBookAir10,1` | ^^ |
| MacBook Air (Retina, 13-inch, 2018) | `MacBookAir8,1` | - Supported natively up to Sonoma<br>- [Currently not supported with OpenCore due to T2 issues](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1136)<br> |
| MacBook Air (Retina, 13-inch, 2019) | `MacBookAir8,2` | ^^ |
| MacBook Air (Retina, 13-inch, 2020) | `MacBookAir9,1` | Supported by Apple |
### MacBook Pro
| Model Name | Identifier | Tagged Issues |
| Model Name | Identifier | Additional info |
| :--- | :--- | :--- |
| MacBook Pro (15-inch, Early 2008)<br>MacBook Pro (17-inch, Early 2008) | `MacBookPro4,1` | - [non-Metal GPU (macOS 11+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108)<br>- [USB 1.1 (macOS 13+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1021)|
| MacBook Pro (15-inch, Late 2008)<br>MacBook Pro (15-inch, Early 2009) | `MacBookPro5,1` | ^^ |
@@ -79,7 +80,7 @@ The patcher is designed to target **macOS Big Sur 11.x to macOS Sonoma 14.x**.
| MacBook Pro (13-inch, 2016, 2 Thunderbolt 3 ports) | `MacBookPro13,1` | ^^ |
| MacBook Pro (13-inch, 2016, 4 Thunderbolt 3 ports) | `MacBookPro13,2` | ^^ |
| MacBook Pro (15-inch, 2016) | `MacBookPro13,3` | ^^ |
| MacBook Pro (13-inch, 2017, 2 Thunderbolt 3 ports) | `MacBookPro14,1` | - Supported by OpenCore Legacy Patcher |
| MacBook Pro (13-inch, 2017, 2 Thunderbolt 3 ports) | `MacBookPro14,1` | - Native graphics support |
| MacBook Pro (13-inch, 2017, 4 Thunderbolt 3 ports) | `MacBookPro14,2` | ^^ |
| MacBook Pro (15-inch, 2017) | `MacBookPro14,3` | - [Legacy Metal (macOS 14+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1008) |
| MacBook Pro (13-inch, 2018, 4 Thunderbolt 3 ports)<br>MacBook Pro (13-inch, 2019, 4 Thunderbolt 3 ports) | `MacBookPro15,2` | - Supported by Apple |
@@ -91,7 +92,7 @@ The patcher is designed to target **macOS Big Sur 11.x to macOS Sonoma 14.x**.
### Mac mini
| Model Name | Identifier | Tagged Issues |
| Model Name | Identifier | Additional info |
| :--- | :--- | :--- |
| Mac mini (Early 2009) | `Macmini3,1` | - [non-Metal GPU (macOS 11+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108)<br>- [USB 1.1 (macOS 13+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1021) |
| Mac mini (Mid 2010) | `Macmini4,1` | ^^ |
@@ -101,7 +102,7 @@ The patcher is designed to target **macOS Big Sur 11.x to macOS Sonoma 14.x**.
| Mac mini (Late 2018) | `Macmini8,1` | - Supported by Apple |
### iMac
| Model Name | Identifier | Tagged Issues |
| Model Name | Identifier | Additional info |
| :--- | :--- | :--- |
| iMac (20-inch, Mid 2007)<br>iMac (24-inch, Mid 2007) | `iMac7,1` | - [Requires SSE4.1 CPU](https://lowendmac.com/2018/penryn-t9300-9500-cpu-upgrades-for-the-2007-imac/)<br>- [non-Metal GPU (macOS 11+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108)<br>- [USB 1.1 (macOS 13+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1021)<br>- Remove stock Bluetooth to prevent panics |
| iMac (20-inch, Early 2008)<br>iMac (24-inch, Early 2008) | `iMac8,1` | - [non-Metal GPU (macOS 11+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108)<br>- [USB 1.1 (macOS 13+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1021) |
@@ -122,7 +123,7 @@ The patcher is designed to target **macOS Big Sur 11.x to macOS Sonoma 14.x**.
| iMac (21.5-inch, Late 2015) | `iMac16,1` | ^^ |
| iMac (Retina 4K, 21.5-inch, Late 2015) | `iMac16,2` | ^^ |
| iMac (Retina 5K, 27-inch, Late 2015) | `iMac17,1` | ^^ |
| iMac (21.5-inch, 2017) | `iMac18,1` | - Supported by OpenCore Legacy Patcher |
| iMac (21.5-inch, 2017) | `iMac18,1` | - Native graphics support |
| iMac (Retina 4K, 21.5-inch, 2017) | `iMac18,2` | ^^ |
| iMac (Retina 5K, 27-inch, 2017) | `iMac18,3` | ^^ |
| iMac (Retina 5K, 27-inch, 2019) | `iMac19,1` | - Supported by Apple |
@@ -132,7 +133,7 @@ The patcher is designed to target **macOS Big Sur 11.x to macOS Sonoma 14.x**.
### Mac Pro
| Model Name | Identifier | Tagged Issues |
| Model Name | Identifier | Additional info |
| :--- | :--- | :--- |
| Mac Pro (Early 2008) | `MacPro3,1` | - [Recommend upgrade to Metal GPU](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1008)<br>- [non-Metal GPU (macOS 11+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108)<br>- [USB 1.1 (macOS 13+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1021)<br>- Remove stock Bluetooth to prevent panics |
| Mac Pro (Early 2009) | `MacPro4,1` | - [Recommend upgrade to Metal GPU](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1008)<br>- [non-Metal GPU (macOS 11+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108)<br>- [USB 1.1 (macOS 13+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1021) |
@@ -142,7 +143,7 @@ The patcher is designed to target **macOS Big Sur 11.x to macOS Sonoma 14.x**.
### Xserve
| Model Name | Identifier | Tagged Issues |
| Model Name | Identifier | Additional info |
| :--- | :--- | :--- |
| Xserve (Early 2008) | `Xserve2,1` | - Recommend upgrade to Metal GPU<br>- [non-Metal GPU (macOS 11+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/108)<br>- [USB 1.1 (macOS 13+)](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1021)
| Xserve (Early 2009) | `Xserve3,1` | ^^ |

View File

@@ -1,3 +1,5 @@
# macOS Monterey
![](./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

@@ -2,6 +2,7 @@
* [Booting without USB drive](#booting-without-usb-drive)
* [Booting seamlessly without Boot Picker](#booting-seamlessly-without-boot-picker)
* [SIP settings](#sip-settings)
* [Applying Post Install Volume Patches](#applying-post-install-volume-patches)
## Booting without USB drive
@@ -16,64 +17,123 @@ Once you've installed macOS through OpenCore, you can boot up and go through the
And voila! No more USB drive required.
If you're having issues with undetected internal disk, refer to [Internal disk missing when building OpenCore](https://dortania.github.io/OpenCore-Legacy-Patcher/TROUBLESHOOTING.html#internal-disk-missing-when-building-opencore) for troubleshooting.
## Booting seamlessly without Boot Picker
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="left">
<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.
## Enabling SIP
## SIP settings
For many users, SIP will be lowered by default on build. For Intel HD 4000 users, you may have noticed that SIP is partially disabled. This is to ensure full compatibility with macOS Monterey and allow seamless booting between it and older OSes. However for users who do not plan to boot Monterey, you can re-enable under Patcher Settings.
SIP, or System Integrity Protection, needs to be lowered on systems where root patching is required to patch data on disk. This will vary between OS versions and the model in question.
Note: Machines running macOS Ventura or systems with non-Metal GPUs cannot enable SIP outright, due to having a patched root volume. Enabling it will brick the installation.
Going forward with 0.6.6, SIP settings can be accessed from the Security tab shown in the images.
| SIP Enabled | SIP Lowered (Root Patching) | SIP Disabled |
| :--- | :--- | :--- |
| ![](./images/OCLP-GUI-Settings-SIP-Enabled.png) | ![](./images/OCLP-GUI-Settings-SIP-Root-Patch.png) | ![](./images/OCLP-GUI-Settings-SIP-Disabled.png) |
OCLP by default will determine the proper SIP options for the OS version and Mac model, in most cases the user has no need to touch these settings.
:::warning
If you're unsure whether you should enable SIP, leave it as-is. Systems where you have already ran the Post Install Root Patching cannot enable SIP without potentially breaking the current install.
If you're unsure whether you should change the SIP settings, leave them as-is. Systems where you have already ran the Post Install Root Patching cannot enable SIP without potentially breaking the current install.
:::
| SIP Enabled | SIP Lowered (OCLP default) | SIP Disabled |
| :--- | :--- | :--- |
| ![](./images/OCLP-GUI-Settings-SIP-Enabled.png) | ![](./images/OCLP-GUI-Settings-SIP-Root-Patch.png) | ![](./images/OCLP-GUI-Settings-SIP-Disabled.png) |
The guide in the dropdown below explains how the SIP settings work in OCLP, where lowered SIP is needed and where full SIP could be enabled.
::: details Configuring SIP manually (click to expand)
SIP settings can be accessed from the Security tab shown in the images. To change SIP settings, make the changes here, return in main menu and rebuild OpenCore using the first option.
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**
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", 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**
All Metal capable systems from 2012 onward (incl. NVIDIA Kepler and Intel HD 4000) as well as Mac Pros with upgraded GPU can run with full SIP enabled.
Non-Metal systems still require lowered SIP.
:::
## Applying Post Install Volume Patches
Post Install Volume Patches, sometimes also called root patches, are patches that have to be installed to disk for some older Macs to gain back functionality.
These patches include things such as:
- Graphics drivers
- WiFi drivers
- Bluetooth drivers
- Touchbar / T1 drivers
- Built-in camera (iSight) drivers
- USB 1.1 drivers
- Other patches for compatibility with older drivers
OCLP will automatically root patch your system during a first time install **if the USB install media was created within OCLP and the proper model was selected before installer creation.** Users will also be prompted to install these patches after macOS updates or whenever patches are not detected on the system. We recommend rebuilding OpenCore with the latest version of OCLP to take advantage of these new features.
Users can also see whether applicable patches have been installed, date and version the system was root patched with in the Post-Install Menu.
- **Note:** In some cases OCLP may require packages to be obtained from the internet, such as KDK or MetallibSupprtPkg if they do not already exist on the system. In these cases OCLP may only install the WiFi driver on first patch run to ensure you can connect to the internet, which means no graphics acceleration
after reboot. Root patching has to be ran again manually to install the rest of the required patches after internet connection is established to obtain the required packages.
Check the affected systems and GPUs from the warnings below.
:::warning
If you need to use Migration Assistant to bring over data to your new macOS install, it is **highly recommended** to avoid restoring from inside Setup Assistant and waiting to install root patches until after the transfer is complete. If root patches were automatically installed, you can use the options available in the OCLP app to remove them.
Using Migration Assistant while patches are installed can lead to an unbootable system, requiring a reinstall of macOS.
For more information on how to restore a Time Machine backup, [refer to the guide here.](https://dortania.github.io/OpenCore-Legacy-Patcher/TIMEMACHINE.html)
:::
Post Install Volume Patches, sometimes also called root patches, are patches that have to be installed to disk for some older Macs to gain back functionality.
OCLP will automatically root patch your system during a first time install **if the USB install media was created within OCLP.** Users will also be prompted to install these patches after macOS updates or whenever patches are not detected on the system. We recommend rebuilding OpenCore with the latest version of OCLP to take advantage of these new features.
Users can also see whether applicable patches have been installed, date and version the system was root patched with in the Post-Install Menu.
| Automatic install prompt | Status |
| :--- | :--- |
| ![](./images/OCLP-GUI-root-patch-update.png) | ![](./images/OCLP-GUI-Root-Patch-Status.png) |
### Running Post Install patches manually
If you're using OCLP v0.4.3 or earlier, or need to run the patcher manually, you can do so with the app. There is no harm in trying to run the Patcher, as without compatible hardware, nothing will be done. You can see below on whether your hardware needs root volume patching or not.
There is also an option to remove root patches, which may be required in some situations, such as switching GPUs in Mac Pros or using Migration Assistant.
You can install and revert Root Patching manually from the app.
| Listing Patches | Patching Finished |
| :--- | :--- |
| ![](./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-based systems. OCLP will handle this as long as you're connected to the internet.
3802 based GPUs:
* 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:
@@ -91,19 +151,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)
@@ -115,6 +218,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
@@ -125,18 +239,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)
:::

19
docs/PROCESS.md Normal file
View File

@@ -0,0 +1,19 @@
# Background process
OpenCore Legacy Patcher utilizes a background process to:
- Check for mismatched configurations and warn the user (e.g. installed MacBookPro11,1 config on MacBookPro11,5)
- Monitor the status of installed Root Patches and OpenCore
- Ask you to install Root Patches in case they aren't detected (typically after an update)
- Check whether OpenCore is being booted from USB drive or internal drive
- Ask you to install OpenCore on the internal disk in case booted from USB
- React to upcoming updates requiring a new KDK to be downloaded, starting KDK download automatically
It is recommended to keep the background process enabled for smoothest functionality. e.g. to try and avoid failed patching when new KDK is not found.
If you decide to disable the background process, the KDK installation for each update has to be done manually. OCLP is also unable to detect Root Patches on boot, meaning manually opening the app and root patching is required.
::: warning Note:
In some cases macOS may report background process being added by "Mykola Grymalyuk", this happens due to a macOS bug where sometimes the developer name who sent the app for notarization is shown instead of the application name.
Dortania cannot do anything about this.
:::

View File

@@ -12,8 +12,8 @@ meta:
features:
# - title: Built with security in mind
# details: Supporting System Integrity Protection(SIP), FileVault 2, .im4m Secure Boot and Vaulting. We make an effort to ensure your system is as secure as possible.
- title: Native OTA updates
details: Install updates the moment they come out, with native System Preferences support, just like a supported Mac.
- title: Near-native OTA updates.
details: Install updates from System Settings, with just couple more additional steps compared to native.
- title: Zero firmware patching
details: Using the capabilities of the OpenCore boot manager, our protocol upgrades are done in memory and are never permanent.
- title: Supporting more hardware
@@ -22,5 +22,5 @@ features:
details: Unlock Sidecar, AirPlay to Mac, Night Shift, and Universal Control, even on natively supported models!
- title: A helpful community
details: Whether it's getting started or learning the specifics, you can always find answers with our amazing community of tinkerers, developers, and dreamers.
footer: Copyright © Dortania 2020-2024
---
footer: Copyright © Dortania 2020-2025
---

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

@@ -0,0 +1,88 @@
# macOS Sequoia
![](./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
Refer to [the troubleshooting page](https://dortania.github.io/OpenCore-Legacy-Patcher/TROUBLESHOOTING.html#keyboard-mouse-and-trackpad-not-working-in-installer-or-after-update) on how to workaround this issue.
### 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,18 +1,11 @@
# macOS Sonoma
![](./images/sonoma.png)
*Well here we are again, it's always such a pleasure~*
Apple has yet again dropped a bunch of models, continuing their journey on discontinuing Intel Macs. With the release of OpenCore Legacy Patcher 1.0.0, early support for macOS Sonoma has been implemented.
## Versioning
With 1.0.0, we'll be switching to a proper major, minor and bug fix system ([Semantic Versioning](https://semver.org/)). This means the coming release will be version 1.0.0, and future releases plan to follow this scheme:
- First digit: Major changes, including new OS support, API changes, and significant patch set changes, etc
- Second digit: Minor changes, including incoming OS update fixes, minor patch set changes, etc
- Third digit: Bug fixes, primarily hot fixes either due to a regression in prior release or resolving issues in already released OS updates
## Newly dropped hardware
* MacBook10,1: MacBook (Retina, 12-inch, 2017)
@@ -31,7 +24,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)
@@ -69,21 +62,7 @@ While USB 1.1 may seem unimportant, it handles many important devices on your sy
* IR Receivers
* Bluetooth
With OpenCore Legacy Patcher v0.6.0+, basic support has been implemented via Root Volume patching. However due to this, users will need to use a USB hub for installation and post-OS updates when patches are cleaned:
![](./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)
Refer to [the troubleshooting page](https://dortania.github.io/OpenCore-Legacy-Patcher/TROUBLESHOOTING.html#keyboard-mouse-and-trackpad-not-working-in-installer-or-after-update) on how to workaround this issue.
### Graphics support and issues
This build includes both Legacy Metal and non-Metal patches for macOS Sonoma. Refer to the following links for more information about Legacy Metal and non-Metal support and their respective issues.

View File

@@ -7,8 +7,6 @@ OpenCore is a sophisticated boot loader used to inject and patch data in memory,
## How do I get started?
1. The first step of ensuring whether your model is supported is by checking the [Supported Models](./MODELS.md) page.
2. [Download and build macOS Installer](./INSTALLER.md)
3. [Run the `OpenCore-Patcher.app`](./BUILD.md)
4. [Reboot and boot OpenCore](./BOOT.md)
1. Read the [FAQ](./FAQ.md) for application requirements and other information.
2. Check that your model is supported from the [Supported Models](./MODELS.md) page.
3. Once you've verified your model is supported, you can jump into the process in [Download and build macOS Installer](./INSTALLER.md)

39
docs/TIMEMACHINE.md Normal file
View File

@@ -0,0 +1,39 @@
# Restoring Time Machine backup
OCLP automatically installs root patches when installing from the USB drive for the first time to ensure smooth operation of the first time settings. However, as an unfortunate side effect, doing a full restore via Time Machine breaks while root patches are installed and restoring requires a few tricks to avoid a kernel panic. Below are two different methods to restore.
::: warning Warning for Sequoia
Time Machine on Sequoia may not function even after uninstalling root patches, leading to a loop with "Migration Finished" window. If you encounter this issue, restore on older OS and then upgrade to Sequoia.
:::
## Method 1 - Restore with root patches installed (partial)
**Warning:** Be advised that with this method, folders **other than** "Desktop", "Documents", "Applications" etc (main folders under profile) may not be restored. If you want a full restore, use method 2 below.
1. Start Time Machine restore either in Setup Assistant (first time settings) or Migration Assistant.
2. When asked to select information to transfer, **uncheck** "Other files and folders" as seen in the image below.
3. Start transfer.
<div align="left">
<img src="./images/TimeMachine-Transfer-Uncheck.png" alt="Uncheck other files and folders" width="600" />
</div>
Now you should be restored with your user profile, applications and settings.
## Method 2 - Restore without root patches (full)
1. In first time settings (Setup Assistant), do not restore the backup. Instead do all settings like you would want to start fresh.
2. Once you reach desktop, open the OCLP application and revert root patches in the Post Install Volume Patches section.
3. Restart your machine.
* Note: Your Mac will feel slow due to lack of graphics drivers and resolution may be wrong. WiFi will also be unavailable in most cases, if your backup is on a network drive, use Ethernet.
4. Login and start Migration Assistant.
5. Go through the restoring process.
6. Once finished, go into the OCLP app and reinstall the root patches.
Now you should be fully restored with Time Machine and also running with all patches.

View File

@@ -1,206 +1,356 @@
# Troubleshooting
Here are some common errors that users may experience while using this patcher:
* [OpenCore Legacy Patcher not launching](#opencore-legacy-patcher-not-launching)
* [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)
* [Stuck on boot after root patching](#stuck-on-boot-after-root-patching)
* [Reboot when entering Hibernation (`Sleep Wake Failure`)](#reboot-when-entering-hibernation-sleep-wake-failure)
* [How to Boot Recovery through OpenCore Legacy Patcher](#how-to-boot-recovery-through-opencore-legacy-patcher)
* [Stuck on "Your Mac needs a firmware update"](#stuck-on-your-mac-needs-a-firmware-update)
* [No Brightness Control](#no-brightness-control)
* [Cannot connect Wi-Fi on Monterey with legacy cards](#cannot-connect-Wi-Fi-on-Monterey-with-legacy-cards)
* [No Graphics Acceleration](#no-graphics-acceleration)
* [Black Screen on MacBookPro11,3 in macOS Monterey](#black-screen-on-macbookpro113-in-macos-monterey)
* [No DisplayPort Output on Mac Pros with NVIDIA Kepler](#no-displayport-output-on-mac-pros-with-NVIDIA-kepler)
* [Volume Hash Mismatch Error in macOS Monterey](#volume-hash-mismatch-error-in-macos-monterey)
* [Cannot Disable SIP in recoveryOS](#cannot-disable-sip-in-recoveryos)
* [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)
## OpenCore Legacy Patcher not launching
If the application won't launch (e.g. icon will bounce in the Dock), try launching OCLP via Terminal by typing the following command, make sure you've moved the app to `/Applications` before this.
```sh
/Applications/OpenCore-Patcher.app/Contents/MacOS/OpenCore-Patcher
```
## Stuck on `This version of Mac OS X is not supported on this platform` or (🚫) Prohibited Symbol
This means macOS has detected an SMBIOS it does not support. To resolve this, ensure you're booting OpenCore **before** the macOS installer in the boot picker. Reminder that the option will be called `EFI Boot`.
Once you've booted OpenCore at least once, your hardware should now auto-boot it until either an NVRAM reset occurs, or you remove the drive with OpenCore installed.
However, if the 🚫 Symbol only appears after the boot process has already started (the bootscreen appears/verbose boot starts), it could mean that your USB drive has failed to pass macOS' integrity checks. To resolve this, create a new installer using a different USB drive (preferably of a different model.)
## Cannot boot macOS without the USB
By default, the OpenCore Patcher won't install OpenCore onto the internal drive itself during installs.
After installing macOS, OpenCore Legacy Patcher should automatically prompt you to install OpenCore onto the internal drive. However, if it doesn't show the prompt, you'll need to either [manually transfer](https://dortania.github.io/OpenCore-Post-Install/universal/oc2hdd.html) OpenCore to the internal drive's EFI or Build and Install again and select your internal drive.
Reminder that once this is done, you'll need to select OpenCore in the boot picker again for your hardware to remember this entry and auto boot from then on.
## Infinite Recovery OS Booting
With OpenCore Legacy Patcher, we rely on Apple Secure Boot to ensure OS updates work correctly and reliably with Big Sur. However this installs NVRAM variables that will confuse your Mac if not running with OpenCore. To resolve this, simply uninstall OpenCore and [reset NVRAM](https://support.apple.com/en-mide/HT201255).
* Note: Machines with modified root volumes will also result in an infinite recovery loop until integrity is restored.
## 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)
* **Note:** If your disk name is something else than "Macintosh HD", make sure to change the path accordingly. You can figure out your disk name by typing `ls /Volumes`.
Go into terminal and first mount the disk by typing
```sh
mount -uw "/Volumes/Macintosh HD"
```
Then revert the snapshot
```sh
bless --mount "/Volumes/Macintosh HD" --bootefi --last-sealed-snapshot
```
Now we're going to clean the /Library/Extensions folder from offending kexts while keeping needed ones.
Run the following and **make sure to type it carefully**
::: warning
If you have **FileVault 2 enabled**, you will need to mount the Data volume first. This can be done in Disk Utility by locating your macOS volume name, selecting its Data volume, and selecting the Mount option in the toolbar.
:::
```sh
cd "/Volumes/Macintosh HD - Data/Library/Extensions" && ls | grep -v "HighPoint*\|SoftRAID*" | xargs rm -rf
```
Then restart and now your system should be restored to the unpatched snapshot and should be able to boot again.
## Reboot when entering Hibernation (`Sleep Wake Failure`)
[Known issue on some models](https://github.com/dortania/Opencore-Legacy-Patcher/issues/72), a temporary fix is to disable Hibernation by executing the following command in the terminal:
```
sudo pmset -a hibernatemode 0
```
## How to Boot Recovery through OpenCore Legacy Patcher
By default, the patcher will try to hide extra boot options such as recovery from the user. To make them appear, simply press the `Spacebar` key while inside OpenCore's Picker to list all boot options.
## Stuck on "Your Mac needs a firmware update"
Full error: "Your Mac needs a firmware update in order to install to this Volume. Please select a Mac OS Extended (Journaled) volume instead."
This error occurs when macOS determines that the current firmware does not have full APFS support. To resolve this, when installing OpenCore, head to "Patcher Settings" and enable "Moderate SMBIOS Patching" or higher. This will ensure that the firmware reported will show support for full APFS capabilities.
## No Brightness Control
With OCLP v0.0.22, we've added support for brightness control on many models. However, some users may have noticed that their brightness keys do not work.
As a work-around, we recommend users try out the below app:
* [Brightness Slider](https://actproductions.net/free-apps/brightness-slider/)
## Cannot connect Wi-Fi on Monterey with legacy cards
With OCLP v0.2.5, we've added support for legacy Wi-Fi on Monterey. However, some users may have noticed that they can't connect to wireless networks.
To work-around this, we recommend that users manually connect using the "Other" option in the Wi-Fi menu bar or manually adding the network in the "Network" preference pane.
## No Graphics Acceleration
In macOS, GPU drivers are often dropped from the OS with each major release of it. With macOS Big Sur, currently, all non-Metal GPUs require additional patches to gain acceleration. In addition, macOS Monterey removed Graphics Drivers for both Intel Ivy Bridge and NVIDIA Kepler graphics processors.
If you're using OCLP v0.4.4, you should have been prompted to install Root Volume patches after the first boot from installation of macOS. If you need to do this manually, you can do so within the patcher app. Once rebooted, acceleration will be re-enabled as well as brightness control for laptops.
## Black Screen on MacBookPro11,3 in macOS Monterey
Due to Apple dropping NVIDIA Kepler support in macOS Monterey, [MacBookPro11,3's GMUX has difficulties switching back to the iGPU to display macOS correctly.](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/522) To work-around this issue, boot the MacBookPro11,3 in Safe Mode and once macOS is installed, run OCLP's Post Install Root Patches to enable GPU Acceleration for the NVIDIA dGPU.
* Safe Mode can be started by holding `Shift` + `Enter` when selecting macOS Monterey in OCLP's Boot Menu.
## No DisplayPort Output on Mac Pros with NVIDIA Kepler
If you're having trouble with DisplayPort output on Mac Pros, try enabling Minimal Spoofing in Settings -> SMBIOS Settings and rebuild/install OpenCore. This will trick macOS drivers into thinking you have a newer MacPro7,1 and resolve the issue.
![](./images/OCLP-GUI-SMBIOS-Minimal.png)
## Volume Hash Mismatch Error in macOS Monterey
A semi-common popup some users face is the "Volume Hash Mismatch" error:
<p align="center">
<img src="./images/Hash-Mismatch.png">
</p>
What this error signifies is that the OS detects that the boot volume's hash does not match what the OS is expecting, this error is generally cosmetic and can be ignored. However if your system starts to crash spontaneously shortly after, you'll want to reinstall macOS fresh without importing any data at first.
* Note that this bug affects native Macs as well and is not due to issues with unsupported Macs: [OSX Daily: “Volume Hash Mismatch” Error in MacOS Monterey](https://osxdaily.com/2021/11/10/volume-hash-mismatch-error-in-macos-monterey/)
Additionally, it can help to disable FeatureUnlock in Settings -> Misc Settings as this tool can be strenuous on systems with weaker memory stability.
## Cannot Disable SIP in recoveryOS
With OCLP, the patcher will always overwrite the current SIP value on boot to ensure that users don't brick an installation after an NVRAM reset. However, for users wanting to disable SIP entirely, this can be done easily.
Head into the GUI, go to Patcher Settings, and toggle the bits you need disabled from SIP:
| SIP Enabled | SIP Lowered (Root Patching) | SIP Disabled |
| :--- | :--- | :--- |
| ![](./images/OCLP-GUI-Settings-SIP-Enabled.png) | ![](./images/OCLP-GUI-Settings-SIP-Root-Patch.png) | ![](./images/OCLP-GUI-Settings-SIP-Disabled.png) |
## Intermediate issues with USB 1.1 and Bluetooth on MacPro3,1 - MacPro5,1
For those experiencing issues with USB 1.1 devices (such as mice, keyboards and bluetooth chipsets), macOS Big Sur and newer have weakened OS-side reliability for the UHCI controller in older Mac Pros.
* UHCI is a USB 1.1 controller that is hooked together with the USB 2.0 ports in your system. Whenever a USB 1.1 device is detected, the UHCI controller is given ownership of the device at a hardware/firmware level.
* EHCI is the USB 2.0 controller in older Mac Pros
Because of this, we recommend placing a USB 2.0/3.0 hub between your devices and the port on the Mac Pro. UHCI and EHCI cannot both be used at once, so using a USB hub will always force the EHCI controller on.
* Alternatively, you can try cold-starting the hardware and see if macOS recognizes the UHCI controller properly.
## Stuck on "Less than a minute remaining..."
A common area for systems to get "stuck", namely for units that are missing the `AES` CPU instruction/older mobile hardware. During this stage, a lot of heavy cryptography is performed, which can make systems appear to be stuck. In reality they are working quite hard to finish up the installation.
Because this step can take a few hours or more depending on drive speeds, be patient at this stage and do not manually power off or reboot your machine as this will break the installation and require you to reinstall. If you think your system has stalled, press the Caps Lock key. If the light turns on, your system is busy and not actually frozen.
## No acceleration after a Metal GPU swap on Mac Pro
If you finished installing Monterey with the original card installed (to see bootpicker for example) and swapped your GPU to a Metal supported one, you may notice that you're missing acceleration. To fix this, open OCLP and revert root patches to get your Metal-supported GPU work again.
Alternatively, you can remove "AutoPkg-Assets.pkg" from /Library/Packages on the USB drive before proceeding with the installation. To see the folder, enable hidden files with `Command` + `Shift` + `.`
The reason for this is that the autopatcher will assume that you will be using the original graphics card and therefore does non-metal patching, which includes removing some drivers for other cards. This causes Metal cards to not accelerate after swapping.
## Keyboard, Mouse and Trackpad not working in installer or after update
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.
* For MacBook users, you'll need to find an external keyboard/mouse in addition to the USB hub
More information can be found here:
* [Legacy UHCI/OHCI support in Ventura #1021](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1021)
Applicable models include:
| Family | Year | Model | Notes |
| :---------- | :--------------------| :---------------------------- | :----------------------------------------------- |
| MacBook | Mid 2010 and older | MacBook5,1 - MacBook7,1 | |
| MacBook Air | Late 2010 and older | MacBookAir2,1 - MacBookAir3,x | |
| MacBook Pro | Mid 2010 and older | MacBookPro4,1 - MacBookPro7,x | Excludes Mid 2010 15" and 17" (MacBookPro6,x) |
| iMac | Late 2009 and older | iMac7,1 - iMac10,x | Excludes Core i5/7 27" late 2009 iMac (iMac11,1) |
| Mac mini | Mid 2011 and older | Macmini3,1 - Macmini5,x | |
| Mac Pro | Mid 2010 and older | MacPro3,1 - MacPro5,1 | |
![](./images/usb11-chart.png)
# General troubleshooting
Here are some common errors that users may experience while using this patcher:
* [OpenCore Legacy Patcher not launching](#opencore-legacy-patcher-not-launching)
* ["You don't have permission to save..." error when creating USB installer](#you-don-t-have-permission-to-save-error-when-creating-usb-installer)
* [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)
* [Stuck on hard disk selection with greyed out buttons in installer](#stuck-on-hard-disk-selection-with-greyed-out-buttons-in-installer)
* [Cannot boot macOS without the USB](#cannot-boot-macos-without-the-usb)
* [Infinite Recovery OS Booting](#infinite-recovery-os-booting)
* [Internal disk missing when building OpenCore](#internal-disk-missing-when-building-opencore)
* [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)
* [How to Boot Recovery through OpenCore Legacy Patcher](#how-to-boot-recovery-through-opencore-legacy-patcher)
* [Stuck on "Your Mac needs a firmware update"](#stuck-on-your-mac-needs-a-firmware-update)
* [No Brightness Control](#no-brightness-control)
* [Cannot connect Wi-Fi on Monterey with legacy cards](#cannot-connect-Wi-Fi-on-Monterey-with-legacy-cards)
* [No Graphics Acceleration](#no-graphics-acceleration)
* [Black Screen on MacBookPro11,3 in macOS Monterey](#black-screen-on-macbookpro11-3-in-macos-monterey)
* [No DisplayPort Output on Mac Pros with NVIDIA Kepler](#no-displayport-output-on-mac-pros-with-nvidia-kepler)
* [Volume Hash Mismatch Error in macOS Monterey](#volume-hash-mismatch-error-in-macos-monterey)
* [Cannot Disable SIP in recoveryOS](#cannot-disable-sip-in-recoveryos)
* [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
If the application won't launch (e.g. icon will bounce in the Dock), try launching OCLP via Terminal by typing the following command.
```sh
/Library/Application Support/Dortania/OpenCore-Patcher.app/Contents/MacOS/OpenCore-Patcher
```
## "You don't have permission to save..." error when creating USB installer
In some cases, a following error saying "The bless of the installer disk failed" stating the reason as "You don't have permission to save..." may appear.
<div align="left">
<img src="./images/Error-No-Permission-To-Save.png" alt="NoPermissionToSave" width="600" />
</div>
To resolve this, you may try adding Full Disk Access permission for OpenCore Legacy Patcher. To add it, first go to the settings
* Ventura and Sonoma: Go to System Settings -> Privacy and Security -> Full Disk Access
* Big Sur and Monterey: Go to System Preferences -> Security and Privacy -> Full Disk Access
Enable OpenCore-Patcher in the list. If not found on the list, press the + sign to add a new entity and find OpenCore Legacy Patcher from Applications.
Restart OpenCore Legacy Patcher and try creating your USB drive again.
Optional: After you've created your USB drive, you can remove OpenCore Legacy Patcher from Full Disk Access again.
## Stuck on `This version of Mac OS X is not supported on this platform` or (🚫) Prohibited Symbol
This means macOS has detected an SMBIOS it does not support. To resolve this, ensure you're booting OpenCore **before** the macOS installer in the boot picker. Reminder that the option will be called `EFI Boot`.
Once you've booted OpenCore at least once, your hardware should now auto-boot it until either an NVRAM reset occurs, or you remove the drive with OpenCore installed.
However, if the 🚫 Symbol only appears after the boot process has already started (the bootscreen appears/verbose boot starts), it could mean that your USB drive has failed to pass macOS' integrity checks. To resolve this, create a new installer using a different USB drive (preferably of a different model.)
## Stuck on hard disk selection with greyed out buttons in installer
Switch installer language to English. If the language selector doesn't show up, [reset NVRAM](https://support.apple.com/en-mide/102603) and boot into the installer again.
You can switch back to different language once macOS has installed.
## Cannot boot macOS without the USB
By default, the OpenCore Patcher won't install OpenCore onto the internal drive itself during installs.
After installing macOS, OpenCore Legacy Patcher should automatically prompt you to install OpenCore onto the internal drive. However, if it doesn't show the prompt, you'll need to either [manually transfer](https://dortania.github.io/OpenCore-Post-Install/universal/oc2hdd.html) OpenCore to the internal drive's EFI or Build and Install again and select your internal drive.
Reminder that once this is done, you'll need to select OpenCore in the boot picker again for your hardware to remember this entry and auto boot from then on.
## Infinite Recovery OS Booting
With OpenCore Legacy Patcher, we rely on Apple Secure Boot to ensure OS updates work correctly and reliably with Big Sur. However this installs NVRAM variables that will confuse your Mac if not running with OpenCore. To resolve this, simply uninstall OpenCore and [reset NVRAM](https://support.apple.com/en-mide/HT201255).
* Note: Machines with modified root volumes will also result in an infinite recovery loop until integrity is restored.
## Internal disk missing when building OpenCore
If you're using a brand new disk that has not been used before or was never formatted in any macOS type, you may face the following error in OCLP when trying to build on the internal disk.
<div align="left">
<img src="./images/OCLP_Failed_to_find_applicable_disks.png" alt="Failed to find applicable disks" width="600" />
</div>
There are two ways to to try and resolve this.
1. Create a new FAT32 partition using Disk Utility, sized at around 100MB, naming does not matter. OpenCore will detect it and you will be able to build your EFI there.
2. When installing macOS, choose "View -> Show all devices" in Disk Utility and format the entire disk by choosing the topmost option in the sidebar.
<div align="left">
<img src="./images/wipe-disk.png" alt="Wipe disk" width="800" />
</div>
## System version mismatch error when root patching
Due to a change by Apple, updates now modify the system volume **already while downloading**, which can lead to broken patches out of a sudden, since the operating system gets into a liminal state between two versions. Hence while root patching, you may get an error that looks like the following:
`SystemVersion.plist build version mismatch: found 15.4 (24E247), expected 13.7.5 (22H527)`
In this example, it is telling that a version 13.7.5 (Ventura) is expected which is currently running but macOS has already staged an update to version 15.4 (Sequoia) and has already modified the filesystem to prepare for an update, including writing the new version in SystemVersion.plist where OCLP is able to read it from. 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.
There are few options to resolve it:
1. Update/upgrade to the version already staged.
2. Reinstall macOS.
* You can try doing an in-place install without wiping the disk to keep your data but this may not be possible due to the OS being partially on newer version and it will complain about downgrade.
4. Use an experimental "PurgePendingUpdate" tool [from the Discord server](https://discord.com/channels/417165963327176704/1253268648324235345/1257348959454625985).
* Download it and then run it in Terminal to get rid of a pending update, then repatch again. If "purge failed" appears, you can ignore it.
* 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.**
* Note: macOS Sequoia has begun prompting to enable automatic updates from 15.4 onward after an update install has finished and isn't giving a choice to fully decline, this means you may have to keep doing it again after updating to newer versions.
::: details How to disable updates (click to expand)
**macOS Ventura and newer:**
System Settings -> General -> Software Update -> (i) button next to Automatic Updates -> Disable "Download new updates when available".
**macOS Big Sur and Monterey:**
System Preferences -> Software Update -> Advanced -> Disable "Download new updates when available".
:::
## Stuck on boot after root patching
**Applies to macOS Monterey and newer. Big Sur does not support snapshot reversion.**
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)
* **Note:** If your disk name is something else than "Macintosh HD", make sure to change the path accordingly. You can figure out your disk name by typing `ls /Volumes`.
Go into terminal and first mount the disk by typing
```sh
mount -uw "/Volumes/Macintosh HD"
```
Then revert the snapshot
```sh
bless --mount "/Volumes/Macintosh HD" --bootefi --last-sealed-snapshot
```
Now we're going to clean the /Library/Extensions folder from offending kexts while keeping needed ones.
Run the following and **make sure to type it carefully**
::: warning
If you have **FileVault 2 enabled**, you will need to mount the Data volume first. This can be done in Disk Utility by locating your macOS volume name, selecting its Data volume, and selecting the Mount option in the toolbar.
:::
```sh
cd "/Volumes/Macintosh HD - Data/Library/Extensions" && ls | grep -v "HighPoint*\|SoftRAID*" | xargs rm -rf
```
Then restart and now your system should be restored to the unpatched snapshot and should be able to boot again.
## "Unable to resolve dependencies, error code 71" when root patching
If you're getting this error, it typically means you have some offending kernel extensions, to fix this you will have to clear them.
Semi-automated way:
1. Open Terminal
2. Type `sudo zsh`
3. Type `cd "/Volumes/Macintosh HD/Library/Extensions" && ls | grep -v "HighPoint*\|SoftRAID*" | xargs rm -rf`
* Make sure to rename "Macintosh HD" to what your drive name is
4. Run OCLP root patcher again
Manual way:
1. Navigate to /Library/Extensions
2. Delete everything **except** HighPointIOP.kext, HighPointRR.kext and SoftRAID.kext
3. Run OCLP root patcher again
If there is no success, navigate to "/Library/Developer/KDKs" and delete everything.
If still no success, type `sudo bless --mount "/Volumes/Macintosh HD/" --bootefi --last-sealed-snapshot`
* Make sure again to rename "Macintosh HD" to what your drive name is
Run OCLP root patcher again.
## Reboot when entering Hibernation (`Sleep Wake Failure`)
[Known issue on some models](https://github.com/dortania/Opencore-Legacy-Patcher/issues/72), a temporary fix is to disable Hibernation by executing the following command in the terminal:
```
sudo pmset -a hibernatemode 0
```
## How to Boot Recovery through OpenCore Legacy Patcher
By default, the patcher will try to hide extra boot options such as recovery from the user. To make them appear, simply press the `Spacebar` key while inside OpenCore's Picker to list all boot options.
## Stuck on "Your Mac needs a firmware update"
Full error: "Your Mac needs a firmware update in order to install to this Volume. Please select a Mac OS Extended (Journaled) volume instead."
This error occurs when macOS determines that the current firmware does not have full APFS support. To resolve this, when installing OpenCore, head to "Patcher Settings" and enable "Moderate SMBIOS Patching" or higher. This will ensure that the firmware reported will show support for full APFS capabilities.
## No Brightness Control
With OCLP v0.0.22, we've added support for brightness control on many models. However, some users may have noticed that their brightness keys do not work.
As a work-around, we recommend users try out the below app:
* [Brightness Slider](https://actproductions.net/free-apps/brightness-slider/)
## Cannot connect Wi-Fi on Monterey with legacy cards
With OCLP v0.2.5, we've added support for legacy Wi-Fi on Monterey. However, some users may have noticed that they can't connect to wireless networks.
To work-around this, we recommend that users manually connect using the "Other" option in the Wi-Fi menu bar or manually adding the network in the "Network" preference pane.
## No Graphics Acceleration
In macOS, GPU drivers are often dropped from the OS with each major release of it. With macOS Big Sur, currently, all non-Metal GPUs require additional patches to gain acceleration. In addition, macOS Monterey removed Graphics Drivers for both Intel Ivy Bridge and NVIDIA Kepler graphics processors.
If you're using OCLP v0.4.4, you should have been prompted to install Root Volume patches after the first boot from installation of macOS. If you need to do this manually, you can do so within the patcher app. Once rebooted, acceleration will be re-enabled as well as brightness control for laptops.
## Black Screen on MacBookPro11,3 in macOS Monterey
Due to Apple dropping NVIDIA Kepler support in macOS Monterey, [MacBookPro11,3's GMUX has difficulties switching back to the iGPU to display macOS correctly.](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/522) To work-around this issue, boot the MacBookPro11,3 in Safe Mode and once macOS is installed, run OCLP's Post Install Root Patches to enable GPU Acceleration for the NVIDIA dGPU.
* Safe Mode can be started by holding `Shift` + `Enter` when selecting macOS Monterey in OCLP's Boot Menu.
## No DisplayPort Output on Mac Pros with NVIDIA Kepler
If you're having trouble with DisplayPort output on Mac Pros, try enabling Minimal Spoofing in Settings -> SMBIOS Settings and rebuild/install OpenCore. This will trick macOS drivers into thinking you have a newer MacPro7,1 and resolve the issue.
<div align="left">
<img src="./images/OCLP-GUI-SMBIOS-Minimal.png" alt="GUI SMBIOS minimal" width="800" />
</div>
## Volume Hash Mismatch Error in macOS Monterey
A semi-common popup some users face is the "Volume Hash Mismatch" error:
<p align="left">
<img src="./images/Hash-Mismatch.png">
</p>
What this error signifies is that the OS detects that the boot volume's hash does not match what the OS is expecting, this error is generally cosmetic and can be ignored. However if your system starts to crash spontaneously shortly after, you'll want to reinstall macOS fresh without importing any data at first.
* Note that this bug affects native Macs as well and is not due to issues with unsupported Macs: [OSX Daily: “Volume Hash Mismatch” Error in MacOS Monterey](https://osxdaily.com/2021/11/10/volume-hash-mismatch-error-in-macos-monterey/)
Additionally, it can help to disable FeatureUnlock in Settings -> Misc Settings as this tool can be strenuous on systems with weaker memory stability.
## Cannot Disable SIP in recoveryOS
With OCLP, the patcher will always overwrite the current SIP value on boot to ensure that users don't brick an installation after an NVRAM reset. However, for users wanting to disable SIP entirely, this can be done easily.
Head into the GUI, go to Patcher Settings, and toggle the bits you need disabled from SIP:
| SIP Enabled | SIP Lowered (Root Patching) | SIP Disabled |
| :--- | :--- | :--- |
| ![](./images/OCLP-GUI-Settings-SIP-Enabled.png) | ![](./images/OCLP-GUI-Settings-SIP-Root-Patch.png) | ![](./images/OCLP-GUI-Settings-SIP-Disabled.png) |
## Intermediate issues with USB 1.1 and Bluetooth on MacPro3,1 - MacPro5,1
For those experiencing issues with USB 1.1 devices (such as mice, keyboards and bluetooth chipsets), macOS Big Sur and newer have weakened OS-side reliability for the UHCI controller in older Mac Pros.
* UHCI is a USB 1.1 controller that is hooked together with the USB 2.0 ports in your system. Whenever a USB 1.1 device is detected, the UHCI controller is given ownership of the device at a hardware/firmware level.
* EHCI is the USB 2.0 controller in older Mac Pros
Because of this, we recommend placing a USB 2.0/3.0 hub between your devices and the port on the Mac Pro. UHCI and EHCI cannot both be used at once, so using a USB hub will always force the EHCI controller on.
* Alternatively, you can try cold-starting the hardware and see if macOS recognizes the UHCI controller properly.
## Stuck on "Less than a minute remaining..."
A common area for systems to get "stuck", namely for units that are missing the `AES` CPU instruction/older mobile hardware. During this stage, a lot of heavy cryptography is performed, which can make systems appear to be stuck. In reality they are working quite hard to finish up the installation.
Because this step can take a few hours or more depending on drive speeds, be patient at this stage and do not manually power off or reboot your machine as this will break the installation and require you to reinstall. If you think your system has stalled, press the Caps Lock key. If the light turns on, your system is busy and not actually frozen.
## No acceleration after a Metal GPU swap on Mac Pro
If you finished installing macOS with the original card installed (to see bootpicker for example) and swapped your GPU to a Metal supported one, you may notice that you're missing acceleration. To fix this, open OCLP and revert root patches to get your Metal-supported GPU work again. In macOS Ventura and newer, repatching is needed after reversion.
Alternatively, you can remove "AutoPkg-Assets.pkg" from /Library/Packages on the USB drive before proceeding with the installation. To see the folder, enable hidden files with `Command` + `Shift` + `.`
The reason for this is that the autopatcher will assume that you will be using the original graphics card and therefore does non-metal patching, which includes removing some drivers for other cards. This causes Metal cards to not accelerate after swapping.
## Keyboard, Mouse and Trackpad not working in installer or after update
Starting from macOS Ventura, USB 1.1 drivers are no longer provided in the operating system. For Macs using legacy USB 1.1 controllers, OpenCore Legacy Patcher can only restore support once it has performed root volume patches which restore the drivers. Thus when installing macOS or after an update, you need to hook up a USB hub between your Mac and keyboard/mouse, forcing USB 2.0 mode in order to install the root patches.
* For MacBook users, you'll need to find an external keyboard/mouse in addition to the USB hub
Applicable models include:
| Family | Year | Model | Notes |
| :---------- | :--------------------| :---------------------------- | :----------------------------------------------- |
| MacBook | Mid 2010 and older | MacBook5,1 - MacBook7,1 | |
| MacBook Air | Late 2010 and older | MacBookAir2,1 - MacBookAir3,x | |
| MacBook Pro | Mid 2010 and older | MacBookPro4,1 - MacBookPro7,x | Excludes Mid 2010 15" and 17" (MacBookPro6,x) |
| iMac | Late 2009 and older | iMac7,1 - iMac10,x | Excludes Core i5/7 27" late 2009 iMac (iMac11,1) |
| Mac mini | Mid 2011 and older | Macmini3,1 - Macmini5,x | |
| Mac Pro | Mid 2010 and older | MacPro3,1 - MacPro5,1 | |
<div align="left">
<img src="./images/usb11-chart.png" alt="USB1.1 chart" width="800" />
</div>
::: warning Note
In macOS Sonoma, this seems to have been further weakened and some hubs may not be functional. If you encounter this issue, try another hub.
:::
### Alternative method for Software Update
Alternative way for updates 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 and run Post Install Volume Patching.
**This only applies to updates via Software Update and is not applicable when booting to installer via USB drive.**
Use the following commands:
1. `ssh username@lan-ip-address` - Connects via SSH, change username and IP address to the system's
2. `/Applications/OpenCore-Patcher.app/Contents/MacOS/OpenCore-Patcher --patch_sys_vol` - Installs root patches via CLI
3. `sudo reboot`.
More information can be found here:
* [Legacy UHCI/OHCI support in Ventura #1021](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1021)
## 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. If the firmware is missing from EFI, T1 will not work regardless whether OCLP reinstates the driver during root patching. 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.
To prevent this from happening in the future, with T1 systems only wipe the volume containing the operating system.
<div align="left">
<img src="./images/wipe-volume.png" alt="WipeVolume" width="800" />
</div>

View File

@@ -1,23 +1,45 @@
# Uninstalling OpenCore
# Uninstall
## Uninstalling the bootloader
This guide tells you different ways to uninstall OCLP and/or patches.
## Delete everything and revert back to native macOS
1. Create a USB drive with the latest officially supported macOS installer.
2. Restart the computer and [Reset NVRAM.](https://support.apple.com/HT204063)
3. Boot the computer using the installer USB drive.
4. Go to Disk Utility and choose View -> Show All Devices.
5. Wipe the full disk by choosing the top disk option on the left sidebar and selecting "Erase".
6. Start macOS installation.
## Manual methods
Uninstalling OCLP manually is a three part process which includes the application, OpenCore and the root patches. If you want to remove OCLP and patches entirely, go through all three in succession. Otherwise do the part(s) you need.
### Reverting root patches
Open the OCLP application and go into the Post Install Root Patch menu, choose Revert Root Patches.
### Uninstalling the application
To uninstall the OCLP application including LaunchAgent and PrivilegedHelperTool, download the uninstaller package from [the releases page.](https://github.com/dortania/OpenCore-Legacy-Patcher/releases)
### Uninstalling the bootloader
1. Remove OpenCore either from the USB or internal drive
* You'll need to mount the drive's EFI partition, and delete the `EFI/OC` and `System` folders
* Mount the drive's EFI partition, and delete the `EFI/OC` and `System` folders
* Note: **Do not** delete the entire EFI folder, this will likely break any existing Windows and Linux installations.
* [See here for an example on how to mount](https://dortania.github.io/OpenCore-Post-Install/universal/oc2hdd.html)
* For 5K iMac users, you will also need to delete `boot.efi` on the root of the EFI partition.
* 5K iMac users, also delete `boot.efi` on the root of the EFI partition.
2. [Reset NVRAM](https://support.apple.com/HT204063)
:::warning
Note that after you remove OpenCore, your Mac will no longer boot and show the "prohibited" symbol. Be ready to install a natively-supported version of macOS before you uninstall OpenCore.
Note that after you remove OpenCore, your Mac will no longer boot and show the "prohibited" symbol. Be prepared to have a bootable USB drive with either OpenCore or natively-supported version of macOS before you uninstall the bootloader.
* This does not apply to native Macs just using OpenCore to achieve features like AirPlay to Mac and Sidecar, but it is still recommended to reinstall macOS after removing OpenCore, if using SMBIOS spoofing to enable Universal Control and other features.
:::
## Uninstalling the application
If you want to remove the application without reinstalling the OS, navigate to `/Library/Application Support/` and delete the Dortania folder.

View File

@@ -3,7 +3,11 @@
Introduced in macOS 12 Monterey, Universal Control is a feature that allows a Mac to control other Macs and/or iPads, share input devices, and share files across them simultaneously. With OpenCore and FeatureUnlock, Universal Control can be unlocked for most unsupported Macs, as long as they meet the technical requirements listed on this page.
* Note: The following page is primarily for tinkerers, no proper support is provided outside of Discord support (see bottom of page).
::: warning Note
These features are not actively tested and may break at any time. The following page is primarily for tinkerers, no proper support is provided outside of Discord support (see bottom of page).
:::
## Enabling Universal Control
@@ -202,7 +206,38 @@ Before we continue, please keep in mind that SMBIOS Spoofing is an advanced feat
### How to spoof
Ventura has dropped more models which includes all of the blacklisted Macs in question, making the procedure slightly different. It is important to follow the guide for the version you're on, failing to do so is likely to cause boot issues.
::: details macOS Sequoia
Firstly run OpenCore Legacy Patcher.
Then go to **Settings** and **SMBIOS** tab, set SMBIOS Spoof Level to **Moderate**. Set SMBIOS Spoof Model **one listed next to your native model in the table for spoofed models below.**
Notice that "Allow native models" and "Allow Native Spoofs" **are NOT** enabled unlike on Monterey, this is on purpose. They are no longer relevant on Sonoma and enabling them will cause boot issues.
| Main Settings view | SMBIOS settings |
| :--- | :--- |
| ![](./images/ventura_uc1.png) | ![](./images/ventura_uc2.png) |
::: details Table for spoofed models (click to expand)
Spoofing to any model with native Sequoia support should work, but these are the earliest Macs natively supported by Sequoia and thus chosen for the sake of simplicity.
**Reminder:** Macs that are not listed on this table work without spoofing, including systems that do not natively support Sequoia as long as the other requirements are met, since they aren't blacklisted.
| Mac by name | Native SMBIOS | Spoof SMBIOS |
|-------------|---------------|--------------|
| MacBook Air Early 2015 11" / 13" | MacBookAir7,x | MacBookAir9,1 |
| MacBook Pro Early 2015 13" | MacBookPro12,x | MacBookPro15,2 |
| MacBook Pro Mid 2015 15" | MacBookPro11,4 / 11,5 | MacBookPro15,2 |
| iMac Late 2015 21" | iMac16,x | iMac19,2 |
| Mac mini Late 2014 | Macmini7,x | MacMini8,1 |
| Mac Pro Late 2013 | MacPro6,x | MacPro7,1 |
:::
::: details macOS Sonoma
@@ -222,7 +257,7 @@ Notice that "Allow native models" and "Allow Native Spoofs" **are NOT** enabled
Spoofing to any model with native Sonoma support should work, but these are the earliest Macs natively supported by Sonoma and thus chosen for the sake of simplicity.
**Reminder:** Macs that are not listed on this table work without spoofing, including systems that do not natively support Ventura as long as the other requirements are met, since they aren't blacklisted.
**Reminder:** Macs that are not listed on this table work without spoofing, including systems that do not natively support Sonoma as long as the other requirements are met, since they aren't blacklisted.
| Mac by name | Native SMBIOS | Spoof SMBIOS |

View File

@@ -1,22 +1,45 @@
# Updating OpenCore and Patches
With OpenCore Legacy Patcher, there's generally very little reason for users to update the OpenCore installation on their machine unless you feel there's a benefit with new versions for your setup, e.g. Bluetooth has stopped working with a new macOS update.
For those who do wish to update, simply [download the latest release](https://github.com/dortania/OpenCore-Legacy-Patcher/releases) and rerun the patcher:
![](./images/OCLP-GUI-Main-Menu.png)
Then, rebuild your OpenCore build and install again. OpenCore Will now be updated!
To check what version of OpenCore and the Patcher you're currently running, you can run the following in the terminal:
```bash
# OpenCore Version
nvram 4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102:opencore-version
# Patcher Version
nvram 4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102:OCLP-Version
```
![](./images/oclp-version.png)
From this, we can see that we're running a RELEASE version of OpenCore 0.8.0 built on April 18th, 2022 with Patcher Version 0.4.5!
# Updating OpenCore and Patches
This guide explains how to get fully up to date application, bootloader and patches.
## Updating the application
Latest versions of OCLP can download updates by themselves, you will get notified of a new update with the changelog.
[You can also manually download the latest release here.](https://github.com/dortania/OpenCore-Legacy-Patcher/releases)
<div align="left">
<img src="./images/OCLP_Update_Available.png" alt="Update Avaialble" />
</div>
## Updating patches
After the update, the application asks if you want to update OpenCore and root patches.
If you do not need to change any settings, you can click "Yes" and follow the procedure. If you want to change settings, select "No" from here and do your settings, then manually build and install OpenCore to update to the latest version of the bootloader.
Finally install new root patches to ensure you're running on the latest fixes for on-disk patches.
<div align="left">
<img src="./images/OCLP_Update_Successful.png" alt="Update Successful" />
</div>
## Checking OCLP and OpenCore versions
To check what version of OpenCore bootloader and the Patcher you're currently running, you can run the following in the terminal:
```bash
# OpenCore Version
nvram 4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102:opencore-version
# Patcher Version
nvram 4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102:OCLP-Version
```
<div align="left">
<img src="./images/oclp-version.png" alt="OCLP version" width="600" />
</div>
From this, we can see that we're running a RELEASE version of OpenCore 0.9.0 built on January 1st, 2023 with Patcher Version 0.6.0!

View File

@@ -1,3 +1,5 @@
# macOS Ventura
![](./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.
@@ -31,7 +33,6 @@ For older hardware, see below sections:
* [Currently Unsupported/Broken Hardware in Ventura](#currently-unsupportedbroken-hardware-in-ventura)
* [AMD Polaris, Vega and Navi support on pre-2019 Mac Pros and pre-2012 iMacs](#amd-polaris-vega-and-navi-support-on-pre-2019-mac-pros-and-pre-2012-imacs)
* [USB 1.1 (OHCI/UHCI) Support](#usb-11-ohciuhci-support)
* [Ethernet issue with Early 2008 Mac Pro](#ethernet-issue-with-early-2008-mac-pro)
The team is doing their best to investigate and fix the aforementioned issues, however no estimated time can be provided.
@@ -62,21 +63,9 @@ For Penryn systems and pre-2013 Mac Pros, USB 1.1 support was outright removed i
* IR Receivers
* Bluetooth
With OpenCore Legacy Patcher v0.6.0, basic support has been implemented via Root Volume patching. However due to this, users will need to use a USB hub for installation and post-OS updates when patches are cleaned:
Refer to [the troubleshooting page](https://dortania.github.io/OpenCore-Legacy-Patcher/TROUBLESHOOTING.html#keyboard-mouse-and-trackpad-not-working-in-installer-or-after-update) on how to workaround this issue.
![](./images/usb11-chart.png)
::: warning The following systems rely on USB 1.1
* iMac10,x and older
* Macmini3,1 and older
* MacBook7,1 and older
* MacBookAir3,1 and older
* MacBookPro7,1 and older
* MacBookPro6,x is exempt
* MacPro5,1 and older
:::
### Graphics and wireless support
::: details Legacy Wireless Support (Resolved in v0.6.0 and newer)

View File

@@ -3,6 +3,13 @@
Modern versions of Windows officially support two types of firmware: UEFI and BIOS. Users may want to boot Windows through the OCLP Bootpicker, but only UEFI Installations of Windows will show up in the OCLP Bootpicker.
Many older Macs do not "officially" support UEFI Windows installations, leading to installation failures and strange behaviour, but OCLP can be used to prevent almost all of these issues.
::: warning
When booting Windows with OpenCore, it's highly recommended to create a new 200MB **MS-DOS (FAT)** partition in Disk Utility to install OpenCore in. This will prevent Windows from overwriting OpenCore with its own bootloader in the EFI partition and causing boot issues.
::::
## Minimum Requirements
This guide will focus on the installation of modern Windows (10/11) without using Boot Camp Assistant.
@@ -232,4 +239,4 @@ Intel's iGPU drivers for the HD 3000 series do not support UEFI booting in Windo
### NVIDIA Tesla Black Screen after driver installation
The NVIDIA Tesla GPUs found in 2008-2010 Macs do not support UEFI booting in Windows. You cannot use UEFI Windows without low-level patching on these machines.
The NVIDIA Tesla GPUs found in 2008-2010 Macs do not support UEFI booting in Windows. You cannot use UEFI Windows without low-level patching on these machines.

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 KiB

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: 203 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 202 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

After

Width:  |  Height:  |  Size: 588 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 629 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 399 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 354 KiB

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 374 KiB

After

Width:  |  Height:  |  Size: 1.0 MiB

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 581 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

@@ -130,7 +130,7 @@ class OpenCoreLegacyPatcher:
if not any(x in sys.argv for x in ignore_args):
while self.constants.unpack_thread.is_alive():
time.sleep(0.1)
time.sleep(self.constants.thread_sleep_interval)
arguments.arguments(self.constants)

View File

@@ -13,9 +13,9 @@ from .detections import device_probe
class Constants:
def __init__(self) -> None:
# Patcher Versioning
self.patcher_version: str = "1.5.0" # OpenCore-Legacy-Patcher
self.patcher_support_pkg_version: str = "1.4.9" # PatcherSupportPkg
self.copyright_date: str = "Copyright © 2020-2024 Dortania"
self.patcher_version: str = "2.4.0" # OpenCore-Legacy-Patcher
self.patcher_support_pkg_version: str = "1.9.5" # PatcherSupportPkg
self.copyright_date: str = "Copyright © 2020-2025 Dortania"
self.patcher_name: str = "OpenCore Legacy Patcher"
# URLs
@@ -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.4"
# 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.airportbcrmfixup_version: str = "2.1.8" # AirPortBrcmFixup
self.nvmefix_version: str = "1.1.1" # NVMeFix
self.lilu_version: str = "1.7.0" # Lilu
self.whatevergreen_version: str = "1.6.9" # WhateverGreen
self.whatevergreen_navi_version: str = "1.6.9-Navi" # WhateverGreen (Navi Patch)
self.airportbcrmfixup_version: str = "2.1.9" # AirPortBrcmFixup
self.nvmefix_version: str = "1.1.2" # 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.bluetool_version: str = "2.6.8" # BlueToolFixup (BrcmPatchRAM)
self.restrictevents_version: str = "1.1.5" # RestrictEvents
self.featureunlock_version: str = "1.1.7" # FeatureUnlock
self.debugenhancer_version: str = "1.1.0" # DebugEnhancer
self.cpufriend_version: str = "1.2.9" # CPUFriend
self.bluetool_version: str = "2.6.9" # 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.4" # 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
@@ -153,6 +155,7 @@ class Constants:
self.unpack_thread = None # Determine if unpack thread finished (threading.Thread)
self.update_stage: int = 0 # Determine update stage (see gui_support.py)
self.log_filepath: Path = None # Path to log file
self.thread_sleep_interval: float = 0.01 # Sleep interval between UI updates (seconds) - balance between UI responsiveness and CPU usage
self.commit_info: tuple = (None, None, None) # Commit info (Branch, Commit Date, Commit URL)
@@ -177,15 +180,15 @@ 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
self.custom_board_serial_number: str = "" # Set SMBIOS board serial number
## FeatureUnlock Settings
self.fu_status: bool = True # Enable FeatureUnlock
self.fu_arguments: str = None # Set FeatureUnlock arguments
self.fu_status: bool = False # Enable FeatureUnlock
self.fu_arguments: str = None # Set FeatureUnlock arguments
## Security Settings
self.sip_status: bool = True # System Integrity Protection
@@ -232,6 +235,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 +248,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 +455,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 +483,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 +790,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 +815,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 +826,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

@@ -29,6 +29,7 @@ class os_data(enum.IntEnum):
monterey = 21
ventura = 22
sonoma = 23
sequoia = 24
max_os = 99

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

@@ -142,11 +142,15 @@ class BuildGraphicsAudio:
iMac MXM dGPU Backlight DevicePath Detection
"""
if not self.constants.custom_model and self.computer.dgpu and self.computer.dgpu.pci_path:
if not self.constants.custom_model:
for i, device in enumerate(self.computer.gpus):
logging.info(f"- Found dGPU ({i + 1}): {utilities.friendly_hex(device.vendor_id)}:{utilities.friendly_hex(device.device_id)}")
self.config["#Revision"][f"Hardware-iMac-dGPU-{i + 1}"] = f"{utilities.friendly_hex(device.vendor_id)}:{utilities.friendly_hex(device.device_id)}"
# Work-around for AMD Navi MXM cards with PCIe bridge
if not self.computer.dgpu:
self.computer.dgpu=self.computer.gpus[i]
if device.pci_path != self.computer.dgpu.pci_path:
logging.info("- device path and GFX0 Device path are different")
self.gfx0_path = device.pci_path
@@ -350,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,8 +65,14 @@ 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:
if self.constants.fu_arguments is not None and self.constants.fu_arguments != "":
logging.info(f"- Adding additional FeatureUnlock args: {self.constants.fu_arguments}")
self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-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

@@ -150,9 +150,10 @@ class BuildStorage:
# Restore S1X/S3X NVMe support removed in 14.0 Beta 2
# Apple's usage of the S1X and S3X is quite sporadic and inconsistent, so we'll try a catch all for units with NVMe drives
# Additionally expanded to cover all Mac models with the 12+16 pin SSD layout, for older machines with newer drives
if self.constants.custom_model and self.model in smbios_data.smbios_dictionary:
if "CPU Generation" in smbios_data.smbios_dictionary[self.model]:
if cpu_data.CPUGen.broadwell <= smbios_data.smbios_dictionary[self.model]["CPU Generation"] <= cpu_data.CPUGen.kaby_lake:
if (cpu_data.CPUGen.haswell <= smbios_data.smbios_dictionary[self.model]["CPU Generation"] <= cpu_data.CPUGen.kaby_lake) or self.model in [ "MacPro6,1" ]:
support.BuildSupport(self.model, self.constants, self.config).enable_kext("IOS3XeFamily.kext", self.constants.s3x_nvme_version, self.constants.s3x_nvme_path)
# Apple RAID Card check
@@ -193,4 +194,4 @@ class BuildStorage:
if self.constants.apfs_trim_timeout is False:
logging.info(f"- Disabling APFS TRIM timeout")
self.config["Kernel"]["Quirks"]["SetApfsTrimTimeout"] = 0
self.config["Kernel"]["Quirks"]["SetApfsTrimTimeout"] = 0

View File

@@ -0,0 +1,111 @@
"""
sucatalog: Python module for querying Apple's Software Update Catalog, supporting Tiger through Sequoia.
-------------------
## Usage
### Get Software Update Catalog URL
```python
>>> import sucatalog
>>> # Defaults to PublicRelease seed
>>> url = sucatalog.CatalogURL().url
"https://swscan.apple.com/.../index-15-14-13-12-10.16-10.15-10.14-10.13-10.12-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog"
>>> url = sucatalog.CatalogURL(seed=sucatalog.SeedType.DeveloperSeed).url
"https://swscan.apple.com/.../index-15seed-15-14-13-12-10.16-10.15-10.14-10.13-10.12-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog"
>>> url = sucatalog.CatalogURL(version=sucatalog.CatalogVersion.HIGH_SIERRA).url
"https://swscan.apple.com/.../index-10.13-10.12-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog"
```
### Parse Software Update Catalog - InstallAssistants only
>>> import sucatalog
>>> # Pass contents of URL (as dictionary)
>>> catalog = plistlib.loads(requests.get(url).content)
>>> products = sucatalog.CatalogProducts(catalog).products
[
{
'Build': '22G720',
'Catalog': <SeedType.PublicRelease: ''>,
'InstallAssistant': {
'IntegrityDataSize': 42008,
'IntegrityDataURL': 'https://swcdn.apple.com/.../InstallAssistant.pkg.integrityDataV1',
'Size': 12210304673,
'URL': 'https://swcdn.apple.com/.../InstallAssistant.pkg'
},
'PostDate': datetime.datetime(2024, 5, 20, 17, 18, 21),
'ProductID': '052-96247',
'Title': 'macOS Ventura',
'Version': '13.6.7'
}
]
### Parse Software Update Catalog - All products
By default, `CatalogProducts` will only return InstallAssistants. To get all products, set `install_assistants_only=False`.
>>> import sucatalog
>>> # Pass contents of URL (as dictionary)
>>> products = sucatalog.CatalogProducts(catalog, install_assistants_only=False).products
[
{
'Build': None,
'Catalog': None,
'Packages': [
{
'MetadataURL': 'https://swdist.apple.com/.../iLifeSlideshow_v2.pkm',
'Size': 116656956,
'URL': 'http://swcdn.apple.com/.../iLifeSlideshow_v2.pkg'
},
{
'MetadataURL': 'https://swdist.apple.com/.../iPhoto9.2.3ContentUpdate.pkm',
'Size': 59623907,
'URL': 'http://swcdn.apple.com/.../iPhoto9.2.3ContentUpdate.pkg'
},
{
'MetadataURL': 'https://swdist.apple.com/.../iPhoto9.2.3Update.pkm',
'Size': 197263405,
'URL': 'http://swcdn.apple.com/.../iPhoto9.2.3Update.pkg'
}
],
'PostDate': datetime.datetime(2019, 10, 23, 0, 2, 42),
'ProductID': '041-85230',
'Title': 'iPhoto Update',
'Version': '9.2.3'
},
{
'Build': None,
'Catalog': None,
'Packages': [
{
'Digest': '9aba109078feec7ea841529e955440b63d7755a0',
'MetadataURL': 'https://swdist.apple.com/.../iPhoto9.4.3Update.pkm',
'Size': 555246460,
'URL': 'http://swcdn.apple.com/.../iPhoto9.4.3Update.pkg'
},
{
'Digest': '0bb013221ca2df5e178d950cb229f41b8e680d00',
'MetadataURL': 'https://swdist.apple.com/.../iPhoto9.4.3ContentUpdate.pkm',
'Size': 213073666,
'URL': 'http://swcdn.apple.com/.../iPhoto9.4.3ContentUpdate.pkg'
}
],
'PostDate': datetime.datetime(2019, 10, 13, 3, 23, 14),
'ProductID': '041-88859',
'Title': 'iPhoto Update',
'Version': '9.4.3'
}
]
"""
from .url import CatalogURL
from .constants import CatalogVersion, SeedType
from .products import CatalogProducts

View File

@@ -0,0 +1,57 @@
"""
constants.py: Enumerations for sucatalog-py
"""
from enum import StrEnum
class SeedType(StrEnum):
"""
Enum for catalog types
Variants:
DeveloperSeed: Developer Beta (Part of the Apple Developer Program)
PublicSeed: Public Beta
CustomerSeed: AppleSeed Program (Generally mirrors DeveloperSeed)
PublicRelease: Public Release
"""
DeveloperSeed: str = "seed"
PublicSeed: str = "beta"
CustomerSeed: str = "customerseed"
PublicRelease: str = ""
class CatalogVersion(StrEnum):
"""
Enum for macOS versions
Used for generating sucatalog URLs
"""
SEQUOIA: str = "15"
SONOMA: str = "14"
VENTURA: str = "13"
MONTEREY: str = "12"
BIG_SUR: str = "11"
BIG_SUR_LEGACY: str = "10.16"
CATALINA: str = "10.15"
MOJAVE: str = "10.14"
HIGH_SIERRA: str = "10.13"
SIERRA: str = "10.12"
EL_CAPITAN: str = "10.11"
YOSEMITE: str = "10.10"
MAVERICKS: str = "10.9"
MOUNTAIN_LION: str = "mountainlion"
LION: str = "lion"
SNOW_LEOPARD: str = "snowleopard"
LEOPARD: str = "leopard"
TIGER: str = ""
class CatalogExtension(StrEnum):
"""
Enum for catalog extensions
Used for generating sucatalog URLs
"""
PLIST: str = ".sucatalog"
GZIP: str = ".sucatalog.gz"

View File

@@ -0,0 +1,422 @@
"""
products.py: Parse products from Software Update Catalog
"""
import re
import plistlib
import packaging.version
import xml.etree.ElementTree as ET
from pathlib import Path
from functools import cached_property
from .url import CatalogURL
from .constants import CatalogVersion, SeedType
from ..support import network_handler
class CatalogProducts:
"""
Args:
catalog (dict): Software Update Catalog (contents of CatalogURL's URL)
install_assistants_only (bool): Only list InstallAssistant products
only_vmm_install_assistants (bool): Only list VMM-x86_64-compatible InstallAssistant products
max_install_assistant_version (CatalogVersion): Maximum InstallAssistant version to list
"""
def __init__(self,
catalog: dict,
install_assistants_only: bool = True,
only_vmm_install_assistants: bool = True,
max_install_assistant_version: CatalogVersion = CatalogVersion.SEQUOIA
) -> None:
self.catalog: dict = catalog
self.ia_only: bool = install_assistants_only
self.vmm_only: bool = only_vmm_install_assistants
self.max_ia_version: packaging = packaging.version.parse(f"{max_install_assistant_version.value}.99.99")
self.max_ia_catalog: CatalogVersion = max_install_assistant_version
def _legacy_parse_info_plist(self, data: dict) -> dict:
"""
Legacy version of parsing for installer details through Info.plist
"""
if "MobileAssetProperties" not in data:
return {}
if "SupportedDeviceModels" not in data["MobileAssetProperties"]:
return {}
if "OSVersion" not in data["MobileAssetProperties"]:
return {}
if "Build" not in data["MobileAssetProperties"]:
return {}
# Ensure Apple Silicon specific Installers are not listed
if "VMM-x86_64" not in data["MobileAssetProperties"]["SupportedDeviceModels"]:
if self.vmm_only:
return {"Missing VMM Support": True}
version = data["MobileAssetProperties"]["OSVersion"]
build = data["MobileAssetProperties"]["Build"]
catalog = ""
try:
catalog = data["MobileAssetProperties"]["BridgeVersionInfo"]["CatalogURL"]
except KeyError:
pass
if any([version, build]) is None:
return {}
return {
"Version": version,
"Build": build,
"Catalog": CatalogURL().catalog_url_to_seed(catalog),
}
def _parse_mobile_asset_plist(self, data: dict) -> dict:
"""
Parses the MobileAsset plist for installer details
With macOS Sequoia, the Info.plist is no longer present in the InstallAssistant's assets
"""
_does_support_vmm = False
for entry in data["Assets"]:
if "SupportedDeviceModels" not in entry:
continue
if "OSVersion" not in entry:
continue
if "Build" not in entry:
continue
if "VMM-x86_64" not in entry["SupportedDeviceModels"]:
if self.vmm_only:
continue
_does_support_vmm = True
build = entry["Build"]
version = entry["OSVersion"]
catalog_url = ""
try:
catalog_url = entry["BridgeVersionInfo"]["CatalogURL"]
except KeyError:
pass
return {
"Version": version,
"Build": build,
"Catalog": CatalogURL().catalog_url_to_seed(catalog_url),
}
if _does_support_vmm is False:
if self.vmm_only:
return {"Missing VMM Support": True}
return {}
def _parse_english_distributions(self, data: bytes) -> dict:
"""
Resolve Title, Build and Version from the English distribution file
"""
try:
plist_contents = plistlib.loads(data)
except plistlib.InvalidFileException:
plist_contents = None
try:
xml_contents = ET.fromstring(data)
except ET.ParseError:
xml_contents = None
_product_map = {
"Title": None,
"Build": None,
"Version": None,
}
if plist_contents:
if "macOSProductBuildVersion" in plist_contents:
_product_map["Build"] = plist_contents["macOSProductBuildVersion"]
if "macOSProductVersion" in plist_contents:
_product_map["Version"] = plist_contents["macOSProductVersion"]
if "BUILD" in plist_contents:
_product_map["Build"] = plist_contents["BUILD"]
if "VERSION" in plist_contents:
_product_map["Version"] = plist_contents["VERSION"]
if xml_contents:
# Fetch item title
item_title = xml_contents.find(".//title").text
if item_title in ["SU_TITLE", "MANUAL_TITLE", "MAN_TITLE"]:
# regex search the contents for the title
title_search = re.search(r'"SU_TITLE"\s*=\s*"(.*)";', data.decode("utf-8"))
if title_search:
item_title = title_search.group(1)
_product_map["Title"] = item_title
return _product_map
def _build_installer_name(self, version: str, catalog: SeedType) -> str:
"""
Builds the installer name based on the version and catalog
"""
try:
marketing_name = CatalogVersion(version.split(".")[0]).name
except ValueError:
marketing_name = "Unknown"
# Replace _ with space
marketing_name = marketing_name.replace("_", " ")
# Convert to upper for each word
marketing_name = "macOS " + " ".join([word.capitalize() for word in marketing_name.split()])
# Append Beta if needed
if catalog in [SeedType.DeveloperSeed, SeedType.PublicSeed, SeedType.CustomerSeed]:
marketing_name += " Beta"
return marketing_name
def _list_latest_installers_only(self, products: list) -> list:
"""
List only the latest installers per macOS version
macOS versions capped at n-3 (n being the latest macOS version)
"""
supported_versions = []
# Build list of supported versions (n to n-3, where n is the latest macOS version set)
did_find_latest = False
for version in CatalogVersion:
if did_find_latest is False:
if version != self.max_ia_catalog:
continue
did_find_latest = True
supported_versions.append(version)
if len(supported_versions) == 4:
break
# Invert the list
supported_versions = supported_versions[::-1]
# Create duplicate product list
products_copy = products.copy()
# Remove all but the newest version
for version in supported_versions:
_newest_version = packaging.version.parse("0.0.0")
# First, determine largest version
for installer in products:
if installer["Version"] is None:
continue
if not installer["Version"].startswith(version.value):
continue
if installer["Catalog"] in [SeedType.CustomerSeed, SeedType.DeveloperSeed, SeedType.PublicSeed]:
continue
try:
if packaging.version.parse(installer["Version"]) > _newest_version:
_newest_version = packaging.version.parse(installer["Version"])
except packaging.version.InvalidVersion:
pass
# Next, remove all installers that are not the newest version
for installer in products:
if installer["Version"] is None:
continue
if not installer["Version"].startswith(version.value):
continue
try:
if packaging.version.parse(installer["Version"]) < _newest_version:
if installer in products_copy:
products_copy.pop(products_copy.index(installer))
except packaging.version.InvalidVersion:
pass
# Remove beta versions if a public release is available
if _newest_version != packaging.version.parse("0.0.0"):
if installer["Catalog"] in [SeedType.CustomerSeed, SeedType.DeveloperSeed, SeedType.PublicSeed]:
if installer in products_copy:
products_copy.pop(products_copy.index(installer))
# Remove EOL versions (older than n-3)
for installer in products:
if installer["Version"].split(".")[0] < supported_versions[-4].value:
if installer in products_copy:
products_copy.pop(products_copy.index(installer))
return products_copy
@cached_property
def products(self) -> None:
"""
Returns a list of products from the sucatalog
"""
catalog = self.catalog
_products = []
for product in catalog["Products"]:
# InstallAssistants.pkgs (macOS Installers) will have the following keys:
if self.ia_only:
if "ExtendedMetaInfo" not in catalog["Products"][product]:
continue
if "InstallAssistantPackageIdentifiers" not in catalog["Products"][product]["ExtendedMetaInfo"]:
continue
if "SharedSupport" not in catalog["Products"][product]["ExtendedMetaInfo"]["InstallAssistantPackageIdentifiers"]:
continue
_product_map = {
"ProductID": product,
"PostDate": catalog["Products"][product]["PostDate"],
"Title": None,
"Build": None,
"Version": None,
"Catalog": None,
# Optional keys if not InstallAssistant only:
# "Packages": None,
# Optional keys if InstallAssistant found:
# "InstallAssistant": {
# "URL": None,
# "Size": None,
# "XNUMajor": None,
# "IntegrityDataURL": None,
# "IntegrityDataSize": None
# },
}
# InstallAssistant logic
if "Packages" in catalog["Products"][product]:
# Add packages to product map if not InstallAssistant only
if self.ia_only is False:
_product_map["Packages"] = catalog["Products"][product]["Packages"]
for package in catalog["Products"][product]["Packages"]:
if "URL" in package:
if Path(package["URL"]).name == "InstallAssistant.pkg":
_product_map["InstallAssistant"] = {
"URL": package["URL"],
"Size": package["Size"],
"IntegrityDataURL": package["IntegrityDataURL"],
"IntegrityDataSize": package["IntegrityDataSize"]
}
if Path(package["URL"]).name not in ["Info.plist", "com_apple_MobileAsset_MacSoftwareUpdate.plist"]:
continue
net_obj = network_handler.NetworkUtilities().get(package["URL"])
if net_obj is None:
continue
contents = net_obj.content
try:
plist_contents = plistlib.loads(contents)
except plistlib.InvalidFileException:
continue
if plist_contents:
if Path(package["URL"]).name == "Info.plist":
result = self._legacy_parse_info_plist(plist_contents)
else:
result = self._parse_mobile_asset_plist(plist_contents)
if result == {"Missing VMM Support": True}:
_product_map = {}
break
_product_map.update(result)
if _product_map == {}:
continue
if _product_map["Version"] is not None:
_product_map["Title"] = self._build_installer_name(_product_map["Version"], _product_map["Catalog"])
# Fall back to English distribution if no version is found
if _product_map["Version"] is None:
url = None
if "Distributions" in catalog["Products"][product]:
if "English" in catalog["Products"][product]["Distributions"]:
url = catalog["Products"][product]["Distributions"]["English"]
elif "en" in catalog["Products"][product]["Distributions"]:
url = catalog["Products"][product]["Distributions"]["en"]
if url is None:
continue
net_obj = network_handler.NetworkUtilities().get(url)
if net_obj is None:
continue
contents = net_obj.content
_product_map.update(self._parse_english_distributions(contents))
if _product_map["Version"] is None:
if "ServerMetadataURL" in catalog["Products"][product]:
server_metadata_url = catalog["Products"][product]["ServerMetadataURL"]
net_obj = network_handler.NetworkUtilities().get(server_metadata_url)
if net_obj is None:
continue
server_metadata_contents = net_obj.content
try:
server_metadata_plist = plistlib.loads(server_metadata_contents)
except plistlib.InvalidFileException:
pass
if "CFBundleShortVersionString" in server_metadata_plist:
_product_map["Version"] = server_metadata_plist["CFBundleShortVersionString"]
if _product_map["Version"] is not None:
# Check if version is newer than the max version
if self.ia_only:
try:
if packaging.version.parse(_product_map["Version"]) > self.max_ia_version:
continue
except packaging.version.InvalidVersion:
pass
if _product_map["Build"] is not None:
if "InstallAssistant" in _product_map:
try:
# Grab first 2 characters of build
_product_map["InstallAssistant"]["XNUMajor"] = int(_product_map["Build"][:2])
except ValueError:
pass
# If version is still None, set to 0.0.0
if _product_map["Version"] is None:
_product_map["Version"] = "0.0.0"
_products.append(_product_map)
_products = sorted(_products, key=lambda x: x["Version"])
return _products
@cached_property
def latest_products(self) -> list:
"""
Returns a list of the latest products from the sucatalog
"""
return self._list_latest_installers_only(self.products)

View File

@@ -0,0 +1,175 @@
"""
url.py: Generate URL for Software Update Catalog
Usage:
>>> import sucatalog
>>> catalog_url = sucatalog.CatalogURL().url
https://swscan.apple.com/content/catalogs/others/index-15seed-15-14-13-12-10.16-10.15-10.14-10.13-10.12-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog
"""
import logging
import plistlib
from .constants import (
SeedType,
CatalogVersion,
CatalogExtension
)
from ..support import network_handler
class CatalogURL:
"""
Provides URL generation for Software Update Catalog
Args:
version (CatalogVersion): Version of macOS
seed (SeedType): Seed type
extension (CatalogExtension): Extension for the catalog URL
"""
def __init__(self,
version: CatalogVersion = CatalogVersion.SEQUOIA,
seed: SeedType = SeedType.PublicRelease,
extension: CatalogExtension = CatalogExtension.PLIST
) -> None:
self.version = version
self.seed = seed
self.extension = extension
self.seed = self._fix_seed_type()
self.version = self._fix_version()
def _fix_seed_type(self) -> SeedType:
"""
Fixes seed type for URL generation
"""
# Pre-Mountain Lion lacked seed types
if self.version in [CatalogVersion.LION, CatalogVersion.SNOW_LEOPARD, CatalogVersion.LEOPARD, CatalogVersion.TIGER]:
if self.seed != SeedType.PublicRelease:
logging.warning(f"{self.seed.name} not supported for {self.version.name}, defaulting to PublicRelease")
return SeedType.PublicRelease
# Pre-Yosemite lacked PublicSeed/CustomerSeed, thus override to DeveloperSeed
if self.version in [CatalogVersion.MAVERICKS, CatalogVersion.MOUNTAIN_LION]:
if self.seed in [SeedType.PublicSeed, SeedType.CustomerSeed]:
logging.warning(f"{self.seed.name} not supported for {self.version.name}, defaulting to DeveloperSeed")
return SeedType.DeveloperSeed
return self.seed
def _fix_version(self) -> CatalogVersion:
"""
Fixes version for URL generation
"""
if self.version == CatalogVersion.BIG_SUR:
return CatalogVersion.BIG_SUR_LEGACY
return self.version
def _fetch_versions_for_url(self) -> list:
"""
Fetches versions for URL generation
"""
versions: list = []
_did_hit_variant: bool = False
for variant in CatalogVersion:
# Avoid appending versions newer than the current version
if variant == self.version:
_did_hit_variant = True
if _did_hit_variant is False:
continue
# Skip invalid version
if variant in [CatalogVersion.BIG_SUR, CatalogVersion.TIGER]:
continue
versions.append(variant.value)
if self.version == CatalogVersion.SNOW_LEOPARD:
# Reverse list pre-Lion (ie. just Snow Leopard, since Lion is a list of one)
versions = versions[::-1]
return versions
def _construct_catalog_url(self) -> str:
"""
Constructs the catalog URL based on the seed type
"""
url: str = "https://swscan.apple.com/content/catalogs"
if self.version == CatalogVersion.TIGER:
url += "/index"
else:
url += "/others/index"
if self.seed in [SeedType.DeveloperSeed, SeedType.PublicSeed, SeedType.CustomerSeed]:
url += f"-{self.version.value}"
if self.version == CatalogVersion.MAVERICKS and self.seed == SeedType.CustomerSeed:
# Apple previously used 'publicseed' for CustomerSeed in Mavericks
url += "publicseed"
else:
url += f"{self.seed.value}"
# 10.10 and older don't append versions for CustomerSeed
if self.seed == SeedType.CustomerSeed and self.version in [
CatalogVersion.YOSEMITE,
CatalogVersion.MAVERICKS,
CatalogVersion.MOUNTAIN_LION,
CatalogVersion.LION,
CatalogVersion.SNOW_LEOPARD,
CatalogVersion.LEOPARD
]:
pass
else:
for version in self._fetch_versions_for_url():
url += f"-{version}"
if self.version != CatalogVersion.TIGER:
url += ".merged-1"
url += self.extension.value
return url
def catalog_url_to_seed(self, catalog_url: str) -> SeedType:
"""
Converts the Catalog URL to a SeedType
"""
if "beta" in catalog_url:
return SeedType.PublicSeed
elif "customerseed" in catalog_url:
return SeedType.CustomerSeed
elif "seed" in catalog_url:
return SeedType.DeveloperSeed
return SeedType.PublicRelease
@property
def url(self) -> str:
"""
Generate URL for Software Update Catalog
Returns:
str: URL for Software Update Catalog
"""
return self._construct_catalog_url()
@property
def url_contents(self) -> dict:
"""
Return URL contents
"""
try:
return plistlib.loads(network_handler.NetworkUtilities().get(self.url).content)
except Exception as e:
logging.error(f"Failed to fetch URL contents: {e}")
return None

View File

@@ -17,15 +17,14 @@ from .. import constants
from ..wx_gui import gui_entry
from ..efi_builder import build
from ..sys_patch import sys_patch
from ..sys_patch.auto_patcher import StartAutomaticPatching
from ..datasets import (
model_array,
os_data
)
from ..sys_patch import (
sys_patch,
sys_patch_auto
)
from . import (
utilities,
defaults,
@@ -118,7 +117,7 @@ class arguments:
"""
logging.info("Set Auto patching")
sys_patch_auto.AutomaticSysPatch(self.constants).start_auto_patch()
StartAutomaticPatching(self.constants).start_auto_patch()
def _prepare_for_update_handler(self) -> None:

View File

@@ -1,292 +0,0 @@
#################################################################################
# Copyright (C) 2009-2011 Vladimir "Farcaller" Pouzanov <farcaller@gmail.com> #
# #
# Permission is hereby granted, free of charge, to any person obtaining a copy #
# of this software and associated documentation files (the "Software"), to deal #
# in the Software without restriction, including without limitation the rights #
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell #
# copies of the Software, and to permit persons to whom the Software is #
# furnished to do so, subject to the following conditions: #
# #
# The above copyright notice and this permission notice shall be included in #
# all copies or substantial portions of the Software. #
# #
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR #
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, #
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE #
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER #
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, #
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN #
# THE SOFTWARE. #
#################################################################################
import struct
import codecs
from datetime import datetime, timedelta
class BPListWriter(object):
def __init__(self, objects):
self.bplist = ""
self.objects = objects
def binary(self):
'''binary -> string
Generates bplist
'''
self.data = 'bplist00'
# TODO: flatten objects and count max length size
# TODO: write objects and save offsets
# TODO: write offsets
# TODO: write metadata
return self.data
def write(self, filename):
'''
Writes bplist to file
'''
if self.bplist != "":
pass
# TODO: save self.bplist to file
else:
raise Exception('BPlist not yet generated')
class BPListReader(object):
def __init__(self, s):
self.data = s
self.objects = []
self.resolved = {}
def __unpackIntStruct(self, sz, s):
'''__unpackIntStruct(size, string) -> int
Unpacks the integer of given size (1, 2 or 4 bytes) from string
'''
if sz == 1:
ot = '!B'
elif sz == 2:
ot = '!H'
elif sz == 4:
ot = '!I'
elif sz == 8:
ot = '!Q'
else:
raise Exception('int unpack size '+str(sz)+' unsupported')
return struct.unpack(ot, s)[0]
def __unpackInt(self, offset):
'''__unpackInt(offset) -> int
Unpacks int field from plist at given offset
'''
return self.__unpackIntMeta(offset)[1]
def __unpackIntMeta(self, offset):
'''__unpackIntMeta(offset) -> (size, int)
Unpacks int field from plist at given offset and returns its size and value
'''
obj_header = self.data[offset]
obj_type, obj_info = (obj_header & 0xF0), (obj_header & 0x0F)
int_sz = 2**obj_info
return int_sz, self.__unpackIntStruct(int_sz, self.data[offset+1:offset+1+int_sz])
def __resolveIntSize(self, obj_info, offset):
'''__resolveIntSize(obj_info, offset) -> (count, offset)
Calculates count of objref* array entries and returns count and offset to first element
'''
if obj_info == 0x0F:
ofs, obj_count = self.__unpackIntMeta(offset+1)
objref = offset+2+ofs
else:
obj_count = obj_info
objref = offset+1
return obj_count, objref
def __unpackFloatStruct(self, sz, s):
'''__unpackFloatStruct(size, string) -> float
Unpacks the float of given size (4 or 8 bytes) from string
'''
if sz == 4:
ot = '!f'
elif sz == 8:
ot = '!d'
else:
raise Exception('float unpack size '+str(sz)+' unsupported')
return struct.unpack(ot, s)[0]
def __unpackFloat(self, offset):
'''__unpackFloat(offset) -> float
Unpacks float field from plist at given offset
'''
obj_header = self.data[offset]
obj_type, obj_info = (obj_header & 0xF0), (obj_header & 0x0F)
int_sz = 2**obj_info
return int_sz, self.__unpackFloatStruct(int_sz, self.data[offset+1:offset+1+int_sz])
def __unpackDate(self, offset):
td = int(struct.unpack(">d", self.data[offset+1:offset+9])[0])
return datetime(year=2001,month=1,day=1) + timedelta(seconds=td)
def __unpackItem(self, offset):
'''__unpackItem(offset)
Unpacks and returns an item from plist
'''
obj_header = self.data[offset]
obj_type, obj_info = (obj_header & 0xF0), (obj_header & 0x0F)
if obj_type == 0x00:
if obj_info == 0x00: # null 0000 0000
return None
elif obj_info == 0x08: # bool 0000 1000 // false
return False
elif obj_info == 0x09: # bool 0000 1001 // true
return True
elif obj_info == 0x0F: # fill 0000 1111 // fill byte
raise Exception("0x0F Not Implemented") # this is really pad byte, FIXME
else:
raise Exception('unpack item type '+str(obj_header)+' at '+str(offset)+ 'failed')
elif obj_type == 0x10: # int 0001 nnnn ... // # of bytes is 2^nnnn, big-endian bytes
return self.__unpackInt(offset)
elif obj_type == 0x20: # real 0010 nnnn ... // # of bytes is 2^nnnn, big-endian bytes
return self.__unpackFloat(offset)
elif obj_type == 0x30: # date 0011 0011 ... // 8 byte float follows, big-endian bytes
return self.__unpackDate(offset)
elif obj_type == 0x40: # data 0100 nnnn [int] ... // nnnn is number of bytes unless 1111 then int count follows, followed by bytes
obj_count, objref = self.__resolveIntSize(obj_info, offset)
return self.data[objref:objref+obj_count] # XXX: we return data as str
elif obj_type == 0x50: # string 0101 nnnn [int] ... // ASCII string, nnnn is # of chars, else 1111 then int count, then bytes
obj_count, objref = self.__resolveIntSize(obj_info, offset)
return self.data[objref:objref+obj_count]
elif obj_type == 0x60: # string 0110 nnnn [int] ... // Unicode string, nnnn is # of chars, else 1111 then int count, then big-endian 2-byte uint16_t
obj_count, objref = self.__resolveIntSize(obj_info, offset)
return self.data[objref:objref+obj_count*2].decode('utf-16be')
elif obj_type == 0x80: # uid 1000 nnnn ... // nnnn+1 is # of bytes
# FIXME: Accept as a string for now
obj_count, objref = self.__resolveIntSize(obj_info, offset)
return self.data[objref:objref+obj_count]
elif obj_type == 0xA0: # array 1010 nnnn [int] objref* // nnnn is count, unless '1111', then int count follows
obj_count, objref = self.__resolveIntSize(obj_info, offset)
arr = []
for i in range(obj_count):
arr.append(self.__unpackIntStruct(self.object_ref_size, self.data[objref+i*self.object_ref_size:objref+i*self.object_ref_size+self.object_ref_size]))
return arr
elif obj_type == 0xC0: # set 1100 nnnn [int] objref* // nnnn is count, unless '1111', then int count follows
# XXX: not serializable via apple implementation
raise Exception("0xC0 Not Implemented") # FIXME: implement
elif obj_type == 0xD0: # dict 1101 nnnn [int] keyref* objref* // nnnn is count, unless '1111', then int count follows
obj_count, objref = self.__resolveIntSize(obj_info, offset)
keys = []
for i in range(obj_count):
keys.append(self.__unpackIntStruct(self.object_ref_size, self.data[objref+i*self.object_ref_size:objref+i*self.object_ref_size+self.object_ref_size]))
values = []
objref += obj_count*self.object_ref_size
for i in range(obj_count):
values.append(self.__unpackIntStruct(self.object_ref_size, self.data[objref+i*self.object_ref_size:objref+i*self.object_ref_size+self.object_ref_size]))
dic = {}
for i in range(obj_count):
dic[keys[i]] = values[i]
return dic
else:
raise Exception('don\'t know how to unpack obj type '+hex(obj_type)+' at '+str(offset))
def __resolveObject(self, idx):
try:
return self.resolved[idx]
except KeyError:
obj = self.objects[idx]
if type(obj) == list:
newArr = []
for i in obj:
newArr.append(self.__resolveObject(i))
self.resolved[idx] = newArr
return newArr
if type(obj) == dict:
newDic = {}
for k,v in obj.items():
key_resolved = self.__resolveObject(k)
if isinstance(key_resolved, str):
rk = key_resolved
else:
rk = codecs.decode(key_resolved, "utf-8")
rv = self.__resolveObject(v)
newDic[rk] = rv
self.resolved[idx] = newDic
return newDic
else:
self.resolved[idx] = obj
return obj
def parse(self):
# read header
if self.data[:8] != b'bplist00':
raise Exception('Bad magic')
# read trailer
self.offset_size, self.object_ref_size, self.number_of_objects, self.top_object, self.table_offset = struct.unpack('!6xBB4xI4xI4xI', self.data[-32:])
#print "** plist offset_size:",self.offset_size,"objref_size:",self.object_ref_size,"num_objs:",self.number_of_objects,"top:",self.top_object,"table_ofs:",self.table_offset
# read offset table
self.offset_table = self.data[self.table_offset:-32]
self.offsets = []
ot = self.offset_table
for i in range(self.number_of_objects):
offset_entry = ot[:self.offset_size]
ot = ot[self.offset_size:]
self.offsets.append(self.__unpackIntStruct(self.offset_size, offset_entry))
#print "** plist offsets:",self.offsets
# read object table
self.objects = []
k = 0
for i in self.offsets:
obj = self.__unpackItem(i)
#print "** plist unpacked",k,type(obj),obj,"at",i
k += 1
self.objects.append(obj)
# rebuild object tree
#for i in range(len(self.objects)):
# self.__resolveObject(i)
# return root object
return self.__resolveObject(self.top_object)
@classmethod
def plistWithString(cls, s):
parser = cls(s)
return parser.parse()
# helpers for testing
def plist(obj):
from Foundation import NSPropertyListSerialization, NSPropertyListBinaryFormat_v1_0
b = NSPropertyListSerialization.dataWithPropertyList_format_options_error_(obj, NSPropertyListBinaryFormat_v1_0, 0, None)
return str(b.bytes())
def unplist(s):
from Foundation import NSData, NSPropertyListSerialization
d = NSData.dataWithBytes_length_(s, len(s))
return NSPropertyListSerialization.propertyListWithData_options_format_error_(d, 0, None, None)
if __name__ == "__main__":
import os
import sys
import json
file_path = sys.argv[1]
with open(file_path, "rb") as fp:
data = fp.read()
out = BPListReader(data).parse()
with open(file_path + ".json", "w") as fp:
json.dump(out, indent=4)

View File

@@ -2,8 +2,12 @@
defaults.py: Generate default data for host/target
"""
import logging
import plistlib
import subprocess
from pathlib import Path
from .. import constants
from ..detections import device_probe
@@ -22,19 +26,52 @@ from ..datasets import (
class GenerateDefaults:
def __init__(self, model: str, host_is_target: bool, global_constants: constants.Constants) -> None:
def __init__(self, model: str, host_is_target: bool, global_constants: constants.Constants, ignore_settings_file: bool = False) -> None:
self.constants: constants.Constants = global_constants
self.model: str = model
self.host_is_target: bool = host_is_target
self.ignore_settings_file: bool = ignore_settings_file
# Reset Variables
self.constants.sip_status = True
self.constants.secure_status = False
self.constants.disable_cs_lv = False
self.constants.disable_amfi = False
self.constants.fu_status = True
self.constants.fu_status = False
# Reset Variables - GUI override
# Match constants.py for model specific settings
# TODO: Write a sane system for this...
self.constants.firewire_boot = False
self.constants.xhci_boot = False
self.constants.nvme_boot = False
self.constants.force_quad_thread = False
self.constants.enable_wake_on_wlan = False
self.constants.disable_tb = False
self.constants.dGPU_switch = False
self.constants.disallow_cpufriend = False
self.constants.disable_mediaanalysisd = False
self.constants.set_alc_usage = True
self.constants.nvram_write = True
self.constants.allow_nvme_fixing = True
self.constants.allow_3rd_party_drives = True
self.constants.disable_fw_throttle = False
self.constants.software_demux = False
self.constants.disable_connectdrivers = False
self.constants.amd_gop_injection = False
self.constants.nvidia_kepler_gop_injection = False
self.constants.disable_cs_lv = False
self.constants.disable_amfi = False
self.constants.secure_status = False
self.constants.serial_settings = "None"
self.constants.override_smbios = "Default"
self.constants.allow_native_spoofs = False
self.constants.allow_oc_everywhere = False
self.constants.sip_status = True
self.constants.custom_sip_value = None
self.constants.fu_arguments = None
@@ -55,6 +92,8 @@ class GenerateDefaults:
self._misc_hardwares_probe()
self._smbios_probe()
self._check_amfipass_supported()
self._load_gui_defaults()
def _general_probe(self) -> None:
"""
@@ -71,6 +110,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 +159,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:
@@ -181,7 +224,6 @@ class GenerateDefaults:
is_modern_wifi = True
else:
print("Checking WiFi")
if self.model not in smbios_data.smbios_dictionary:
return
if (
@@ -198,7 +240,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,16 +247,18 @@ 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
# AirPlay to Mac was unsupported regardless, so we can safely disable it
self.constants.fu_status = True
self.constants.fu_arguments = " -disable_sidecar_mac"
# if is_legacy_wifi is True:
# # 13.0: Enabling AirPlay to Mac patches breaks Control Center on legacy chipsets
# # AirPlay to Mac was unsupported regardless, so we can safely disable it
# self.constants.fu_arguments = " -disable_sidecar_mac"
def _misc_hardwares_probe(self) -> None:
@@ -268,6 +311,7 @@ class GenerateDefaults:
device_probe.NVIDIA.Archs.Kepler,
]:
self.constants.disable_amfi = True
self.constants.disable_mediaanalysisd = True
if arch in [
device_probe.AMD.Archs.Legacy_GCN_7000,
@@ -359,3 +403,46 @@ class GenerateDefaults:
self.constants.disable_amfi = False
self.constants.disable_cs_lv = False
def _load_gui_defaults(self) -> None:
"""
Load GUI defaults from global settings
"""
if not self.host_is_target:
return
if self.ignore_settings_file is True:
return
settings_plist = global_settings.GlobalEnviromentSettings().global_settings_plist
if not Path(settings_plist).exists():
return
try:
plist = plistlib.load(Path(settings_plist).open("rb"))
except Exception as e:
logging.error("Error: Unable to read global settings file")
logging.error(e)
return
for key in plist:
if not key.startswith("GUI:"):
continue
constants_key = key.replace("GUI:", "")
if plist[key] == "PYTHON_NONE_VALUE":
plist[key] = None
if hasattr(self.constants, constants_key):
# Check if type is different
original_type = type(getattr(self.constants, constants_key))
new_type = type(plist[key])
if original_type != new_type:
logging.error(f"Global settings type mismatch for {constants_key}: {original_type} vs {new_type}")
logging.error(f"Removing {key} from global settings")
global_settings.GlobalEnviromentSettings().delete_property(key)
continue
logging.info(f"Setting {constants_key} to {plist[key]}")
setattr(self.constants, constants_key, plist[key])

View File

@@ -7,12 +7,9 @@ This is to ensure compatibility when running without a user
ie. during automated patching
"""
import os
import logging
import plistlib
from . import subprocess_wrapper
from pathlib import Path
@@ -47,6 +44,25 @@ class GlobalEnviromentSettings:
return None
def delete_property(self, property_name: str) -> None:
"""
Deletes a property from the global settings file
"""
if Path(self.global_settings_plist).exists():
try:
plist = plistlib.load(Path(self.global_settings_plist).open("rb"))
except Exception as e:
logging.error("Error: Unable to read global settings file")
logging.error(e)
return
if property_name in plist:
del plist[property_name]
try:
plistlib.dump(plist, Path(self.global_settings_plist).open("wb"))
except PermissionError:
logging.info("Failed to write to global settings")
def write_property(self, property_name: str, property_value) -> None:
"""
Writes a property to the global settings file

View File

@@ -5,7 +5,7 @@ install.py: Installation of OpenCore files to ESP
import logging
import plistlib
import subprocess
import applescript
import re
from pathlib import Path
@@ -13,8 +13,6 @@ from . import utilities, subprocess_wrapper
from .. import constants
from ..datasets import os_data
class tui_disk_installation:
def __init__(self, versions):
@@ -30,9 +28,15 @@ class tui_disk_installation:
# Sierra and older
disks = plistlib.loads(subprocess.run(["/usr/sbin/diskutil", "list", "-plist"], stdout=subprocess.PIPE).stdout.decode().strip().encode())
for disk in disks["AllDisksAndPartitions"]:
disk_info = plistlib.loads(subprocess.run(["/usr/sbin/diskutil", "info", "-plist", disk["DeviceIdentifier"]], stdout=subprocess.PIPE).stdout.decode().strip().encode())
try:
all_disks[disk["DeviceIdentifier"]] = {"identifier": disk_info["DeviceNode"], "name": disk_info["MediaName"], "size": disk_info["TotalSize"], "partitions": {}}
disk_info = plistlib.loads(subprocess.run(["/usr/sbin/diskutil", "info", "-plist", disk["DeviceIdentifier"]], stdout=subprocess.PIPE).stdout.decode().strip().encode())
except:
# Chinesium USB can have garbage data in MediaName
diskutil_output = subprocess.run(["/usr/sbin/diskutil", "info", "-plist", disk["DeviceIdentifier"]], stdout=subprocess.PIPE).stdout.decode().strip()
ungarbafied_output = re.sub(r'(<key>MediaName</key>\s*<string>).*?(</string>)', r'\1\2', diskutil_output).encode()
disk_info = plistlib.loads(ungarbafied_output)
try:
all_disks[disk["DeviceIdentifier"]] = {"identifier": disk_info["DeviceNode"], "name": disk_info.get("MediaName", "Disk"), "size": disk_info["TotalSize"], "partitions": {}}
for partition in disk["Partitions"]:
partition_info = plistlib.loads(subprocess.run(["/usr/sbin/diskutil", "info", "-plist", partition["DeviceIdentifier"]], stdout=subprocess.PIPE).stdout.decode().strip().encode())
all_disks[disk["DeviceIdentifier"]]["partitions"][partition["DeviceIdentifier"]] = {
@@ -101,7 +105,7 @@ class tui_disk_installation:
partition_info = plistlib.loads(subprocess.run(["/usr/sbin/diskutil", "info", "-plist", full_disk_identifier], stdout=subprocess.PIPE).stdout.decode().strip().encode())
parent_disk = partition_info["ParentWholeDisk"]
drive_host_info = plistlib.loads(subprocess.run(["/usr/sbin/diskutil", "info", "-plist", parent_disk], stdout=subprocess.PIPE).stdout.decode().strip().encode())
sd_type = drive_host_info["MediaName"]
sd_type = drive_host_info.get("MediaName", "Disk")
try:
ssd_type = drive_host_info["SolidState"]
except KeyError:

View File

@@ -2,7 +2,6 @@
kdk_handler.py: Module for parsing and determining best Kernel Debug Kit for host OS
"""
import os
import logging
import plistlib
import requests
@@ -16,6 +15,7 @@ from pathlib import Path
from .. import constants
from ..datasets import os_data
from ..volume import generate_copy_arguments
from . import (
network_handler,
@@ -668,7 +668,7 @@ class KernelDebugKitUtilities:
logging.info("Backup already exists, skipping")
return
result = subprocess_wrapper.run_as_root(["/bin/cp", "-R", kdk_path, kdk_dst_path], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
result = subprocess_wrapper.run_as_root(generate_copy_arguments(kdk_path, kdk_dst_path), stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
if result.returncode != 0:
logging.info("Failed to create KDK backup:")
subprocess_wrapper.log(result)

View File

@@ -18,8 +18,7 @@ from .. import constants
from . import (
analytics_handler,
global_settings,
subprocess_wrapper
global_settings
)
@@ -201,7 +200,6 @@ class InitializeLoggingSupport:
return
if self.constants.cli_mode is True:
threading.Thread(target=analytics_handler.Analytics(self.constants).send_crash_report, args=(self.log_filepath,)).start()
return
error_msg = f"OpenCore Legacy Patcher encountered the following internal error:\n\n"
@@ -209,17 +207,7 @@ class InitializeLoggingSupport:
if tb:
error_msg += f"\n\n{traceback.extract_tb(tb)[-1]}"
cant_log: bool = global_settings.GlobalEnviromentSettings().read_property("DisableCrashAndAnalyticsReporting")
if not isinstance(cant_log, bool):
cant_log = False
if self.constants.commit_info[0].startswith("refs/tags"):
cant_log = True
if cant_log is True:
error_msg += "\n\nReveal log file?"
else:
error_msg += "\n\nSend crash report to Dortania?"
error_msg += "\n\nReveal log file?"
# Ask user if they want to send crash report
try:
@@ -231,11 +219,7 @@ class InitializeLoggingSupport:
if result[applescript.AEType(b'bhit')] != "Yes":
return
if cant_log is True:
subprocess.run(["/usr/bin/open", "--reveal", self.log_filepath])
return
threading.Thread(target=analytics_handler.Analytics(self.constants).send_crash_report, args=(self.log_filepath,)).start()
subprocess.run(["/usr/bin/open", "--reveal", self.log_filepath])
def custom_thread_excepthook(args) -> None:

View File

@@ -1,47 +1,29 @@
"""
macos_installer_handler.py: Handler for macOS installers, both local and remote
macos_installer_handler.py: Handler for local macOS installers
"""
import enum
import logging
import plistlib
import tempfile
import subprocess
import applescript
import re
from pathlib import Path
from ..datasets import os_data
from . import (
network_handler,
utilities,
subprocess_wrapper
)
from ..volume import (
can_copy_on_write,
generate_copy_arguments
)
APPLICATION_SEARCH_PATH: str = "/Applications"
SFR_SOFTWARE_UPDATE_PATH: str = "SFR/com_apple_MobileAsset_SFRSoftwareUpdate/com_apple_MobileAsset_SFRSoftwareUpdate.xml"
CATALOG_URL_BASE: str = "https://swscan.apple.com/content/catalogs/others/index"
CATALOG_URL_EXTENSION: str = ".merged-1.sucatalog"
CATALOG_URL_VARIANTS: list = [
"15",
"14",
"13",
"12",
"10.16",
"10.15",
"10.14",
"10.13",
"10.12",
"10.11",
"10.10",
"10.9",
"mountainlion",
"lion",
"snowleopard",
"leopard",
]
tmp_dir = tempfile.TemporaryDirectory()
@@ -113,13 +95,9 @@ class InstallerCreation():
for file in Path(ia_tmp).glob("*"):
subprocess.run(["/bin/rm", "-rf", str(file)])
# Copy installer to tmp (use CoW to avoid extra disk writes)
args = ["/bin/cp", "-cR", installer_path, ia_tmp]
if utilities.check_filesystem_type() != "apfs":
# HFS+ disks do not support CoW
args[1] = "-R"
# Ensure we have enough space for the duplication
# Copy installer to tmp
if can_copy_on_write(installer_path, ia_tmp) is False:
# Ensure we have enough space for the duplication when CoW is not supported
space_available = utilities.get_free_space()
space_needed = Path(ia_tmp).stat().st_size
if space_available < space_needed:
@@ -127,7 +105,7 @@ class InstallerCreation():
logging.info(f"{utilities.human_fmt(space_available)} available, {utilities.human_fmt(space_needed)} required")
return False
subprocess.run(args)
subprocess.run(generate_copy_arguments(installer_path, ia_tmp))
# Adjust installer_path to point to the copied installer
installer_path = Path(ia_tmp) / Path(Path(installer_path).name)
@@ -157,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
@@ -193,9 +171,15 @@ fi
disks = plistlib.loads(subprocess.run(["/usr/sbin/diskutil", "list", "-plist"], stdout=subprocess.PIPE).stdout.decode().strip().encode())
for disk in disks["AllDisksAndPartitions"]:
disk_info = plistlib.loads(subprocess.run(["/usr/sbin/diskutil", "info", "-plist", disk["DeviceIdentifier"]], stdout=subprocess.PIPE).stdout.decode().strip().encode())
try:
all_disks[disk["DeviceIdentifier"]] = {"identifier": disk_info["DeviceNode"], "name": disk_info["MediaName"], "size": disk_info["TotalSize"], "removable": disk_info["Internal"], "partitions": {}}
disk_info = plistlib.loads(subprocess.run(["/usr/sbin/diskutil", "info", "-plist", disk["DeviceIdentifier"]], stdout=subprocess.PIPE).stdout.decode().strip().encode())
except:
# Chinesium USB can have garbage data in MediaName
diskutil_output = subprocess.run(["/usr/sbin/diskutil", "info", "-plist", disk["DeviceIdentifier"]], stdout=subprocess.PIPE).stdout.decode().strip()
ungarbafied_output = re.sub(r'(<key>MediaName</key>\s*<string>).*?(</string>)', r'\1\2', diskutil_output).encode()
disk_info = plistlib.loads(ungarbafied_output)
try:
all_disks[disk["DeviceIdentifier"]] = {"identifier": disk_info["DeviceNode"], "name": disk_info.get("MediaName", "Disk"), "size": disk_info["TotalSize"], "removable": disk_info["Internal"], "partitions": {}}
except KeyError:
# Avoid crashing with CDs installed
continue
@@ -221,288 +205,6 @@ fi
return list_disks
class SeedType(enum.IntEnum):
"""
Enum for catalog types
Variants:
DeveloperSeed: Developer Beta (Part of the Apple Developer Program)
PublicSeed: Public Beta
CustomerSeed: AppleSeed Program (Generally mirrors DeveloperSeed)
PublicRelease: Public Release
"""
DeveloperSeed: int = 0
PublicSeed: int = 1
CustomerSeed: int = 2
PublicRelease: int = 3
class RemoteInstallerCatalog:
"""
Parses Apple's Software Update catalog and finds all macOS installers.
"""
def __init__(self, seed_override: SeedType = SeedType.PublicRelease, os_override: int = os_data.os_data.sonoma) -> None:
self.catalog_url: str = self._construct_catalog_url(seed_override, os_override)
self.available_apps: dict = self._parse_catalog()
self.available_apps_latest: dict = self._list_newest_installers_only()
def _construct_catalog_url(self, seed_type: SeedType, os_kernel: int) -> str:
"""
Constructs the catalog URL based on the seed type
Parameters:
seed_type (SeedType): The seed type to use
Returns:
str: The catalog URL
"""
url: str = CATALOG_URL_BASE
os_version: str = os_data.os_conversion.kernel_to_os(os_kernel)
os_version = "10.16" if os_version == "11" else os_version
if os_version not in CATALOG_URL_VARIANTS:
logging.error(f"OS version {os_version} is not supported, defaulting to latest")
os_version = CATALOG_URL_VARIANTS[0]
url += f"-{os_version}"
if seed_type == SeedType.DeveloperSeed:
url += f"seed"
elif seed_type == SeedType.PublicSeed:
url += f"beta"
elif seed_type == SeedType.CustomerSeed:
url += f"customerseed"
did_find_variant: bool = False
for variant in CATALOG_URL_VARIANTS:
if variant in url:
did_find_variant = True
if did_find_variant:
url += f"-{variant}"
url += f"{CATALOG_URL_EXTENSION}"
return url
def _fetch_catalog(self) -> dict:
"""
Fetches the catalog from Apple's servers
Returns:
dict: The catalog as a dictionary
"""
catalog: dict = {}
if network_handler.NetworkUtilities(self.catalog_url).verify_network_connection() is False:
return catalog
try:
catalog = plistlib.loads(network_handler.NetworkUtilities().get(self.catalog_url).content)
except plistlib.InvalidFileException:
return {}
return catalog
def _parse_catalog(self) -> dict:
"""
Parses the catalog and returns a dictionary of available installers
Returns:
dict: Dictionary of available installers
"""
available_apps: dict = {}
catalog: dict = self._fetch_catalog()
if not catalog:
return available_apps
if "Products" not in catalog:
return available_apps
for product in catalog["Products"]:
if "ExtendedMetaInfo" not in catalog["Products"][product]:
continue
if "Packages" not in catalog["Products"][product]:
continue
if "InstallAssistantPackageIdentifiers" not in catalog["Products"][product]["ExtendedMetaInfo"]:
continue
if "SharedSupport" not in catalog["Products"][product]["ExtendedMetaInfo"]["InstallAssistantPackageIdentifiers"]:
continue
if "BuildManifest" not in catalog["Products"][product]["ExtendedMetaInfo"]["InstallAssistantPackageIdentifiers"]:
continue
for bm_package in catalog["Products"][product]["Packages"]:
if "Info.plist" not in bm_package["URL"]:
continue
if "InstallInfo.plist" in bm_package["URL"]:
continue
try:
build_plist = plistlib.loads(network_handler.NetworkUtilities().get(bm_package["URL"]).content)
except plistlib.InvalidFileException:
continue
if "MobileAssetProperties" not in build_plist:
continue
if "SupportedDeviceModels" not in build_plist["MobileAssetProperties"]:
continue
if "OSVersion" not in build_plist["MobileAssetProperties"]:
continue
if "Build" not in build_plist["MobileAssetProperties"]:
continue
# Ensure Apple Silicon specific Installers are not listed
if "VMM-x86_64" not in build_plist["MobileAssetProperties"]["SupportedDeviceModels"]:
continue
version = build_plist["MobileAssetProperties"]["OSVersion"]
build = build_plist["MobileAssetProperties"]["Build"]
try:
catalog_url = build_plist["MobileAssetProperties"]["BridgeVersionInfo"]["CatalogURL"]
if "beta" in catalog_url:
catalog_url = "PublicSeed"
elif "customerseed" in catalog_url:
catalog_url = "CustomerSeed"
elif "seed" in catalog_url:
catalog_url = "DeveloperSeed"
else:
catalog_url = "Public"
except KeyError:
# Assume Public if no catalog URL is found
catalog_url = "Public"
download_link = None
integrity = None
size = None
date = catalog["Products"][product]["PostDate"]
for ia_package in catalog["Products"][product]["Packages"]:
if "InstallAssistant.pkg" not in ia_package["URL"]:
continue
if "URL" not in ia_package:
continue
if "IntegrityDataURL" not in ia_package:
continue
download_link = ia_package["URL"]
integrity = ia_package["IntegrityDataURL"]
size = ia_package["Size"] if ia_package["Size"] else 0
if any([version, build, download_link, size, integrity]) is None:
continue
available_apps.update({
product: {
"Version": version,
"Build": build,
"Link": download_link,
"Size": size,
"integrity": integrity,
"Source": "Apple Inc.",
"Variant": catalog_url,
"OS": os_data.os_conversion.os_to_kernel(version),
"Models": build_plist["MobileAssetProperties"]["SupportedDeviceModels"],
"Date": date
}
})
available_apps = {k: v for k, v in sorted(available_apps.items(), key=lambda x: x[1]['Version'])}
return available_apps
def _list_newest_installers_only(self) -> dict:
"""
Returns a dictionary of the newest macOS installers only.
Primarily used to avoid overwhelming the user with a list of
installers that are not the newest version.
Returns:
dict: A dictionary of the newest macOS installers only.
"""
if self.available_apps is None:
return {}
newest_apps: dict = self.available_apps.copy()
supported_versions = ["10.13", "10.14", "10.15", "11", "12", "13", "14"]
for version in supported_versions:
remote_version_minor = 0
remote_version_security = 0
os_builds = []
# First determine the largest version
for ia in newest_apps:
if newest_apps[ia]["Version"].startswith(version):
if newest_apps[ia]["Variant"] not in ["CustomerSeed", "DeveloperSeed", "PublicSeed"]:
remote_version = newest_apps[ia]["Version"].split(".")
if remote_version[0] == "10":
remote_version.pop(0)
remote_version.pop(0)
else:
remote_version.pop(0)
if int(remote_version[0]) > remote_version_minor:
remote_version_minor = int(remote_version[0])
remote_version_security = 0 # Reset as new minor version found
if len(remote_version) > 1:
if int(remote_version[1]) > remote_version_security:
remote_version_security = int(remote_version[1])
# Now remove all versions that are not the largest
for ia in list(newest_apps):
# Don't use Beta builds to determine latest version
if newest_apps[ia]["Variant"] in ["CustomerSeed", "DeveloperSeed", "PublicSeed"]:
continue
if newest_apps[ia]["Version"].startswith(version):
remote_version = newest_apps[ia]["Version"].split(".")
if remote_version[0] == "10":
remote_version.pop(0)
remote_version.pop(0)
else:
remote_version.pop(0)
if int(remote_version[0]) < remote_version_minor:
newest_apps.pop(ia)
continue
if int(remote_version[0]) == remote_version_minor:
if len(remote_version) > 1:
if int(remote_version[1]) < remote_version_security:
newest_apps.pop(ia)
continue
else:
if remote_version_security > 0:
newest_apps.pop(ia)
continue
# Remove duplicate builds
# ex. macOS 12.5.1 has 2 builds in the Software Update Catalog
# ref: https://twitter.com/classicii_mrmac/status/1560357471654379522
if newest_apps[ia]["Build"] in os_builds:
newest_apps.pop(ia)
continue
os_builds.append(newest_apps[ia]["Build"])
# Remove Betas if there's a non-beta version available
for ia in list(newest_apps):
if newest_apps[ia]["Variant"] in ["CustomerSeed", "DeveloperSeed", "PublicSeed"]:
for ia2 in newest_apps:
if newest_apps[ia2]["Version"].split(".")[0] == newest_apps[ia]["Version"].split(".")[0] and newest_apps[ia2]["Variant"] not in ["CustomerSeed", "DeveloperSeed", "PublicSeed"]:
newest_apps.pop(ia)
break
return newest_apps
class LocalInstallerCatalog:
"""
Finds all macOS installers on the local machine.
@@ -641,9 +343,15 @@ class LocalInstallerCatalog:
if output.returncode != 0:
return (detected_build, detected_os)
ss_info = Path(SFR_SOFTWARE_UPDATE_PATH)
if Path(tmpdir / ss_info).exists():
ss_info_files = [
Path("SFR/com_apple_MobileAsset_SFRSoftwareUpdate/com_apple_MobileAsset_SFRSoftwareUpdate.xml"),
Path("com_apple_MobileAsset_MacSoftwareUpdate/com_apple_MobileAsset_MacSoftwareUpdate.xml")
]
for ss_info in ss_info_files:
if not Path(tmpdir / ss_info).exists():
continue
plist = plistlib.load((tmpdir / ss_info).open("rb"))
if "Assets" in plist:
if "Build" in plist["Assets"][0]:

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

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