Compare commits

...

83 Commits
0.4.0 ... 0.4.3

Author SHA1 Message Date
Mykola Grymalyuk
c573a8a335 smbios_data.py: Add Mac Studio Model IDs
Ref: https://twitter.com/khronokernel/status/1501315940260016133?s=21
2022-03-08 15:55:31 -07:00
Mykola Grymalyuk
1393db72dd Add XCPM disabling 2022-03-02 09:19:41 -07:00
Mykola Grymalyuk
ba82b41cbd Sync PatcherSupportPkg 2022-03-02 08:56:33 -07:00
Mykola Grymalyuk
97a9853526 Resolve crash on Vendor detection 2022-02-24 11:25:44 -07:00
Mykola Grymalyuk
f1d67923c8 Resolve SDXC
Closes https://github.com/dortania/OpenCore-Legacy-Patcher/issues/978
2022-02-23 20:23:11 -07:00
Mykola Grymalyuk
0e526556e5 Update MONTEREY-DROP.md 2022-02-18 19:31:09 -07:00
Mykola Grymalyuk
9125b170ce bug_report: Clarify troubleshooting 2022-02-17 09:20:41 -07:00
Mykola Grymalyuk
cc5ed2396c Update issues 2022-02-17 08:52:01 -07:00
Mykola Grymalyuk
165526fbe2 docs: Fix TOC
Closes https://github.com/dortania/OpenCore-Legacy-Patcher/issues/956
2022-02-14 10:38:51 -07:00
Mykola Grymalyuk
c366680ad0 Sync FeatureUnlock
Closes https://github.com/dortania/OpenCore-Legacy-Patcher/issues/957
2022-02-14 10:38:15 -07:00
Mykola Grymalyuk
1237dc55e0 GUI.py: Add Dark Menubar configuration 2022-02-12 11:01:07 -07:00
Mykola Grymalyuk
ca61262228 docs: Add DisplayLink non-Metal information 2022-02-11 19:12:33 -07:00
Mykola Grymalyuk
2b4fdbb388 Resolve Non-Metal Keyboard Backlight support 2022-02-11 10:31:54 -07:00
Mykola Grymalyuk
23927a4e6a Resolve I210/I225 Sandy support
Closes https://github.com/dortania/OpenCore-Legacy-Patcher/issues/939
2022-02-09 19:29:59 -07:00
Mykola Grymalyuk
d5330555fc gui.py: Fix typo 2022-02-09 17:45:01 -07:00
Mykola Grymalyuk
8b1a46d8c4 Update ocvalidate binary 2022-02-08 08:59:35 -07:00
Mykola Grymalyuk
84bf2a9e18 sys_patch_detect.py: Fix backlight detection 2022-02-08 08:52:25 -07:00
Mykola Grymalyuk
4d244a5eee CHANGELOG: Add Cursor note 2022-02-07 14:40:47 -07:00
Mykola Grymalyuk
31ff4bbd0d Increment Binaries 2022-02-07 14:33:29 -07:00
Mykola Grymalyuk
cf4b2b2ad0 Update Credits 2022-02-06 14:23:20 -07:00
Mykola Grymalyuk
aa5e39f48a install.py: Add Safe Mode note 2022-02-06 12:19:00 -07:00
Mykola Grymalyuk
d1bd915ede install.py: Fix formatting in GUI 2022-02-06 10:31:13 -07:00
Mykola Grymalyuk
4d8aa1a541 install.py: Resolve error handling in GUI 2022-02-06 10:16:59 -07:00
Mykola Grymalyuk
e2aa6b4b48 utilities.py: Set checksum check to optional
Closes https://github.com/dortania/OpenCore-Legacy-Patcher/issues/915
2022-02-05 09:14:23 -07:00
Mykola Grymalyuk
3a9479a1d6 sys_patch: Add extra snapshot checks
Avoid issues on snapshot-less installs
2022-02-04 13:32:51 -07:00
Mykola Grymalyuk
39758fec20 gui: Strip unneeded print 2022-02-04 13:31:30 -07:00
Mykola Grymalyuk
2473daee2b Increment Build 2022-02-03 11:57:28 -07:00
Mykola Grymalyuk
a604325c5d docs: Update TS2 info 2022-02-03 11:54:39 -07:00
Mykola Grymalyuk
c74706127d device_probe.py: Handle VPCI erroring 2022-02-03 10:01:18 -07:00
Mykola Grymalyuk
bea1e92a3b Resolve Color Strobing on AMD TeraScale 2 GPUs 2022-02-02 21:03:46 -07:00
Mykola Grymalyuk
e0af3206cf sys_patch.py: Strip duplicate code
SysPatch Detection core moved to sys_patch_detect.py
2022-02-02 13:03:31 -07:00
Mykola Grymalyuk
7fc5de8e27 TUI: Add new icon and sync BundleID 2022-02-02 11:58:04 -07:00
Mykola Grymalyuk
504fb3a617 sys_patch_detect.py: Add extra Board ID info 2022-02-02 11:00:13 -07:00
Mykola Grymalyuk
b3ac3a6843 Sync changelog 2022-02-01 18:20:16 -07:00
Mykola Grymalyuk
e25b23f7a3 Increment PatcherSupportPkg 2022-02-01 14:42:43 -07:00
Mykola Grymalyuk
cdcbf30f63 sys_patch.py: Remove SkylightPlugins on unpatch 2022-02-01 14:33:17 -07:00
Mykola Grymalyuk
c66f3cd0ca Update docs 2022-02-01 14:33:01 -07:00
Mykola Grymalyuk
df958a2b1c Add NVMe Enhanced Power Management configuration
Closes https://github.com/dortania/OpenCore-Legacy-Patcher/issues/921
2022-02-01 11:30:44 -07:00
Mykola Grymalyuk
f7f890d37e Fix Power Management Support in macOS 12.3 Beta 1
Closes https://github.com/dortania/OpenCore-Legacy-Patcher/issues/930
2022-01-31 10:24:09 -07:00
Mykola Grymalyuk
1027e37a03 Add Universal Control support for Monterey Macs 2022-01-29 21:04:52 -07:00
Mykola Grymalyuk
42892e503f SurPlus: Set MaxKernel 2022-01-29 10:24:14 -07:00
Mykola Grymalyuk
ca9a0eba34 Fix available typo 2022-01-29 08:56:27 -07:00
Mykola Grymalyuk
12007041ab Update Issues template 2022-01-29 08:50:03 -07:00
Mykola Grymalyuk
05fd9489ae docs: Add SIP images 2022-01-28 18:56:43 -07:00
Mykola Grymalyuk
5b6da1f4e7 Merge branch 'main' of https://github.com/dortania/OpenCore-Legacy-Patcher 2022-01-28 18:44:38 -07:00
Mykola Grymalyuk
0a8e599877 Update images 2022-01-28 18:44:21 -07:00
Mykola Grymalyuk
67c88acedf Merge pull request #747 from bdwilson1907/patch-1
Update TESTED.md
2022-01-28 15:03:07 -07:00
Mykola Grymalyuk
3b4bb78fa2 Merge pull request #766 from charly-black/patch-1
Update TESTED.md
2022-01-28 15:02:32 -07:00
Mykola Grymalyuk
c03b8d2231 Merge pull request #867 from uvesten/patch-1
Add MacBookAir3,1 as working to tested models
2022-01-28 15:01:45 -07:00
Mykola Grymalyuk
32985b7fdd Merge pull request #891 from casey1234/patch-1
Update TESTED.md // Added MBP 7,1 + 9,2 + 11,2 as working perfectly!
2022-01-28 15:01:28 -07:00
Mykola Grymalyuk
d1323a4268 Merge pull request #912 from JakubMazur/main
iMac 15,1 (upgraded) tested
2022-01-28 15:01:02 -07:00
Jakub Mazur
16f7e24231 Update TESTED.md 2022-01-27 12:37:32 +01:00
Mykola Grymalyuk
c822e1f2c5 Sync changelog 2022-01-26 11:43:07 -07:00
Mykola Grymalyuk
e064d9a37a Add Content Caching support configurability 2022-01-25 21:28:26 -07:00
Mykola Grymalyuk
ddac821dfb Fix SIP default disabling
Resolve SIP and SecureBootModel not disabling by default on some non-Metal Mac Pros
2022-01-25 20:45:35 -07:00
Mykola Grymalyuk
b7a1fa302e Merge pull request #911 from dortania/installer-test
Resolve Local Installer Detection
2022-01-25 12:03:12 -07:00
Mykola Grymalyuk
19027fbac7 Update Issues format 2022-01-25 11:59:53 -07:00
Mykola Grymalyuk
b930544128 build.py: ExtendBTFeatureFlags on 3rd party BT 2022-01-25 11:48:49 -07:00
Mykola Grymalyuk
a15261073b Clean up 2022-01-25 10:40:30 -07:00
Mykola Grymalyuk
cd1729f74d Check Permissions erroring 2022-01-25 10:01:04 -07:00
Mykola Grymalyuk
af3abe6aa1 installer.py: Add Permissions check 2022-01-25 09:55:21 -07:00
Mykola Grymalyuk
2ca02f5802 Limit Content Caching to Desktops by default 2022-01-24 20:35:47 -07:00
Mykola Grymalyuk
3e742ffaf8 Sync FeatureUnlock 2022-01-24 20:23:22 -07:00
Mykola Grymalyuk
79390c897d docs: Add Hash Mismatch info 2022-01-24 12:59:40 -07:00
Mykola Grymalyuk
3ffe8c5142 device_probe.py: Add UHCI detection 2022-01-24 11:08:04 -07:00
Mykola Grymalyuk
18f9e05792 Resolve Macmini4,1 HDEF pathing 2022-01-23 11:42:20 -07:00
Mykola Grymalyuk
9f96fa43ec Pyinstaller: resolve formatting 2022-01-22 19:37:36 -07:00
Mykola Grymalyuk
f0f9f0b56d Sync changelog 2022-01-22 19:31:06 -07:00
Mykola Grymalyuk
33eef9b87f installer.py: Add Variant Info 2022-01-22 15:32:35 -07:00
Mykola Grymalyuk
f042ddfe75 defaults.py: Fix crash on hackintoshes 2022-01-22 09:49:44 -07:00
Mykola Grymalyuk
53cb55e375 docs: Update info
Sync with new GUI
2022-01-22 09:49:28 -07:00
Mykola Grymalyuk
d3aea7510f Increment Build 2022-01-21 16:13:38 -07:00
Mykola Grymalyuk
a8683e4e27 Sync changelog 2022-01-21 12:34:25 -07:00
Mykola Grymalyuk
7bb4aea2c0 Merge pull request #899 from dortania/helper-fix
Resolve OCLP-Helper dyld crash
2022-01-21 12:33:51 -07:00
Mykola Grymalyuk
30375b869b gui.py: Sync menu 2022-01-21 12:30:39 -07:00
Mykola Grymalyuk
5c207e0a2b Update OCLP-Helper 2022-01-21 12:19:40 -07:00
Mykola Grymalyuk
92324ede72 build.py: Add XHCI Boot Support 2022-01-21 11:40:43 -07:00
Mykola Grymalyuk
158dac6ab4 GA: Fix file naming 2022-01-21 10:39:53 -07:00
Mykola Grymalyuk
dfc4a7b2fc Increment build 2022-01-21 10:37:55 -07:00
casey1234
9408cd3ea5 Update TESTED.md
Please add my tests on

Macbook Pro 7,1
Macbook Pro 9,2
Macbook Pro 11,2

Everything works fine with Patcher 0.3.3 on Monterey.
2022-01-19 10:56:55 +01:00
Petter Uvesten
8f5ac32bb5 Add MacBookAir3,1 as working
Working fine running macOS Monterex 12.0.1
2022-01-02 21:49:59 +01:00
charly-black
2d98a827ec Update TESTED.md
Added mac mini 5.2 and mac book pro 8.1, both testet with 0.3.1 big sur
2021-11-29 15:26:56 +01:00
bdwilson1907
1dc76600e7 Update TESTED.md
Added successful installation to MacBook Air 4,2 with loader 0.3.1.

Issues present with intermittent function of backlight on keyboard and visual artefacts of the cursor on MacOS windows (finder (folder list only), safari, mail (folder list only).
2021-11-18 22:59:51 +00:00
70 changed files with 1467 additions and 403 deletions

View File

@@ -122,6 +122,17 @@ body:
- 'false' - 'false'
validations: validations:
required: true required: true
- type: dropdown
id: used-forums
attributes:
label: Have you already verified this is a patcher bug and not a macOS bug/user error on our discord servers?
description: If no, please do not use issues for this. We'd appreciate it if users check discuss with others before filing. Issues are for valid patcher issues only, not for personal troubleshooting scessions.
multiple: true
options:
- 'true'
- 'false'
validations:
required: true
- type: dropdown - type: dropdown
id: 3rd-party-application id: 3rd-party-application
attributes: attributes:
@@ -172,4 +183,4 @@ body:
- type: textarea - type: textarea
id: extra-info id: extra-info
attributes: attributes:
label: Any Additional Information label: What steps have you taken to troubleshoot this? Please include messages from Discord, logs, and screenshots.

View File

@@ -23,18 +23,18 @@ jobs:
- run: 'codesign -s "Developer ID Application: Mykola Grymalyuk (S74BDJXQMD)" -v --force --deep --timestamp --entitlements ./payloads/entitlements.plist -o runtime "dist/OpenCore-Patcher.app"' - run: 'codesign -s "Developer ID Application: Mykola Grymalyuk (S74BDJXQMD)" -v --force --deep --timestamp --entitlements ./payloads/entitlements.plist -o runtime "dist/OpenCore-Patcher.app"'
- run: cd dist; zip -r ../OpenCore-Patcher-TUI.app.zip OpenCore-Patcher.app - run: cd dist; zip -r ../OpenCore-Patcher-TUI.app.zip OpenCore-Patcher.app
- run: ./../sign-tui.sh - run: ./../sign-tui.sh
- run: mv ./OpenCore-Patcher-TUI.app.zip ./OpenCore-Patcher-TUI-Offline.app.zip
- name: Upload App to Artifacts - name: Upload App to Artifacts
uses: actions/upload-artifact@v2 uses: actions/upload-artifact@v2
with: with:
name: OpenCore-Patcher-TUI.app (Offline) name: OpenCore-Patcher-TUI.app (Offline)
path: OpenCore-Patcher-TUI.app.zip path: OpenCore-Patcher-TUI-Offline.app.zip
- name: Upload to Release - name: Upload to Release
if: github.event_name == 'release' if: github.event_name == 'release'
uses: svenstaro/upload-release-action@e74ff71f7d8a4c4745b560a485cc5fdb9b5b999d uses: svenstaro/upload-release-action@e74ff71f7d8a4c4745b560a485cc5fdb9b5b999d
with: with:
repo_token: ${{ secrets.GITHUB_TOKEN }} repo_token: ${{ secrets.GITHUB_TOKEN }}
asset_name: OpenCore-Patcher-TUI.app (Offline) file: OpenCore-Patcher-TUI-Offline.app.zip
file: OpenCore-Patcher-TUI.app.zip
tag: ${{ github.ref }} tag: ${{ github.ref }}
file_glob: true file_glob: true

View File

@@ -22,19 +22,19 @@ jobs:
- run: 'codesign -s "Developer ID Application: Mykola Grymalyuk (S74BDJXQMD)" -v --force --deep --timestamp --entitlements ./payloads/entitlements.plist -o runtime "dist/OpenCore-Patcher.app"' - run: 'codesign -s "Developer ID Application: Mykola Grymalyuk (S74BDJXQMD)" -v --force --deep --timestamp --entitlements ./payloads/entitlements.plist -o runtime "dist/OpenCore-Patcher.app"'
- run: cd dist; zip -r ../OpenCore-Patcher-wxPython.app.zip OpenCore-Patcher.app - run: cd dist; zip -r ../OpenCore-Patcher-wxPython.app.zip OpenCore-Patcher.app
- run: ./../sign-wxpython.sh - run: ./../sign-wxpython.sh
- run: mv ./OpenCore-Patcher-wxPython.app.zip ./OpenCore-Patcher-GUI-Offline.app.zip
- name: Upload App to Artifacts - name: Upload App to Artifacts
uses: actions/upload-artifact@v2 uses: actions/upload-artifact@v2
with: with:
name: OpenCore-Patcher.app (GUI Offline) name: OpenCore-Patcher.app (GUI Offline)
path: OpenCore-Patcher-wxPython.app.zip path: OpenCore-Patcher-GUI-Offline.app.zip
- name: Upload to Release - name: Upload to Release
if: github.event_name == 'release' if: github.event_name == 'release'
uses: svenstaro/upload-release-action@e74ff71f7d8a4c4745b560a485cc5fdb9b5b999d uses: svenstaro/upload-release-action@e74ff71f7d8a4c4745b560a485cc5fdb9b5b999d
with: with:
repo_token: ${{ secrets.GITHUB_TOKEN }} repo_token: ${{ secrets.GITHUB_TOKEN }}
file: OpenCore-Patcher-wxPython.app.zip file: OpenCore-Patcher-GUI-Offline.app.zip
tag: ${{ github.ref }} tag: ${{ github.ref }}
file_glob: true file_glob: true
asset_name: OpenCore-Patcher.app (GUI Offline)
- name: Validate OpenCore - name: Validate OpenCore
run: ./dist/OpenCore-Patcher.app/Contents/MacOS/OpenCore-Patcher --validate run: ./dist/OpenCore-Patcher.app/Contents/MacOS/OpenCore-Patcher --validate

View File

@@ -21,17 +21,17 @@ jobs:
- run: 'codesign -s "Developer ID Application: Mykola Grymalyuk (S74BDJXQMD)" -v --force --deep --timestamp --entitlements ./payloads/entitlements.plist -o runtime "dist/OpenCore-Patcher.app"' - run: 'codesign -s "Developer ID Application: Mykola Grymalyuk (S74BDJXQMD)" -v --force --deep --timestamp --entitlements ./payloads/entitlements.plist -o runtime "dist/OpenCore-Patcher.app"'
- run: cd dist; zip -r ../OpenCore-Patcher-wxPython.app.zip OpenCore-Patcher.app - run: cd dist; zip -r ../OpenCore-Patcher-wxPython.app.zip OpenCore-Patcher.app
- run: ./../sign-wxpython.sh - run: ./../sign-wxpython.sh
- run: mv ./OpenCore-Patcher-wxPython.app.zip ./OpenCore-Patcher-GUI.app.zip
- name: Upload App to Artifacts - name: Upload App to Artifacts
uses: actions/upload-artifact@v2 uses: actions/upload-artifact@v2
with: with:
name: OpenCore-Patcher.app (GUI) name: OpenCore-Patcher.app (GUI)
path: OpenCore-Patcher-wxPython.app.zip path: OpenCore-Patcher-GUI.app.zip
- name: Upload to Release - name: Upload to Release
if: github.event_name == 'release' if: github.event_name == 'release'
uses: svenstaro/upload-release-action@e74ff71f7d8a4c4745b560a485cc5fdb9b5b999d uses: svenstaro/upload-release-action@e74ff71f7d8a4c4745b560a485cc5fdb9b5b999d
with: with:
repo_token: ${{ secrets.GITHUB_TOKEN }} repo_token: ${{ secrets.GITHUB_TOKEN }}
file: OpenCore-Patcher-wxPython.app.zip file: OpenCore-Patcher-GUI.app.zip
tag: ${{ github.ref }} tag: ${{ github.ref }}
file_glob: true file_glob: true
asset_name: OpenCore-Patcher.app (GUI)

2
.gitignore vendored
View File

@@ -22,3 +22,5 @@ __pycache__/
/docs/node_modules/ /docs/node_modules/
/payloads/List.txt /payloads/List.txt
/payloads/Installer.sh /payloads/Installer.sh
/payloads/Info.plist
/payloads/seed.plist

View File

@@ -1,11 +1,67 @@
# OpenCore Legacy Patcher changelog # OpenCore Legacy Patcher changelog
## 0.4.3
- Increment Binaries:
- PatcherSupportPkg 0.3.4 - release
- OpenCorePkg 0.7.8 - release
- Lilu 1.6.0 - release
- WhateverGreen 1.5.7 - release
- FeatureUnlock 1.0.7 - rolling (6a87f65)
- Resolve many non-Metal issues:
- Control Centre Sliders
- Shift/missing icons
- Hardware Cursor
- Note cursor images will be static (ie. beachball)
- Quicklook dismiss/expand
- Keyboard Backlight
- Drops reliance on LabTick
- Add Ethernet Controller detection to build
- Resolve i210/i225 NIC support on pre-Ivy Macs
- Resolve AirPlay to Mac support on Skylake+ Macs in 12.3 Beta 2+
- Resolve SDXC support in Monterey for Pre-Ivy Bridge Macs
- Rename Battery Throttling option to Firmware Throttling
- Expands support to desktops (ie. iMacs without Displays)
- Add XCPM disabling
- Forces `ACPI_SMC_PlatformPlugin` to outmatch `X86PlatformPlugin`
## 0.4.2
- Resolve app crashing on some 3rd party SAS/SATA controllers
- Add Beta identifier to macOS Installer menu
- Resolve showing unsupported installers in Creation menu
- Resolve Macmini4,1 HDEF pathing
- Increment Binaries:
- FeatureUnlock 1.0.6 - rolling (d296645)
- PatcherSupportPkg 0.3.1
- Resolve SIP and SecureBootModel not disabling by default on some non-Metal Mac Pros
- Add Content Caching support configurability
- Limit SurPlus patchset to 20.4.0 - 21.1.0
- No longer required for macOS 12.1 and newer
- Add Universal Control support for Monterey native Macs
- Applicable for Haswell/Broadwell
- Requires macOS 12.3 or newer
- Fix Power Management Support in macOS 12.3 Beta 1
- Applicable for Sandy Bridge and older
- Enforces ACPI_SMC_PlatformPlugin matching
- Add NVMe Enhanced Power Management configuration
- Disables NVMe adjustments on Skylake and newer Macs by default
- Resolve Catalyst Scrolling on non-Metal GPUs
- Add new TUI icon to differentiate between GUI
- Resolve Color Strobing on AMD TeraScale 2 GPUs
- Drops reliance on ResXtreme and SwitchResX
## 0.4.1
- Add XHCI Boot Support to pre-UEFI 2.0 Macs
- Applicable to pre-Ivy Macs with upgraded USB 3.0 controllers, allows USB 3.0 boot
- Credit to Jazzzny for testing, [DearthnVader for original research](https://forums.macrumors.com/threads/bootable-xhci-pci-e-for-the-3-1-experimental.2217479/)
- Drivers stripped from MacPro6,1 firmware
- Resolve OCLP-Helper dyld crash
## 0.4.0 ## 0.4.0
- Resolves Install USB Creation using incorrect installer - Resolves Install USB Creation using incorrect installer
- Resolves `installer` failing to extract InstallAssistant in older OSes - Resolves `installer` failing to extract InstallAssistant in older OSes
- Resolves certain Samsung NVMe drives appearing as external on Mac Pros - Resolves certain Samsung NVMe drives appearing as external on Mac Pros
- Add FeatureUnlock configurability - Add FeatureUnlock configurability
- Add NVRAM WriteFlash configurability for degarded/fragile systems - Add NVRAM WriteFlash configurability for degraded/fragile systems
- Add `ThirdPartyDrives` quirk configurability - Add `ThirdPartyDrives` quirk configurability
- Resolve Skylight dylib injection issue - Resolve Skylight dylib injection issue
- Increment Binaries: - Increment Binaries:

View File

@@ -46,10 +46,11 @@ app = BUNDLE(exe,
bundle_identifier="com.dortania.opencore-legacy-patcher-wxpython", bundle_identifier="com.dortania.opencore-legacy-patcher-wxpython",
info_plist={ info_plist={
"CFBundleShortVersionString": constants.Constants().patcher_version, "CFBundleShortVersionString": constants.Constants().patcher_version,
"NSHumanReadableCopyright": "Copyright 2020-2022 Dortania", "NSHumanReadableCopyright": constants.Constants().copyright_date,
"LSMinimumSystemVersion": "10.10.0", "LSMinimumSystemVersion": "10.10.0",
"NSRequiresAquaSystemAppearance": False, "NSRequiresAquaSystemAppearance": False,
"NSHighResolutionCapable": True, "NSHighResolutionCapable": True,
"Build Date": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), "Build Date": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),
"BuildMachineOSBuild": subprocess.run("sw_vers -buildVersion".split(), stdout=subprocess.PIPE, stderr=subprocess.STDOUT).stdout.decode().strip(), "BuildMachineOSBuild": subprocess.run("sw_vers -buildVersion".split(), stdout=subprocess.PIPE, stderr=subprocess.STDOUT).stdout.decode().strip(),
"NSPrincipalClass": "NSApplication",
}) })

View File

@@ -35,10 +35,10 @@ exe = EXE(pyz,
console=True ) console=True )
app = BUNDLE(exe, app = BUNDLE(exe,
name='OpenCore-Patcher.app', name='OpenCore-Patcher.app',
icon="payloads/OC-Patcher.icns", icon="payloads/OC-Patcher-TUI.icns",
bundle_identifier=None, bundle_identifier="com.dortania.opencore-legacy-patcher-tui",
info_plist={ info_plist={
"CFBundleShortVersionString": constants.Constants().patcher_version, "CFBundleShortVersionString": constants.Constants().patcher_version,
"CFBundleExecutable": "MacOS/Launcher", "CFBundleExecutable": "MacOS/Launcher",
"NSHumanReadableCopyright": "Copyright 2020-2022 Dortania" "NSHumanReadableCopyright": constants.Constants().copyright_date,
}) })

View File

@@ -28,9 +28,9 @@ To run the project from source, see here: [Build and run from source](./SOURCE.m
## Support ## Support
To get aid with the patcher, we recommend joining the [OpenCore Patcher Paradise Discord Server](https://discord.gg/rqdPgH8xSN). We're actively there and is the quickest way to receive help. For bigger issues such as patcher crashing on build and such, we recommend opening an issue right here on GitHub To get aid with the patcher, we recommend joining the [OpenCore Patcher Paradise Discord Server](https://discord.gg/rqdPgH8xSN). We're actively there and is the quickest way to receive help.
* Please review [How to debug with OpenCore](https://dortania.github.io/OpenCore-Legacy-Patcher/DEBUG.html) before opening issues * Please review our docs on [how to debug with OpenCore](https://dortania.github.io/OpenCore-Legacy-Patcher/DEBUG.html) to gather important information to help others with troubleshooting.
## Credits ## Credits
@@ -45,7 +45,7 @@ To get aid with the patcher, we recommend joining the [OpenCore Patcher Paradise
* Great amounts of help debugging and code suggestions * Great amounts of help debugging and code suggestions
* [vit9696](https://github.com/vit9696) * [vit9696](https://github.com/vit9696)
* Endless amount of help troubleshooting, determining fixes and writing patches * Endless amount of help troubleshooting, determining fixes and writing patches
* [ASentientBot](https://github.com/ASentientBot) * [ASentientBot](https://github.com/ASentientBot), [EduCovas](https://github.com/educovas) and [ASentientHedgehog](https://github.com/moosethegoose2213)
* Legacy Acceleration Patch set and documentation * Legacy Acceleration Patch set and documentation
* [cdf](https://github.com/cdf) * [cdf](https://github.com/cdf)
* Mac Pro on OpenCore Patch set and documentation * Mac Pro on OpenCore Patch set and documentation

View File

@@ -15,7 +15,7 @@ For developers wishing to validate mainline changes, you may use these nightly l
## Getting Started ## Getting Started
To start, ensure you have python 3.6 or newer installed. Additionally ensure that they were downloaded from the offical source, [python.org](https://www.python.org/downloads/macos/). To start, ensure you have python 3.6 or newer installed. Additionally ensure that they were downloaded from the Official source, [python.org](https://www.python.org/downloads/macos/).
* Python installations either preinstalled or provided with Xcode/Xcode Tools are unsupported due to reliablility issues * Python installations either preinstalled or provided with Xcode/Xcode Tools are unsupported due to reliablility issues

View File

@@ -21,3 +21,4 @@ class cpu_data(enum.IntEnum):
apple_m1 = 114 # A14 apple_m1 = 114 # A14
apple_m1_pro = 115 apple_m1_pro = 115
apple_m1_max = 116 apple_m1_max = 116
apple_m1_ultra = 117

View File

@@ -48,6 +48,59 @@ class MacBookPro:
opencore_version=None, opencore_version=None,
) )
MacBookPro111_Stock = device_probe.Computer(
real_model='MacBookPro11,1',
real_board_id='Mac-189A3D4F975D5FFC',
reported_model='MacBookPro11,1',
reported_board_id='Mac-189A3D4F975D5FFC',
gpus=[
device_probe.Intel(vendor_id=32902, device_id=2606, class_code=196608, name='IGPU', model='Intel Iris', acpi_path='IOACPIPlane:/_SB/PCI0@0/IGPU@20000', pci_path='PciRoot(0x0)/Pci(0x2,0x0)')
],
igpu=device_probe.Intel(vendor_id=32902, device_id=2606, class_code=196608, name='IGPU', model='Intel Iris', acpi_path='IOACPIPlane:/_SB/PCI0@0/IGPU@20000', pci_path='PciRoot(0x0)/Pci(0x2,0x0)'),
dgpu=None,
storage=[
device_probe.SATAController(vendor_id=6987, device_id=37251, class_code=67073, name='SSD0', model=None, acpi_path='IOACPIPlane:/_SB/PCI0@0/RP06@1c0005/SSD0@0', pci_path='PciRoot(0x0)/Pci(0x1c,0x5)/Pci(0x0,0x0)')
],
usb_controllers=[
device_probe.XHCIController(vendor_id=32902, device_id=39985, class_code=787248, name='XHC1', model=None, acpi_path='IOACPIPlane:/_SB/PCI0@0/XHC1@140000', pci_path='PciRoot(0x0)/Pci(0x14,0x0)')
],
wifi=device_probe.Broadcom(vendor_id=5348, device_id=17312, class_code=163840, name='ARPT', model=None, acpi_path='IOACPIPlane:/_SB/PCI0@0/RP03@1c0002/ARPT@0', pci_path='PciRoot(0x0)/Pci(0x1c,0x2)/Pci(0x0,0x0)'),
cpu=device_probe.CPU(
name='Intel(R) Core(TM) i5-4258U CPU @ 2.40GHz',
flags=['FPU', 'VME', 'DE', 'PSE', 'TSC', 'MSR', 'PAE', 'MCE', 'CX8', 'APIC', 'SEP', 'MTRR', 'PGE', 'MCA', 'CMOV', 'PAT', 'PSE36', 'CLFSH', 'DS', 'ACPI', 'MMX', 'FXSR', 'SSE', 'SSE2', 'SS', 'HTT', 'TM', 'PBE', 'SSE3', 'PCLMULQDQ', 'DTES64', 'MON', 'DSCPL', 'VMX', 'EST', 'TM2', 'SSSE3', 'FMA', 'CX16', 'TPR', 'PDCM', 'SSE4.1', 'SSE4.2', 'x2APIC', 'MOVBE', 'POPCNT', 'AES', 'PCID', 'XSAVE', 'OSXSAVE', 'SEGLIM64', 'TSCTMR', 'AVX1.0', 'RDRAND', 'F16C']
),
oclp_version='0.4.2',
opencore_version='DBG-077-2022-01-10',
bluetooth_chipset='BRCM20702 Hub',
third_party_sata_ssd=False
)
MacBookPro141_SSD_Upgrade = device_probe.Computer(
real_model='MacBookPro14,1',
real_board_id='Mac-B4831CEBD52A0C4C',
reported_model='MacBookPro14,1',
reported_board_id='Mac-B4831CEBD52A0C4C',
gpus=[
device_probe.Intel(vendor_id=32902, device_id=22822, class_code=196608, name='IGPU', model='Intel Iris Plus Graphics 640', acpi_path='IOACPIPlane:/_SB/PCI0@0/IGPU@20000', pci_path='PciRoot(0x0)/Pci(0x2,0x0)')
],
igpu=device_probe.Intel(vendor_id=32902, device_id=22822, class_code=196608, name='IGPU', model='Intel Iris Plus Graphics 640', acpi_path='IOACPIPlane:/_SB/PCI0@0/IGPU@20000', pci_path='PciRoot(0x0)/Pci(0x2,0x0)'),
dgpu=None,
storage=[
device_probe.NVMeController(vendor_id=6535, device_id=20499, class_code=67586, name='SSD0', model=None, acpi_path='IOACPIPlane:/_SB/PCI0@0/RP01@1c0000/SSD0@0', pci_path='PciRoot(0x0)/Pci(0x1c,0x0)/Pci(0x0,0x0)', aspm=2)
],
usb_controllers=[
device_probe.XHCIController(vendor_id=32902, device_id=40239, class_code=787248, name='XHC1', model=None, acpi_path='IOACPIPlane:/_SB/PCI0@0/XHC1@140000', pci_path='PciRoot(0x0)/Pci(0x14,0x0)'),
device_probe.XHCIController(vendor_id=32902, device_id=5588, class_code=787248, name='XHC2', model=None, acpi_path='IOACPIPlane:/_SB/PCI0@0/RP05@1c0004/UPSB@0/DSB2@20000/XHC2@0', pci_path='PciRoot(0x0)/Pci(0x1c,0x4)/Pci(0x0,0x0)/Pci(0x2,0x0)/Pci(0x0,0x0)')
],
wifi=device_probe.Broadcom(vendor_id=5348, device_id=17315, class_code=163840, name='ARPT', model=None, acpi_path='IOACPIPlane:/_SB/PCI0@0/RP09@1d0000/ARPT@0', pci_path='PciRoot(0x0)/Pci(0x1d,0x0)/Pci(0x0,0x0)'),
cpu=device_probe.CPU(
name='Intel(R) Core(TM) i5-7360U CPU @ 2.30GHz',
flags=['FPU', 'VME', 'DE', 'PSE', 'TSC', 'MSR', 'PAE', 'MCE', 'CX8', 'APIC', 'SEP', 'MTRR', 'PGE', 'MCA', 'CMOV', 'PAT', 'PSE36', 'CLFSH', 'DS', 'ACPI', 'MMX', 'FXSR', 'SSE', 'SSE2', 'SS', 'HTT', 'TM', 'PBE', 'SSE3', 'PCLMULQDQ', 'DTES64', 'MON', 'DSCPL', 'VMX', 'SMX', 'EST', 'TM2', 'SSSE3', 'FMA', 'CX16', 'TPR', 'PDCM', 'SSE4.1', 'SSE4.2', 'x2APIC', 'MOVBE', 'POPCNT', 'AES', 'PCID', 'XSAVE', 'OSXSAVE', 'SEGLIM64', 'TSCTMR', 'AVX1.0', 'RDRAND', 'F16C']
), oclp_version='0.4.1',
opencore_version=None,
bluetooth_chipset=None,
third_party_sata_ssd=False)
MacBookPro171_Stock = device_probe.Computer( MacBookPro171_Stock = device_probe.Computer(
# Run under Rosetta # Run under Rosetta
real_model="MacBookPro17,1", real_model="MacBookPro17,1",
@@ -179,10 +232,39 @@ class iMac:
opencore_version=None, opencore_version=None,
) )
iMac122_Upgraded_Nvidia = device_probe.Computer(
real_model='iMac12,2',
real_board_id='Mac-942B59F58194171B',
reported_model='iMac12,2',
reported_board_id='Mac-942B59F58194171B',
gpus=[
device_probe.Intel(vendor_id=32902, device_id=258, class_code=229376, name='IGPU', model=None, acpi_path='IOACPIPlane:/_SB/PCI0@0/IGPU@20000', pci_path='PciRoot(0x0)/Pci(0x2,0x0)'),
device_probe.NVIDIA(vendor_id=4318, device_id=4092, class_code=196608, name='GFX0', model='Quadro K1000M by Nick[D]vB', acpi_path='IOACPIPlane:/_SB/PCI0@0/P0P2@10000/GFX0@0', pci_path='PciRoot(0x0)/Pci(0x1,0x0)/Pci(0x0,0x0)')],
igpu=device_probe.Intel(vendor_id=32902, device_id=258, class_code=229376, name='IGPU', model=None, acpi_path='IOACPIPlane:/_SB/PCI0@0/IGPU@20000', pci_path='PciRoot(0x0)/Pci(0x2,0x0)'),
dgpu=device_probe.NVIDIA(vendor_id=4318, device_id=4092, class_code=196608, name='GFX0', model='Quadro K1000M by Nick[D]vB', acpi_path='IOACPIPlane:/_SB/PCI0@0/P0P2@10000/GFX0@0', pci_path='PciRoot(0x0)/Pci(0x1,0x0)/Pci(0x0,0x0)'),
storage=[
device_probe.SATAController(vendor_id=32902, device_id=7170, class_code=67073, name='SATA', model=None, acpi_path='IOACPIPlane:/_SB/PCI0@0/SATA@1f0002', pci_path='PciRoot(0x0)/Pci(0x1f,0x2)')
],
usb_controllers=[
device_probe.EHCIController(vendor_id=32902, device_id=7213, class_code=787232, name='EHC2', model=None, acpi_path='IOACPIPlane:/_SB/PCI0@0/EHC2@1a0007', pci_path='PciRoot(0x0)/Pci(0x1a,0x7)'),
device_probe.EHCIController(vendor_id=32902, device_id=7206, class_code=787232, name='EHC1', model=None, acpi_path='IOACPIPlane:/_SB/PCI0@0/EHC1@1d0007', pci_path='PciRoot(0x0)/Pci(0x1d,0x7)')
],
wifi=device_probe.Broadcom(vendor_id=5348, device_id=17201, class_code=163840, name='ARPT', model=None, acpi_path='IOACPIPlane:/_SB/PCI0@0/RP02@1c0001/ARPT@0', pci_path='PciRoot(0x0)/Pci(0x1c,0x1)/Pci(0x0,0x0)'),
cpu=device_probe.CPU(
name='Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz',
flags=['FPU', 'VME', 'DE', 'PSE', 'TSC', 'MSR', 'PAE', 'MCE', 'CX8', 'APIC', 'SEP', 'MTRR', 'PGE', 'MCA', 'CMOV', 'PAT', 'PSE36', 'CLFSH', 'DS', 'ACPI', 'MMX', 'FXSR', 'SSE', 'SSE2', 'SS', 'HTT', 'TM', 'PBE', 'SSE3', 'PCLMULQDQ', 'DTES64', 'MON', 'DSCPL', 'VMX', 'SMX', 'EST', 'TM2', 'SSSE3', 'CX16', 'TPR', 'PDCM', 'SSE4.1', 'SSE4.2', 'x2APIC', 'POPCNT', 'AES', 'PCID', 'XSAVE', 'OSXSAVE', 'TSCTMR', 'AVX1.0']
),
oclp_version='0.3.3',
opencore_version=None,
bluetooth_chipset='BRCM2046 Hub',
third_party_sata_ssd=True
)
iMac151_Stock = device_probe.Computer( iMac151_Stock = device_probe.Computer(
real_model='iMac15,1', real_model='iMac15,1',
real_board_id='Mac-42FD25EABCABB274', real_board_id='Mac-42FD25EABCABB274',
reported_model='iMac15,1', reported_board_id='Mac-42FD25EABCABB274', reported_model='iMac15,1',
reported_board_id='Mac-42FD25EABCABB274',
gpus=[ gpus=[
device_probe.Intel(vendor_id=32902, device_id=1042, class_code=196608, name='IGPU', model='Intel Iris Pro', acpi_path=None, pci_path='PciRoot(0x0)/Pci(0x2,0x0)'), device_probe.Intel(vendor_id=32902, device_id=1042, class_code=196608, name='IGPU', model='Intel Iris Pro', acpi_path=None, pci_path='PciRoot(0x0)/Pci(0x2,0x0)'),
device_probe.AMD(vendor_id=4098, device_id=26640, class_code=196608, name='GFX0', model='AMD Radeon R9 M290X', acpi_path=None, pci_path='PciRoot(0x0)/Pci(0x1,0x0)/Pci(0x0,0x0)') device_probe.AMD(vendor_id=4098, device_id=26640, class_code=196608, name='GFX0', model='AMD Radeon R9 M290X', acpi_path=None, pci_path='PciRoot(0x0)/Pci(0x1,0x0)/Pci(0x0,0x0)')
@@ -204,6 +286,33 @@ class iMac:
third_party_sata_ssd=False third_party_sata_ssd=False
) )
iMac201_Stock = device_probe.Computer(
real_model='iMac20,1',
real_board_id='Mac-CFF7D910A743CAAF',
reported_model='iMac20,1',
reported_board_id='Mac-CFF7D910A743CAAF',
gpus=[
device_probe.Intel(vendor_id=32902, device_id=39880, class_code=196608, name='IGPU', model='Intel HD Graphics CFL', acpi_path='IOACPIPlane:/_SB/PCI0@0/IGPU@20000', pci_path='PciRoot(0x0)/Pci(0x2,0x0)'),
device_probe.AMD(vendor_id=4098, device_id=29504, class_code=196608, name='GFX0', model='AMD Radeon Pro 5300', acpi_path='IOACPIPlane:/_SB/PCI0@0/PEG0@10000/EGP0@0/EGP1@0/GFX0@0', pci_path='PciRoot(0x0)/Pci(0x1,0x0)/Pci(0x0,0x0)/Pci(0x0,0x0)/Pci(0x0,0x0)')
],
igpu=device_probe.Intel(vendor_id=32902, device_id=39880, class_code=196608, name='IGPU', model='Intel HD Graphics CFL', acpi_path='IOACPIPlane:/_SB/PCI0@0/IGPU@20000', pci_path='PciRoot(0x0)/Pci(0x2,0x0)'),
dgpu=device_probe.AMD(vendor_id=4098, device_id=29504, class_code=196608, name='GFX0', model='AMD Radeon Pro 5300', acpi_path='IOACPIPlane:/_SB/PCI0@0/PEG0@10000/EGP0@0/EGP1@0/GFX0@0', pci_path='PciRoot(0x0)/Pci(0x1,0x0)/Pci(0x0,0x0)/Pci(0x0,0x0)/Pci(0x0,0x0)'),
storage=[],
usb_controllers=[
device_probe.XHCIController(vendor_id=32902, device_id=1773, class_code=787248, name='XHC1', model=None, acpi_path='IOACPIPlane:/_SB/PCI0@0/XHC1@140000', pci_path='PciRoot(0x0)/Pci(0x14,0x0)'),
device_probe.XHCIController(vendor_id=32902, device_id=5612, class_code=787248, name='XHC2', model=None, acpi_path='IOACPIPlane:/_SB/PCI0@0/RP05@1c0004/UPSB@0/DSB2@20000/XHC2@0', pci_path='PciRoot(0x0)/Pci(0x1c,0x4)/Pci(0x0,0x0)/Pci(0x2,0x0)/Pci(0x0,0x0)')
],
wifi=device_probe.Broadcom(vendor_id=5348, device_id=17508, class_code=163840, name='ARPT', model=None, acpi_path='IOACPIPlane:/_SB/PCI0@0/RP01@1c0000/ARPT@0', pci_path='PciRoot(0x0)/Pci(0x1c,0x0)/Pci(0x0,0x0)'),
cpu=device_probe.CPU(
name='Intel(R) Core(TM) i5-10500 CPU @ 3.10GHz',
flags=['FPU', 'VME', 'DE', 'PSE', 'TSC', 'MSR', 'PAE', 'MCE', 'CX8', 'APIC', 'SEP', 'MTRR', 'PGE', 'MCA', 'CMOV', 'PAT', 'PSE36', 'CLFSH', 'DS', 'ACPI', 'MMX', 'FXSR', 'SSE', 'SSE2', 'SS', 'HTT', 'TM', 'PBE', 'SSE3', 'PCLMULQDQ', 'DTES64', 'MON', 'DSCPL', 'VMX', 'SMX', 'EST', 'TM2', 'SSSE3', 'FMA', 'CX16', 'TPR', 'PDCM', 'SSE4.1', 'SSE4.2', 'x2APIC', 'MOVBE', 'POPCNT', 'AES', 'PCID', 'XSAVE', 'OSXSAVE', 'SEGLIM64', 'TSCTMR', 'AVX1.0', 'RDRAND', 'F16C']
),
oclp_version=None,
opencore_version=None,
bluetooth_chipset=None,
third_party_sata_ssd=False
)
class MacPro: class MacPro:
MacPro31_Stock = device_probe.Computer( MacPro31_Stock = device_probe.Computer(

View File

@@ -1546,6 +1546,7 @@ smbios_dictionary = {
"Wireless Model": device_probe.Broadcom.Chipsets.AirPortBrcm4360, "Wireless Model": device_probe.Broadcom.Chipsets.AirPortBrcm4360,
"Bluetooth Model": bluetooth_data.bluetooth_data.BRCM2070, "Bluetooth Model": bluetooth_data.bluetooth_data.BRCM2070,
"Ethernet Chipset": "Broadcom", "Ethernet Chipset": "Broadcom",
"nForce Chipset": True,
"Stock GPUs": [ "Stock GPUs": [
device_probe.NVIDIA.Archs.Tesla device_probe.NVIDIA.Archs.Tesla
], ],
@@ -2720,6 +2721,36 @@ smbios_dictionary = {
"SATA 3.5", "SATA 3.5",
], ],
}, },
# Mac Studio M1 Max
"Mac13,1": {
"Board ID": None,
"FirmwareFeatures": None,
"SecureBootModel": "j375c",
"CPU Generation": cpu_data.cpu_data.apple_m1_max.value,
"Max OS Supported": os_data.os_data.max_os,
"Wireless Model": device_probe.Broadcom.Chipsets.AppleBCMWLANBusInterfacePCIe,
"Bluetooth Model": bluetooth_data.bluetooth_data.PCIe,
"Ethernet Chipset": "Aquantia",
"Stock GPUs": [],
"Stock Storage": [
"NVMe",
],
},
# Mac Studio M1 Ultra
"Mac13,2": {
"Board ID": None,
"FirmwareFeatures": None,
"SecureBootModel": "j375d",
"CPU Generation": cpu_data.cpu_data.apple_m1_ultra.value,
"Max OS Supported": os_data.os_data.max_os,
"Wireless Model": device_probe.Broadcom.Chipsets.AppleBCMWLANBusInterfacePCIe,
"Bluetooth Model": bluetooth_data.bluetooth_data.PCIe,
"Ethernet Chipset": "Aquantia",
"Stock GPUs": [],
"Stock Storage": [
"NVMe",
],
},
"ADP2,1": { "ADP2,1": {
"Board ID": None, "Board ID": None,
"FirmwareFeatures": None, "FirmwareFeatures": None,
@@ -2807,6 +2838,7 @@ smbios_dictionary = {
# VMware Virtual Machine # VMware Virtual Machine
"Board ID": "440BX Desktop Reference Platform", "Board ID": "440BX Desktop Reference Platform",
"FirmwareFeatures": None, "FirmwareFeatures": None,
"SecureBootModel": "x86legacy",
"CPU Generation": cpu_data.cpu_data.penryn.value, "CPU Generation": cpu_data.cpu_data.penryn.value,
"Max OS Supported": os_data.os_data.max_os, "Max OS Supported": os_data.os_data.max_os,
"Wireless Model": None, "Wireless Model": None,
@@ -2818,6 +2850,7 @@ smbios_dictionary = {
# Parallels Virtual Machine # Parallels Virtual Machine
"Board ID": "Parallels Virtual Platform", "Board ID": "Parallels Virtual Platform",
"FirmwareFeatures": None, "FirmwareFeatures": None,
"SecureBootModel": "x86legacy",
"CPU Generation": cpu_data.cpu_data.penryn.value, "CPU Generation": cpu_data.cpu_data.penryn.value,
"Max OS Supported": os_data.os_data.max_os, "Max OS Supported": os_data.os_data.max_os,
"Wireless Model": None, "Wireless Model": None,
@@ -2849,4 +2882,126 @@ smbios_dictionary = {
"Stock GPUs": [], "Stock GPUs": [],
"Stock Storage": [], "Stock Storage": [],
}, },
"APPL_GPU_Test_Board": {
# AppleInternal GPU Test Board
# System is used for testing Intel iGPUs
# Model has been configured with the following:
# - Broadwell iGPU (HD Graphics 5300)
# - Skylake iGPU (HD Graphics 5xx)
# - Kaby Lake iGPU (HD Graphics 6xx)
# - Ice Lake iGPU (G4/G7)
"Board ID": "Mac-50619A408DB004DA",
"FirmwareFeatures": None,
"SecureBootModel": None,
"CPU Generation": None,
"Max OS Supported": os_data.os_data.max_os,
"Wireless Model": None,
"Bluetooth Model": bluetooth_data.bluetooth_data.NonApplicable,
"Stock GPUs": [],
"Stock Storage": [],
},
"APPL_UNKNOWN_MODEL_1": {
# Laptop model
# No mentions in SLE outside X86PlatformPlugin
"Board ID": "Mac-112B0A653D3AAB9C",
"FirmwareFeatures": None,
"SecureBootModel": None,
"CPU Generation": None,
"Max OS Supported": os_data.os_data.max_os,
"Wireless Model": None,
"Bluetooth Model": bluetooth_data.bluetooth_data.NonApplicable,
"Stock GPUs": [],
"Stock Storage": [],
},
"APPL_UNKNOWN_MODEL_2": {
# Laptop model
# Only mentioned in ApplePlatformEnabler and X86PlatformPlugin
"Board ID": "Mac-4BFBC784B845591E",
"FirmwareFeatures": None,
"SecureBootModel": None,
"CPU Generation": None,
"Max OS Supported": os_data.os_data.max_os,
"Wireless Model": None,
"Bluetooth Model": bluetooth_data.bluetooth_data.NonApplicable,
"Stock GPUs": [],
"Stock Storage": [],
},
"APPL_UNKNOWN_MODEL_3": {
# Laptop model, 15"/17" with dGPU and GMUX
# Only mentioned in AppleGraphicsPowerManagement, AppleMuxControl2, AGDCBacklightControl, ApplePlatformEnabler and X86PlatformPlugin
"Board ID": "Mac-564FBA6031E5946A",
"FirmwareFeatures": None,
"SecureBootModel": None,
"CPU Generation": None,
"Max OS Supported": os_data.os_data.max_os,
"Wireless Model": None,
"Bluetooth Model": bluetooth_data.bluetooth_data.NonApplicable,
"Stock GPUs": [],
"Stock Storage": [],
},
"APPL_UNKNOWN_MODEL_4": {
# Laptop model, iGPU only
# Only mentioned in AppleGraphicsPowerManagement, ApplePlatformEnabler and X86PlatformPlugin
"Board ID": "Mac-6FEBD60817C77D8A",
"FirmwareFeatures": None,
"SecureBootModel": None,
"CPU Generation": None,
"Max OS Supported": os_data.os_data.max_os,
"Wireless Model": None,
"Bluetooth Model": bluetooth_data.bluetooth_data.NonApplicable,
"Stock GPUs": [],
"Stock Storage": [],
},
"APPL_UNKNOWN_MODEL_5": {
# Laptop model, iGPU only, Iris Plus Graphics G7
# Only mentioned in AppleGraphicsPowerManagement, ApplePlatformEnabler and X86PlatformPlugin
"Board ID": "Mac-747B1AEFF11738BE",
"FirmwareFeatures": None,
"SecureBootModel": None,
"CPU Generation": None,
"Max OS Supported": os_data.os_data.max_os,
"Wireless Model": None,
"Bluetooth Model": bluetooth_data.bluetooth_data.NonApplicable,
"Stock GPUs": [],
"Stock Storage": [],
},
"APPL_UNKNOWN_MODEL_6": {
# Laptop model, iGPU only
# Only mentioned in AppleGraphicsPowerManagement, ApplePlatformEnabler and X86PlatformPlugin
"Board ID": "Mac-87DCB00F4AD77EEA",
"FirmwareFeatures": None,
"SecureBootModel": None,
"CPU Generation": None,
"Max OS Supported": os_data.os_data.max_os,
"Wireless Model": None,
"Bluetooth Model": bluetooth_data.bluetooth_data.NonApplicable,
"Stock GPUs": [],
"Stock Storage": [],
},
"APPL_UNKNOWN_MODEL_7": {
# Laptop model
# Only mentioned in X86PlatformPlugin, AppleGVA
"Board ID": "Mac-90BE64C3CB5A9AEB",
"FirmwareFeatures": None,
"SecureBootModel": None,
"CPU Generation": None,
"Max OS Supported": os_data.os_data.max_os,
"Wireless Model": None,
"Bluetooth Model": bluetooth_data.bluetooth_data.NonApplicable,
"Stock GPUs": [],
"Stock Storage": [],
},
"APPL_UNKNOWN_MODEL_7": {
# Laptop model, iGPU only
# Only mentioned in AppleGraphicsPowerManagement and X86PlatformPlugin
"Board ID": "Mac-9394BDF4BF862EE7",
"FirmwareFeatures": None,
"SecureBootModel": None,
"CPU Generation": None,
"Max OS Supported": os_data.os_data.max_os,
"Wireless Model": None,
"Bluetooth Model": bluetooth_data.bluetooth_data.NonApplicable,
"Stock GPUs": [],
"Stock Storage": [],
},
} }

View File

@@ -1,5 +1,6 @@
# Working Around Legacy Acceleration Issues # Working Around Legacy Acceleration Issues
* [Broken Background Blurs](#broken-background-blurs)
* [Downloading older non-Metal Apps](#downloading-older-non-metal-apps) * [Downloading older non-Metal Apps](#downloading-older-non-metal-apps)
* [Unable to run Zoom](#unable-to-run-zoom) * [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) * [Unable to grant special permissions to apps (ie. Camera Access to Zoom)](#unable-to-grant-special-permissions-to-apps-ie-camera-access-to-zoom)
@@ -35,6 +36,13 @@ For those unfamiliar with what is considered a non-Metal GPU, see below chart:
::: :::
## Broken Background Blurs
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)
Do note that enabling beta blurs can be more demanding on slower hardware
## Downloading older non-Metal Apps ## Downloading older non-Metal Apps
Many Apple apps now have direct reliance on Metal for proper functioning, however legacy builds of these apps still do work in Big Sur. See below for archive of many apps such as Pages, iMovie, GarageBand. Many Apple apps now have direct reliance on Metal for proper functioning, however legacy builds of these apps still do work in Big Sur. See below for archive of many apps such as Pages, iMovie, GarageBand.
@@ -112,10 +120,18 @@ The best way to achieve this is to boot Recovery (or Single User Mode if the dGP
nvram FA4CE28D-B62F-4C99-9CC3-6815686E30F9:gpu-power-prefs=%01%00%00%00 nvram FA4CE28D-B62F-4C99-9CC3-6815686E30F9:gpu-power-prefs=%01%00%00%00
``` ```
This will disable the dGPU and allow the iGPU to function in Big Sur. Note that external display outputs are directly routed to the dGPU and therefore can no longer be used. Solutions such as a [DisplayLink Adapters](https://www.displaylink.com/products/usb-adapters) can work around this limitation in theory. However, currently the proprietary DisplayLink driver refuses to function on legacy-patched systems, either resulting in a windowserver crash loop or no output at all. This will disable the dGPU and allow the iGPU to function in Big Sur. Note that external display outputs are directly routed to the dGPU and therefore can no longer be used. Solutions such as a [DisplayLink Adapters](https://www.displaylink.com/products/usb-adapters) can work around this limitation, however note that you'll need to use older drivers (5.2.6):
* [DisplayLink USB Graphics Software for macOS - For Mojave and Catalina - 5.2.6](https://www.synaptics.com/products/displaylink-graphics/downloads/macos-5.2.6)
Note this driver only provides partial support in macOS, full graphics acceleration is not currently available on the displays driven by DisplayLink
## Erratic Colours on ATI TeraScale 2 GPUs (HD5000/HD6000) ## Erratic Colours on ATI TeraScale 2 GPUs (HD5000/HD6000)
Resolved with OpenCore Legacy Patcher v0.4.2
::: details Legacy Fix (prior to 0.4.2)
Due to an odd bug with ATI's TeraScale 2 GPUs, many users will experience erratic/strobing colours once finished installing and rebooting into the accelerated patches. The issue stems from an incorrect assumption in the GPU drivers where it will enforce the Billion Colour space on your display. To fix, simply force your Display into a lower color depth such as a Million Colours. Due to an odd bug with ATI's TeraScale 2 GPUs, many users will experience erratic/strobing colours once finished installing and rebooting into the accelerated patches. The issue stems from an incorrect assumption in the GPU drivers where it will enforce the Billion Colour space on your display. To fix, simply force your Display into a lower color depth such as a Million Colours.
Applications that can set color depth are: Applications that can set color depth are:
@@ -123,6 +139,8 @@ Applications that can set color depth are:
* [SwitchResX](https://www.madrau.com) * [SwitchResX](https://www.madrau.com)
* [ResXtreme](https://macdownload.informer.com/resxtreme/) * [ResXtreme](https://macdownload.informer.com/resxtreme/)
:::
## Unable to allow Safari Extensions ## Unable to allow Safari Extensions
Due to an bug on the legacy acceleration patches, users won't be able to enable Safari Extensions Due to an bug on the legacy acceleration patches, users won't be able to enable Safari Extensions
@@ -135,7 +153,7 @@ This tool can be used to work-around this issue:
By default OpenCore Legacy Patcher will assume MacBookPro8,2/3 have a faulty dGPU and disable acceleration. This is the safest option for most users as enabling dGPU acceleration on faulty Macs will result in failed booting. By default OpenCore Legacy Patcher will assume MacBookPro8,2/3 have a faulty dGPU and disable acceleration. This is the safest option for most users as enabling dGPU acceleration on faulty Macs will result in failed booting.
However if your machine does not have the dGPU disabled via NVRAM, you'll expereince a login loop. To work around this is quite simple: However if your machine does not have the dGPU disabled via NVRAM, you'll experience a login loop. To work around this is quite simple:
1. Boot macOS in Single User Mode 1. Boot macOS in Single User Mode
* Press Cmd+S in OpenCore's menu when you turn the Mac on * Press Cmd+S in OpenCore's menu when you turn the Mac on

View File

@@ -1,8 +1,6 @@
# How to debug with OpenCore # How to debug with OpenCore
For those who've hit an odd bug and unsure if it's user error or patcher, the below will tell you how to get more verbose debug information as well as logs to help [file issues with us](https://github.com/dortania/OpenCore-Legacy-Patcher/issues) For those who've hit an odd bug and unsure if it's user error or patcher, we recommend asking on the [OpenCore Patcher Paradise Discord Server](https://discord.gg/rqdPgH8xSN) for help.
* For users who are less experienced, we recommend asking on the [OpenCore Patcher Paradise Discord Server](https://discord.gg/rqdPgH8xSN) for help.
## Debugging yourself ## Debugging yourself

View File

@@ -1,7 +1,6 @@
# Download and build macOS Installers # Download and build macOS Installers
* [Downloading](#downloading) * [Creating the installer](#creating-the-installer)
* [Building](#building)
This doc is centered around downloading and writing the macOS installer to a USB. If you're already familiar with how to do this, you can skip. This doc is centered around downloading and writing the macOS installer to a USB. If you're already familiar with how to do this, you can skip.
@@ -25,7 +24,6 @@ First we'll want to select the "Create macOS Installer" button. This will presen
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: For this example, we'll assume you'll need an installer. Selecting this option will download Apple's Installer Catalogs and build a list for you to choose:
| Downloading | Listed Installers | | Downloading | Listed Installers |
| :--- | :--- | | :--- | :--- |
| ![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) | | ![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) |
@@ -49,4 +47,5 @@ Now the patcher will start the installer flashing!
| Flashing | Success Prompt | Finished 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) | | ![](../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) # Once finished, head to [Building and installing OpenCore](./BUILD.md)

View File

@@ -47,13 +47,14 @@ sudo killall -9 BlueTool bluetoothd
* Broadcom BCM94328, BCM94322 and Atheros Wireless Chipsets lost support * Broadcom BCM94328, BCM94322 and Atheros Wireless Chipsets lost support
The following models lost Bluetooth support in macOS Monterey due to their legacy Wireless chipset: The following models lost Wifi support in macOS Monterey due to their legacy Wireless chipset:
* iMac12,x and older * iMac12,x and older
* Macmini3,1 and older * Macmini3,1 and older
* MacBook5,x and older * MacBook5,x and older
* MacBookAir2,1 and older * MacBookAir2,1 and older
* MacBookPro7,1 and older * MacBookPro7,1 and older
* MacBookPro6,x is exempt
* MacPro5,1 and older * MacPro5,1 and older
Note: BCM943224, BCM94331, BCM94360 and BCM943602 are still fully support by OpenCore Legacy Patcher Note: BCM943224, BCM94331, BCM94360 and BCM943602 are still fully support by OpenCore Legacy Patcher

View File

@@ -14,12 +14,38 @@ Below is a run down of the main logic OpenCore Legacy Patcher uses to gain nativ
::: details Configuration Explanation ::: details Configuration Explanation
### ACPI -> Add
* SSDT-CPBG
* Reason: Resolves Kernel Panic on Arrendale Macs in early Big Sur builds
* Logic: Disable dummy CPBG device in ACPI
* Models: MacBookPro6,x and iMac11,x
* SSDT-PCI
* Reason: Patch Windows Audio support for Sandy and Ivy Bridge
* Logic: Removes PCI0's 32-bit Allocation Limitation
* Models: All Sandy and Ivy Bridge Macs, excluding MacPro6,1
* SSDT-DGPU
* Reason: Allows for software based deMUX disabling dGPUs in 2011 MacBook Pros
* Logic: Sends power down request to dGPU via ACPI
* Models: MacBookPro8,2 and MacBookPro8,3 with dead dGPUs
### ACPI -> Patch ### ACPI -> Patch
* EHCx and XHC1 Patches * `EHCx` and `XHC1` Patches
* Reason: Required for proper USB operation * Reason: Required for proper USB operation
* Logic: Avoids USB maps of newer models attaching and breaking USB port functionality * Logic: Avoids USB maps of newer models attaching and breaking USB port functionality
* Models: All models require when spoofing with Moderate or Advanced SMBIOS * Models: All models require when spoofing with Moderate or Advanced SMBIOS
* `BUF0` to `BUF1` Patch
* Reason: To be paired with SSDT-PCI
* `_INI` to `XINI` Patch
* Reason: To be paired with SSDT-DGPU
### Booter -> Patch
* Reroute `HW_BID` to `OC_BID`
* Reason: Allows macOS installers to be used on unsupported models
* Logic: Reroutes Board ID macOS checks to custom variable
* Models: All systems using VMM spoofing
### Booter -> Quirks ### Booter -> Quirks
@@ -30,14 +56,6 @@ Below is a run down of the main logic OpenCore Legacy Patcher uses to gain nativ
### DeviceProperties -> Add ### DeviceProperties -> Add
* `PciRoot(0x0)/Pci(0x15,0x0)/Pci(0x0,0x0)`
* `PciRoot(0x0)/Pci(0x1C,0x4)/Pci(0x0,0x0)`
* `PciRoot(0x0)/Pci(0x1C,0x3)/Pci(0x0,0x0)`
* `PciRoot(0x0)/Pci(0x1C,0x5)/Pci(0x0,0x0)`
* `PciRoot(0x0)/Pci(0x1C,0x1)/Pci(0x0,0x0)`
* Reason: Required to ensure Wifi works with full, native support
* Logic: Tricks AirPortBrcmNIC.kext into thinking our device is a BCM94360 (`14e4,43ba`)
* Models: Machines with BCM943224 and BCM94331 chipsets
* `PciRoot(0x0)/Pci(0x3,0x0)/Pci(0x0,0x0)` * `PciRoot(0x0)/Pci(0x3,0x0)/Pci(0x0,0x0)`
* `PciRoot(0x0)/Pci(0x1,0x0)/Pci(0x0,0x0)` * `PciRoot(0x0)/Pci(0x1,0x0)/Pci(0x0,0x0)`
* Reason: Required to ensure Brightness Control works on upgraded iMacs * Reason: Required to ensure Brightness Control works on upgraded iMacs
@@ -58,6 +76,23 @@ Below is a run down of the main logic OpenCore Legacy Patcher uses to gain nativ
* Reason: Required for HID peripheral support in macOS on older hardware * Reason: Required for HID peripheral support in macOS on older hardware
* Logic: Tricks IOHIDFamily into thinking it's always booting recovery * Logic: Tricks IOHIDFamily into thinking it's always booting recovery
* Models: Penryn CPUs (Core2 series) * Models: Penryn CPUs (Core2 series)
* Force FileVault on Broken Seal Patch
* Reason: Allow FileVault on root patched Macs
* Logic: Forces APFS.kext to always return true on FileVault support
* Models: Any model needing root patches
* Disable Library Validation Enforcement Patch
* Reason: non-Metal Root Volume Patches do not pass library validation tests
* Logic: Forces Library Validation function to always return not required
* Models: Non-Metal GPUs
* SurPlus Patch
* Reason: macOS 11.3-12.0.1 require systems to have RDRAND support in the CPU for stable boot
* Logic: Forces RDRAND code to return predetermined value
* Models: All pre-Ivy Bridge Macs
* Reroute `kern.hv_vmm_present` Patch
* Reason: Allows macOS to be installed and updated on unsupported hardware
* Logic: Forces userspace to see system as Virtual Machine
* Models: Any model using VMM spoofing
### Kernel -> Quirks ### Kernel -> Quirks
@@ -73,9 +108,9 @@ Below is a run down of the main logic OpenCore Legacy Patcher uses to gain nativ
### Misc -> Security ### Misc -> Security
* SecureBootModel * SecureBootModel
* Reason: Required to ensure seamless OS updates with Big Sur * Reason: Required to allow native OS updates on T2 model spoofs
* Logic: Sets iMacPro1,1's Secure Enclave Identifier (j137) * Logic: Sets T2's Secure Enclave Identifier
* Models: All models require * Models: All models required that spoof T2 model with minimal or higher
### NVRAM -> Add ### NVRAM -> Add
@@ -123,13 +158,13 @@ Below is an explanation of what Kexts OpenCore Legacy Patcher will inject into m
* Models: All models require * Models: All models require
* WhateverGreen * WhateverGreen
* Reason: Patches GPU Frameworks and kext to ensure proper support * Reason: Patches GPU Frameworks and kext to ensure proper support
* Models: All models require * Models: All models require when spoofing or have non-stock GPU
* CPUFriend * CPUFriend
* Reason: Patches IOx86PlatformPlugin to restore previous CPU profiles * Reason: Patches IOx86PlatformPlugin to restore previous CPU profiles
* Models: 2012 and newer models * Models: All models using minimal or higher spoofing
* AirportBrcmFixup * AirportBrcmFixup
* Reason: Patches IO80211 and co to fix networking support for unsupported cards * Reason: Patches IO80211 and co to fix networking support for unsupported cards, and fix bugs on native ones as well (ie. random degraded network performance)
* Models: BCM943224 and BCM94331 * Models: BCM943224, BCM94331, BCM94360 and BCM943602
* RestrictEvents * RestrictEvents
* Reason: Disables memory errors on MacPro7,1 * Reason: Disables memory errors on MacPro7,1
* Models: Mac Pros and Xserves * Models: Mac Pros and Xserves
@@ -151,7 +186,7 @@ Below is an explanation of what Kexts OpenCore Legacy Patcher will inject into m
* USBMap * USBMap
* Reason: Inject old USB map profiles to fix USB * Reason: Inject old USB map profiles to fix USB
* Models: All models require * Models: All models require when spoofing moderate or higher, as well as pre-2012 models
### SSE ### SSE
@@ -189,14 +224,14 @@ Below is an explanation of what Kexts OpenCore Legacy Patcher will inject into m
* Models: 2011 and older, MacBookPro9,x included * Models: 2011 and older, MacBookPro9,x included
* SMC-Spoof * SMC-Spoof
* Reason: Spoofs SMC version to 9.9999 * Reason: Spoofs SMC version to 9.9999
* Models: All models require * Models: All models require when spoofing minimal or higher
::: :::
## On-Disk Patches ## On-Disk Patches
Unfortunately certain on-disk patches are required to achieve full functionality. Below is a breakdown of patches supported Unfortunately certain on-disk patches are required to achieve full functionality. Below is a breakdown of patches supported
::: details Audio Patches ::: details Audio Patches (11.0+)
### Extensions ### Extensions
@@ -206,7 +241,68 @@ Unfortunately certain on-disk patches are required to achieve full functionality
::: :::
::: details Acceleration Patches ::: details Legacy Wireless Patches (12.0+)
Applicable for BCM94328, BCM94322 and Atheros Wifi cards
### CoreServices
* WiFiAgent.app
### /usr/libexec
* airportd
:::
::: details Nvidia Kepler Graphics Acceleration Patches (12.0+)
### Extensions
* GeForce.kext
* GeForceAIRPlugin.bundle
* GeForceGLDriver.bundle
* GeForceMTLDriver.bundle
* GeForceVADriver.bundle
* NVDAGF100Hal.kext
* NVDAGK100Hal.kext
* NVDAResman.kext
* NVDAStartup.kext
### Frameworks
* OpenCL (libCLVMNVPTXPlugin.dylib, NVPTX.dylib)
* Reason: Re-add Kepler hardware acceleration support
:::
::: details Intel Ivy Bridge Graphics Acceleration Patches (12.0+)
### Extensions
* AppleIntelIVBVA.bundle
* AppleIntelFramebufferCapri.kext
* AppleIntelGraphicsShared.bundle
* AppleIntelHD4000Graphics.kext
* AppleIntelHD4000GraphicsGLDriver.bundle
* AppleIntelHD4000GraphicsMTLDriver.bundle
* AppleIntelHD4000GraphicsVADriver.bundle
### PrivateFrameworks
* AppleGVA/AppleGVACore
* Reason: Enable DRM support
### Frameworks
* OpenCL (libCLVMIGILPlugin.dylib)
* Reason: Re-add Ivy Bridge hardware acceleration support
* WebKit (com.apple.WebProcess.sb)
* Reason: Re-add Ivy Bridge Safari rendering support
:::
::: details non-Metal Graphics Acceleration Patches (11.0+)
### Extensions ### Extensions
@@ -290,10 +386,4 @@ Unfortunately certain on-disk patches are required to achieve full functionality
* SkyLight.framework * SkyLight.framework
* Logic: Copied from Mojave, heavy modifications/shims * Logic: Copied from Mojave, heavy modifications/shims
### LaunchDaemons
* HiddHack.plist
* Reason: Fixes unresponsive input when patching Skylight
* Logic: Forces `hidd` to register events, as Skylight handles them by default in Big Sur
::: :::

View File

@@ -20,7 +20,9 @@ And voila! No more USB drive required
To do this, run the OpenCore Patcher and head to Patcher Settings: To do this, run the OpenCore Patcher and head to Patcher Settings:
![](../images/settings.png) | GUI Settings | TUI Settings
| :--- | :--- |
|![](../images/OCLP-GUI-Settings-ShowPicker.png) | ![](../images/settings.png) |
Here you can change different patcher settings, however the main interest is: Here you can change different patcher settings, however the main interest is:
@@ -30,11 +32,19 @@ Once you've toggled them both off, build your OpenCore EFI once again and instal
## Enabling SIP ## Enabling SIP
For many users, SIP will be enabled by default on build. For Intel HD 4000 users, you may have noticed that SIP is 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. For many users, SIP will be enabled 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.
Note: Machines with non-Metal GPUs cannot enable SIP in Big Sur either due to patched root volume Note: Machines with non-Metal GPUs cannot enable SIP in Big Sur either due to patched root volume
Note 2: NVRAM may need to be reset to ensure SIP is correctly re-enabled | 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) |
::: warning
If you're unsure whether you should enable SIP, leave as-is. Systems where you have already ran the Post Install Root Patching cannot enable SIP without potentially breaking the current install.
:::
## Applying Post Install Volume Patches ## Applying Post Install Volume Patches
@@ -42,6 +52,20 @@ For users with unsupported GPUs/wifi cards, you'll need to run the Post Install
* Hint: Try running the root volume patch option, the Patcher will determine and install patches only when required. So there is no harm in applying them * Hint: Try running the root volume patch option, the Patcher will determine and install patches only when required. So there is no harm in applying them
| Listing Patches | Patching Finished |
| :--- | :--- |
| ![](../images/OCLP-GUI-Root-Patching-List.png) | ![](../images/OCLP-GUI-Root-Patching-Finished.png) |
::: warning
Root Patching requires a network connection by default to grab associated resources. If your system is having difficulties with wifi or ethernet, grab the Offline variants of the patcher on Github next to the regular apps:
* [OpenCore Legacy Patcher releases](https://github.com/dortania/OpenCore-Legacy-Patcher/releases/latest)
:::
::: details Unsupported GPUs in macOS Big Sur ::: details Unsupported GPUs in macOS Big Sur
* Nvidia: * Nvidia:
@@ -76,13 +100,3 @@ For users with unsupported GPUs/wifi cards, you'll need to run the Post Install
* Atheros * Atheros
::: :::
To apply the Post-Install Volume patches, select option #3 as shown below:
![](../images/root-patch.png)
And go ahead to option #1 and let the OCLP patcher apply the needed legacy video patches.
![](../images/root-patcher-2.png)
Reboot your system and check out the now working graphics acceleration on your legacy system. This is still Beta software.

View File

@@ -19,10 +19,10 @@ To aid users in troubleshooting, we've compiled a list of users who've reported
| SMBIOS | Tested | Tester | Comment | | SMBIOS | Tested | Tester | Comment |
| :--- | :--- | :--- | :--- | | :--- | :--- | :--- | :--- |
| MacBookAir2,1 | No reports | N/A | N/A | | MacBookAir2,1 | No reports | N/A | N/A |
| MacBookAir3,1 | ^^ | ^^ | ^^ | | MacBookAir3,1 | <span style="color:#30BCD5"> YES </span> | uvesten | - Stock Model<br/>- Patcher version 0.3.3 |
| MacBookAir3,2 | <span style="color:#30BCD5"> YES </span> | houser42 | - Stock model <br/>- Patcher version unknown | | MacBookAir3,2 | <span style="color:#30BCD5"> YES </span> | houser42 | - Stock model <br/>- Patcher version unknown |
| MacBookAir4,1 | No reports | N/A | N/A | | MacBookAir4,1 | No reports | N/A | N/A |
| MacBookAir4,2 | ^^ | ^^ | ^^ | | MacBookAir4,2 | <span style="color:#30BCD5"> YES </span> | bdwilson1907 | - Stock Model <br/>- Patcher version 0.3.1 <br/>- Intermittent keyboard backlight|
| MacBookAir5,1 | <span style="color:#30BCD5"> YES </span> | Ausdauersportler | - Stock Model<br/>- Patcher version 0.0.9 | | MacBookAir5,1 | <span style="color:#30BCD5"> YES </span> | Ausdauersportler | - Stock Model<br/>- Patcher version 0.0.9 |
| ^^ | ^^ | webg3 | Stock Model | | ^^ | ^^ | webg3 | Stock Model |
| MacBookAir5,2 | ^^ | Bab-droid | - Stock Model<br/>- Patcher version 0.0.19 | | MacBookAir5,2 | ^^ | Bab-droid | - Stock Model<br/>- Patcher version 0.0.19 |
@@ -42,7 +42,9 @@ To aid users in troubleshooting, we've compiled a list of users who've reported
| MacBookPro6,1 | ^^ | ^^ | ^^ | | MacBookPro6,1 | ^^ | ^^ | ^^ |
| MacBookPro6,2 | <span style="color:#30BCD5"> YES </span> | Jakeluke | - Stock model, dGPU broken <br/>- Patcher version unknown | | MacBookPro6,2 | <span style="color:#30BCD5"> YES </span> | Jakeluke | - Stock model, dGPU broken <br/>- Patcher version unknown |
| MacBookPro7,1 | ^^ | fussel132 | - Stock model <br/>-Patcher version v0.1.2 | | MacBookPro7,1 | ^^ | fussel132 | - Stock model <br/>-Patcher version v0.1.2 |
| ^^ | ^^ | casey1234 | - SSD Upgrade <br/>- Patcher version 0.3.3 |
| MacBookPro8,1 | ^^ | AvaQueen | - Stock model <br/>- Patcher version 0.0.19 | | MacBookPro8,1 | ^^ | AvaQueen | - Stock model <br/>- Patcher version 0.0.19 |
| MacBookPro8,1 | yes | charly-black | - Upgraded BCM94331PCIEBT4CAX <br/>- Patcher version 0.3.1 |
| MacBookPro8,2 | ^^ | air.man | - Stock model, dGPU disabled <br/>- Patcher version 0.0.22 | | MacBookPro8,2 | ^^ | air.man | - Stock model, dGPU disabled <br/>- Patcher version 0.0.22 |
| ^^ | ^^ | cboukouv | - Stock model <br/>- Patcher version 0.0.19 | | ^^ | ^^ | cboukouv | - Stock model <br/>- Patcher version 0.0.19 |
| MacBookPro8,3 | ^^ | lulujyc | - Stock model, dGPU disabled <br/>- Patcher version 0.1.4 | | MacBookPro8,3 | ^^ | lulujyc | - Stock model, dGPU disabled <br/>- Patcher version 0.1.4 |
@@ -56,9 +58,11 @@ To aid users in troubleshooting, we've compiled a list of users who've reported
| ^^ | ^^ | woefi | - BCM94331CAX upgrade<br/>- Patcher version 0.0.13 | | ^^ | ^^ | woefi | - BCM94331CAX upgrade<br/>- Patcher version 0.0.13 |
| ^^ | ^^ | whgmkeller | - Stock model<br/>- Patcher version 0.0.11 | | ^^ | ^^ | whgmkeller | - Stock model<br/>- Patcher version 0.0.11 |
| ^^ | ^^ | vinaypundith | - Patcher version 0.0.7 | | ^^ | ^^ | vinaypundith | - Patcher version 0.0.7 |
| ^^ | ^^ | casey1234 | - RAM and SSD Upgrade <br/>- Patcher version 0.3.3 |
| MacBookPro10,1 | ^^ | traviswparker | - Stock model <br/>- Patcher version 0.0.14 | | MacBookPro10,1 | ^^ | traviswparker | - Stock model <br/>- Patcher version 0.0.14 |
| ^^ | ^^ | il-rollino | - Upgraded BCM94360CSAX <br/>- Patcher version 0.0.21 | | ^^ | ^^ | il-rollino | - Upgraded BCM94360CSAX <br/>- Patcher version 0.0.21 |
| MacBookPro10,2 | ^^ | akidone | - Upgraded BCM94360CSAX <br/>- Patcher version 0.3.0 | | MacBookPro10,2 | ^^ | akidone | - Upgraded BCM94360CSAX <br/>- Patcher version 0.3.0 |
| MacBookPro11,2 | ^^ | casey1234 | - Stock model<br/>- Patcher version 0.3.3 |
### Mac mini ### Mac mini
@@ -67,7 +71,7 @@ To aid users in troubleshooting, we've compiled a list of users who've reported
| Macmini3,1 | No reports | N/A | N/A | | Macmini3,1 | No reports | N/A | N/A |
| Macmini4,1 | ^^ | ^^ | ^^ | | Macmini4,1 | ^^ | ^^ | ^^ |
| Macmini5,1 | ^^ | ^^ | ^^ | | Macmini5,1 | ^^ | ^^ | ^^ |
| Macmini5,2 | ^^ | ^^ | ^^ | | Macmini5,2 | yes | charly-black | Dual Core 2.7GHz with AMD HD6630M | Patcher Version 0.3.1
| Macmini5,3 | ^^ | ^^ | ^^ | | Macmini5,3 | ^^ | ^^ | ^^ |
| Macmini6,1 | <span style="color:#30BCD5"> YES </span> | cicofz | - Stock model <br/>- Patcher version 0.0.21 | | Macmini6,1 | <span style="color:#30BCD5"> YES </span> | cicofz | - Stock model <br/>- Patcher version 0.0.21 |
| ^^ | ^^ | Stig124 | - Stock model <br/>- Patcher version 0.0.19 | | ^^ | ^^ | Stig124 | - Stock model <br/>- Patcher version 0.0.19 |
@@ -100,6 +104,7 @@ To aid users in troubleshooting, we've compiled a list of users who've reported
| iMac14,2 | ^^ | OKonnel | - Stock Model<br/>- Patcher version 0.0.22 | | iMac14,2 | ^^ | OKonnel | - Stock Model<br/>- Patcher version 0.0.22 |
| ^^ | ^^ | mibaxx | - Stock Model<br/>- Patcher version 0.0.21 | | ^^ | ^^ | mibaxx | - Stock Model<br/>- Patcher version 0.0.21 |
| iMac14,3 | No reports | N/A | N/A | | iMac14,3 | No reports | N/A | N/A |
| iMac15,1 | YES | JakubMazur | - Upgraded RAM<br/>- Upgraded Graphics (AMD Radeon R9 M295X 4 GB)<br/>- Upgraded CPU (4 GHz Quad-Core Intel Core i7)<br/>- Patcher version 0.4.1 |
### Mac Pro ### Mac Pro

View File

@@ -11,8 +11,12 @@ Here are some common errors users may experience while using this patcher:
* [Stuck on "Your Mac needs a firmware update"](#stuck-on-your-mac-needs-a-firmware-update) * [Stuck on "Your Mac needs a firmware update"](#stuck-on-your-mac-needs-a-firmware-update)
* [No Brightness Control](#no-brightness-control) * [No Brightness Control](#no-brightness-control)
* [Cannot connect Wi-Fi on Monterey with legacy cards](#cannot-connect-Wi-Fi-on-Monterey-with-legacy-cards) * [Cannot connect Wi-Fi on Monterey with legacy cards](#cannot-connect-Wi-Fi-on-Monterey-with-legacy-cards)
* [No Graphics Acceleration on Intel Ivy Bridge and Nvidia Kepler GPUs](#no-graphics-acceleration-on-intel-ivy-bridge-and-nvidia-kepler-gpus) * [No Graphics Acceleration](#no-graphics-acceleration)
* [Black Screen on MacBookPro11,3 in macOS Monterey](#black-screen-on-macbookpro113-in-macos-monterey) * [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 `This version of Mac OS X is not supported on this platform` ## Stuck on `This version of Mac OS X is not supported on this platform`
@@ -78,9 +82,12 @@ With OCLP v0.2.5, we've added support for legacy Wi-Fi on Monterey. However some
To work-around, we recommend users to manually connect using the "other" option on the Wi-Fi menu bar or manually adding the network on the "Network" preference pane. To work-around, we recommend users to manually connect using the "other" option on the Wi-Fi menu bar or manually adding the network on the "Network" preference pane.
## No Graphics Acceleration on Intel Ivy Bridge and Nvidia Kepler GPUs ## No Graphics Acceleration
With macOS Monterey, Apple removed Graphics Drivers for both Intel Ivy Bride and Nvidia Kepler. To re-enable acceleration, simply run the Post Install Root Volume patches.
In macOS, each release generally means GPU drivers are dropped from the OS. 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.
To re-enable acceleration, simply run the Post Install Root Volume patches.
Once rebooted, acceleration will be re-enabled as well as brightness control for laptops. Once rebooted, acceleration will be re-enabled as well as brightness control for laptops.
@@ -89,3 +96,42 @@ Once rebooted, acceleration will be re-enabled as well as brightness control for
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. 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. * 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 troubles 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 play nicer.
![](../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:
![](../images/Hash-Mismatch.png)
What this error signifies is that the OS detects the boot volume's hash does not match to what the OS detects, 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 NVRAM reset. However for users wanting to disable SIP entirely, this can be done easily.
Head into the GUI, 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

View File

@@ -315,7 +315,7 @@ class wx_python_gui:
# Copyright Label # Copyright Label
self.copyright = wx.StaticText(self.frame, label="Copyright © 2020-2022 Dortania") self.copyright = wx.StaticText(self.frame, label=self.constants.copyright_date)
self.copyright.SetFont(wx.Font(8, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL)) self.copyright.SetFont(wx.Font(8, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL))
self.copyright.SetPosition( self.copyright.SetPosition(
wx.Point( wx.Point(
@@ -340,8 +340,8 @@ class wx_python_gui:
# Define Menu # Define Menu
# Header: Get help with OpenCore Legacy Patcher # Header: Get help with OpenCore Legacy Patcher
# Subheader: Following resources are available: # Subheader: Following resources are available:
# Button: Offical Guide # Button: Official Guide
# Button: Offical Discord Server # Button: Official Discord Server
self.frame.DestroyChildren() self.frame.DestroyChildren()
@@ -362,8 +362,8 @@ class wx_python_gui:
self.subheader.Centre(wx.HORIZONTAL) self.subheader.Centre(wx.HORIZONTAL)
# Offical Guide # Official Guide
self.guide = wx.Button(self.frame, label="Offical Guide", size=(200,30)) self.guide = wx.Button(self.frame, label="Official Guide", size=(200,30))
self.guide.SetPosition( self.guide.SetPosition(
wx.Point( wx.Point(
self.subheader.GetPosition().x, self.subheader.GetPosition().x,
@@ -374,8 +374,8 @@ class wx_python_gui:
self.guide.Bind(wx.EVT_BUTTON, lambda event: webbrowser.open(self.constants.guide_link)) self.guide.Bind(wx.EVT_BUTTON, lambda event: webbrowser.open(self.constants.guide_link))
self.guide.Centre(wx.HORIZONTAL) self.guide.Centre(wx.HORIZONTAL)
# Offical Discord Server # Official Discord Server
self.discord = wx.Button(self.frame, label="Offical Discord Server", size=(200,30)) self.discord = wx.Button(self.frame, label="Official Discord Server", size=(200,30))
self.discord.SetPosition( self.discord.SetPosition(
wx.Point( wx.Point(
self.guide.GetPosition().x, self.guide.GetPosition().x,
@@ -386,7 +386,7 @@ class wx_python_gui:
self.discord.Centre(wx.HORIZONTAL) self.discord.Centre(wx.HORIZONTAL)
# Overclock Button # Overclock Button
self.overclock = wx.Button(self.frame, label="Offical Support Phone", size=(200,30)) self.overclock = wx.Button(self.frame, label="Official Support Phone", size=(200,30))
self.overclock.SetPosition( self.overclock.SetPosition(
wx.Point( wx.Point(
self.discord.GetPosition().x, self.discord.GetPosition().x,
@@ -677,6 +677,7 @@ class wx_python_gui:
self.subheader.Centre(wx.HORIZONTAL) self.subheader.Centre(wx.HORIZONTAL)
patches = sys_patch_detect.detect_root_patch(self.computer.real_model, self.constants).detect_patch_set() patches = sys_patch_detect.detect_root_patch(self.computer.real_model, self.constants).detect_patch_set()
self.patches = patches
if not any(not patch.startswith("Settings") and not patch.startswith("Validation") and patches[patch] is True for patch in patches): if not any(not patch.startswith("Settings") and not patch.startswith("Validation") and patches[patch] is True for patch in patches):
print("- No applicable patches available") print("- No applicable patches available")
patches = [] patches = []
@@ -873,7 +874,7 @@ class wx_python_gui:
sys.stderr = menu_redirect.RedirectText(self.text_box, True) sys.stderr = menu_redirect.RedirectText(self.text_box, True)
wx.GetApp().Yield() wx.GetApp().Yield()
self.frame.Show() self.frame.Show()
sys_patch.PatchSysVolume(self.constants.custom_model or self.constants.computer.real_model, self.constants).start_patch() sys_patch.PatchSysVolume(self.constants.custom_model or self.constants.computer.real_model, self.constants, self.patches).start_patch()
sys.stdout = self.stock_stdout sys.stdout = self.stock_stdout
sys.stderr = self.stock_stderr sys.stderr = self.stock_stderr
@@ -946,7 +947,7 @@ class wx_python_gui:
sys.stdout = menu_redirect.RedirectText(self.text_box, True) sys.stdout = menu_redirect.RedirectText(self.text_box, True)
sys.stderr = menu_redirect.RedirectText(self.text_box, True) sys.stderr = menu_redirect.RedirectText(self.text_box, True)
wx.GetApp().Yield() wx.GetApp().Yield()
sys_patch.PatchSysVolume(self.constants.custom_model or self.constants.computer.real_model, self.constants).start_unpatch() sys_patch.PatchSysVolume(self.constants.custom_model or self.constants.computer.real_model, self.constants, self.patches).start_unpatch()
sys.stdout = self.stock_stdout sys.stdout = self.stock_stdout
sys.stderr = self.stock_stderr sys.stderr = self.stock_stderr
@@ -1036,7 +1037,7 @@ class wx_python_gui:
self.frame.Show() self.frame.Show()
# Download installer catalog # Download installer catalog
avalible_installers = installer.list_downloadable_macOS_installers(self.constants.payload_path, "PublicSeed") available_installers = installer.list_downloadable_macOS_installers(self.constants.payload_path, "PublicSeed")
self.frame.DestroyChildren() self.frame.DestroyChildren()
sys.stdout = self.stock_stdout sys.stdout = self.stock_stdout
@@ -1060,13 +1061,17 @@ class wx_python_gui:
# Sort Installers by 'Version' # Sort Installers by 'Version'
# By default Apple adds new builds to the end of the list, so we need to sort them by version # By default Apple adds new builds to the end of the list, so we need to sort them by version
avalible_installers = {k: v for k, v in sorted(avalible_installers.items(), key=lambda x: x[1]['Version'])} available_installers = {k: v for k, v in sorted(available_installers.items(), key=lambda x: x[1]['Version'])}
i = -20 i = -20
if avalible_installers: if available_installers:
for app in avalible_installers: for app in available_installers:
print(f"macOS {avalible_installers[app]['Version']} ({avalible_installers[app]['Build']} - {utilities.human_fmt(avalible_installers[app]['Size'])} - {avalible_installers[app]['Source']})") print(f"macOS {available_installers[app]['Version']} ({available_installers[app]['Build']} - {utilities.human_fmt(available_installers[app]['Size'])} - {available_installers[app]['Source']}) - {available_installers[app]['Variant']}")
self.install_selection = wx.Button(self.frame, label=f"macOS {avalible_installers[app]['Version']} ({avalible_installers[app]['Build']} - {utilities.human_fmt(avalible_installers[app]['Size'])})", size=(250, 30)) if available_installers[app]['Variant'] in ["DeveloperSeed" , "PublicSeed"]:
extra = " Beta"
else:
extra = ""
self.install_selection = wx.Button(self.frame, label=f"macOS {available_installers[app]['Version']}{extra} ({available_installers[app]['Build']} - {utilities.human_fmt(available_installers[app]['Size'])})", size=(280, 30))
i = i + 25 i = i + 25
self.install_selection.SetPosition( self.install_selection.SetPosition(
wx.Point( wx.Point(
@@ -1074,7 +1079,7 @@ class wx_python_gui:
self.subheader.GetPosition().y + self.subheader.GetSize().height + i self.subheader.GetPosition().y + self.subheader.GetSize().height + i
) )
) )
self.install_selection.Bind(wx.EVT_BUTTON, lambda event, temp=app: self.download_macos_click(f"macOS {avalible_installers[temp]['Version']} ({avalible_installers[temp]['Build']})", avalible_installers[temp]['Link'])) self.install_selection.Bind(wx.EVT_BUTTON, lambda event, temp=app: self.download_macos_click(f"macOS {available_installers[temp]['Version']} ({available_installers[temp]['Build']})", available_installers[temp]['Link']))
self.install_selection.Centre(wx.HORIZONTAL) self.install_selection.Centre(wx.HORIZONTAL)
else: else:
self.install_selection = wx.StaticText(self.frame, label="No installers available") self.install_selection = wx.StaticText(self.frame, label="No installers available")
@@ -1139,7 +1144,7 @@ class wx_python_gui:
sys.stdout = self.stock_stdout sys.stdout = self.stock_stdout
self.download_label.SetLabel(f"Finished Downloading {installer_name}") self.download_label.SetLabel(f"Finished Downloading {installer_name}")
self.download_label.Centre(wx.HORIZONTAL) self.download_label.Centre(wx.HORIZONTAL)
wx.App.Get().Yield()
# Update Label: # Update Label:
sys.stdout=menu_redirect.RedirectLabelAll(self.download_label) sys.stdout=menu_redirect.RedirectLabelAll(self.download_label)
sys.stderr=menu_redirect.RedirectLabelAll(self.download_label) sys.stderr=menu_redirect.RedirectLabelAll(self.download_label)
@@ -1178,12 +1183,12 @@ class wx_python_gui:
self.subheader.Centre(wx.HORIZONTAL) self.subheader.Centre(wx.HORIZONTAL)
i = -7 i = -7
avalible_installers = installer.list_local_macOS_installers() available_installers = installer.list_local_macOS_installers()
if avalible_installers: if available_installers:
print("Installer found") print("Installer found")
for app in avalible_installers: for app in available_installers:
print(f"{avalible_installers[app]['Short Name']}: {avalible_installers[app]['Version']} ({avalible_installers[app]['Build']})") print(f"{available_installers[app]['Short Name']}: {available_installers[app]['Version']} ({available_installers[app]['Build']})")
self.install_selection = wx.Button(self.frame, label=f"{avalible_installers[app]['Short Name']}: {avalible_installers[app]['Version']} ({avalible_installers[app]['Build']})", size=(300, 30)) self.install_selection = wx.Button(self.frame, label=f"{available_installers[app]['Short Name']}: {available_installers[app]['Version']} ({available_installers[app]['Build']})", size=(300, 30))
i = i + 25 i = i + 25
self.install_selection.SetPosition( self.install_selection.SetPosition(
wx.Point( wx.Point(
@@ -1191,7 +1196,7 @@ class wx_python_gui:
self.header.GetPosition().y + self.header.GetSize().height + i self.header.GetPosition().y + self.header.GetSize().height + i
) )
) )
self.install_selection.Bind(wx.EVT_BUTTON, lambda event, temp=app: self.format_usb_menu(avalible_installers[temp]['Path'])) self.install_selection.Bind(wx.EVT_BUTTON, lambda event, temp=app: self.format_usb_menu(available_installers[temp]['Short Name'], available_installers[temp]['Path']))
self.install_selection.Centre(wx.HORIZONTAL) self.install_selection.Centre(wx.HORIZONTAL)
else: else:
print("No installers found") print("No installers found")
@@ -1202,7 +1207,7 @@ class wx_python_gui:
# Set Position below header # Set Position below header
wx.Point( wx.Point(
self.header.GetPosition().x, self.header.GetPosition().x,
self.header.GetPosition().y + self.header.GetSize().height + 10 self.header.GetPosition().y + self.header.GetSize().height + 15
) )
) )
self.install_selection.Centre(wx.HORIZONTAL) self.install_selection.Centre(wx.HORIZONTAL)
@@ -1219,7 +1224,7 @@ class wx_python_gui:
self.frame.SetSize(-1, self.return_to_main_menu.GetPosition().y + self.return_to_main_menu.GetSize().height + 40) self.frame.SetSize(-1, self.return_to_main_menu.GetPosition().y + self.return_to_main_menu.GetSize().height + 40)
def format_usb_menu(self, installer_path): def format_usb_menu(self, installer_name, installer_path):
self.frame.DestroyChildren() self.frame.DestroyChildren()
print(installer_path) print(installer_path)
@@ -1264,7 +1269,7 @@ class wx_python_gui:
self.usb_selection_label.GetPosition().y + self.usb_selection_label.GetSize().height + i self.usb_selection_label.GetPosition().y + self.usb_selection_label.GetSize().height + i
) )
) )
self.usb_selection.Bind(wx.EVT_BUTTON, lambda event, temp=disk: self.format_usb_progress(availible_disks[temp]['identifier'], installer_path)) self.usb_selection.Bind(wx.EVT_BUTTON, lambda event, temp=disk: self.format_usb_progress(availible_disks[temp]['identifier'], installer_name, installer_path))
self.usb_selection.Centre(wx.HORIZONTAL) self.usb_selection.Centre(wx.HORIZONTAL)
else: else:
print("No disks found") print("No disks found")
@@ -1292,11 +1297,11 @@ class wx_python_gui:
self.frame.SetSize(-1, self.return_to_main_menu.GetPosition().y + self.return_to_main_menu.GetSize().height + 40) self.frame.SetSize(-1, self.return_to_main_menu.GetPosition().y + self.return_to_main_menu.GetSize().height + 40)
def format_usb_progress(self, disk, installer_path): def format_usb_progress(self, disk, installer_name, installer_path):
self.frame.DestroyChildren() self.frame.DestroyChildren()
self.frame.SetSize(500, -1) self.frame.SetSize(500, -1)
# Header # Header
self.header = wx.StaticText(self.frame, label="Creating macOS Installer") self.header = wx.StaticText(self.frame, label=f"Creating Installer: {installer_name}")
self.header.SetFont(wx.Font(18, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD)) self.header.SetFont(wx.Font(18, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD))
self.header.Centre(wx.HORIZONTAL) self.header.Centre(wx.HORIZONTAL)
@@ -1389,7 +1394,6 @@ class wx_python_gui:
time.sleep(0.1) time.sleep(0.1)
output = float(utilities.monitor_disk_output(disk)) output = float(utilities.monitor_disk_output(disk))
bytes_written = output - default_output bytes_written = output - default_output
print(bytes_written)
if thread.is_alive(): if thread.is_alive():
self.progress_bar.SetValue(bytes_written) self.progress_bar.SetValue(bytes_written)
self.progress_label.SetLabel(f"Bytes Written: {round(bytes_written, 2)}MB") self.progress_label.SetLabel(f"Bytes Written: {round(bytes_written, 2)}MB")
@@ -1734,7 +1738,7 @@ class wx_python_gui:
self.set_terascale_accel_checkbox.SetPosition(wx.Point( self.set_terascale_accel_checkbox.SetPosition(wx.Point(
self.disable_thunderbolt_checkbox.GetPosition().x, self.disable_thunderbolt_checkbox.GetPosition().x,
self.disable_thunderbolt_checkbox.GetPosition().y + self.disable_thunderbolt_checkbox.GetSize().height)) self.disable_thunderbolt_checkbox.GetPosition().y + self.disable_thunderbolt_checkbox.GetSize().height))
self.set_terascale_accel_checkbox.SetToolTip(wx.ToolTip("This option will determine whether TeraScale 2 acceleration is avalible during Root Volume patching.\nOnly applicable if your system has a AMD TeraScale 2 GPU (ie. MacBookPro8,2/3)")) self.set_terascale_accel_checkbox.SetToolTip(wx.ToolTip("This option will determine whether TeraScale 2 acceleration is available during Root Volume patching.\nOnly applicable if your system has a AMD TeraScale 2 GPU (ie. MacBookPro8,2/3)"))
if self.computer.real_model not in ["MacBookPro8,2", "MacBookPro8,3"]: if self.computer.real_model not in ["MacBookPro8,2", "MacBookPro8,3"]:
self.set_terascale_accel_checkbox.Disable() self.set_terascale_accel_checkbox.Disable()
@@ -1757,21 +1761,30 @@ class wx_python_gui:
self.hibernation_checkbox.SetToolTip(wx.ToolTip("This will disable the ConnectDrivers in OpenCore\nRecommended to toggle if your machine is having issues with hibernation.\nMainly applicable for MacBookPro9,1 and MacBookPro10,1")) self.hibernation_checkbox.SetToolTip(wx.ToolTip("This will disable the ConnectDrivers in OpenCore\nRecommended to toggle if your machine is having issues with hibernation.\nMainly applicable for MacBookPro9,1 and MacBookPro10,1"))
# Disable Battery Throttling # Disable Battery Throttling
self.disable_battery_throttling_checkbox = wx.CheckBox(self.frame, label="Disable Battery Throttling") self.disable_battery_throttling_checkbox = wx.CheckBox(self.frame, label="Disable Firmware Throttling")
self.disable_battery_throttling_checkbox.SetValue(self.constants.disable_msr_power_ctl) self.disable_battery_throttling_checkbox.SetValue(self.constants.disable_msr_power_ctl)
self.disable_battery_throttling_checkbox.Bind(wx.EVT_CHECKBOX, self.disable_battery_throttling_click) self.disable_battery_throttling_checkbox.Bind(wx.EVT_CHECKBOX, self.disable_battery_throttling_click)
self.disable_battery_throttling_checkbox.SetPosition(wx.Point( self.disable_battery_throttling_checkbox.SetPosition(wx.Point(
self.hibernation_checkbox.GetPosition().x, self.hibernation_checkbox.GetPosition().x,
self.hibernation_checkbox.GetPosition().y + self.hibernation_checkbox.GetSize().height)) self.hibernation_checkbox.GetPosition().y + self.hibernation_checkbox.GetSize().height))
self.disable_battery_throttling_checkbox.SetToolTip(wx.ToolTip("This will forcefully disable MSR Power Control on Arrendale and newer Laptops\nMainly applicable for systems with severe battery throttling")) self.disable_battery_throttling_checkbox.SetToolTip(wx.ToolTip("This will forcefully disable MSR Power Control on Arrendale and newer Macs\nMainly applicable for systems with severe throttling due to missing battery or display"))
# Disable XCPM
self.disable_xcpm_checkbox = wx.CheckBox(self.frame, label="Disable XCPM")
self.disable_xcpm_checkbox.SetValue(self.constants.disable_xcpm)
self.disable_xcpm_checkbox.Bind(wx.EVT_CHECKBOX, self.disable_xcpm_click)
self.disable_xcpm_checkbox.SetPosition(wx.Point(
self.disable_battery_throttling_checkbox.GetPosition().x,
self.disable_battery_throttling_checkbox.GetPosition().y + self.disable_battery_throttling_checkbox.GetSize().height))
self.disable_xcpm_checkbox.SetToolTip(wx.ToolTip("This will forcefully disable XCPM on Ivy Bridge EP and newer Macs\nMainly applicable for systems with severe throttling due to missing battery or display"))
# Software Demux # Software Demux
self.software_demux_checkbox = wx.CheckBox(self.frame, label="Software Demux") self.software_demux_checkbox = wx.CheckBox(self.frame, label="Software Demux")
self.software_demux_checkbox.SetValue(self.constants.software_demux) self.software_demux_checkbox.SetValue(self.constants.software_demux)
self.software_demux_checkbox.Bind(wx.EVT_CHECKBOX, self.software_demux_click) self.software_demux_checkbox.Bind(wx.EVT_CHECKBOX, self.software_demux_click)
self.software_demux_checkbox.SetPosition(wx.Point( self.software_demux_checkbox.SetPosition(wx.Point(
self.disable_battery_throttling_checkbox.GetPosition().x, self.disable_xcpm_checkbox.GetPosition().x,
self.disable_battery_throttling_checkbox.GetPosition().y + self.disable_battery_throttling_checkbox.GetSize().height)) self.disable_xcpm_checkbox.GetPosition().y + self.disable_xcpm_checkbox.GetSize().height))
self.software_demux_checkbox.SetToolTip(wx.ToolTip("This will force a software based demux on MacBookPro8,2/3 aiding for better battery life\nThis will require the dGPU to be disabled via NVRAM")) self.software_demux_checkbox.SetToolTip(wx.ToolTip("This will force a software based demux on MacBookPro8,2/3 aiding for better battery life\nThis will require the dGPU to be disabled via NVRAM"))
if not self.constants.custom_model and self.computer.real_model not in ["MacBookPro8,2", "MacBookPro8,3"]: if not self.constants.custom_model and self.computer.real_model not in ["MacBookPro8,2", "MacBookPro8,3"]:
self.software_demux_checkbox.Disable() self.software_demux_checkbox.Disable()
@@ -1867,6 +1880,22 @@ class wx_python_gui:
print("NVMe Disabled") print("NVMe Disabled")
self.constants.nvme_boot = False self.constants.nvme_boot = False
def nvme_power_management_click(self, event=None):
if self.nvme_power_management_checkbox.GetValue():
print("NVMe Power Management Enabled")
self.constants.allow_nvme_fixing = True
else:
print("NVMe Power Management Disabled")
self.constants.allow_nvme_fixing = False
def xhci_click(self, event=None):
if self.xhci_boot_checkbox.GetValue():
print("XHCI Enabled")
self.constants.xhci_boot = True
else:
print("XHCI Disabled")
self.constants.xhci_boot = False
def wake_on_wlan_click(self, event=None): def wake_on_wlan_click(self, event=None):
if self.wake_on_wlan_checkbox.GetValue(): if self.wake_on_wlan_checkbox.GetValue():
print("Wake on WLAN Enabled") print("Wake on WLAN Enabled")
@@ -1875,6 +1904,14 @@ class wx_python_gui:
print("Wake on WLAN Disabled") print("Wake on WLAN Disabled")
self.constants.enable_wake_on_wlan = False self.constants.enable_wake_on_wlan = False
def content_caching_click(self, event=None):
if self.content_caching_checkbox.GetValue():
print("Content Caching Enabled")
self.constants.set_content_caching = True
else:
print("Content Caching Disabled")
self.constants.set_content_caching = False
def disable_tb_click(self, event=None): def disable_tb_click(self, event=None):
if self.disable_thunderbolt_checkbox.GetValue(): if self.disable_thunderbolt_checkbox.GetValue():
print("Disable Thunderbolt Enabled") print("Disable Thunderbolt Enabled")
@@ -1915,6 +1952,14 @@ class wx_python_gui:
print("Disable Battery Throttling Disabled") print("Disable Battery Throttling Disabled")
self.constants.disable_msr_power_ctl = False self.constants.disable_msr_power_ctl = False
def disable_xcpm_click(self, event=None):
if self.disable_xcpm_checkbox.GetValue():
print("Disable XCPM Enabled")
self.constants.disable_xcpm = True
else:
print("Disable XCPM Disabled")
self.constants.disable_xcpm = False
def software_demux_click(self, event=None): def software_demux_click(self, event=None):
if self.software_demux_checkbox.GetValue(): if self.software_demux_checkbox.GetValue():
print("Software Demux Enabled") print("Software Demux Enabled")
@@ -2347,26 +2392,47 @@ OpenCore Legacy Patcher by default knows the most ideal
if generate_smbios.check_firewire(self.computer.real_model) is False and not self.constants.custom_model: if generate_smbios.check_firewire(self.computer.real_model) is False and not self.constants.custom_model:
self.firewire_boot_checkbox.Disable() self.firewire_boot_checkbox.Disable()
# XHCI Boot
self.xhci_boot_checkbox = wx.CheckBox(self.frame, label="XHCI Boot")
self.xhci_boot_checkbox.SetValue(self.constants.xhci_boot)
self.xhci_boot_checkbox.Bind(wx.EVT_CHECKBOX, self.xhci_click)
self.xhci_boot_checkbox.SetPosition(wx.Point(self.firewire_boot_checkbox.GetPosition().x, self.firewire_boot_checkbox.GetPosition().y + self.firewire_boot_checkbox.GetSize().height))
self.xhci_boot_checkbox.SetToolTip(wx.ToolTip("Enables XHCI/USB3.o support in UEFI for non-native systems (ie. pre-Ivy Bridge)\nRequires OpenCore to be stored on a natively bootable volume however"))
# NVMe Boot # NVMe Boot
self.nvme_boot_checkbox = wx.CheckBox(self.frame, label="NVMe Boot") self.nvme_boot_checkbox = wx.CheckBox(self.frame, label="NVMe Boot")
self.nvme_boot_checkbox.SetValue(self.constants.nvme_boot) self.nvme_boot_checkbox.SetValue(self.constants.nvme_boot)
self.nvme_boot_checkbox.Bind(wx.EVT_CHECKBOX, self.nvme_click) self.nvme_boot_checkbox.Bind(wx.EVT_CHECKBOX, self.nvme_click)
self.nvme_boot_checkbox.SetPosition(wx.Point(self.firewire_boot_checkbox.GetPosition().x, self.firewire_boot_checkbox.GetPosition().y + self.firewire_boot_checkbox.GetSize().height)) self.nvme_boot_checkbox.SetPosition(wx.Point(self.xhci_boot_checkbox.GetPosition().x, self.xhci_boot_checkbox.GetPosition().y + self.xhci_boot_checkbox.GetSize().height))
self.nvme_boot_checkbox.SetToolTip(wx.ToolTip("Enables NVMe support in UEFI for non-native systems (ie. MacPro3,1)\nRequires OpenCore to be stored on a natively bootable volume however")) self.nvme_boot_checkbox.SetToolTip(wx.ToolTip("Enables NVMe support in UEFI for non-native systems (ie. MacPro3,1)\nRequires OpenCore to be stored on a natively bootable volume however"))
# NVMe Power Management
self.nvme_power_management_checkbox = wx.CheckBox(self.frame, label="NVMe Power Management")
self.nvme_power_management_checkbox.SetValue(self.constants.allow_nvme_fixing)
self.nvme_power_management_checkbox.Bind(wx.EVT_CHECKBOX, self.nvme_power_management_click)
self.nvme_power_management_checkbox.SetPosition(wx.Point(self.nvme_boot_checkbox.GetPosition().x, self.nvme_boot_checkbox.GetPosition().y + self.nvme_boot_checkbox.GetSize().height))
self.nvme_power_management_checkbox.SetToolTip(wx.ToolTip("For machines with upgraded NVMe drives, this option allows for better power management support within macOS.\nNote that some NVMe drives don't support macOS's power management settings, and can result in boot issues. Disable this option if you experience IONVMeFamily kernel panics. Mainly applicable for Skylake and newer Macs."))
# Wake on WLAN # Wake on WLAN
self.wake_on_wlan_checkbox = wx.CheckBox(self.frame, label="Wake on WLAN") self.wake_on_wlan_checkbox = wx.CheckBox(self.frame, label="Wake on WLAN")
self.wake_on_wlan_checkbox.SetValue(self.constants.enable_wake_on_wlan) self.wake_on_wlan_checkbox.SetValue(self.constants.enable_wake_on_wlan)
self.wake_on_wlan_checkbox.Bind(wx.EVT_CHECKBOX, self.wake_on_wlan_click) self.wake_on_wlan_checkbox.Bind(wx.EVT_CHECKBOX, self.wake_on_wlan_click)
self.wake_on_wlan_checkbox.SetPosition(wx.Point(self.nvme_boot_checkbox.GetPosition().x, self.nvme_boot_checkbox.GetPosition().y + self.nvme_boot_checkbox.GetSize().height)) self.wake_on_wlan_checkbox.SetPosition(wx.Point(self.nvme_power_management_checkbox.GetPosition().x, self.nvme_power_management_checkbox.GetPosition().y + self.nvme_power_management_checkbox.GetSize().height))
self.wake_on_wlan_checkbox.SetToolTip(wx.ToolTip("Enables Wake on WLAN for Broadcom Wifi.\nBy default, Wake on WLAN is disabled to work around Apple's wake from sleep bug causing heavily degraded networking performance.\nNote: This option is only applicable for BCM943224, BCM94331, BCM94360 and BCM943602 chipsets")) self.wake_on_wlan_checkbox.SetToolTip(wx.ToolTip("Enables Wake on WLAN for Broadcom Wifi.\nBy default, Wake on WLAN is disabled to work around Apple's wake from sleep bug causing heavily degraded networking performance.\nNote: This option is only applicable for BCM943224, BCM94331, BCM94360 and BCM943602 chipsets"))
# Content Caching
self.content_caching_checkbox = wx.CheckBox(self.frame, label="Content Caching")
self.content_caching_checkbox.SetValue(self.constants.set_content_caching)
self.content_caching_checkbox.Bind(wx.EVT_CHECKBOX, self.content_caching_click)
self.content_caching_checkbox.SetPosition(wx.Point(self.wake_on_wlan_checkbox.GetPosition().x, self.wake_on_wlan_checkbox.GetPosition().y + self.wake_on_wlan_checkbox.GetSize().height))
self.content_caching_checkbox.SetToolTip(wx.ToolTip("Enables content caching support in macOS"))
# Button: return to main menu # Button: return to main menu
self.return_to_main_menu_button = wx.Button(self.frame, label="Return to Settings") self.return_to_main_menu_button = wx.Button(self.frame, label="Return to Settings")
self.return_to_main_menu_button.Bind(wx.EVT_BUTTON, self.settings_menu) self.return_to_main_menu_button.Bind(wx.EVT_BUTTON, self.settings_menu)
self.return_to_main_menu_button.SetPosition(wx.Point( self.return_to_main_menu_button.SetPosition(wx.Point(
self.wake_on_wlan_checkbox.GetPosition().x, self.content_caching_checkbox.GetPosition().x,
self.wake_on_wlan_checkbox.GetPosition().y + self.wake_on_wlan_checkbox.GetSize().height + 10)) self.content_caching_checkbox.GetPosition().y + self.content_caching_checkbox.GetSize().height + 10))
self.return_to_main_menu_button.Center(wx.HORIZONTAL) self.return_to_main_menu_button.Center(wx.HORIZONTAL)
# set frame size below return to main menu button # set frame size below return to main menu button
@@ -2374,6 +2440,9 @@ OpenCore Legacy Patcher by default knows the most ideal
def non_metal_config_menu(self, event=None): def non_metal_config_menu(self, event=None):
# Configures ASB's Blur settings # Configures ASB's Blur settings
# Check Dark Menu Bar:
# defaults read ASB_DarkMenuBar
# defaults write -g ASB_DarkMenuBar -bool true
# Check Beta Blur: # Check Beta Blur:
# defaults read ASB_BlurBeta # defaults read ASB_BlurBeta
# defaults write -g ASB_BlurBeta -bool true # defaults write -g ASB_BlurBeta -bool true
@@ -2422,7 +2491,11 @@ OpenCore Legacy Patcher by default knows the most ideal
self.subheader_4.SetPosition(wx.Point(0, self.subheader_3.GetPosition().y + self.subheader_3.GetSize().height+ 5)) self.subheader_4.SetPosition(wx.Point(0, self.subheader_3.GetPosition().y + self.subheader_3.GetSize().height+ 5))
self.subheader_4.Centre(wx.HORIZONTAL) self.subheader_4.Centre(wx.HORIZONTAL)
is_dark_menu_bar = subprocess.run(["defaults", "read", "-g", "ASB_DarkMenuBar"], stdout=subprocess.PIPE).stdout.decode("utf-8").strip()
if is_dark_menu_bar in ["1", "true"]:
is_dark_menu_bar = True
else:
is_dark_menu_bar = False
is_blur_enabled = subprocess.run(["defaults", "read", "-g", "ASB_BlurBeta"], stdout=subprocess.PIPE).stdout.decode("utf-8").strip() is_blur_enabled = subprocess.run(["defaults", "read", "-g", "ASB_BlurBeta"], stdout=subprocess.PIPE).stdout.decode("utf-8").strip()
if is_blur_enabled in ["1", "true"]: if is_blur_enabled in ["1", "true"]:
@@ -2430,12 +2503,18 @@ OpenCore Legacy Patcher by default knows the most ideal
else: else:
is_blur_enabled = False is_blur_enabled = False
# Checkbox: Dark Menu Bar
self.dark_menu_bar_checkbox = wx.CheckBox(self.frame, label="Dark Menu Bar")
self.dark_menu_bar_checkbox.SetValue(is_dark_menu_bar)
self.dark_menu_bar_checkbox.Bind(wx.EVT_CHECKBOX, self.enable_dark_menubar_click)
self.dark_menu_bar_checkbox.SetPosition(wx.Point(0, self.subheader_4.GetPosition().y + self.subheader_4.GetSize().height + 10))
self.dark_menu_bar_checkbox.Centre(wx.HORIZONTAL)
# Checkbox: Enable Beta Blur # Checkbox: Enable Beta Blur
self.enable_beta_blur_checkbox = wx.CheckBox(self.frame, label="Enable Beta Blur") self.enable_beta_blur_checkbox = wx.CheckBox(self.frame, label="Enable Beta Blur")
self.enable_beta_blur_checkbox.SetValue(is_blur_enabled) self.enable_beta_blur_checkbox.SetValue(is_blur_enabled)
self.enable_beta_blur_checkbox.Bind(wx.EVT_CHECKBOX, self.enable_beta_blur_click) self.enable_beta_blur_checkbox.Bind(wx.EVT_CHECKBOX, self.enable_beta_blur_click)
self.enable_beta_blur_checkbox.SetPosition(wx.Point(0, self.subheader_4.GetPosition().y + self.subheader_4.GetSize().height + 10)) self.enable_beta_blur_checkbox.SetPosition(wx.Point(self.dark_menu_bar_checkbox.GetPosition().x, self.dark_menu_bar_checkbox.GetPosition().y + self.dark_menu_bar_checkbox.GetSize().height + 10))
self.enable_beta_blur_checkbox.Center(wx.HORIZONTAL)
# Text: Blur Radius # Text: Blur Radius
self.blur_radius_text = wx.StaticText(self.frame, label="Current Blur Radius: " + "px") self.blur_radius_text = wx.StaticText(self.frame, label="Current Blur Radius: " + "px")
@@ -2475,6 +2554,13 @@ OpenCore Legacy Patcher by default knows the most ideal
subprocess.run(["defaults", "write", "-g", "ASB_BlurBeta", "-bool", "false"]) subprocess.run(["defaults", "write", "-g", "ASB_BlurBeta", "-bool", "false"])
print("Beta Blur Enabled:", event.IsChecked()) print("Beta Blur Enabled:", event.IsChecked())
def enable_dark_menubar_click(self, event=None):
if event.IsChecked():
subprocess.run(["defaults", "write", "-g", "ASB_DarkMenuBar", "-bool", "true"])
else:
subprocess.run(["defaults", "write", "-g", "ASB_DarkMenuBar", "-bool", "false"])
print("Dark Menu Bar Enabled:", event.IsChecked())
def blur_radius_scale_change(self, event=None): def blur_radius_scale_change(self, event=None):
val = event.GetInt() val = event.GetInt()
subprocess.run(["defaults", "write", "-g", "ASB_BlurOverride", "-float", str(val)]) subprocess.run(["defaults", "write", "-g", "ASB_BlurOverride", "-float", str(val)])

BIN
images/Hash-Mismatch.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 275 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 252 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 424 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 923 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 916 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 893 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 495 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 311 KiB

After

Width:  |  Height:  |  Size: 569 KiB

View File

@@ -501,6 +501,42 @@
<key>PlistPath</key> <key>PlistPath</key>
<string>Contents/Info.plist</string> <string>Contents/Info.plist</string>
</dict> </dict>
<dict>
<key>Arch</key>
<string>x86_64</string>
<key>Comment</key>
<string>SDXC Patch for Pre-Ivy</string>
<key>Enabled</key>
<false/>
<key>MaxKernel</key>
<string></string>
<key>MinKernel</key>
<string>21.0.0</string>
<key>BundlePath</key>
<string>BigSurSDXC.kext</string>
<key>ExecutablePath</key>
<string>Contents/MacOS/BigSurSDXC</string>
<key>PlistPath</key>
<string>Contents/Info.plist</string>
</dict>
<dict>
<key>Arch</key>
<string>x86_64</string>
<key>Comment</key>
<string>I210 Ethernet patch</string>
<key>Enabled</key>
<false/>
<key>MaxKernel</key>
<string></string>
<key>MinKernel</key>
<string>20.0.0</string>
<key>BundlePath</key>
<string>CatalinaIntelI210Ethernet.kext</string>
<key>ExecutablePath</key>
<string>Contents/MacOS/CatalinaIntelI210Ethernet</string>
<key>PlistPath</key>
<string>Contents/Info.plist</string>
</dict>
<dict> <dict>
<key>Arch</key> <key>Arch</key>
<string>x86_64</string> <string>x86_64</string>
@@ -1149,6 +1185,24 @@
<key>PlistPath</key> <key>PlistPath</key>
<string>Contents/Info.plist</string> <string>Contents/Info.plist</string>
</dict> </dict>
<dict>
<key>Arch</key>
<string>x86_64</string>
<key>Comment</key>
<string>ACPI_SMC_PlatformPlugin Override</string>
<key>Enabled</key>
<false/>
<key>MaxKernel</key>
<string></string>
<key>MinKernel</key>
<string>21.4.0</string>
<key>BundlePath</key>
<string>ASPP-Override.kext</string>
<key>ExecutablePath</key>
<string></string>
<key>PlistPath</key>
<string>Contents/Info.plist</string>
</dict>
</array> </array>
<key>Block</key> <key>Block</key>
<array/> <array/>
@@ -1309,7 +1363,7 @@
<key>Mask</key> <key>Mask</key>
<data></data> <data></data>
<key>MaxKernel</key> <key>MaxKernel</key>
<string>21.99.99</string> <string>21.1.0</string>
<key>MinKernel</key> <key>MinKernel</key>
<string>20.4.0</string> <string>20.4.0</string>
<key>Replace</key> <key>Replace</key>
@@ -1339,7 +1393,7 @@
<key>Mask</key> <key>Mask</key>
<data></data> <data></data>
<key>MaxKernel</key> <key>MaxKernel</key>
<string>21.99.99</string> <string>21.1.0</string>
<key>MinKernel</key> <key>MinKernel</key>
<string>20.4.0</string> <string>20.4.0</string>
<key>Replace</key> <key>Replace</key>
@@ -1946,6 +2000,16 @@
<key>Arguments</key> <key>Arguments</key>
<string></string> <string></string>
</dict> </dict>
<dict>
<key>Comment</key>
<string></string>
<key>Path</key>
<string>UsbBusDxe.efi</string>
<key>Enabled</key>
<false/>
<key>Arguments</key>
<string></string>
</dict>
<dict> <dict>
<key>Comment</key> <key>Comment</key>
<string></string> <string></string>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
payloads/Tools/ocvalidate-0.7.8 Executable file

Binary file not shown.

View File

@@ -101,7 +101,7 @@ If you plan to create the USB for another machine, please select the "Change Mod
print("- Set Mojave/Catalina root patch configuration") print("- Set Mojave/Catalina root patch configuration")
settings.moj_cat_accel = True settings.moj_cat_accel = True
print("- Set System Volume patching") print("- Set System Volume patching")
sys_patch.PatchSysVolume(settings.custom_model or settings.computer.real_model, settings).start_patch() sys_patch.PatchSysVolume(settings.custom_model or settings.computer.real_model, settings, None).start_patch()
elif self.args.unpatch_sys_vol: elif self.args.unpatch_sys_vol:
print("- Set System Volume unpatching") print("- Set System Volume unpatching")
sys_patch.PatchSysVolume(settings.custom_model or settings.computer.real_model, settings).start_unpatch() sys_patch.PatchSysVolume(settings.custom_model or settings.computer.real_model, settings, None).start_unpatch()

View File

@@ -126,9 +126,6 @@ class BuildOpenCore:
self.constants.cpufriend_path, self.constants.cpufriend_path,
lambda: self.model not in ["iMac7,1", "Xserve2,1", "Dortania1,1"] and self.constants.allow_oc_everywhere is False and self.constants.disallow_cpufriend is False and self.constants.serial_settings != "None", lambda: self.model not in ["iMac7,1", "Xserve2,1", "Dortania1,1"] and self.constants.allow_oc_everywhere is False and self.constants.disallow_cpufriend is False and self.constants.serial_settings != "None",
), ),
# Ethernet patches
("nForceEthernet.kext", self.constants.nforce_version, self.constants.nforce_path, lambda: smbios_data.smbios_dictionary[self.model]["Ethernet Chipset"] == "Nvidia"),
("MarvelYukonEthernet.kext", self.constants.marvel_version, self.constants.marvel_path, lambda: smbios_data.smbios_dictionary[self.model]["Ethernet Chipset"] == "Marvell"),
# Legacy audio # Legacy audio
( (
"AppleALC.kext", "AppleALC.kext",
@@ -177,16 +174,52 @@ class BuildOpenCore:
print(f"- Adding additional FeatureUnlock args: {self.constants.fu_arguments}") print(f"- Adding additional FeatureUnlock args: {self.constants.fu_arguments}")
self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"] += self.constants.fu_arguments self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"] += self.constants.fu_arguments
if smbios_data.smbios_dictionary[self.model]["CPU Generation"] <= cpu_data.cpu_data.sandy_bridge.value or self.constants.disable_xcpm is True:
# With macOS 12.3 Beta 1, Apple dropped the 'plugin-type' check within X86PlatformPlugin
# Because of this, X86PP will match onto the CPU instead of ACPI_SMC_PlatformPlugin
# This causes power management to break on pre-Ivy Bridge CPUs as they don't have correct
# power management tables provided.
# This patch will simply increase ASPP's 'IOProbeScore' to outmatch X86PP
print("- Overriding ACPI SMC matching")
self.enable_kext("ASPP-Override.kext", self.constants.aspp_override_version, self.constants.aspp_override_path)
if self.constants.disable_xcpm is True:
# Only inject on older OSes if user requests
self.get_item_by_kv(self.config["Kernel"]["Add"], "BundlePath", "ASPP-Override.kext")["MinKernel"] = ""
if self.model in ["MacBookPro6,1", "MacBookPro6,2", "MacBookPro9,1", "MacBookPro10,1"]: if self.model in ["MacBookPro6,1", "MacBookPro6,2", "MacBookPro9,1", "MacBookPro10,1"]:
# Modded RestrictEvents with displaypolicyd blocked to fix dGPU switching # Modded RestrictEvents with displaypolicyd blocked to fix dGPU switching
self.enable_kext("RestrictEvents.kext", self.constants.restrictevents_mbp_version, self.constants.restrictevents_mbp_path) self.enable_kext("RestrictEvents.kext", self.constants.restrictevents_mbp_version, self.constants.restrictevents_mbp_path)
# Ethernet Patch Sets if not self.constants.custom_model and self.constants.computer.ethernet:
if smbios_data.smbios_dictionary[self.model]["Ethernet Chipset"] == "Broadcom": for controller in self.constants.computer.ethernet:
if smbios_data.smbios_dictionary[self.model]["CPU Generation"] < cpu_data.cpu_data.ivy_bridge.value: if isinstance(controller, device_probe.BroadcomEthernet) and controller.chipset == device_probe.BroadcomEthernet.Chipsets.AppleBCM5701Ethernet:
# Required due to Big Sur's BCM5701 requiring VT-x support if smbios_data.smbios_dictionary[self.model]["CPU Generation"] < cpu_data.cpu_data.ivy_bridge.value:
# Applicable for pre-Ivy Bridge models # Required due to Big Sur's BCM5701 requiring VT-D support
self.enable_kext("CatalinaBCM5701Ethernet.kext", self.constants.bcm570_version, self.constants.bcm570_path) # Applicable for pre-Ivy Bridge models
if self.get_kext_by_bundle_path("CatalinaBCM5701Ethernet.kext")["Enabled"] is False:
self.enable_kext("CatalinaBCM5701Ethernet.kext", self.constants.bcm570_version, self.constants.bcm570_path)
elif isinstance(controller, device_probe.IntelEthernet) and controller.chipset == device_probe.IntelEthernet.Chipsets.AppleIntelI210Ethernet:
if smbios_data.smbios_dictionary[self.model]["CPU Generation"] < cpu_data.cpu_data.ivy_bridge.value:
# Apple's IOSkywalkFamily in DriverKit requires VT-D support
# Applicable for pre-Ivy Bridge models
if self.get_kext_by_bundle_path("CatalinaIntelI210Ethernet.kext")["Enabled"] is False:
self.enable_kext("CatalinaIntelI210Ethernet.kext", self.constants.i210_version, self.constants.i210_path)
elif isinstance(controller, device_probe.NVIDIAEthernet):
if self.get_kext_by_bundle_path("nForceEthernet.kext")["Enabled"] is False:
self.enable_kext("nForceEthernet.kext", self.constants.nforce_version, self.constants.nforce_path)
elif isinstance(controller, device_probe.Marvell) or isinstance(controller, device_probe.SysKonnect):
if self.get_kext_by_bundle_path("MarvelYukonEthernet.kext")["Enabled"] is False:
self.enable_kext("MarvelYukonEthernet.kext", self.constants.marvel_version, self.constants.marvel_path)
else:
if smbios_data.smbios_dictionary[self.model]["Ethernet Chipset"] == "Broadcom":
if smbios_data.smbios_dictionary[self.model]["CPU Generation"] < cpu_data.cpu_data.ivy_bridge.value:
# Required due to Big Sur's BCM5701 requiring VT-D support
# Applicable for pre-Ivy Bridge models
self.enable_kext("CatalinaBCM5701Ethernet.kext", self.constants.bcm570_version, self.constants.bcm570_path)
elif smbios_data.smbios_dictionary[self.model]["Ethernet Chipset"] == "Nvidia":
self.enable_kext("nForceEthernet.kext", self.constants.nforce_version, self.constants.nforce_path)
elif smbios_data.smbios_dictionary[self.model]["Ethernet Chipset"] == "Marvell":
self.enable_kext("MarvelYukonEthernet.kext", self.constants.marvel_version, self.constants.marvel_path)
# i3 Ivy Bridge iMacs don't support RDRAND # i3 Ivy Bridge iMacs don't support RDRAND
# However for prebuilt, assume they do # However for prebuilt, assume they do
@@ -218,7 +251,7 @@ class BuildOpenCore:
if not self.computer.storage: if not self.computer.storage:
print("- No PCIe Storage Controllers found to fix") print("- No PCIe Storage Controllers found to fix")
if not self.constants.custom_model: if not self.constants.custom_model and self.constants.allow_nvme_fixing is True:
nvme_devices = [i for i in self.computer.storage if isinstance(i, device_probe.NVMeController)] nvme_devices = [i for i in self.computer.storage if isinstance(i, device_probe.NVMeController)]
for i, controller in enumerate(nvme_devices): for i, controller in enumerate(nvme_devices):
print(f"- Found 3rd Party NVMe SSD ({i + 1}): {utilities.friendly_hex(controller.vendor_id)}:{utilities.friendly_hex(controller.device_id)}") print(f"- Found 3rd Party NVMe SSD ({i + 1}): {utilities.friendly_hex(controller.vendor_id)}:{utilities.friendly_hex(controller.device_id)}")
@@ -236,11 +269,8 @@ class BuildOpenCore:
print("- Falling back to -nvmefaspm") print("- Falling back to -nvmefaspm")
self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"] += " -nvmefaspm" self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"] += " -nvmefaspm"
if (controller.vendor_id != 0x144D and controller.device_id != 0xA804 and self.model not in ["MacBookPro13,3", "MacBookPro14,3"]): if (controller.vendor_id != 0x144D and controller.device_id != 0xA804):
# Avoid injecting NVMeFix when a native Apple NVMe drive is present # Avoid injecting NVMeFix when a native Apple NVMe drive is present
# Note on 2016-2017 MacBook Pros, 15" devices used a stock Samsung SSD with IONVMeController
# Technically this should be patched based on NVMeFix.kext logic,
# however Apple deemed the SSD unsupported for enhanced performance
# https://github.com/acidanthera/NVMeFix/blob/1.0.9/NVMeFix/NVMeFix.cpp#L220-L225 # https://github.com/acidanthera/NVMeFix/blob/1.0.9/NVMeFix/NVMeFix.cpp#L220-L225
if self.get_kext_by_bundle_path("NVMeFix.kext")["Enabled"] is False: if self.get_kext_by_bundle_path("NVMeFix.kext")["Enabled"] is False:
self.enable_kext("NVMeFix.kext", self.constants.nvmefix_version, self.constants.nvmefix_path) self.enable_kext("NVMeFix.kext", self.constants.nvmefix_version, self.constants.nvmefix_path)
@@ -380,6 +410,12 @@ class BuildOpenCore:
self.get_item_by_kv(self.config["ACPI"]["Patch"], "Comment", "BUF0 to BUF1")["Enabled"] = True self.get_item_by_kv(self.config["ACPI"]["Patch"], "Comment", "BUF0 to BUF1")["Enabled"] = True
shutil.copy(self.constants.windows_ssdt_path, self.constants.acpi_path) shutil.copy(self.constants.windows_ssdt_path, self.constants.acpi_path)
# With macOS Monterey, Apple's SDXC driver requires the system to support VT-D
# However pre-Ivy Bridge don't support this feature
if smbios_data.smbios_dictionary[self.model]["CPU Generation"] <= cpu_data.cpu_data.sandy_bridge.value:
if (self.constants.computer.sdxc_controller and not self.constants.custom_model) or (self.model.startswith("MacBookPro8") or self.model.startswith("Macmini5")):
self.enable_kext("BigSurSDXC.kext", self.constants.bigsursdxc_version, self.constants.bigsursdxc_path)
# USB Map # USB Map
usb_map_path = Path(self.constants.plist_folder_path) / Path("AppleUSBMaps/Info.plist") usb_map_path = Path(self.constants.plist_folder_path) / Path("AppleUSBMaps/Info.plist")
if ( if (
@@ -704,6 +740,8 @@ class BuildOpenCore:
elif self.computer.bluetooth_chipset == "3rd Party Bluetooth 4.0 Hub": elif self.computer.bluetooth_chipset == "3rd Party Bluetooth 4.0 Hub":
print("- Detected 3rd Party Chipset") print("- Detected 3rd Party Chipset")
self.enable_kext("BlueToolFixup.kext", self.constants.bluetool_version, self.constants.bluetool_path) self.enable_kext("BlueToolFixup.kext", self.constants.bluetool_version, self.constants.bluetool_path)
print("- Enabling Bluetooth FeatureFlags")
self.config["Kernel"]["Quirks"]["ExtendBTFeatureFlags"] = True
elif smbios_data.smbios_dictionary[self.model]["Bluetooth Model"] <= bluetooth_data.bluetooth_data.BRCM20702_v1.value: elif smbios_data.smbios_dictionary[self.model]["Bluetooth Model"] <= bluetooth_data.bluetooth_data.BRCM20702_v1.value:
print("- Fixing Legacy Bluetooth for macOS Monterey") print("- Fixing Legacy Bluetooth for macOS Monterey")
self.enable_kext("BlueToolFixup.kext", self.constants.bluetool_version, self.constants.bluetool_path) self.enable_kext("BlueToolFixup.kext", self.constants.bluetool_version, self.constants.bluetool_path)
@@ -761,6 +799,14 @@ class BuildOpenCore:
except KeyError: except KeyError:
pass pass
if self.constants.xhci_boot is True:
print("- Adding USB 3.0 Controller Patch")
print("- Adding XhciDxe.efi and UsbBusDxe.efi")
shutil.copy(self.constants.xhci_driver_path, self.constants.drivers_path)
shutil.copy(self.constants.usb_bus_driver_path, self.constants.drivers_path)
self.get_efi_binary_by_path("XhciDxe.efi", "UEFI", "Drivers")["Enabled"] = True
self.get_efi_binary_by_path("UsbBusDxe.efi", "UEFI", "Drivers")["Enabled"] = True
# ThirdPartDrives Check # ThirdPartDrives Check
if self.constants.allow_3rd_party_drives is True: if self.constants.allow_3rd_party_drives is True:
for drive in ["SATA 2.5", "SATA 3.5", "mSATA"]: for drive in ["SATA 2.5", "SATA 3.5", "mSATA"]:
@@ -883,10 +929,10 @@ class BuildOpenCore:
self.get_item_by_kv(self.config["Kernel"]["Patch"], "Identifier", "com.apple.filesystems.apfs")["Enabled"] = True self.get_item_by_kv(self.config["Kernel"]["Patch"], "Identifier", "com.apple.filesystems.apfs")["Enabled"] = True
# Lets us check in sys_patch.py if config supports FileVault # Lets us check in sys_patch.py if config supports FileVault
self.config["NVRAM"]["Add"]["4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102"]["OCLP-Settings"] += " -allow_fv" self.config["NVRAM"]["Add"]["4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102"]["OCLP-Settings"] += " -allow_fv"
if self.constants.disable_msr_power_ctl is True and self.model.startswith("MacBook"): if self.constants.disable_msr_power_ctl is True:
print("- Disabling Battery Throttling") print("- Disabling Firmware Throttling")
if smbios_data.smbios_dictionary[self.model]["CPU Generation"] >= cpu_data.cpu_data.nehalem.value: if smbios_data.smbios_dictionary[self.model]["CPU Generation"] >= cpu_data.cpu_data.nehalem.value:
# Nehalem and newer MacBooks force firmware throttling via MSR_POWER_CTL # Nehalem and newer systems force firmware throttling via MSR_POWER_CTL
self.enable_kext("SimpleMSR.kext", self.constants.simplemsr_version, self.constants.simplemsr_path) self.enable_kext("SimpleMSR.kext", self.constants.simplemsr_version, self.constants.simplemsr_path)
if self.constants.disable_connectdrivers is True: if self.constants.disable_connectdrivers is True:
print("- Disabling ConnectDrivers") print("- Disabling ConnectDrivers")
@@ -894,7 +940,7 @@ class BuildOpenCore:
if self.constants.nvram_write is False: if self.constants.nvram_write is False:
print("- Disabling Hardware NVRAM Write") print("- Disabling Hardware NVRAM Write")
self.config["NVRAM"]["WriteFlash"] = False self.config["NVRAM"]["WriteFlash"] = False
if self.get_item_by_kv(self.config["Kernel"]["Patch"], "Comment", "Reroute kern.hv_vmm_present patch (1)")["Enabled"] is True: if self.get_item_by_kv(self.config["Kernel"]["Patch"], "Comment", "Reroute kern.hv_vmm_present patch (1)")["Enabled"] is True and self.constants.set_content_caching is True:
# Add Content Caching patch # Add Content Caching patch
print("- Fixing Content Caching support") print("- Fixing Content Caching support")
if self.get_kext_by_bundle_path("RestrictEvents.kext")["Enabled"] is False: if self.get_kext_by_bundle_path("RestrictEvents.kext")["Enabled"] is False:

View File

@@ -467,6 +467,60 @@ OpenCore will enable NVMe support in it's picker
else: else:
self.allow_nvme() self.allow_nvme()
def allow_nvme_pwr_mgmt(self):
utilities.cls()
utilities.header(["Allow NVMe Power Management Adjustments"])
print(
"""
For machines with upgraded NVMe drives, this
option allows for better power management support
within macOS.
Note that some NVMe drives don't support macOS's
power management settings, and can result in boot
issues. Disable this option if you experience
IONVMeFamily kernel panics. Mainly applicable for
Skylake and newer Macs.
"""
)
change_menu = input("Enable NVMe Power Management?(y/n/q): ")
if change_menu in {"y", "Y", "yes", "Yes"}:
self.constants.allow_nvme_fixing = True
elif change_menu in {"n", "N", "no", "No"}:
self.constants.allow_nvme_fixing = False
elif change_menu in {"q", "Q", "Quit", "quit"}:
print("Returning to previous menu")
else:
self.allow_nvme()
def allow_xhci(self):
utilities.cls()
utilities.header(["Allow NVMe UEFI Support"])
print(
"""
For machines not natively supporting XHCI/USB 3.o,
this option allows you to see and boot XHCI
drive in OpenCore's picker
Not required if your machine natively supports USB 3.0
Note: You must have OpenCore on a bootable volume
first, ie. USB 2.0 or SATA drive. Once loaded,
OpenCore will enable XHCI support in it's picker
"""
)
change_menu = input("Enable XHCI Boot support?(y/n/q): ")
if change_menu in {"y", "Y", "yes", "Yes"}:
self.constants.xhci_boot = True
elif change_menu in {"n", "N", "no", "No"}:
self.constants.xhci_boot = False
elif change_menu in {"q", "Q", "Quit", "quit"}:
print("Returning to previous menu")
else:
self.allow_xhci()
def allow_wowl(self): def allow_wowl(self):
utilities.cls() utilities.cls()
utilities.header(["Allow Wake on WLAN"]) utilities.header(["Allow Wake on WLAN"])
@@ -753,16 +807,16 @@ https://dortania.github.io/OpenCore-Legacy-Patcher/ACCEL.html#unable-to-switch-g
print( print(
""" """
By default on Nehalem and newer Macs, the firmware will throttle if By default on Nehalem and newer Macs, the firmware will throttle if
the battery is either dead or missing. The firmware will set the battery or Display is either dead or missing. The firmware will set
'BD PROCHOT' to notify the OS the machine needs to run in an extreme 'BD PROCHOT' to notify the OS the machine needs to run in an extreme
low power mode. low power mode.
Enabling this option will patch 'MSR_POWER_CTL' to be unset allowing Enabling this option will patch 'MSR_POWER_CTL' to be unset allowing
proper CPU behaviour as if battery is present. Note that this can cause proper CPU behaviour as if hardware is present. Note that this can cause
instability in situations where the CPU is being taxed and pulls more instability in situations where the CPU is being taxed and pulls more
power than the PSU can supply. power than the laptop's PSU can supply.
Note: Only supported on Nehalem and newer MacBooks (2010+) Note: Only supported on Nehalem and newer Macs (2010+)
""" """
) )
@@ -776,6 +830,32 @@ Note: Only supported on Nehalem and newer MacBooks (2010+)
else: else:
self.set_battery_throttle() self.set_battery_throttle()
def set_xcpm(self):
utilities.cls()
utilities.header(["Disable XCPM"])
print(
"""
By default on Ivy Bridge EP and newer Macs, the system will throttle if
the battery or Display is either dead or missing. Apple's XCPM will set
'BD PROCHOT' to avoid damage to the system.
Enabling this option will disable Apple's XNU CPU Power Management (XCPM)
and fall back onto the older ACPI_SMC_PlatformPlugin.kext.
Note: Only supported on Ivy Bridge EP and newer Macs (2013+)
"""
)
change_menu = input("Disable XCPM?(y/n/q): ")
if change_menu in {"y", "Y", "yes", "Yes"}:
self.constants.disable_xcpm = True
elif change_menu in {"n", "N", "no", "No"}:
self.constants.disable_xcpm = False
elif change_menu in {"q", "Q", "Quit", "quit"}:
print("Returning to previous menu")
else:
self.set_xcpm()
def set_surplus(self): def set_surplus(self):
utilities.cls() utilities.cls()
utilities.header(["Override SurPlus MaxKernel"]) utilities.header(["Override SurPlus MaxKernel"])
@@ -939,6 +1019,26 @@ Supported Options:
print("Invalid input, returning to previous menu") print("Invalid input, returning to previous menu")
self.set_nvram_write() self.set_nvram_write()
def set_cc_support(self):
utilities.cls()
utilities.header(["Set Content Caching Support"])
print(
"""
On systems spoofing via VMM, Content Caching is disabled by
default by Apple. This option allows you to mask VMM from
AssetCache.
"""
)
change_menu = input("Set Content Caching Support (y/n/q): ")
if change_menu in ["y", "Y", "yes", "Yes"]:
self.constants.set_content_caching = True
elif change_menu in ["n", "N", "no", "No"]:
self.constants.set_content_caching = False
elif change_menu in ["q", "Q", "Quit", "quit"]:
print("Returning to previous menu")
else:
self.set_cc_support()
def credits(self): def credits(self):
utilities.TUIOnlyPrint( utilities.TUIOnlyPrint(
["Credits"], ["Credits"],
@@ -1004,9 +1104,9 @@ system_profiler SPHardwareDataType | grep 'Model Identifier'
no_unpatch = True no_unpatch = True
change_menu = input("Patch System Volume?: ") change_menu = input("Patch System Volume?: ")
if no_patch is not True and change_menu == "1": if no_patch is not True and change_menu == "1":
sys_patch.PatchSysVolume(self.constants.custom_model or self.constants.computer.real_model, self.constants).start_patch() sys_patch.PatchSysVolume(self.constants.custom_model or self.constants.computer.real_model, self.constants, None).start_patch()
elif no_unpatch is not True and change_menu == "2": elif no_unpatch is not True and change_menu == "2":
sys_patch.PatchSysVolume(self.constants.custom_model or self.constants.computer.real_model, self.constants).start_unpatch() sys_patch.PatchSysVolume(self.constants.custom_model or self.constants.computer.real_model, self.constants, None).start_unpatch()
else: else:
print("Returning to main menu") print("Returning to main menu")
@@ -1127,8 +1227,10 @@ system_profiler SPHardwareDataType | grep 'Model Identifier'
title = ["Adjust Bootable Volume Settings"] title = ["Adjust Bootable Volume Settings"]
menu = utilities.TUIMenu(title, "Please select an option: ", auto_number=True, top_level=True) menu = utilities.TUIMenu(title, "Please select an option: ", auto_number=True, top_level=True)
options = [ options = [
[f"Set FireWire Boot:\tCurrently {self.constants.firewire_boot}", MenuOptions(self.constants.custom_model or self.constants.computer.real_model, self.constants).allow_firewire], [f"Set FireWire Boot:\t\tCurrently {self.constants.firewire_boot}", MenuOptions(self.constants.custom_model or self.constants.computer.real_model, self.constants).allow_firewire],
[f"Set NVMe Boot:\tCurrently {self.constants.nvme_boot}", MenuOptions(self.constants.custom_model or self.constants.computer.real_model, self.constants).allow_nvme], [f"Set XHCI Boot:\t\tCurrently {self.constants.xhci_boot}", MenuOptions(self.constants.custom_model or self.constants.computer.real_model, self.constants).allow_xhci],
[f"Set NVMe Boot:\t\tCurrently {self.constants.nvme_boot}", MenuOptions(self.constants.custom_model or self.constants.computer.real_model, self.constants).allow_nvme],
[f"Set NVMe Power Management:\tCurrently {self.constants.allow_nvme_fixing}", MenuOptions(self.constants.custom_model or self.constants.computer.real_model, self.constants).allow_nvme_pwr_mgmt],
] ]
for option in options: for option in options:
@@ -1160,10 +1262,12 @@ system_profiler SPHardwareDataType | grep 'Model Identifier'
], ],
[f"Set Hibernation Workaround:\tCurrently {self.constants.disable_connectdrivers}", MenuOptions(self.constants.custom_model or self.constants.computer.real_model, self.constants).set_hibernation_workaround], [f"Set Hibernation Workaround:\tCurrently {self.constants.disable_connectdrivers}", MenuOptions(self.constants.custom_model or self.constants.computer.real_model, self.constants).set_hibernation_workaround],
[f"Disable Battery Throttling:\tCurrently {self.constants.disable_msr_power_ctl}", MenuOptions(self.constants.custom_model or self.constants.computer.real_model, self.constants).set_battery_throttle], [f"Disable Battery Throttling:\tCurrently {self.constants.disable_msr_power_ctl}", MenuOptions(self.constants.custom_model or self.constants.computer.real_model, self.constants).set_battery_throttle],
[f"Disable XCPM:\t\tCurrently {self.constants.disable_xcpm}", MenuOptions(self.constants.custom_model or self.constants.computer.real_model, self.constants).set_xcpm],
[f"Set Software Demux:\tCurrently {self.constants.software_demux}", MenuOptions(self.constants.custom_model or self.constants.computer.real_model, self.constants).set_software_demux], [f"Set Software Demux:\tCurrently {self.constants.software_demux}", MenuOptions(self.constants.custom_model or self.constants.computer.real_model, self.constants).set_software_demux],
[f"Set 3rd Party SSD Support:\tCurrently {self.constants.allow_3rd_party_drives}", MenuOptions(self.constants.custom_model or self.constants.computer.real_model, self.constants).set_3rd_party_drices], [f"Set 3rd Party SSD Support:\tCurrently {self.constants.allow_3rd_party_drives}", MenuOptions(self.constants.custom_model or self.constants.computer.real_model, self.constants).set_3rd_party_drices],
[f"Set FeatureUnlock: \tCurrently {self.constants.fu_status}", MenuOptions(self.constants.custom_model or self.constants.computer.real_model, self.constants).set_fu_settings], [f"Set FeatureUnlock: \tCurrently {self.constants.fu_status}", MenuOptions(self.constants.custom_model or self.constants.computer.real_model, self.constants).set_fu_settings],
[f"Set NVRAM Write:\t\tCurrently {self.constants.nvram_write}", MenuOptions(self.constants.custom_model or self.constants.computer.real_model, self.constants).set_nvram_write], [f"Set NVRAM Write:\t\tCurrently {self.constants.nvram_write}", MenuOptions(self.constants.custom_model or self.constants.computer.real_model, self.constants).set_nvram_write],
[f"Set Content Caching:\tCurrently {self.constants.set_content_caching}", MenuOptions(self.constants.custom_model or self.constants.computer.real_model, self.constants).set_cc_support],
] ]
for option in options: for option in options:
@@ -1231,12 +1335,16 @@ B. Exit
options = [] options = []
title = ["Select the macOS Installer you wish to download"] title = ["Select the macOS Installer you wish to download"]
menu = utilities.TUIMenu(title, "Please select an option: ", auto_number=True, top_level=True) menu = utilities.TUIMenu(title, "Please select an option: ", auto_number=True, top_level=True)
avalible_installers = installer.list_downloadable_macOS_installers(self.constants.payload_path, "DeveloperSeed") available_installers = installer.list_downloadable_macOS_installers(self.constants.payload_path, "DeveloperSeed")
if avalible_installers: if available_installers:
# Add mirror of 11.2.3 for users who want it # Add mirror of 11.2.3 for users who want it
options.append([f"macOS {mirror_data.Install_macOS_Big_Sur_11_2_3['Version']} ({mirror_data.Install_macOS_Big_Sur_11_2_3['Build']} - {utilities.human_fmt(mirror_data.Install_macOS_Big_Sur_11_2_3['Size'])} - {mirror_data.Install_macOS_Big_Sur_11_2_3['Source']})", lambda: self.download_install_assistant(mirror_data.Install_macOS_Big_Sur_11_2_3['Link'])]) options.append([f"macOS {mirror_data.Install_macOS_Big_Sur_11_2_3['Version']} ({mirror_data.Install_macOS_Big_Sur_11_2_3['Build']} - {utilities.human_fmt(mirror_data.Install_macOS_Big_Sur_11_2_3['Size'])} - {mirror_data.Install_macOS_Big_Sur_11_2_3['Source']})", lambda: self.download_install_assistant(mirror_data.Install_macOS_Big_Sur_11_2_3['Link'])])
for app in avalible_installers: for app in available_installers:
options.append([f"macOS {avalible_installers[app]['Version']} ({avalible_installers[app]['Build']} - {utilities.human_fmt(avalible_installers[app]['Size'])} - {avalible_installers[app]['Source']})", lambda x=app: self.download_install_assistant(avalible_installers[x]['Link'])]) if available_installers[app]['Variant'] in ["DeveloperSeed", "PublicSeed"]:
variant = " Beta"
else:
variant = ""
options.append([f"macOS {available_installers[app]['Version']}{variant} ({available_installers[app]['Build']} - {utilities.human_fmt(available_installers[app]['Size'])} - {available_installers[app]['Source']})", lambda x=app: self.download_install_assistant(available_installers[x]['Link'])])
for option in options: for option in options:
menu.add_menu_option(option[0], function=option[1]) menu.add_menu_option(option[0], function=option[1])
response = menu.start() response = menu.start()
@@ -1247,10 +1355,10 @@ B. Exit
options = [] options = []
title = ["Select the macOS Installer you wish to use"] title = ["Select the macOS Installer you wish to use"]
menu = utilities.TUIMenu(title, "Please select an option: ", auto_number=True, top_level=True) menu = utilities.TUIMenu(title, "Please select an option: ", auto_number=True, top_level=True)
avalible_installers = installer.list_local_macOS_installers() available_installers = installer.list_local_macOS_installers()
if avalible_installers: if available_installers:
for app in avalible_installers: for app in available_installers:
options.append([f"{avalible_installers[app]['Short Name']}: {avalible_installers[app]['Version']} ({avalible_installers[app]['Build']})", lambda x=app: self.list_disks(avalible_installers[x]['Path'])]) options.append([f"{available_installers[app]['Short Name']}: {available_installers[app]['Version']} ({available_installers[app]['Build']})", lambda x=app: self.list_disks(available_installers[x]['Path'])])
for option in options: for option in options:
menu.add_menu_option(option[0], function=option[1]) menu.add_menu_option(option[0], function=option[1])
response = menu.start() response = menu.start()

View File

@@ -14,31 +14,32 @@ from data import os_data
class Constants: class Constants:
def __init__(self): def __init__(self):
# Patcher Versioning # Patcher Versioning
self.patcher_version = "0.4.0" # OpenCore-Legacy-Patcher self.patcher_version = "0.4.3" # OpenCore-Legacy-Patcher
self.patcher_support_pkg_version = "0.2.9" # PatcherSupportPkg self.patcher_support_pkg_version = "0.3.4" # PatcherSupportPkg
self.url_patcher_support_pkg = "https://github.com/dortania/PatcherSupportPkg/releases/download/" self.url_patcher_support_pkg = "https://github.com/dortania/PatcherSupportPkg/releases/download/"
self.nightly_url_patcher_support_pkg = "https://nightly.link/dortania/PatcherSupportPkg/workflows/build/master/" self.nightly_url_patcher_support_pkg = "https://nightly.link/dortania/PatcherSupportPkg/workflows/build/master/"
self.discord_link = "https://discord.gg/rqdPgH8xSN" self.discord_link = "https://discord.gg/rqdPgH8xSN"
self.guide_link = "https://dortania.github.io/OpenCore-Legacy-Patcher/" self.guide_link = "https://dortania.github.io/OpenCore-Legacy-Patcher/"
self.repo_link = "https://github.com/dortania/OpenCore-Legacy-Patcher" self.repo_link = "https://github.com/dortania/OpenCore-Legacy-Patcher"
self.repo_link_latest = f"{self.repo_link}/releases/tag/{self.patcher_version}" self.repo_link_latest = f"{self.repo_link}/releases/tag/{self.patcher_version}"
self.copyright_date = "Copyright © 2020-2022 Dortania"
# OpenCore Versioning # OpenCore Versioning
# https://github.com/acidanthera/OpenCorePkg # https://github.com/acidanthera/OpenCorePkg
self.opencore_commit = "b530a29 - 01-11-2022" self.opencore_commit = "30798fb - 02-07-2022"
self.opencore_version = "0.7.7" self.opencore_version = "0.7.8"
# Kext Versioning # Kext Versioning
## Acidanthera ## Acidanthera
## https://github.com/acidanthera ## https://github.com/acidanthera
self.lilu_version = "1.5.9" # Lilu self.lilu_version = "1.6.0" # Lilu
self.whatevergreen_version = "1.5.6" # WhateverGreen self.whatevergreen_version = "1.5.7" # WhateverGreen
self.airportbcrmfixup_version = "2.1.3" # AirPortBrcmFixup self.airportbcrmfixup_version = "2.1.3" # AirPortBrcmFixup
self.nvmefix_version = "1.0.9" # NVMeFix self.nvmefix_version = "1.0.9" # NVMeFix
self.applealc_version = "1.6.3" # AppleALC self.applealc_version = "1.6.3" # AppleALC
self.restrictevents_version = "1.0.6" # RestrictEvents self.restrictevents_version = "1.0.6" # RestrictEvents
self.restrictevents_mbp_version = "1.0.6" # RestrictEvents blocking displaypolicyd (see RestrictEvents-MBP91.patch) self.restrictevents_mbp_version = "1.0.6" # RestrictEvents blocking displaypolicyd (see RestrictEvents-MBP91.patch)
self.featureunlock_version = "1.0.6" # FeatureUnlock self.featureunlock_version = "1.0.7" # FeatureUnlock
self.debugenhancer_version = "1.0.4" # DebugEnhancer self.debugenhancer_version = "1.0.4" # DebugEnhancer
self.cpufriend_version = "1.2.4" # CPUFriend self.cpufriend_version = "1.2.4" # CPUFriend
self.bluetool_version = "2.6.1" # BlueToolFixup (BrcmPatchRAM) self.bluetool_version = "2.6.1" # BlueToolFixup (BrcmPatchRAM)
@@ -56,10 +57,12 @@ class Constants:
## Apple - Dortania Modified ## Apple - Dortania Modified
self.bcm570_version = "1.0.2" # CatalinaBCM5701Ethernet self.bcm570_version = "1.0.2" # CatalinaBCM5701Ethernet
self.i210_version = "1.0.0" # CatalinaIntelI210Ethernet
self.corecaptureelcap_version = "1.0.1" # corecaptureElCap self.corecaptureelcap_version = "1.0.1" # corecaptureElCap
self.io80211elcap_version = "2.0.0" # IO80211ElCap self.io80211elcap_version = "2.0.0" # IO80211ElCap
self.io80211high_sierra_version = "1.0.1" # IO80211HighSierra self.io80211high_sierra_version = "1.0.1" # IO80211HighSierra
self.io80211mojave_version = "1.0.1" # IO80211Mojave self.io80211mojave_version = "1.0.1" # IO80211Mojave
self.bigsursdxc_version = "1.0.0" # BigSurSDXC
## Dortania ## Dortania
## https://github.com/dortania ## https://github.com/dortania
@@ -67,6 +70,7 @@ class Constants:
self.smcspoof_version = "1.0.0" # SMC-Spoof self.smcspoof_version = "1.0.0" # SMC-Spoof
self.mce_version = "1.0.0" # AppleMCEReporterDisabler self.mce_version = "1.0.0" # AppleMCEReporterDisabler
self.btspoof_version = "1.0.0" # Bluetooth-Spoof self.btspoof_version = "1.0.0" # Bluetooth-Spoof
self.aspp_override_version = "1.0.1" # ACPI_SMC_PlatformPlugin Override
## Syncretic ## Syncretic
## https://forums.macrumors.com/members/syncretic.1173816/ ## https://forums.macrumors.com/members/syncretic.1173816/
@@ -155,6 +159,7 @@ class Constants:
## Boot Volume Settings ## Boot Volume Settings
self.firewire_boot = False # Allow macOS FireWire Boot self.firewire_boot = False # Allow macOS FireWire Boot
self.nvme_boot = False # Allow UEFI NVMe Boot self.nvme_boot = False # Allow UEFI NVMe Boot
self.xhci_boot = False
## Graphics Settings ## Graphics Settings
self.metal_build = False # Set MXM Build support self.metal_build = False # Set MXM Build support
@@ -180,6 +185,9 @@ class Constants:
self.walkthrough = False # Enable Walkthrough self.walkthrough = False # Enable Walkthrough
self.disable_connectdrivers = False # Disable ConnectDrivers (hibernation) self.disable_connectdrivers = False # Disable ConnectDrivers (hibernation)
self.allow_3rd_party_drives = True # Allow ThridPartyDrives quirk self.allow_3rd_party_drives = True # Allow ThridPartyDrives quirk
self.set_content_caching = False # Set Content Caching
self.allow_nvme_fixing = True # Allow NVMe Kernel Space Patches
self.disable_xcpm = False # Disable XCPM (X86PlatformPlugin.kext)
self.legacy_accel_support = [ self.legacy_accel_support = [
os_data.os_data.mojave, os_data.os_data.mojave,
@@ -229,6 +237,10 @@ class Constants:
def xhci_driver_path(self): def xhci_driver_path(self):
return self.payload_path / Path("Drivers/XhciDxe.efi") return self.payload_path / Path("Drivers/XhciDxe.efi")
@property
def usb_bus_driver_path(self):
return self.payload_path / Path("Drivers/UsbBusDxe.efi")
@property @property
def diags_launcher_path(self): def diags_launcher_path(self):
return self.payload_path / Path("Drivers/diags.efi") return self.payload_path / Path("Drivers/diags.efi")
@@ -274,6 +286,10 @@ class Constants:
def bcm570_path(self): def bcm570_path(self):
return self.payload_kexts_path / Path(f"Ethernet/CatalinaBCM5701Ethernet-v{self.bcm570_version}.zip") return self.payload_kexts_path / Path(f"Ethernet/CatalinaBCM5701Ethernet-v{self.bcm570_version}.zip")
@property
def i210_path(self):
return self.payload_kexts_path / Path(f"Ethernet/CatalinaIntelI210Ethernet-v{self.i210_version}.zip")
@property @property
def marvel_path(self): def marvel_path(self):
return self.payload_kexts_path / Path(f"Ethernet/MarvelYukonEthernet-v{self.marvel_version}.zip") return self.payload_kexts_path / Path(f"Ethernet/MarvelYukonEthernet-v{self.marvel_version}.zip")
@@ -286,6 +302,10 @@ class Constants:
def mce_path(self): def mce_path(self):
return self.payload_kexts_path / Path(f"Misc/AppleMCEReporterDisabler-v{self.mce_version}.zip") return self.payload_kexts_path / Path(f"Misc/AppleMCEReporterDisabler-v{self.mce_version}.zip")
@property
def bigsursdxc_path(self):
return self.payload_kexts_path / Path(f"Misc/BigSurSDXC-v{self.bigsursdxc_version}.zip")
@property @property
def mousse_path(self): def mousse_path(self):
return self.payload_kexts_path / Path(f"SSE/AAAMouSSE-v{self.mousse_version}.zip") return self.payload_kexts_path / Path(f"SSE/AAAMouSSE-v{self.mousse_version}.zip")
@@ -334,6 +354,10 @@ class Constants:
def btspoof_path(self): def btspoof_path(self):
return self.payload_kexts_path / Path(f"Misc/Bluetooth-Spoof-v{self.btspoof_version}.zip") return self.payload_kexts_path / Path(f"Misc/Bluetooth-Spoof-v{self.btspoof_version}.zip")
@property
def aspp_override_path(self):
return self.payload_kexts_path / Path(f"Misc/ASPP-Override-v{self.aspp_override_version}.zip")
@property @property
def nvmefix_path(self): def nvmefix_path(self):
return self.payload_kexts_path / Path(f"Acidanthera/NVMeFix-v{self.nvmefix_version}-{self.kext_variant}.zip") return self.payload_kexts_path / Path(f"Acidanthera/NVMeFix-v{self.nvmefix_version}-{self.kext_variant}.zip")
@@ -680,10 +704,6 @@ class Constants:
def legacy_wifi_support(self): def legacy_wifi_support(self):
return self.payload_apple_application_support / Path("Legacy-Wifi") return self.payload_apple_application_support / Path("Legacy-Wifi")
@property
def legacy_keyboard_backlight_support(self):
return self.payload_apple_application_support / Path("Keyboard-Backlight")
@property @property
def legacy_dropbox_support(self): def legacy_dropbox_support(self):
return self.payload_apple_application_support / Path("Dropbox") return self.payload_apple_application_support / Path("Dropbox")

View File

@@ -12,8 +12,22 @@ class generate_defaults:
settings.amfi_status = True settings.amfi_status = True
if host_is_target: if host_is_target:
if settings.computer.usb_controllers:
try:
if smbios_data.smbios_dictionary[model]["CPU Generation"] < cpu_data.cpu_data.ivy_bridge.value:
# Pre-Ivy do not natively support XHCI boot support
# If we detect XHCI on older model, enable
for controller in settings.computer.usb_controllers:
if isinstance(controller, device_probe.XHCIController):
settings.xhci_boot = True
break
except KeyError:
pass
if utilities.check_metal_support(device_probe, settings.computer) is False: if utilities.check_metal_support(device_probe, settings.computer) is False:
settings.disable_cs_lv = True settings.disable_cs_lv = True
settings.secure_status = False
settings.sip_status = False
settings.allow_fv_root = True
if settings.computer.gpus: if settings.computer.gpus:
for gpu in settings.computer.gpus: for gpu in settings.computer.gpus:
if gpu.arch == device_probe.NVIDIA.Archs.Kepler: if gpu.arch == device_probe.NVIDIA.Archs.Kepler:
@@ -74,6 +88,11 @@ class generate_defaults:
settings.allow_fv_root = True # Allow FileVault on broken seal settings.allow_fv_root = True # Allow FileVault on broken seal
# settings.amfi_status = True # Signed bundles, Don't need to explicitly set currently # settings.amfi_status = True # Signed bundles, Don't need to explicitly set currently
if "Book" in model:
settings.set_content_caching = False
else:
settings.set_content_caching = True
custom_cpu_model_value = utilities.get_nvram("revcpuname", "4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102", decode=True) custom_cpu_model_value = utilities.get_nvram("revcpuname", "4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102", decode=True)
if custom_cpu_model_value is not None: if custom_cpu_model_value is not None:
# TODO: Fix to not use two separate variables # TODO: Fix to not use two separate variables
@@ -90,13 +109,24 @@ class generate_defaults:
# Users disabling TS2 most likely have a faulty dGPU # Users disabling TS2 most likely have a faulty dGPU
# users can override this in settings # users can override this in settings
settings.allow_ts2_accel = False settings.allow_ts2_accel = False
try:
if smbios_data.smbios_dictionary[model]["CPU Generation"] < cpu_data.cpu_data.ivy_bridge.value and model != "MacPro5,1": if smbios_data.smbios_dictionary[model]["CPU Generation"] < cpu_data.cpu_data.ivy_bridge.value and model != "MacPro5,1":
# Sidecar and AirPlay to Mac only blacklist Ivy and newer (as well as MacPro5,1) # Sidecar and AirPlay to Mac only blacklist Ivy and newer (as well as MacPro5,1)
# Avoid extra patching without benefit # Avoid extra patching without benefit
settings.fu_arguments = " -disable_sidecar_mac" settings.fu_arguments = " -disable_sidecar_mac"
else: else:
settings.fu_arguments = None settings.fu_arguments = None
if smbios_data.smbios_dictionary[model]["CPU Generation"] >= cpu_data.cpu_data.skylake.value:
# On 2016-2017 MacBook Pros, 15" devices used a stock Samsung SSD with IONVMeController
# Technically this should be patched based on NVMeFix.kext logic,
# however Apple deemed the SSD unsupported for enhanced performance
# In addition, some upgraded NVMe drives still have issues with enhanced power management
# Safest to disable by default, allow user to configure afterwards
settings.allow_nvme_fixing = False
else:
settings.allow_nvme_fixing = True
except KeyError:
pass
# Check if running in RecoveryOS # Check if running in RecoveryOS
settings.recovery_status = utilities.check_recovery() settings.recovery_status = utilities.check_recovery()

View File

@@ -50,7 +50,10 @@ class PCIDevice:
device = cls(vendor_id, device_id, int.from_bytes(properties["class-code"][:6], byteorder="little"), name=ioreg.io_name_t_to_str(ioreg.IORegistryEntryGetName(entry, None)[1])) device = cls(vendor_id, device_id, int.from_bytes(properties["class-code"][:6], byteorder="little"), name=ioreg.io_name_t_to_str(ioreg.IORegistryEntryGetName(entry, None)[1]))
if "model" in properties: if "model" in properties:
device.model = properties["model"].strip(b"\0").decode() model = properties["model"]
if type(model) is bytes:
model = model.strip(b"\0").decode()
device.model = model
if "acpi-path" in properties: if "acpi-path" in properties:
device.acpi_path = properties["acpi-path"] device.acpi_path = properties["acpi-path"]
device.populate_pci_path(entry) device.populate_pci_path(entry)
@@ -73,18 +76,19 @@ class PCIDevice:
def detect(cls, device): def detect(cls, device):
return device.vendor_id == cls.VENDOR_ID and ((device.class_code == cls.CLASS_CODE) if getattr(cls, "CLASS_CODE", None) else True) # type: ignore # pylint: disable=no-member return device.vendor_id == cls.VENDOR_ID and ((device.class_code == cls.CLASS_CODE) if getattr(cls, "CLASS_CODE", None) else True) # type: ignore # pylint: disable=no-member
# def acpi_path(self):
# # Eventually
# raise NotImplementedError
def populate_pci_path(self, original_entry: ioreg.io_registry_entry_t): def populate_pci_path(self, original_entry: ioreg.io_registry_entry_t):
# Based off gfxutil logic, seems to work. # Based off gfxutil logic, seems to work.
paths = [] paths = []
entry = original_entry entry = original_entry
while entry: while entry:
if ioreg.IOObjectConformsTo(entry, "IOPCIDevice".encode()): if ioreg.IOObjectConformsTo(entry, "IOPCIDevice".encode()):
location = [hex(int(i, 16)) for i in ioreg.io_name_t_to_str(ioreg.IORegistryEntryGetLocationInPlane(entry, "IOService".encode(), None)[1]).split(",") + ["0"]] # Virtual PCI devices provide a botched IOService path (us.electronic.kext.vusb)
paths.append(f"Pci({location[0]},{location[1]})") # We only care about physical devices, so skip them
try:
location = [hex(int(i, 16)) for i in ioreg.io_name_t_to_str(ioreg.IORegistryEntryGetLocationInPlane(entry, "IOService".encode(), None)[1]).split(",") + ["0"]]
paths.append(f"Pci({location[0]},{location[1]})")
except ValueError:
break
elif ioreg.IOObjectConformsTo(entry, "IOACPIPlatformDevice".encode()): elif ioreg.IOObjectConformsTo(entry, "IOACPIPlatformDevice".encode()):
paths.append(f"PciRoot({hex(int(ioreg.corefoundation_to_native(ioreg.IORegistryEntryCreateCFProperty(entry, '_UID', ioreg.kCFAllocatorDefault, ioreg.kNilOptions)) or 0))})") # type: ignore paths.append(f"PciRoot({hex(int(ioreg.corefoundation_to_native(ioreg.IORegistryEntryCreateCFProperty(entry, '_UID', ioreg.kCFAllocatorDefault, ioreg.kNilOptions)) or 0))})") # type: ignore
break break
@@ -149,6 +153,14 @@ class NVMeController(PCIDevice):
aspm: Optional[int] = None aspm: Optional[int] = None
# parent_aspm: Optional[int] = None # parent_aspm: Optional[int] = None
@dataclass
class EthernetController(PCIDevice):
CLASS_CODE: ClassVar[int] = 0x020000
chipset: enum.Enum = field(init=False)
def __post_init__(self):
self.detect_chipset()
@dataclass @dataclass
class SATAController(PCIDevice): class SATAController(PCIDevice):
@@ -158,6 +170,25 @@ class SATAController(PCIDevice):
class SASController(PCIDevice): class SASController(PCIDevice):
CLASS_CODE: ClassVar[int] = 0x010400 CLASS_CODE: ClassVar[int] = 0x010400
@dataclass
class XHCIController(PCIDevice):
CLASS_CODE: ClassVar[int] = 0x0c0330
@dataclass
class EHCIController(PCIDevice):
CLASS_CODE: ClassVar[int] = 0x0c0320
@dataclass
class OHCIController(PCIDevice):
CLASS_CODE: ClassVar[int] = 0x0c0310
@dataclass
class UHCIController(PCIDevice):
CLASS_CODE: ClassVar[int] = 0x0c0300
@dataclass
class SDXCController(PCIDevice):
CLASS_CODE: ClassVar[int] = 0x080501
@dataclass @dataclass
class NVIDIA(GPU): class NVIDIA(GPU):
@@ -186,6 +217,18 @@ class NVIDIA(GPU):
else: else:
self.arch = NVIDIA.Archs.Unknown self.arch = NVIDIA.Archs.Unknown
@dataclass
class NVIDIAEthernet(EthernetController):
VENDOR_ID: ClassVar[int] = 0x10DE
class Chipsets(enum.Enum):
nForceEthernet = "nForceEthernet"
chipset: Chipsets = field(init=False)
def detect_chipset(self):
# nForce driver matches against Vendor ID, thus making all nForce chipsets supported
self.chipset = NVIDIAEthernet.Chipsets.nForceEthernet
@dataclass @dataclass
class AMD(GPU): class AMD(GPU):
@@ -279,6 +322,27 @@ class Intel(GPU):
else: else:
self.arch = Intel.Archs.Unknown self.arch = Intel.Archs.Unknown
@dataclass
class IntelEthernet(EthernetController):
VENDOR_ID: ClassVar[int] = 0x8086
class Chipsets(enum.Enum):
AppleIntel8254XEthernet = "AppleIntel8254XEthernet Supported"
AppleIntelI210Ethernet = "AppleIntelI210Ethernet Supported"
Intel82574L = "Intel82574L Supported"
Unknown = "Unknown"
chipset: Chipsets = field(init=False)
def detect_chipset(self):
if self.device_id in pci_data.intel_ids.AppleIntel8254XEthernet:
self.chipset = IntelEthernet.Chipsets.AppleIntel8254XEthernet
elif self.device_id in pci_data.intel_ids.AppleIntelI210Ethernet:
self.chipset = IntelEthernet.Chipsets.AppleIntelI210Ethernet
elif self.device_id in pci_data.intel_ids.Intel82574L:
self.chipset = IntelEthernet.Chipsets.Intel82574L
else:
self.chipset = IntelEthernet.Chipsets.Unknown
@dataclass @dataclass
class Broadcom(WirelessCard): class Broadcom(WirelessCard):
@@ -309,6 +373,21 @@ class Broadcom(WirelessCard):
else: else:
self.chipset = Broadcom.Chipsets.Unknown self.chipset = Broadcom.Chipsets.Unknown
@dataclass
class BroadcomEthernet(EthernetController):
VENDOR_ID: ClassVar[int] = 0x14E4
class Chipsets(enum.Enum):
AppleBCM5701Ethernet = "AppleBCM5701Ethernet supported"
Unknown = "Unknown"
chipset: Chipsets = field(init=False)
def detect_chipset(self):
if self.device_id in pci_data.broadcom_ids.AppleBCM5701Ethernet:
self.chipset = BroadcomEthernet.Chipsets.AppleBCM5701Ethernet
else:
self.chipset = BroadcomEthernet.Chipsets.Unknown
@dataclass @dataclass
class Atheros(WirelessCard): class Atheros(WirelessCard):
@@ -329,6 +408,56 @@ class Atheros(WirelessCard):
self.chipset = Atheros.Chipsets.Unknown self.chipset = Atheros.Chipsets.Unknown
@dataclass
class Aquantia(EthernetController):
VENDOR_ID: ClassVar[int] = 0x1D6A
class Chipsets(enum.Enum):
# pylint: disable=invalid-name
AppleEthernetAquantiaAqtion = "AppleEthernetAquantiaAqtion supported"
Unknown = "Unknown"
chipset: Chipsets = field(init=False)
def detect_chipset(self):
if self.device_id in pci_data.aquantia_ids.AppleEthernetAquantiaAqtion:
self.chipset = Aquantia.Chipsets.AppleEthernetAquantiaAqtion
else:
self.chipset = Aquantia.Chipsets.Unknown
@dataclass
class Marvell(EthernetController):
VENDOR_ID: ClassVar[int] = 0x11AB
class Chipsets(enum.Enum):
MarvelYukonEthernet = "MarvelYukonEthernet supported"
Unknown = "Unknown"
chipset: Chipsets = field(init=False)
def detect_chipset(self):
if self.device_id in pci_data.marvell_ids.MarvelYukonEthernet:
self.chipset = Marvell.Chipsets.MarvelYukonEthernet
else:
self.chipset = Marvell.Chipsets.Unknown
@dataclass
class SysKonnect(EthernetController):
VENDOR_ID: ClassVar[int] = 0x1148
class Chipsets(enum.Enum):
MarvelYukonEthernet = "MarvelYukonEthernet supported"
Unknown = "Unknown"
chipset: Chipsets = field(init=False)
def detect_chipset(self):
if self.device_id in pci_data.syskonnect_ids.MarvelYukonEthernet:
self.chipset = SysKonnect.Chipsets.MarvelYukonEthernet
else:
self.chipset = SysKonnect.Chipsets.Unknown
@dataclass @dataclass
class Computer: class Computer:
real_model: Optional[str] = None real_model: Optional[str] = None
@@ -339,11 +468,15 @@ class Computer:
igpu: Optional[GPU] = None # Shortcut for IGPU igpu: Optional[GPU] = None # Shortcut for IGPU
dgpu: Optional[GPU] = None # Shortcut for GFX0 dgpu: Optional[GPU] = None # Shortcut for GFX0
storage: list[PCIDevice] = field(default_factory=list) storage: list[PCIDevice] = field(default_factory=list)
usb_controllers: list[PCIDevice] = field(default_factory=list)
sdxc_controller: list[PCIDevice] = field(default_factory=list)
ethernet: Optional[EthernetController] = field(default_factory=list)
wifi: Optional[WirelessCard] = None wifi: Optional[WirelessCard] = None
cpu: Optional[CPU] = None cpu: Optional[CPU] = None
oclp_version: Optional[str] = None oclp_version: Optional[str] = None
opencore_version: Optional[str] = None opencore_version: Optional[str] = None
bluetooth_chipset: Optional[str] = None bluetooth_chipset: Optional[str] = None
ambient_light_sensor: Optional[bool] = False
third_party_sata_ssd: Optional[bool] = False third_party_sata_ssd: Optional[bool] = False
@staticmethod @staticmethod
@@ -354,9 +487,13 @@ class Computer:
computer.igpu_probe() computer.igpu_probe()
computer.wifi_probe() computer.wifi_probe()
computer.storage_probe() computer.storage_probe()
computer.usb_controller_probe()
computer.sdxc_controller_probe()
computer.ethernet_probe()
computer.smbios_probe() computer.smbios_probe()
computer.cpu_probe() computer.cpu_probe()
computer.bluetooth_probe() computer.bluetooth_probe()
computer.ambient_light_sensor_probe()
computer.sata_disk_probe() computer.sata_disk_probe()
return computer return computer
@@ -413,6 +550,86 @@ class Computer:
break break
ioreg.IOObjectRelease(device) ioreg.IOObjectRelease(device)
def ambient_light_sensor_probe(self):
device = next(ioreg.ioiterator_to_list(ioreg.IOServiceGetMatchingServices(ioreg.kIOMasterPortDefault, ioreg.IOServiceNameMatching("ALS0".encode()), None)[1]), None)
if device:
self.ambient_light_sensor = True
ioreg.IOObjectRelease(device)
def sdxc_controller_probe(self):
sdxc_controllers = ioreg.ioiterator_to_list(
ioreg.IOServiceGetMatchingServices(
ioreg.kIOMasterPortDefault,
{"IOProviderClass": "IOPCIDevice", "IOPropertyMatch": [{"class-code": binascii.a2b_hex(utilities.hexswap(hex(SDXCController.CLASS_CODE)[2:].zfill(8)))}]},
None,
)[1]
)
for device in sdxc_controllers:
self.sdxc_controller.append(SDXCController.from_ioregistry(device))
ioreg.IOObjectRelease(device)
def usb_controller_probe(self):
xhci_controllers = ioreg.ioiterator_to_list(
ioreg.IOServiceGetMatchingServices(
ioreg.kIOMasterPortDefault,
{"IOProviderClass": "IOPCIDevice", "IOPropertyMatch": [{"class-code": binascii.a2b_hex(utilities.hexswap(hex(XHCIController.CLASS_CODE)[2:].zfill(8)))}]},
None,
)[1]
)
ehci_controllers = ioreg.ioiterator_to_list(
ioreg.IOServiceGetMatchingServices(
ioreg.kIOMasterPortDefault,
{"IOProviderClass": "IOPCIDevice", "IOPropertyMatch": [{"class-code": binascii.a2b_hex(utilities.hexswap(hex(EHCIController.CLASS_CODE)[2:].zfill(8)))}]},
None,
)[1]
)
ohci_controllers = ioreg.ioiterator_to_list(
ioreg.IOServiceGetMatchingServices(
ioreg.kIOMasterPortDefault,
{"IOProviderClass": "IOPCIDevice", "IOPropertyMatch": [{"class-code": binascii.a2b_hex(utilities.hexswap(hex(OHCIController.CLASS_CODE)[2:].zfill(8)))}]},
None,
)[1]
)
uhci_controllers = ioreg.ioiterator_to_list(
ioreg.IOServiceGetMatchingServices(
ioreg.kIOMasterPortDefault,
{"IOProviderClass": "IOPCIDevice", "IOPropertyMatch": [{"class-code": binascii.a2b_hex(utilities.hexswap(hex(UHCIController.CLASS_CODE)[2:].zfill(8)))}]},
None,
)[1]
)
for device in xhci_controllers:
self.usb_controllers.append(XHCIController.from_ioregistry(device))
ioreg.IOObjectRelease(device)
for device in ehci_controllers:
self.usb_controllers.append(EHCIController.from_ioregistry(device))
ioreg.IOObjectRelease(device)
for device in ohci_controllers:
self.usb_controllers.append(OHCIController.from_ioregistry(device))
ioreg.IOObjectRelease(device)
for device in uhci_controllers:
self.usb_controllers.append(UHCIController.from_ioregistry(device))
ioreg.IOObjectRelease(device)
def ethernet_probe(self):
ethernet_controllers = ioreg.ioiterator_to_list(
ioreg.IOServiceGetMatchingServices(
ioreg.kIOMasterPortDefault,
{"IOProviderClass": "IOPCIDevice", "IOPropertyMatch": [{"class-code": binascii.a2b_hex(utilities.hexswap(hex(EthernetController.CLASS_CODE)[2:].zfill(8)))}]},
None,
)[1]
)
# for device in ethernet_controllers:
# self.ethernet.append(EthernetController.from_ioregistry(device))
# ioreg.IOObjectRelease(device)
for device in ethernet_controllers:
vendor: Type[EthernetController] = PCIDevice.from_ioregistry(device).vendor_detect(inherits=EthernetController) # type: ignore
if vendor:
self.ethernet.append(vendor.from_ioregistry(device)) # type: ignore
ioreg.IOObjectRelease(device)
def storage_probe(self): def storage_probe(self):
sata_controllers = ioreg.ioiterator_to_list( sata_controllers = ioreg.ioiterator_to_list(
ioreg.IOServiceGetMatchingServices( ioreg.IOServiceGetMatchingServices(

View File

@@ -168,9 +168,18 @@ Please build OpenCore first!"""
# cancelled prompt # cancelled prompt
return return
else: else:
utilities.TUIOnlyPrint( if self.constants.gui_mode is False:
["Copying OpenCore"], "Press [Enter] to go back.\n", ["An error occurred!"] + result.stderr.decode().split("\n") + ["", "Please report this to the devs at GitHub."] utilities.TUIOnlyPrint(
).start() ["Copying OpenCore"], "Press [Enter] to go back.\n", ["An error occurred!"] + result.stderr.decode().split("\n") + [""]
).start()
else:
print("An error occurred!")
print(result.stderr.decode())
# Check if we're in Safe Mode, and if so, tell user FAT32 is unsupported
if utilities.check_boot_mode() == "safe_boot":
print("\nSafe Mode detected. FAT32 is unsupported by macOS in this mode.")
print("Please disable Safe Mode and try again.")
return return
partition_info = plistlib.loads(subprocess.run(f"diskutil info -plist {full_disk_identifier}".split(), stdout=subprocess.PIPE).stdout.decode().strip().encode()) partition_info = plistlib.loads(subprocess.run(f"diskutil info -plist {full_disk_identifier}".split(), stdout=subprocess.PIPE).stdout.decode().strip().encode())
parent_disk = partition_info["ParentWholeDisk"] parent_disk = partition_info["ParentWholeDisk"]
@@ -242,7 +251,10 @@ Please build OpenCore first!"""
print("\nPress [Enter] to continue.\n") print("\nPress [Enter] to continue.\n")
input() input()
else: else:
utilities.TUIOnlyPrint(["Copying OpenCore"], "Press [Enter] to go back.\n", ["EFI failed to mount!", "Please report this to the devs at GitHub."]).start() if self.constants.gui_mode is False:
utilities.TUIOnlyPrint(["Copying OpenCore"], "Press [Enter] to go back.\n", ["EFI failed to mount!"]).start()
else:
print("EFI failed to mount!")
def rmtree_handler(func, path, exc_info): def rmtree_handler(func, path, exc_info):
if exc_info[0] == FileNotFoundError: if exc_info[0] == FileNotFoundError:

View File

@@ -12,26 +12,54 @@ def list_local_macOS_installers():
for application in Path("/Applications").iterdir(): for application in Path("/Applications").iterdir():
# Verify whether application has createinstallmedia # Verify whether application has createinstallmedia
if (Path("/Applications") / Path(application) / Path("Contents/Resources/createinstallmedia")).exists(): try:
plist = plistlib.load((Path("/Applications") / Path(application) / Path("Contents/Info.plist")).open("rb")) if (Path("/Applications") / Path(application) / Path("Contents/Resources/createinstallmedia")).exists():
try: plist = plistlib.load((Path("/Applications") / Path(application) / Path("Contents/Info.plist")).open("rb"))
# Doesn't reflect true OS build, but best to report SDK in the event multiple installers are found with same version
app_version = plist["DTPlatformVersion"]
clean_name = plist["CFBundleDisplayName"]
try: try:
app_sdk = plist["DTSDKBuild"] # Doesn't reflect true OS build, but best to report SDK in the event multiple installers are found with same version
app_version = plist["DTPlatformVersion"]
clean_name = plist["CFBundleDisplayName"]
try:
app_sdk = plist["DTSDKBuild"]
except KeyError:
app_sdk = "Unknown"
# app_version can sometimes report GM instead of the actual version
# This is a workaround to get the actual version
if app_version.startswith("GM"):
try:
app_version = int(app_sdk[:2])
if app_version < 20:
app_version = f"10.{app_version - 4}"
else:
app_version = f"{app_version - 9}.0"
except ValueError:
app_version = "Unknown"
# Check if App Version is High Sierra or newer
can_add = False
if app_version.startswith("10."):
app_sub_version = app_version.split(".")[1]
if int(app_sub_version) >= 13:
can_add = True
else:
can_add = False
else:
can_add = True
if can_add is True:
application_list.update({
application: {
"Short Name": clean_name,
"Version": app_version,
"Build": app_sdk,
"Path": application,
}
})
except KeyError: except KeyError:
app_sdk = "Unknown" pass
application_list.update({ except PermissionError:
application: { pass
"Short Name": clean_name, # Sort Applications by version
"Version": app_version, application_list = {k: v for k, v in sorted(application_list.items(), key=lambda item: item[1]["Version"])}
"Build": app_sdk,
"Path": application,
}
})
except KeyError:
pass
return application_list return application_list
def create_installer(installer_path, volume_name): def create_installer(installer_path, volume_name):
@@ -59,6 +87,7 @@ def download_install_assistant(download_path, ia_link):
return False return False
def install_macOS_installer(download_path): def install_macOS_installer(download_path):
print("- Extracting macOS installer from InstallAssistant.pkg\n This may take some time")
args = [ args = [
"osascript", "osascript",
"-e", "-e",
@@ -78,7 +107,7 @@ def install_macOS_installer(download_path):
return False return False
def list_downloadable_macOS_installers(download_path, catalog): def list_downloadable_macOS_installers(download_path, catalog):
avalible_apps = {} available_apps = {}
if catalog == "DeveloperSeed": if catalog == "DeveloperSeed":
link = "https://swscan.apple.com/content/catalogs/others/index-12seed-12-10.16-10.15-10.14-10.13-10.12-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog.gz" link = "https://swscan.apple.com/content/catalogs/others/index-12seed-12-10.16-10.15-10.14-10.13-10.12-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog.gz"
elif catalog == "PublicSeed": elif catalog == "PublicSeed":
@@ -99,18 +128,31 @@ def list_downloadable_macOS_installers(download_path, catalog):
catalog_plist["Products"][item]["ExtendedMetaInfo"]["InstallAssistantPackageIdentifiers"]["BuildManifest"] catalog_plist["Products"][item]["ExtendedMetaInfo"]["InstallAssistantPackageIdentifiers"]["BuildManifest"]
for bm_package in catalog_plist["Products"][item]["Packages"]: for bm_package in catalog_plist["Products"][item]["Packages"]:
if "BuildManifest.plist" in bm_package["URL"]: if "Info.plist" in bm_package["URL"] and "InstallInfo.plist" not in bm_package["URL"]:
utilities.download_file(bm_package["URL"], (Path(download_path) / Path("BuildManifest.plist"))) utilities.download_file(bm_package["URL"], (Path(download_path) / Path("Info.plist")))
build_plist = plistlib.load((Path(download_path) / Path("BuildManifest.plist")).open("rb")) build_plist = plistlib.load((Path(download_path) / Path("Info.plist")).open("rb"))
version = build_plist["ProductVersion"] version = build_plist["MobileAssetProperties"]["OSVersion"]
build = build_plist["ProductBuildVersion"] 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 = "Unknown"
except KeyError:
# Assume CustomerSeed if no catalog URL is found
catalog_url = "CustomerSeed"
for ia_package in catalog_plist["Products"][item]["Packages"]: for ia_package in catalog_plist["Products"][item]["Packages"]:
if "InstallAssistant.pkg" in ia_package["URL"]: if "InstallAssistant.pkg" in ia_package["URL"]:
download_link = ia_package["URL"] download_link = ia_package["URL"]
size = ia_package["Size"] size = ia_package["Size"]
integrity = ia_package["IntegrityDataURL"] integrity = ia_package["IntegrityDataURL"]
avalible_apps.update({ available_apps.update({
item: { item: {
"Version": version, "Version": version,
"Build": build, "Build": build,
@@ -118,11 +160,12 @@ def list_downloadable_macOS_installers(download_path, catalog):
"Size": size, "Size": size,
"integrity": integrity, "integrity": integrity,
"Source": "Apple Inc.", "Source": "Apple Inc.",
"Variant": catalog_url,
} }
}) })
except KeyError: except KeyError:
pass pass
return avalible_apps return available_apps
def format_drive(disk_id): def format_drive(disk_id):
# Formats a disk for macOS install # Formats a disk for macOS install

View File

@@ -16,6 +16,7 @@ class OpenCoreLegacyPatcher:
self.generate_base_data() self.generate_base_data()
if utilities.check_cli_args() is None: if utilities.check_cli_args() is None:
if launch_gui is True: if launch_gui is True:
utilities.disable_cls()
from gui import gui_main from gui import gui_main
gui_main.wx_python_gui(self.constants) gui_main.wx_python_gui(self.constants)
else: else:

View File

@@ -12,42 +12,56 @@ import zipfile
from pathlib import Path from pathlib import Path
import sys import sys
from resources import constants, device_probe, utilities, generate_smbios, sys_patch_download from resources import constants, utilities, generate_smbios, sys_patch_download, sys_patch_detect
from data import sip_data, sys_patch_data, model_array, os_data, smbios_data, cpu_data from data import sip_data, sys_patch_data, os_data
class PatchSysVolume: class PatchSysVolume:
def __init__(self, model, versions): def __init__(self, model, versions, hardware_details=None):
self.model = model self.model = model
self.constants: constants.Constants() = versions self.constants: constants.Constants() = versions
self.computer = self.constants.computer self.computer = self.constants.computer
self.root_mount_path = None self.root_mount_path = None
self.sip_enabled = True
self.sbm_enabled = True
self.amfi_enabled = True
self.fv_enabled = True
self.dosdude_patched = True
self.nvidia_legacy = False
self.kepler_gpu = False
self.amd_ts1 = False
self.amd_ts2 = False
self.iron_gpu = False
self.sandy_gpu = False
self.ivy_gpu = False
self.brightness_legacy = False
self.legacy_audio = False
self.legacy_wifi = False
self.legacy_gmux = False
self.legacy_keyboard_backlight = False
self.added_legacy_kexts = False
self.amfi_must_disable = False
self.check_board_id = False
self.bad_board_id = False
self.no_patch = True
self.validate = False self.validate = False
self.supports_metal = False self.added_legacy_kexts = False
self.root_supports_snapshot = utilities.check_if_root_is_apfs_snapshot()
if self.constants.detected_os > os_data.os_data.catalina: # GUI will detect hardware patches betfore starting PatchSysVolume()
# However the TUI will not, so allow for data to be passed in manually avoiding multiple calls
if hardware_details is None:
hardware_details = sys_patch_detect.detect_root_patch(self.computer.real_model, self.constants).detect_patch_set()
self.init_hardware_patches(hardware_details)
self.init_pathing(custom_root_mount_path=None, custom_data_mount_path=None)
def init_hardware_patches(self, hardware_details):
self.amfi_must_disable = hardware_details["Settings: Requires AMFI exemption"]
self.check_board_id = hardware_details["Settings: Requires Board ID validation"]
self.sip_enabled = hardware_details["Validation: SIP is enabled"]
self.sbm_enabled = hardware_details["Validation: SBM is enabled"]
self.amfi_enabled = hardware_details["Validation: AMFI is enabled"]
self.fv_enabled = hardware_details["Validation: FileVault is enabled"]
self.dosdude_patched = hardware_details["Validation: System is dosdude1 patched"]
self.bad_board_id = hardware_details[f"Validation: Board ID is unsupported \n({self.computer.reported_board_id})"]
self.nvidia_legacy = hardware_details["Graphics: Nvidia Tesla"]
self.kepler_gpu = hardware_details["Graphics: Nvidia Kepler"]
self.amd_ts1 = hardware_details["Graphics: AMD TeraScale 1"]
self.amd_ts2 = hardware_details["Graphics: AMD TeraScale 2"]
self.iron_gpu = hardware_details["Graphics: Intel Ironlake"]
self.sandy_gpu = hardware_details["Graphics: Intel Sandy Bridge"]
self.ivy_gpu = hardware_details["Graphics: Intel Ivy Bridge"]
self.brightness_legacy = hardware_details["Brightness: Legacy Backlight Control"]
self.legacy_audio = hardware_details["Audio: Legacy Realtek"]
self.legacy_wifi = hardware_details["Networking: Legacy Wireless"]
self.legacy_gmux = hardware_details["Miscellaneous: Legacy GMUX"]
self.legacy_keyboard_backlight = hardware_details["Miscellaneous: Legacy Keyboard Backlight"]
def init_pathing(self, custom_root_mount_path=None, custom_data_mount_path=None):
if custom_root_mount_path and custom_data_mount_path:
self.mount_location = custom_root_mount_path
self.data_mount_location = custom_data_mount_path
elif self.root_supports_snapshot is True:
# Big Sur and newer use APFS snapshots # Big Sur and newer use APFS snapshots
self.mount_location = "/System/Volumes/Update/mnt1" self.mount_location = "/System/Volumes/Update/mnt1"
self.mount_location_data = "" self.mount_location_data = ""
@@ -67,8 +81,11 @@ class PatchSysVolume:
def find_mount_root_vol(self, patch): def find_mount_root_vol(self, patch):
self.root_mount_path = utilities.get_disk_path() self.root_mount_path = utilities.get_disk_path()
if self.root_mount_path.startswith("disk"): if self.root_mount_path.startswith("disk"):
if self.constants.detected_os == os_data.os_data.catalina and self.validate is False: if (
print("- Mounting Catalina Root Volume as writable") self.constants.detected_os == os_data.os_data.catalina or
(self.constants.detected_os > os_data.os_data.catalina and self.root_supports_snapshot is False)
):
print("- Mounting Dedicated Root Volume as writable")
utilities.elevated(["mount", "-uw", f"{self.mount_location}/"], stdout=subprocess.PIPE).stdout.decode().strip().encode() utilities.elevated(["mount", "-uw", f"{self.mount_location}/"], stdout=subprocess.PIPE).stdout.decode().strip().encode()
print(f"- Found Root Volume at: {self.root_mount_path}") print(f"- Found Root Volume at: {self.root_mount_path}")
if Path(self.mount_extensions).exists(): if Path(self.mount_extensions).exists():
@@ -76,7 +93,7 @@ class PatchSysVolume:
if patch is True: if patch is True:
# Root Volume unpatching is unreliable due to being a live volume # Root Volume unpatching is unreliable due to being a live volume
# Only worth while on Big Sur as '--last-sealed-snapshot' is hit or miss # Only worth while on Big Sur as '--last-sealed-snapshot' is hit or miss
if self.constants.detected_os == os_data.os_data.big_sur and utilities.check_seal() is True: if self.constants.detected_os == os_data.os_data.big_sur and self.root_supports_snapshot is True and utilities.check_seal() is True:
self.backup_volume() self.backup_volume()
self.patch_root_vol() self.patch_root_vol()
return True return True
@@ -84,7 +101,7 @@ class PatchSysVolume:
self.unpatch_root_vol() self.unpatch_root_vol()
return True return True
else: else:
if self.constants.detected_os > os_data.os_data.catalina: if self.constants.detected_os > os_data.os_data.catalina and self.root_supports_snapshot is True:
print("- Mounting APFS Snapshot as writable") print("- Mounting APFS Snapshot as writable")
result = utilities.elevated(["mount", "-o", "nobrowse", "-t", "apfs", f"/dev/{self.root_mount_path}", self.mount_location], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) result = utilities.elevated(["mount", "-o", "nobrowse", "-t", "apfs", f"/dev/{self.root_mount_path}", self.mount_location], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
if result.returncode == 0: if result.returncode == 0:
@@ -94,7 +111,7 @@ class PatchSysVolume:
if patch is True: if patch is True:
# Root Volume unpatching is unreliable due to being a live volume # Root Volume unpatching is unreliable due to being a live volume
# Only worth while on Big Sur as '--last-sealed-snapshot' is hit or miss # Only worth while on Big Sur as '--last-sealed-snapshot' is hit or miss
if self.constants.detected_os == os_data.os_data.big_sur and utilities.check_seal() is True: if self.constants.detected_os == os_data.os_data.big_sur and self.root_supports_snapshot is True and utilities.check_seal() is True:
self.backup_volume() self.backup_volume()
self.patch_root_vol() self.patch_root_vol()
return True return True
@@ -202,7 +219,7 @@ class PatchSysVolume:
print("- Could not find Extensions.zip, cannot manually unpatch root volume") print("- Could not find Extensions.zip, cannot manually unpatch root volume")
def unpatch_root_vol(self): def unpatch_root_vol(self):
if self.constants.detected_os > os_data.os_data.catalina: if self.constants.detected_os > os_data.os_data.catalina and self.root_supports_snapshot is True:
print("- Reverting to last signed APFS snapshot") print("- Reverting to last signed APFS snapshot")
result = utilities.elevated(["bless", "--mount", self.mount_location, "--bootefi", "--last-sealed-snapshot"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) result = utilities.elevated(["bless", "--mount", self.mount_location, "--bootefi", "--last-sealed-snapshot"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
if result.returncode != 0: if result.returncode != 0:
@@ -212,6 +229,7 @@ class PatchSysVolume:
print("- Failed to revert snapshot via bless, falling back on manual restoration") print("- Failed to revert snapshot via bless, falling back on manual restoration")
self.manual_root_patch_revert() self.manual_root_patch_revert()
else: else:
self.clean_skylight_plugins()
print("- Unpatching complete") print("- Unpatching complete")
print("\nPlease reboot the machine for patches to take effect") print("\nPlease reboot the machine for patches to take effect")
else: else:
@@ -239,12 +257,7 @@ class PatchSysVolume:
else: else:
self.success_status = True self.success_status = True
print("- Successfully built new kernel cache") print("- Successfully built new kernel cache")
# if self.constants.gui_mode is False: if self.root_supports_snapshot is True:
# if self.constants.detected_os > os_data.os_data.catalina:
# input("Press [ENTER] to continue with snapshotting")
# else:
# input("Press [ENTER] to continue with kernel and dyld cache merging")
if self.constants.detected_os > os_data.os_data.catalina:
print("- Creating new APFS snapshot") print("- Creating new APFS snapshot")
bless = utilities.elevated( bless = utilities.elevated(
["bless", "--folder", f"{self.mount_location}/System/Library/CoreServices", "--bootefi", "--create-snapshot"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT ["bless", "--folder", f"{self.mount_location}/System/Library/CoreServices", "--bootefi", "--create-snapshot"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT
@@ -262,17 +275,11 @@ class PatchSysVolume:
if self.constants.detected_os == os_data.os_data.catalina: if self.constants.detected_os == os_data.os_data.catalina:
print("- Merging kernel cache") print("- Merging kernel cache")
utilities.process_status(utilities.elevated(["kcditto"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)) utilities.process_status(utilities.elevated(["kcditto"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT))
print("- Merging dyld cache") if self.constants.detected_os in [os_data.os_data.mojave, os_data.os_data.catalina]:
utilities.process_status(utilities.elevated(["update_dyld_shared_cache", "-root", f"{self.mount_location}/"])) print("- Merging dyld cache")
utilities.process_status(utilities.elevated(["update_dyld_shared_cache", "-root", f"{self.mount_location}/"]))
print("- Patching complete") print("- Patching complete")
print("\nPlease reboot the machine for patches to take effect") print("\nPlease reboot the machine for patches to take effect")
if self.amd_ts2 is True and self.constants.allow_ts2_accel is True:
print(
"""\nPlease note that with ATI TeraScale 2 GPUs, you may experience colour strobing
on reboot. Please use SwitchResX or ResXtreme to force 1 million colours on your
monitor to fix this. If you are epileptic, please ask for someone to aid you or
set million colour before rebooting"""
)
if self.constants.gui_mode is False: if self.constants.gui_mode is False:
input("\nPress [ENTER] to continue") input("\nPress [ENTER] to continue")
@@ -300,6 +307,11 @@ set million colour before rebooting"""
utilities.process_status(utilities.elevated(["chmod", "-Rf", "755", f"{self.mount_extensions}/{add_current_kext}"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)) utilities.process_status(utilities.elevated(["chmod", "-Rf", "755", f"{self.mount_extensions}/{add_current_kext}"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT))
utilities.process_status(utilities.elevated(["chown", "-Rf", "root:wheel", f"{self.mount_extensions}/{add_current_kext}"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)) utilities.process_status(utilities.elevated(["chown", "-Rf", "root:wheel", f"{self.mount_extensions}/{add_current_kext}"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT))
def clean_skylight_plugins(self):
if (Path(self.mount_application_support) / Path("SkyLightPlugins/")).exists():
print("- Found SkylightPlugins folder, removing")
utilities.process_status(utilities.elevated(["rm", "-rf", f"{self.mount_application_support}/SkyLightPlugins"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT))
def add_brightness_patch(self): def add_brightness_patch(self):
self.delete_old_binaries(sys_patch_data.DeleteBrightness) self.delete_old_binaries(sys_patch_data.DeleteBrightness)
self.add_new_binaries(sys_patch_data.AddBrightness, self.constants.legacy_brightness) self.add_new_binaries(sys_patch_data.AddBrightness, self.constants.legacy_brightness)
@@ -338,8 +350,10 @@ set million colour before rebooting"""
) )
def add_legacy_keyboard_backlight_patch(self): def add_legacy_keyboard_backlight_patch(self):
print("- Merging Keyboard Backlight SkyLightPlugins") print("- Enabling Keyboard Backlight delay")
utilities.elevated(["rsync", "-r", "-i", "-a", f"{self.constants.legacy_keyboard_backlight_support}/", self.mount_application_support], stdout=subprocess.PIPE) utilities.process_status(
utilities.elevated(["defaults", "write", "/Library/Preferences/.GlobalPreferences.plist", "NonMetal_BacklightHack", "-bool", "true"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
)
def add_legacy_dropbox_patch(self): def add_legacy_dropbox_patch(self):
print("- Merging DropboxHack SkyLightPlugins") print("- Merging DropboxHack SkyLightPlugins")
@@ -395,7 +409,6 @@ set million colour before rebooting"""
self.gpu_accel_legacy() self.gpu_accel_legacy()
self.add_new_binaries(sys_patch_data.AddAMDAccelLegacy, self.constants.legacy_amd_path) self.add_new_binaries(sys_patch_data.AddAMDAccelLegacy, self.constants.legacy_amd_path)
elif self.constants.detected_os in [os_data.os_data.big_sur, os_data.os_data.monterey] and self.constants.allow_ts2_accel is True: elif self.constants.detected_os in [os_data.os_data.big_sur, os_data.os_data.monterey] and self.constants.allow_ts2_accel is True:
# TODO: Enable for Monterey when acceleration patches proress
print("- Installing TeraScale 2 Acceleration Kext patches for Big Sur") print("- Installing TeraScale 2 Acceleration Kext patches for Big Sur")
self.delete_old_binaries(sys_patch_data.DeleteAMDAccel11) self.delete_old_binaries(sys_patch_data.DeleteAMDAccel11)
self.delete_old_binaries(sys_patch_data.DeleteAMDAccel11TS2) self.delete_old_binaries(sys_patch_data.DeleteAMDAccel11TS2)
@@ -505,6 +518,9 @@ set million colour before rebooting"""
if self.constants.detected_os == os_data.os_data.monterey: if self.constants.detected_os == os_data.os_data.monterey:
self.add_legacy_dropbox_patch() self.add_legacy_dropbox_patch()
if self.legacy_keyboard_backlight is True:
self.add_legacy_keyboard_backlight_patch()
print("- Merging general legacy Frameworks") print("- Merging general legacy Frameworks")
utilities.elevated(["rsync", "-r", "-i", "-a", f"{self.constants.payload_apple_frameworks_path_accel}/", self.mount_frameworks], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) utilities.elevated(["rsync", "-r", "-i", "-a", f"{self.constants.payload_apple_frameworks_path_accel}/", self.mount_frameworks], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
if self.constants.detected_os > os_data.os_data.big_sur: if self.constants.detected_os > os_data.os_data.big_sur:
@@ -542,6 +558,10 @@ set million colour before rebooting"""
def patch_root_vol(self): def patch_root_vol(self):
print(f"- Running patches for {self.model}") print(f"- Running patches for {self.model}")
# Before starting, clean out old plugins
self.clean_skylight_plugins()
# Graphics patches # Graphics patches
if self.nvidia_legacy is True: if self.nvidia_legacy is True:
print("- Installing legacy Nvidia Patches") print("- Installing legacy Nvidia Patches")
@@ -630,10 +650,6 @@ set million colour before rebooting"""
print("- Installing Legacy Mux Brightness support") print("- Installing Legacy Mux Brightness support")
self.add_legacy_mux_patch() self.add_legacy_mux_patch()
if self.legacy_keyboard_backlight is True:
print("- Installing Legacy Keyboard Backlight support")
self.add_legacy_keyboard_backlight_patch()
if self.validate is False: if self.validate is False:
self.rebuild_snapshot() self.rebuild_snapshot()
@@ -682,123 +698,8 @@ set million colour before rebooting"""
input("\nPress enter to continue") input("\nPress enter to continue")
return None return None
def detect_gpus(self):
gpus = self.constants.computer.gpus
if self.constants.moj_cat_accel is True:
non_metal_os = os_data.os_data.high_sierra
else:
non_metal_os = os_data.os_data.catalina
for i, gpu in enumerate(gpus):
if gpu.class_code and gpu.class_code != 0xFFFFFFFF:
print(f"- Found GPU ({i}): {utilities.friendly_hex(gpu.vendor_id)}:{utilities.friendly_hex(gpu.device_id)}")
if gpu.arch in [device_probe.NVIDIA.Archs.Tesla, device_probe.NVIDIA.Archs.Fermi]:
if self.constants.detected_os > non_metal_os:
self.nvidia_legacy = True
self.amfi_must_disable = True
# self.legacy_keyboard_backlight = self.check_legacy_keyboard_backlight()
elif gpu.arch == device_probe.NVIDIA.Archs.Kepler:
if self.constants.detected_os > os_data.os_data.big_sur:
# Kepler drivers were dropped with Beta 7
# 12.0 Beta 5: 21.0.0 - 21A5304g
# 12.0 Beta 6: 21.1.0 - 21A5506j
# 12.0 Beta 7: 21.1.0 - 21A5522h
if self.constants.detected_os == os_data.os_data.monterey and self.constants.detected_os_minor > 0:
if "21A5506j" not in self.constants.detected_os_build:
self.kepler_gpu = True
self.supports_metal = True
elif gpu.arch == device_probe.AMD.Archs.TeraScale_1:
if self.constants.detected_os > non_metal_os:
self.amd_ts1 = True
self.amfi_must_disable = True
elif gpu.arch == device_probe.AMD.Archs.TeraScale_2:
if self.constants.detected_os > non_metal_os:
self.amd_ts2 = True
self.amfi_must_disable = True
elif gpu.arch == device_probe.Intel.Archs.Iron_Lake:
if self.constants.detected_os > non_metal_os:
self.iron_gpu = True
self.amfi_must_disable = True
elif gpu.arch == device_probe.Intel.Archs.Sandy_Bridge:
if self.constants.detected_os > non_metal_os:
self.sandy_gpu = True
self.amfi_must_disable = True
self.check_board_id = True
elif gpu.arch == device_probe.Intel.Archs.Ivy_Bridge:
if self.constants.detected_os > os_data.os_data.big_sur:
self.ivy_gpu = True
self.supports_metal = True
if self.supports_metal is True:
# Avoid patching Metal and non-Metal GPUs if both present, prioritize Metal GPU
# Main concerns are for iMac12,x with Sandy iGPU and Kepler dGPU
self.nvidia_legacy = False
self.amd_ts1 = False
self.amd_ts2 = False
self.iron_gpu = False
self.sandy_gpu = False
def check_dgpu_status(self):
dgpu = self.constants.computer.dgpu
if dgpu:
if dgpu.class_code and dgpu.class_code == 0xFFFFFFFF:
# If dGPU is disabled via class-codes, assume demuxed
return False
return True
return False
def detect_demux(self):
# If GFX0 is missing, assume machine was demuxed
# -wegnoegpu would also trigger this, so ensure arg is not present
if not "-wegnoegpu" in (utilities.get_nvram("boot-args") or ""):
igpu = self.constants.computer.igpu
dgpu = self.check_dgpu_status()
if igpu and not dgpu:
return True
return False
def check_legacy_keyboard_backlight(self):
# With Big Sur and newer, Skylight patch set unfortunately breaks native keyboard backlight
# Penryn Macs are able to re-enable the keyboard backlight by simply running '/usr/libexec/TouchBarServer'
# For Arrendale and newer, this has no effect.
if self.model.startswith("MacBookPro") or self.model.startswith("MacBookAir"):
# non-Metal MacBooks never had keyboard backlight
if smbios_data.smbios_dictionary[self.model]["CPU Generation"] <= cpu_data.cpu_data.penryn.value:
if self.constants.detected_os > os_data.os_data.catalina:
return True
return False
def detect_patch_set(self): def detect_patch_set(self):
self.detect_gpus()
if self.model in model_array.LegacyBrightness:
if self.constants.detected_os > os_data.os_data.catalina:
self.brightness_legacy = True
if self.model in ["iMac7,1", "iMac8,1"] or (self.model in model_array.LegacyAudio and utilities.check_kext_loaded("AppleALC", self.constants.detected_os) is False):
# Special hack for systems with botched GOPs
# TL;DR: No Boot Screen breaks Lilu, therefore breaking audio
if self.constants.detected_os > os_data.os_data.catalina:
self.legacy_audio = True
if (
isinstance(self.constants.computer.wifi, device_probe.Broadcom)
and self.constants.computer.wifi.chipset in [device_probe.Broadcom.Chipsets.AirPortBrcm4331, device_probe.Broadcom.Chipsets.AirPortBrcm43224]
) or (isinstance(self.constants.computer.wifi, device_probe.Atheros) and self.constants.computer.wifi.chipset == device_probe.Atheros.Chipsets.AirPortAtheros40):
if self.constants.detected_os > os_data.os_data.big_sur:
self.legacy_wifi = True
# if self.model in ["MacBookPro5,1", "MacBookPro5,2", "MacBookPro5,3", "MacBookPro8,2", "MacBookPro8,3"]:
if self.model in ["MacBookPro8,2", "MacBookPro8,3"]:
# Sierra uses a legacy GMUX control method needed for dGPU switching on MacBookPro5,x
# Same method is also used for demuxed machines
# Note that MacBookPro5,x machines are extremely unstable with this patch set, so disabled until investigated further
# Ref: https://github.com/dortania/OpenCore-Legacy-Patcher/files/7360909/KP-b10-030.txt
if self.constants.detected_os > os_data.os_data.high_sierra:
if self.model in ["MacBookPro8,2", "MacBookPro8,3"]:
# Ref: https://doslabelectronics.com/Demux.html
if self.detect_demux() is True:
self.legacy_gmux = True
else:
self.legacy_gmux = True
utilities.cls() utilities.cls()
print("The following patches will be applied:") print("The following patches will be applied:")
if self.nvidia_legacy is True: if self.nvidia_legacy is True:
@@ -850,7 +751,6 @@ set million colour before rebooting"""
sip_value = ( sip_value = (
"For Hackintoshes, please set csr-active-config to '030A0000' (0xA03)\nFor non-OpenCore Macs, please run 'csrutil disable' and \n'csrutil authenticated-root disable' in RecoveryOS" "For Hackintoshes, please set csr-active-config to '030A0000' (0xA03)\nFor non-OpenCore Macs, please run 'csrutil disable' and \n'csrutil authenticated-root disable' in RecoveryOS"
) )
self.sip_enabled, self.sbm_enabled, self.amfi_enabled, self.fv_enabled, self.dosdude_patched = utilities.patching_status(sip, self.constants.detected_os)
if self.sip_enabled is True: if self.sip_enabled is True:
print("\nCannot patch! Please disable System Integrity Protection (SIP).") print("\nCannot patch! Please disable System Integrity Protection (SIP).")
print("Disable SIP in Patcher Settings and Rebuild OpenCore\n") print("Disable SIP in Patcher Settings and Rebuild OpenCore\n")
@@ -928,3 +828,5 @@ set million colour before rebooting"""
self.find_mount_root_vol(False) self.find_mount_root_vol(False)
if self.constants.gui_mode is False: if self.constants.gui_mode is False:
input("\nPress [ENTER] to return to the main menu") input("\nPress [ENTER] to return to the main menu")
elif self.constants.gui_mode is False:
input("\nPress [ENTER] to return to the main menu")

View File

@@ -1,5 +1,10 @@
from resources import constants, device_probe, utilities, generate_smbios # Hardware Detection Logic for Root Patching
from data import model_array, os_data, smbios_data, cpu_data, sip_data # Returns a dictionary of patches with boolean values
# Used when supplying data to sys_patch.py
# Copyright (C) 2020-2022, Dhinak G, Mykola Grymalyuk
from resources import constants, device_probe, utilities
from data import model_array, os_data, sip_data
class detect_root_patch: class detect_root_patch:
def __init__(self, model, versions): def __init__(self, model, versions):
@@ -50,7 +55,7 @@ class detect_root_patch:
if self.constants.detected_os > non_metal_os: if self.constants.detected_os > non_metal_os:
self.nvidia_legacy = True self.nvidia_legacy = True
self.amfi_must_disable = True self.amfi_must_disable = True
# self.legacy_keyboard_backlight = self.check_legacy_keyboard_backlight() self.legacy_keyboard_backlight = self.check_legacy_keyboard_backlight()
elif gpu.arch == device_probe.NVIDIA.Archs.Kepler: elif gpu.arch == device_probe.NVIDIA.Archs.Kepler:
if self.constants.detected_os > os_data.os_data.big_sur: if self.constants.detected_os > os_data.os_data.big_sur:
# Kepler drivers were dropped with Beta 7 # Kepler drivers were dropped with Beta 7
@@ -73,11 +78,13 @@ class detect_root_patch:
if self.constants.detected_os > non_metal_os: if self.constants.detected_os > non_metal_os:
self.iron_gpu = True self.iron_gpu = True
self.amfi_must_disable = True self.amfi_must_disable = True
self.legacy_keyboard_backlight = self.check_legacy_keyboard_backlight()
elif gpu.arch == device_probe.Intel.Archs.Sandy_Bridge: elif gpu.arch == device_probe.Intel.Archs.Sandy_Bridge:
if self.constants.detected_os > non_metal_os: if self.constants.detected_os > non_metal_os:
self.sandy_gpu = True self.sandy_gpu = True
self.amfi_must_disable = True self.amfi_must_disable = True
self.check_board_id = True self.check_board_id = True
self.legacy_keyboard_backlight = self.check_legacy_keyboard_backlight()
elif gpu.arch == device_probe.Intel.Archs.Ivy_Bridge: elif gpu.arch == device_probe.Intel.Archs.Ivy_Bridge:
if self.constants.detected_os > os_data.os_data.big_sur: if self.constants.detected_os > os_data.os_data.big_sur:
self.ivy_gpu = True self.ivy_gpu = True
@@ -90,6 +97,7 @@ class detect_root_patch:
self.amd_ts2 = False self.amd_ts2 = False
self.iron_gpu = False self.iron_gpu = False
self.sandy_gpu = False self.sandy_gpu = False
self.legacy_keyboard_backlight = False
def check_dgpu_status(self): def check_dgpu_status(self):
dgpu = self.constants.computer.dgpu dgpu = self.constants.computer.dgpu
@@ -111,14 +119,10 @@ class detect_root_patch:
return False return False
def check_legacy_keyboard_backlight(self): def check_legacy_keyboard_backlight(self):
# With Big Sur and newer, Skylight patch set unfortunately breaks native keyboard backlight # iMac12,x+ have an 'ACPI0008' device, but it's not a keyboard backlight
# Penryn Macs are able to re-enable the keyboard backlight by simply running '/usr/libexec/TouchBarServer' # Best to assume laptops will have a keyboard backlight
# For Arrendale and newer, this has no effect. if self.model.startswith("MacBook"):
if self.model.startswith("MacBookPro") or self.model.startswith("MacBookAir"): return self.constants.computer.ambient_light_sensor
# non-Metal MacBooks never had keyboard backlight
if smbios_data.smbios_dictionary[self.model]["CPU Generation"] <= cpu_data.cpu_data.penryn.value:
if self.constants.detected_os > os_data.os_data.catalina:
return True
return False return False
def detect_patch_set(self): def detect_patch_set(self):
@@ -173,10 +177,10 @@ class detect_root_patch:
"Validation: Patching Possible": self.verify_patch_allowed(), "Validation: Patching Possible": self.verify_patch_allowed(),
"Validation: SIP is enabled": self.sip_enabled, "Validation: SIP is enabled": self.sip_enabled,
"Validation: SBM is enabled": self.sbm_enabled, "Validation: SBM is enabled": self.sbm_enabled,
"Validation: AMFI is enabled": self.amfi_enabled, "Validation: AMFI is enabled": self.amfi_enabled if self.amfi_must_disable else False,
"Validation: FileVault is enabled": self.fv_enabled, "Validation: FileVault is enabled": self.fv_enabled,
"Validation: System is dosdude1 patched": self.dosdude_patched, "Validation: System is dosdude1 patched": self.dosdude_patched,
"Validation: Board ID is unsupported": self.bad_board_id, f"Validation: Board ID is unsupported \n({self.computer.reported_board_id})": self.bad_board_id,
} }
return self.root_patch_dict return self.root_patch_dict

View File

@@ -84,6 +84,14 @@ def get_disk_path():
root_mount_path = root_mount_path[:-2] if root_mount_path.count("s") > 1 else root_mount_path root_mount_path = root_mount_path[:-2] if root_mount_path.count("s") > 1 else root_mount_path
return root_mount_path return root_mount_path
def check_if_root_is_apfs_snapshot():
root_partition_info = plistlib.loads(subprocess.run("diskutil info -plist /".split(), stdout=subprocess.PIPE).stdout.decode().strip().encode())
try:
is_snapshotted = root_partition_info["APFSSnapshot"]
except KeyError:
is_snapshotted = False
return is_snapshotted
def check_seal(): def check_seal():
# 'Snapshot Sealed' property is only listed on booted snapshots # 'Snapshot Sealed' property is only listed on booted snapshots
@@ -312,7 +320,7 @@ def verify_network_connection(url):
except (requests.exceptions.Timeout, requests.exceptions.TooManyRedirects, requests.exceptions.ConnectionError, requests.exceptions.HTTPError): except (requests.exceptions.Timeout, requests.exceptions.TooManyRedirects, requests.exceptions.ConnectionError, requests.exceptions.HTTPError):
return False return False
def download_file(link, location, is_gui=None): def download_file(link, location, is_gui=None, verify_checksum=False):
if verify_network_connection(link): if verify_network_connection(link):
short_link = os.path.basename(link) short_link = os.path.basename(link)
if Path(location).exists(): if Path(location).exists():
@@ -361,13 +369,18 @@ def download_file(link, location, is_gui=None):
if total_file_size > 1024: if total_file_size > 1024:
total_downloaded_string = f" ({round(float(dl / total_file_size * 100), 2)}%)" total_downloaded_string = f" ({round(float(dl / total_file_size * 100), 2)}%)"
print(f"{round(count / 1024 / 1024, 2)}MB Downloaded{file_size_string}{total_downloaded_string}\nAverage Download Speed: {round(dl//(time.perf_counter() - start) / 100000 / 8, 2)} MB/s") print(f"{round(count / 1024 / 1024, 2)}MB Downloaded{file_size_string}{total_downloaded_string}\nAverage Download Speed: {round(dl//(time.perf_counter() - start) / 100000 / 8, 2)} MB/s")
checksum = hashlib.sha256()
with location.open("rb") as file: if verify_checksum is True:
chunk = file.read(1024 * 1024 * 16) # Verify checksum
while chunk: # Note that this can be quite taxing on slower Macs
checksum.update(chunk) checksum = hashlib.sha256()
with location.open("rb") as file:
chunk = file.read(1024 * 1024 * 16) chunk = file.read(1024 * 1024 * 16)
return checksum while chunk:
checksum.update(chunk)
chunk = file.read(1024 * 1024 * 16)
return checksum
return True
else: else:
cls() cls()
header = "# Could not establish Network Connection with provided link! #" header = "# Could not establish Network Connection with provided link! #"
@@ -393,6 +406,11 @@ def monitor_disk_output(disk):
output = output[-2] output = output[-2]
return output return output
def check_boot_mode():
# Check whether we're in Safe Mode or not
sys_plist = plistlib.loads(subprocess.run(["system_profiler", "SPSoftwareDataType"], stdout=subprocess.PIPE).stdout)
return sys_plist[0]["_items"][0]["boot_mode"]
def elevated(*args, **kwargs) -> subprocess.CompletedProcess: def elevated(*args, **kwargs) -> subprocess.CompletedProcess:
# When runnign through our GUI, we run as root, however we do not get uid 0 # When runnign through our GUI, we run as root, however we do not get uid 0
# Best to assume CLI is running as root # Best to assume CLI is running as root

View File

@@ -8,11 +8,13 @@ def validate(settings):
valid_dumps = [ valid_dumps = [
example_data.MacBookPro.MacBookPro92_Stock, example_data.MacBookPro.MacBookPro92_Stock,
example_data.MacBookPro.MacBookPro111_Stock,
# example_data.MacBookPro.MacBookPro171_Stock, # example_data.MacBookPro.MacBookPro171_Stock,
# example_data.Macmini.Macmini91_Stock, # example_data.Macmini.Macmini91_Stock,
example_data.iMac.iMac81_Stock, example_data.iMac.iMac81_Stock,
example_data.iMac.iMac112_Stock, example_data.iMac.iMac112_Stock,
example_data.iMac.iMac122_Upgraded, example_data.iMac.iMac122_Upgraded,
example_data.iMac.iMac122_Upgraded_Nvidia,
example_data.iMac.iMac151_Stock, example_data.iMac.iMac151_Stock,
example_data.MacPro.MacPro31_Stock, example_data.MacPro.MacPro31_Stock,
example_data.MacPro.MacPro31_Upgrade, example_data.MacPro.MacPro31_Upgrade,
@@ -23,6 +25,11 @@ def validate(settings):
example_data.MacPro.MacPro41_51__Flashed_Modern_AMD, example_data.MacPro.MacPro41_51__Flashed_Modern_AMD,
] ]
valid_dumps_native = [
example_data.iMac.iMac201_Stock,
example_data.MacBookPro.MacBookPro141_SSD_Upgrade,
]
settings.validate = True settings.validate = True
def build_prebuilt(): def build_prebuilt():