Compare commits

...

40 Commits
2.3.2 ... 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
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
24 changed files with 211 additions and 170 deletions

View File

@@ -1,5 +1,15 @@
# 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:

View File

@@ -5,7 +5,7 @@
* [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)
@@ -105,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

@@ -2,6 +2,7 @@
* [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)
@@ -27,6 +28,15 @@ The patcher application requires **OS X Yosemite 10.10** or later to run.
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.
@@ -73,7 +83,9 @@ It is extremely recommended to disable automatic updates (even downloading) when
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.
### Disabling updates
* 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:**
@@ -83,6 +95,8 @@ System Settings -> General -> Software Update -> (i) button next to Automatic Up
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.
@@ -115,7 +129,7 @@ Since macOS Ventura, AVX2 is required from all Macs supported by it. While OCLP
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.
Earliest Mac models supporting AVX instruction:
::: details Earliest Mac models supporting AVX instruction (click to expand)
- Macmini5,x (2011)
- iMac12,x (2011)
@@ -123,8 +137,9 @@ Earliest Mac models supporting AVX instruction:
- MacBookAir4,x (2011)
- MacBook8,x (2015)
- MacPro6,1 (2013)
:::
Earliest Mac models supporting AVX2 instruction:
::: details Earliest Mac models supporting AVX2 instruction (click to expand)
- Macmini7,x (2014)
- iMac14,x (2013)
@@ -132,29 +147,33 @@ Earliest Mac models supporting AVX2 instruction:
- 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.
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.
GPUs that support Metal are as follows:
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 and newer (GCN 1)
* 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. A great rule of thumb is that Macs older than 2012 are non-Metal, with the exception of systems with upgradable GPUs. 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.
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) and [Working Around Non-Metal Issues](https://dortania.github.io/OpenCore-Legacy-Patcher/ACCEL.html) pages for more information.
:::
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.
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

View File

@@ -4,6 +4,8 @@ This document is centered around downloading and writing the macOS installer to
* 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.
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.
## Downloading the installer

View File

@@ -78,29 +78,8 @@ While USB 1.1 may seem unimportant, it handles many important devices on your sy
* IR Receivers
* Bluetooth
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.
However, the driver has recently been weakened starting from Sonoma, which means even some USB hubs may not work properly.
An alternative way is making sure to enable "Remote Login" in General -> Sharing before updating, which will enable SSH.
That means you can take control using Terminal in another system by typing `ssh username@lan-ip-address` and your password.
After that run Post Install Volume Patching by typing `/Applications/OpenCore-Patcher.app/Contents/MacOS/OpenCore-Patcher --patch_sys_vol` and finally `sudo reboot`.
![](./images/usb11-chart.png)
::: warning The following systems rely on USB 1.1
* iMac10,x and older
* Macmini4,1 and older
* MacBook7,1 and older
* MacBookAir3,1 and older
* MacPro5,1 and older
* Xserve 3,1 and older
:::
[More information here](https://github.com/dortania/OpenCore-Legacy-Patcher/issues/1021)
### Graphics support and issues
This build includes both Legacy Metal and non-Metal patches for macOS Sequoia. Refer to the following links for more information about Legacy Metal and non-Metal support and their respective issues.

View File

@@ -6,15 +6,6 @@
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)
@@ -71,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

@@ -1,10 +1,31 @@
# 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.
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.
However, as an unfortunate side effect, restoring via Time Machine breaks while root patches are installed and restoring a root patched machine requires a few tricks to avoid a kernel panic.
::: 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)
To ensure a smooth Time Machine restore, follow the steps listed under:
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.
@@ -16,10 +37,3 @@ To ensure a smooth Time Machine restore, follow the steps listed under:
Now you should be fully restored with Time Machine and also running with all patches.
::: warning Sequoia Note
Time Machine restoring seems to be currently broken on Sequoia even after uninstalling root patches, leading to a loop with "Migration Finished" window. Currently the only way is to restore on older OS and then upgrade to Sequoia.
:::

View File

@@ -30,10 +30,10 @@ Here are some common errors that users may experience while using this patcher:
## 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.
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
/Applications/OpenCore-Patcher.app/Contents/MacOS/OpenCore-Patcher
/Library/Application Support/Dortania/OpenCore-Patcher.app/Contents/MacOS/OpenCore-Patcher
```
## "You don't have permission to save..." error when creating USB installer
@@ -108,11 +108,26 @@ There are two ways to to try and resolve this.
## System version mismatch error when root patching
Updates from now on modify the system volume already while downloading, which can lead to broken patches out of a sudden as well as a "version mismatch" error while root patching, since the operating system gets into a liminal state between two versions. The "version mismatch" error is a safeguard preventing OCLP from patching on a system that is in a weird liminal state, to avoid leading to a very likely boot failure.
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:
Currently there is a "PurgePendingUpdate" tool available [on the Discord server](https://discord.com/channels/417165963327176704/1037474131526029362/1255993208966742108) you can download and then run it in Terminal, to get rid of a pending update. This may be integrated into OCLP later on, however there is currently no ETA.
`SystemVersion.plist build version mismatch: found 15.4 (24E247), expected 13.7.5 (22H527)`
Disabling automatic macOS updates is extremely recommended once recovered, to prevent it from happening again.
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:**
@@ -122,6 +137,8 @@ System Settings -> General -> Software Update -> (i) button next to Automatic Up
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.**
@@ -282,24 +299,10 @@ The reason for this is that the autopatcher will assume that you will be using t
## 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.
::: warning Note
In macOS Sonoma, this seems to have been further weakened and some hubs may not be functional.
Alternative way is making sure to enable "Remote Login" in General -> Sharing before updating, which will enable SSH. That means you can take control using Terminal in another system by typing `ssh username@lan-ip-address` and your password. After that run Post Install Volume Patching by typing `/Applications/OpenCore-Patcher.app/Contents/MacOS/OpenCore-Patcher --patch_sys_vol` and finally `sudo reboot`.
:::
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
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 |
@@ -311,10 +314,34 @@ Applicable models include:
| 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.

View File

@@ -4,28 +4,33 @@ This guide tells you different ways to uninstall OCLP and/or patches.
## Delete everything and revert back to native macOS
Boot a native macOS installer, go to Disk Utility and choose View -> Show All Devices. Wipe the full disk by choosing the top option on the left sidebar and start macOS installation.
[Reset NVRAM](https://support.apple.com/HT204063) afterwards.
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 the application
To fully 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 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.
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)
@@ -37,3 +42,4 @@ Note that after you remove OpenCore, your Mac will no longer boot and show the "
:::

View File

@@ -33,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.
@@ -64,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)

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

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,8 +13,8 @@ from .detections import device_probe
class Constants:
def __init__(self) -> None:
# Patcher Versioning
self.patcher_version: str = "2.3.2" # OpenCore-Legacy-Patcher
self.patcher_support_pkg_version: str = "1.9.3" # PatcherSupportPkg
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"
@@ -155,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)

View File

@@ -112,6 +112,24 @@ class USB11Controller(BaseHardware):
}
def _usb_webcam_patches(self) -> dict:
"""
Patches for USB 1.1 Webcam
"""
if self._xnu_major < os_data.sequoia.value:
return {}
return {
"Legacy USB 1.1 Webcam": {
PatchType.MERGE_SYSTEM_VOLUME: {
"/System/Library/Frameworks": {
"IOUSBHost.framework": "14.6.1",
},
},
},
}
def patches(self) -> dict:
"""
Patches for USB 1.1 Controller
@@ -122,4 +140,5 @@ class USB11Controller(BaseHardware):
return {
**self._base_patches(),
**self._extended_patches(),
**self._usb_webcam_patches(),
}

View File

@@ -6,6 +6,7 @@ import wx
import logging
import threading
import traceback
import time
from .. import constants
@@ -101,12 +102,12 @@ class BuildFrame(wx.Frame):
"""
while gui_support.PayloadMount(self.constants, self).is_unpack_finished() is False:
wx.Yield()
time.sleep(self.constants.thread_sleep_interval)
thread = threading.Thread(target=self._build)
thread.start()
while thread.is_alive():
wx.Yield()
gui_support.wait_for_thread(thread)
self.return_button.Enable()

View File

@@ -76,13 +76,11 @@ class OSUpdateFrame(wx.Frame):
if results[HardwarePatchsetSettings.KERNEL_DEBUG_KIT_REQUIRED] is True:
kdk_thread = threading.Thread(target=_kdk_thread_spawn)
kdk_thread.start()
while kdk_thread.is_alive():
wx.Yield()
gui_support.wait_for_thread(kdk_thread)
if results[HardwarePatchsetSettings.METALLIB_SUPPORT_PKG_REQUIRED] is True:
metallib_thread = threading.Thread(target=_metallib_thread_spawn)
metallib_thread.start()
while metallib_thread.is_alive():
wx.Yield()
gui_support.wait_for_thread(metallib_thread)
download_objects = {
@@ -149,8 +147,7 @@ class OSUpdateFrame(wx.Frame):
kdk_checksum_thread = threading.Thread(target=_validate_kdk_checksum_thread)
kdk_checksum_thread.start()
while kdk_checksum_thread.is_alive():
wx.Yield()
gui_support.wait_for_thread(kdk_checksum_thread)
if self.kdk_checksum_result is False:
logging.error("KDK checksum validation failed")
@@ -172,8 +169,7 @@ class OSUpdateFrame(wx.Frame):
kdk_install_thread = threading.Thread(target=_install_kdk_thread)
kdk_install_thread.start()
while kdk_install_thread.is_alive():
wx.Yield()
gui_support.wait_for_thread(kdk_install_thread)
if self.kdk_install_result is False:
logging.info("Failed to install KDK")
@@ -194,8 +190,7 @@ class OSUpdateFrame(wx.Frame):
metallib_install_thread = threading.Thread(target=_install_metallib_thread)
metallib_install_thread.start()
while metallib_install_thread.is_alive():
wx.Yield()
gui_support.wait_for_thread(metallib_install_thread)
if self.metallib_install_result is False:
logging.info("Failed to install Metallib")

View File

@@ -4,6 +4,7 @@ gui_download.py: Generate UI for downloading files
import wx
import logging
import time
from .. import constants
@@ -86,6 +87,7 @@ class DownloadFrame(wx.Frame):
label_amount.Centre(wx.HORIZONTAL)
wx.Yield()
time.sleep(self.constants.thread_sleep_interval)
if self.download_obj.download_complete is False and self.user_cancelled is False:
wx.MessageBox(f"Download failed: \n{self.download_obj.error_msg}", "Error", wx.OK | wx.ICON_ERROR)

View File

@@ -103,9 +103,7 @@ class InstallOCFrame(wx.Frame):
thread = threading.Thread(target=self._fetch_disks)
thread.start()
while thread.is_alive():
wx.Yield()
continue
gui_support.wait_for_thread(thread)
self.progress_bar_animation.stop_pulse()
self.progress_bar.Hide()
@@ -281,8 +279,7 @@ class InstallOCFrame(wx.Frame):
thread = threading.Thread(target=self._install_oc, args=(partition,))
thread.start()
while thread.is_alive():
wx.Yield()
gui_support.wait_for_thread(thread)
if self.result is True:
if self.constants.update_stage != gui_support.AutoUpdateStages.INACTIVE and self.constants.detected_os >= os_data.os_data.big_sur:

View File

@@ -149,8 +149,7 @@ class macOSInstallerDownloadFrame(wx.Frame):
thread = threading.Thread(target=_fetch_installers)
thread.start()
while thread.is_alive():
wx.Yield()
gui_support.wait_for_thread(thread)
progress_bar_animation.stop_pulse()
progress_bar.Hide()
@@ -412,8 +411,7 @@ class macOSInstallerDownloadFrame(wx.Frame):
self.Show()
# Wait for thread to finish
while thread.is_alive():
wx.Yield()
gui_support.wait_for_thread(thread)
progress_bar_animation.stop_pulse()
progress_bar.Hide()

View File

@@ -3,7 +3,6 @@ gui_macos_installer_flash.py: macOS Installer Flash Frame
"""
import wx
import time
import logging
import plistlib
import tempfile
@@ -88,8 +87,7 @@ class macOSInstallerFlashFrame(wx.Frame):
thread = threading.Thread(target=fetch_installers)
thread.start()
while thread.is_alive():
wx.Yield()
gui_support.wait_for_thread(thread)
frame_modal = wx.Dialog(self, title=self.title, size=(350, 200))
@@ -180,8 +178,7 @@ class macOSInstallerFlashFrame(wx.Frame):
thread = threading.Thread(target=_fetch_disks)
thread.start()
while thread.is_alive():
wx.Yield()
gui_support.wait_for_thread(thread)
self.frame_modal = wx.Dialog(self, title=self.title, size=(350, 200))
@@ -317,7 +314,9 @@ class macOSInstallerFlashFrame(wx.Frame):
except:
bytes_written = 0
wx.CallAfter(progress_bar.SetValue, bytes_written)
wx.Yield()
thread.join(timeout=self.constants.thread_sleep_interval)
if self.result is False:
logging.error("Failed to flash installer, cannot continue.")
@@ -370,8 +369,7 @@ class macOSInstallerFlashFrame(wx.Frame):
thread = threading.Thread(target=prepare_script, args=(self, installer_path, disk, self.constants))
thread.start()
while thread.is_alive():
wx.Yield()
gui_support.wait_for_thread(thread)
return self.prepare_result
@@ -399,10 +397,11 @@ class macOSInstallerFlashFrame(wx.Frame):
return False
logging.info("Successfully created macOS installer")
while thread.is_alive():
# wait for download_thread to finish
# though highly unlikely this thread is still alive (flashing an Installer will take a while)
time.sleep(0.1)
# wait for download_thread to finish
# though highly unlikely this thread is still alive (flashing an Installer will take a while)
gui_support.wait_for_thread(thread)
logging.info("Installing Root Patcher to drive")
self._install_installer_pkg(disk)
@@ -617,8 +616,7 @@ class macOSInstallerFlashFrame(wx.Frame):
thread = threading.Thread(target=_integrity_check)
thread.start()
while thread.is_alive():
wx.Yield()
gui_support.wait_for_thread(thread)
if error_message == "":
logging.info("Installer pkg validated")

View File

@@ -263,6 +263,19 @@ class ThreadHandler(logging.Handler):
wx.CallAfter(self.text_box.AppendText, self.format(record) + '\n')
def wait_for_thread(thread: threading.Thread, sleep_interval=None):
"""
Waits for a thread to finish while processing UI events at regular intervals
to prevent UI freezing and excessive CPU usage.
"""
# Use the passed sleep_interval, or get from global_constants
interval = sleep_interval if sleep_interval is not None else constants.Constants().thread_sleep_interval
while thread.is_alive():
wx.Yield()
thread.join(timeout=interval)
class RestartHost:
"""
Restarts the host machine

View File

@@ -93,9 +93,7 @@ class SysPatchDisplayFrame(wx.Frame):
frame.ShowWindowModal()
while thread.is_alive():
wx.Yield()
gui_support.wait_for_thread(thread)
frame.Close()

View File

@@ -88,8 +88,7 @@ class SysPatchStartFrame(wx.Frame):
kdk_thread = threading.Thread(target=_kdk_thread_spawn)
kdk_thread.start()
while kdk_thread.is_alive():
wx.Yield()
gui_support.wait_for_thread(kdk_thread)
if self.kdk_obj.success is False:
progress_bar_animation.stop_pulse()
@@ -170,8 +169,7 @@ class SysPatchStartFrame(wx.Frame):
metallib_thread = threading.Thread(target=_metallib_thread_spawn)
metallib_thread.start()
while metallib_thread.is_alive():
wx.Yield()
gui_support.wait_for_thread(metallib_thread)
if self.metallib_obj.success is False:
progress_bar_animation.stop_pulse()
@@ -209,8 +207,7 @@ class SysPatchStartFrame(wx.Frame):
install_thread = threading.Thread(target=_install_metallib)
install_thread.start()
while install_thread.is_alive():
wx.Yield()
gui_support.wait_for_thread(install_thread)
if self.result is False:
progress_bar_animation.stop_pulse()
@@ -314,6 +311,7 @@ class SysPatchStartFrame(wx.Frame):
while gui_support.PayloadMount(self.constants, self).is_unpack_finished() is False:
wx.Yield()
time.sleep(self.constants.thread_sleep_interval)
if self.patches[HardwarePatchsetSettings.KERNEL_DEBUG_KIT_REQUIRED] is True:
if self._kdk_download(self) is False:
@@ -329,8 +327,7 @@ class SysPatchStartFrame(wx.Frame):
thread = threading.Thread(target=self._start_root_patching, args=(self.patches,))
thread.start()
while thread.is_alive():
wx.Yield()
gui_support.wait_for_thread(thread)
self._post_patch()
self.return_button.Enable()
@@ -356,8 +353,7 @@ class SysPatchStartFrame(wx.Frame):
thread = threading.Thread(target=self._revert_root_patching, args=(self.patches,))
thread.start()
while thread.is_alive():
wx.Yield()
gui_support.wait_for_thread(thread)
self._post_patch()
self.return_button.Enable()

View File

@@ -102,8 +102,7 @@ class UpdateFrame(wx.Frame):
thread = threading.Thread(target=_fetch_update)
thread.start()
while thread.is_alive():
wx.Yield()
gui_support.wait_for_thread(thread)
gui_download.DownloadFrame(
self.frame,
@@ -128,8 +127,7 @@ class UpdateFrame(wx.Frame):
thread = threading.Thread(target=self._extract_update)
thread.start()
while thread.is_alive():
wx.Yield()
gui_support.wait_for_thread(thread)
# Title: Installing update
title_label.SetLabel("Installing update...")
@@ -138,8 +136,7 @@ class UpdateFrame(wx.Frame):
thread = threading.Thread(target=self._install_update)
thread.start()
while thread.is_alive():
wx.Yield()
gui_support.wait_for_thread(thread)
# Title: Update complete
title_label.SetLabel("Update complete!")
@@ -170,8 +167,7 @@ class UpdateFrame(wx.Frame):
thread = threading.Thread(target=self._launch_update)
thread.start()
while thread.is_alive():
wx.Yield()
gui_support.wait_for_thread(thread)
timer = 5
while True: