OSX-KVM - March 2021 - Batch Update 1

Changes:

- Upgrade to OpenCore 0.6.7-RELEASE

- Big Sur image building script updates (Nick)
  - See https://github.com/kholia/OSX-KVM/pull/169 for details.

- Removed history to reduce repository size
This commit is contained in:
Dhiru Kholia 2021-02-13 18:35:20 +05:30
commit ca219f57e5
109 changed files with 20573 additions and 0 deletions

10
.github/issue_template.md vendored Normal file
View file

@ -0,0 +1,10 @@
#### Notes
- Please, DO NOT create a new issue if your issue is already known.
- Carefully read the documentation included in the repository.
- Look closely at the closed and open issues.
- Attach details about your host OS (distribution, kernel, QEMU version) and
host CPU (vendor and model number).
- Remove this template message after reading it ;)

11
.gitignore vendored Normal file
View file

@ -0,0 +1,11 @@
*.iso
mac_hdd.img
mac_hdd_ng.img
*.sha256sum
*.sucatalog
*.img
*.dmg
*.dist
*.smd
*.dmg
OVMF_VARS-1024x768.fd

3
.gitmodules vendored Normal file
View file

@ -0,0 +1,3 @@
[submodule "resources/OcBinaryData"]
path = resources/OcBinaryData
url = https://github.com/acidanthera/OcBinaryData.git

119
CREDITS.md Normal file
View file

@ -0,0 +1,119 @@
### Credits
- [UPSTREAM] https://github.com/acidanthera/OpenCorePkg + https://dortania.github.io/ - for making all this possible!
* RehabMan, th3joker and others - FakeSMC.kext, https://bitbucket.org/RehabMan
* Chuck Remes (chuckremes) - better documentation
* Meissa - better networking documentation
* PJ Meyer (pjmeyer) - compatibility with modern versions of GNU mktemp
* Robert DeRose (RobertDeRose) and Dirk Bajohr (isolution-de) - macOS support
* Fritz Elfert (felfert) - cleanups, better documentation, and nicer ISO creation script
* Ian McDowell (IMcD23) - more documentation, and better ISO creation script
* voobscout - libvirt XML file
* Evgeny Grin (Karlson2k) - for the original ISO creation script
* Gabriel L. Somlo - for getting things started and going
* http://www.insanelymac.com/ - Enoch bootloader
* Nicholas Sherlock - UEFI, Clover, and other hacks
* Phil Dennis-Jordan - virtio-net-osx, usb-tablet and other hacks
* Nikolay Dimitrov (nikidim) - Docker for Mac
* Francisco de la Peña - libvirt XML file for macOS High Sierra
* Christian Giliberto - libvirt XML tweaks
* José Roberto Meza Cabrera - AMD Ryzen testing
* Paweł BB Drozd - UEFI resolution
* Jan Kuri (jkuri) - Mojave ISO creation fixes
* Mike Hardy (mikehardy) - Network documentation improvements
* CuriousTommy + pickled_monkey - Information on vmxnet3 network adapter
* Povilas Kanapickas (p12tic) - Flexible ISO generation
* Dick Marinus (meeuw) - Allow usage of latest Clover
* Foxlet (foxlet) - Allow installation without existing macOS
* Ralph Kühnert (redradrat) - Debug fetch-macOS.py script
* Pellegrino Prevete (tallero) - Better documentation
* Niklas Korz (niklaskorz) - Stop using brctl
* Mike Bybee (stereoplegic) - Higher resolution documentation
* Yarkhan - Passthrough for making iDevices work
* Yu-Chen Lin (npes87184) - Virtio and qemu-img notes
* Wen-He - Catalina related fixes
* Alexander Galato (alet) - OVMF build documentation fixes
* zimbatm - portability enhancements, cool crazy ideas (thanks!)
* https://github.com/Leoyzen/KVM-Opencore - OpenCore support
* Kyle Dayton - UEFI, Clover, and GPU passthrough notes
- foxtrotdragon - OpenCore language fixes
- hoshsadiq (Hosh) - fetch-macOS.py improvements
- philffm - Typo fix in `Big-Sur.md`
- jviotti - Headless mode fixes
- offlinehacker - libvirt support
- hellodeibu - Big Sur support
- kittywhiskers - Large number of changes - thank you!
- zimbatm - Thank you!
- Peter Asanov (ink-splatters) - Fixes for the OS-fetch script
- Sangwhan "fish" Moon - Big Sur doc enhancements
- ADawesomeguy - Big Sur doc enhancements, Xcode + OSX-KVM tutorial
- shmsh9 - Python 3.9.x support
- Gelma (Andrea Gelmini) - Typo fixes
- ivy-rew (Reguel) - Greatly improved Big-Sur notes
- Broly1 - Greatly improved Big-Sur notes
- mikkeyboi (Michael Leung) - Greatly improved Big-Sur notes
- CyberShadow (Vladimir Panteleev) - Documentation fixes
- mikehardy (Mike Hardy) - Docker on macOS notes, CPU support notes
- Dogr95 - macOS-libvirt-Catalina.xml fixes
- headkaze - AppleVirtualGraphics.kext tip
- aydenbottos - macOS-libvirt-Catalina.xml fixes
- mikkeyboi - Unraid OS stuff
Note: Individual files have more specific 'credits' in them.

2
Makefile Normal file
View file

@ -0,0 +1,2 @@
clean:
rm -rf content || true

30
OVMF-notes.txt Normal file
View file

@ -0,0 +1,30 @@
Current OVMF blobs are borrowed from the following URL,
http://download.proxmox.com/debian/dists/buster/pve-no-subscription/binary-amd64/pve-edk2-firmware_2.20200531-1_all.deb
OVMF for non-OpenCore boot loaders: https://github.com/kholia/edk2/tree/macOS-NG-v3.
Building OVMF
-------------
# Add tools and build dependencies:
apt-get update
apt-get install build-essential git lintian debhelper iasl nasm \
python uuid-dev -y
git clone https://github.com/tianocore/edk2
cd edk2
git submodule update --init
make -C BaseTools
. edksetup.sh BaseTools
build -a X64 -t GCC5 -p OvmfPkg/OvmfPkgX64.dsc -b RELEASE
References
----------
* https://www.contrib.andrew.cmu.edu/~somlo/OSXKVM/
* https://www.nicksherlock.com/2018/04/patch-ovmf-to-support-macos-in-proxmox-5-1/
* https://github.com/thenickdude/edk2 (macos-support branch)

BIN
OVMF_CODE.fd Normal file

Binary file not shown.

BIN
OVMF_VARS-1024x768.fd Normal file

Binary file not shown.

58
OpenCore-Boot-CD.sh Executable file
View file

@ -0,0 +1,58 @@
#!/usr/bin/env bash
# Special thanks to:
# https://github.com/Leoyzen/KVM-Opencore
# https://github.com/thenickdude/KVM-Opencore/
# https://github.com/qemu/qemu/blob/master/docs/usb2.txt
#
# qemu-img create -f qcow2 mac_hdd_ng.img 128G
#
# echo 1 > /sys/module/kvm/parameters/ignore_msrs (this is required)
############################################################################
# NOTE: Tweak the "MY_OPTIONS" line in case you are having booting problems!
############################################################################
MY_OPTIONS="+pcid,+ssse3,+sse4.2,+popcnt,+avx,+aes,+xsave,+xsaveopt,check"
# This script works for Big Sur, Catalina, Mojave, and High Sierra. Tested with
# macOS 10.15.6, macOS 10.14.6, and macOS 10.13.6
ALLOCATED_RAM="3072" # MiB
CPU_SOCKETS="1"
CPU_CORES="2"
CPU_THREADS="4"
REPO_PATH="./"
OVMF_DIR="."
# shellcheck disable=SC2054
args=(
-enable-kvm -m "$ALLOCATED_RAM" -cpu Penryn,kvm=on,vendor=GenuineIntel,+invtsc,vmware-cpuid-freq=on,"$MY_OPTIONS"
-machine q35
-usb -device usb-kbd -device usb-tablet
-smp "$CPU_THREADS",cores="$CPU_CORES",sockets="$CPU_SOCKETS"
-device usb-ehci,id=ehci
# -device usb-kbd,bus=ehci.0
# -device usb-mouse,bus=ehci.0
# -device nec-usb-xhci,id=xhci
-device isa-applesmc,osk="ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc"
-drive if=pflash,format=raw,readonly,file="$REPO_PATH/$OVMF_DIR/OVMF_CODE.fd"
-drive if=pflash,format=raw,file="$REPO_PATH/$OVMF_DIR/OVMF_VARS-1024x768.fd"
-smbios type=2
-device ich9-intel-hda -device hda-duplex
-device ich9-ahci,id=sata
# -drive id=OpenCoreBoot,if=none,snapshot=on,format=qcow2,file="$REPO_PATH/OpenCore-Catalina/OpenCore-nopicker.qcow2"
-drive id=OpenCoreBoot,if=none,snapshot=on,format=qcow2,file="$REPO_PATH/OpenCore-Catalina/OpenCore.qcow2"
-device ide-hd,bus=sata.2,drive=OpenCoreBoot
-device ide-hd,bus=sata.3,drive=InstallMedia
-drive id=InstallMedia,if=none,file="$REPO_PATH/os.dmg",format=raw
-drive id=MacHDD,if=none,file="$REPO_PATH/mac_hdd_ng.img",format=qcow2
-device ide-hd,bus=sata.4,drive=MacHDD
# -netdev tap,id=net0,ifname=tap0,script=no,downscript=no -device vmxnet3,netdev=net0,id=net0,mac=52:54:00:c9:18:27
-netdev user,id=net0 -device vmxnet3,netdev=net0,id=net0,mac=52:54:00:c9:18:27
-monitor stdio
-device VGA,vgamem_mb=128
)
qemu-system-x86_64 "${args[@]}"

61
OpenCore-Boot.sh Executable file
View file

@ -0,0 +1,61 @@
#!/usr/bin/env bash
# Special thanks to:
# https://github.com/Leoyzen/KVM-Opencore
# https://github.com/thenickdude/KVM-Opencore/
# https://github.com/qemu/qemu/blob/master/docs/usb2.txt
#
# qemu-img create -f qcow2 mac_hdd_ng.img 128G
#
# echo 1 > /sys/module/kvm/parameters/ignore_msrs (this is required)
############################################################################
# NOTE: Tweak the "MY_OPTIONS" line in case you are having booting problems!
############################################################################
MY_OPTIONS="+pcid,+ssse3,+sse4.2,+popcnt,+avx,+aes,+xsave,+xsaveopt,check"
# This script works for Big Sur, Catalina, Mojave, and High Sierra. Tested with
# macOS 10.15.6, macOS 10.14.6, and macOS 10.13.6
ALLOCATED_RAM="3072" # MiB
CPU_SOCKETS="1"
CPU_CORES="2"
CPU_THREADS="4"
REPO_PATH="."
OVMF_DIR="."
# This causes high cpu usage on the *host* side
# qemu-system-x86_64 -enable-kvm -m 3072 -cpu Penryn,vendor=GenuineIntel,+invtsc,vmware-cpuid-freq=on,hypervisor=off,vmx=on,kvm=off,$MY_OPTIONS\
# shellcheck disable=SC2054
args=(
-enable-kvm -m "$ALLOCATED_RAM" -cpu Penryn,kvm=on,vendor=GenuineIntel,+invtsc,vmware-cpuid-freq=on,"$MY_OPTIONS"
-machine q35
-usb -device usb-kbd -device usb-tablet
-smp "$CPU_THREADS",cores="$CPU_CORES",sockets="$CPU_SOCKETS"
-device usb-ehci,id=ehci
# -device usb-kbd,bus=ehci.0
# -device usb-mouse,bus=ehci.0
# -device nec-usb-xhci,id=xhci
-device isa-applesmc,osk="ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc"
-drive if=pflash,format=raw,readonly,file="$REPO_PATH/$OVMF_DIR/OVMF_CODE.fd"
-drive if=pflash,format=raw,file="$REPO_PATH/$OVMF_DIR/OVMF_VARS-1024x768.fd"
-smbios type=2
-device ich9-intel-hda -device hda-duplex
-device ich9-ahci,id=sata
# -drive id=OpenCoreBoot,if=none,snapshot=on,format=qcow2,file="$REPO_PATH/OpenCore-Catalina/OpenCore-nopicker.qcow2"
-drive id=OpenCoreBoot,if=none,snapshot=on,format=qcow2,file="$REPO_PATH/OpenCore-Catalina/OpenCore.qcow2"
-device ide-hd,bus=sata.2,drive=OpenCoreBoot
-device ide-hd,bus=sata.3,drive=InstallMedia
-drive id=InstallMedia,if=none,file="$REPO_PATH/BaseSystem.img",format=raw
-drive id=MacHDD,if=none,file="$REPO_PATH/mac_hdd_ng.img",format=qcow2
-device ide-hd,bus=sata.4,drive=MacHDD
# -netdev tap,id=net0,ifname=tap0,script=no,downscript=no -device vmxnet3,netdev=net0,id=net0,mac=52:54:00:c9:18:27
-netdev user,id=net0 -device vmxnet3,netdev=net0,id=net0,mac=52:54:00:c9:18:27
-monitor stdio
-device VGA,vgamem_mb=128
)
qemu-system-x86_64 "${args[@]}"

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.

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.

View file

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>BuildMachineOSBuild</key>
<string>18A391011</string>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleGetInfoString</key>
<string>111.1.18, Copyright 2008-2016 Apple Inc. All rights reserved.</string>
<key>CFBundleIdentifier</key>
<string>com.apple.driver.AGPMInjector</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>AGPMInjector</string>
<key>CFBundlePackageType</key>
<string>KEXT</string>
<key>CFBundleShortVersionString</key>
<string>2.7.3-AGPMInjector</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>111.1.18</string>
<key>IOKitPersonalities</key>
<dict>
<key>AGPM</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.apple.driver.AGPM</string>
<key>IOClass</key>
<string>AGPMController</string>
<key>IONameMatch</key>
<string>AGPMEnabler</string>
<key>IOProviderClass</key>
<string>IOPlatformPluginDevice</string>
<key>Machines</key>
<dict>
<key>iMacPro1,1</key>
<dict>
<key>GFX0</key>
<dict>
<key>AGDCEnabled</key>
<integer>1</integer>
<key>Heuristic</key>
<dict>
<key>ID</key>
<integer>4</integer>
</dict>
<key>control-id</key>
<integer>17</integer>
<key>max-power-state</key>
<integer>15</integer>
<key>min-power-state</key>
<integer>0</integer>
</dict>
</dict>
</dict>
</dict>
</dict>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2008-2016 Apple Inc. All rights reserved.</string>
<key>OSBundleRequired</key>
<string>Safe Boot</string>
</dict>
</plist>

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,115 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict/>
<key>files2</key>
<dict/>
<key>rules</key>
<dict>
<key>^Resources/</key>
<true/>
<key>^Resources/.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^Resources/.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Resources/Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/</key>
<dict>
<key>nested</key>
<true/>
<key>weight</key>
<real>10</real>
</dict>
<key>^.*</key>
<true/>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^Resources/</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^Resources/.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^Resources/.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Resources/Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^[^/]+$</key>
<dict>
<key>nested</key>
<true/>
<key>weight</key>
<real>10</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>

View file

@ -0,0 +1,85 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>BuildMachineOSBuild</key>
<string>19H2</string>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>Lilu</string>
<key>CFBundleIdentifier</key>
<string>as.vit9696.Lilu</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>Lilu</string>
<key>CFBundlePackageType</key>
<string>KEXT</string>
<key>CFBundleShortVersionString</key>
<string>1.4.9</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleSupportedPlatforms</key>
<array>
<string>MacOSX</string>
</array>
<key>CFBundleVersion</key>
<string>1.4.9</string>
<key>DTCompiler</key>
<string>com.apple.compilers.llvm.clang.1_0</string>
<key>DTPlatformBuild</key>
<string>12A7209</string>
<key>DTPlatformName</key>
<string>macosx</string>
<key>DTPlatformVersion</key>
<string>10.15.6</string>
<key>DTSDKBuild</key>
<string>19G68</string>
<key>DTSDKName</key>
<string>macosx10.15</string>
<key>DTXcode</key>
<string>1200</string>
<key>DTXcodeBuild</key>
<string>12A7209</string>
<key>IOKitPersonalities</key>
<dict>
<key>as.vit9696.Lilu</key>
<dict>
<key>CFBundleIdentifier</key>
<string>as.vit9696.Lilu</string>
<key>IOClass</key>
<string>Lilu</string>
<key>IOMatchCategory</key>
<string>Lilu</string>
<key>IOProviderClass</key>
<string>IOResources</string>
<key>IOResourceMatch</key>
<string>IOKit</string>
</dict>
</dict>
<key>LSMinimumSystemVersion</key>
<string>10.6</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2016-2020 vit9696. All rights reserved.</string>
<key>OSBundleCompatibleVersion</key>
<string>1.2.0</string>
<key>OSBundleLibraries</key>
<dict>
<key>com.apple.kpi.bsd</key>
<string>10.0.0</string>
<key>com.apple.kpi.dsep</key>
<string>10.0.0</string>
<key>com.apple.kpi.iokit</key>
<string>10.0.0</string>
<key>com.apple.kpi.libkern</key>
<string>10.0.0</string>
<key>com.apple.kpi.mach</key>
<string>10.0.0</string>
<key>com.apple.kpi.unsupported</key>
<string>10.0.0</string>
</dict>
<key>OSBundleRequired</key>
<string>Root</string>
</dict>
</plist>

Binary file not shown.

View file

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleGetInfoString</key>
<string>MCEReporterDisabler 0.5, Copyright (GPLv2) © 2017 by RehabMan. All rights reserved.</string>
<key>CFBundleIdentifier</key>
<string>org.rehabman.disabler.MCEReporter</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>MCEReporterDisabler</string>
<key>CFBundlePackageType</key>
<string>KEXT</string>
<key>CFBundleVersion</key>
<string>0.5</string>
<key>IOKitPersonalities</key>
<dict>
<key>MCEInterruptControllerDisabler</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.apple.driver.AppleIntelMCEReporter</string>
<key>IOClass</key>
<string>IOService</string>
<key>IOMatchCategory</key>
<string>AppleIntelMCEInterruptController</string>
<key>IOProbeScore</key>
<integer>5000</integer>
<key>IOPropertyMatch</key>
<array>
<dict>
<key>board-id</key>
<string>Mac-F60DEB81FF30ACF6</string>
</dict>
<dict>
<key>board-id</key>
<string>Mac-7BA5B2D9E42DDD94</string>
</dict>
<dict>
<key>board-id</key>
<string>Mac-27AD2F918AE68F61</string>
</dict>
</array>
<key>IOProviderClass</key>
<string>IOPlatformExpertDevice</string>
</dict>
<key>MCEReporterDisabler</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.apple.driver.AppleIntelMCEReporter</string>
<key>IOClass</key>
<string>IOService</string>
<key>IOMatchCategory</key>
<string>AppleIntelMCEReporter</string>
<key>IOProbeScore</key>
<integer>5000</integer>
<key>IOProviderClass</key>
<string>AppleIntelMCEInterruptNub</string>
</dict>
</dict>
</dict>
</plist>

View file

@ -0,0 +1,245 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleGetInfoString</key>
<string>1.0 Copyright © 2018-2020 Headsoft. All rights reserved.</string>
<key>CFBundleIdentifier</key>
<string>com.Headsoft.USBPorts</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>USBPorts</string>
<key>CFBundlePackageType</key>
<string>KEXT</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>IOKitPersonalities</key>
<dict>
<key>iMacPro1,1-EH01</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.apple.driver.AppleUSBMergeNub</string>
<key>IOClass</key>
<string>AppleUSBMergeNub</string>
<key>IONameMatch</key>
<string>EH01</string>
<key>IOPCIPrimaryMatch</key>
<string>0x293a8086</string>
<key>IOProbeScore</key>
<integer>5000</integer>
<key>IOProviderClass</key>
<string>AppleUSBEHCIPCI</string>
<key>IOProviderMergeProperties</key>
<dict>
<key>port-count</key>
<data>
BgAAAA==
</data>
<key>ports</key>
<dict>
<key>HS11</key>
<dict>
<key>UsbConnector</key>
<integer>0</integer>
<key>port</key>
<data>
AQAAAA==
</data>
</dict>
<key>HS12</key>
<dict>
<key>UsbConnector</key>
<integer>0</integer>
<key>port</key>
<data>
AgAAAA==
</data>
</dict>
<key>HS13</key>
<dict>
<key>UsbConnector</key>
<integer>0</integer>
<key>port</key>
<data>
AwAAAA==
</data>
</dict>
<key>HS14</key>
<dict>
<key>UsbConnector</key>
<integer>0</integer>
<key>port</key>
<data>
BAAAAA==
</data>
</dict>
<key>HS15</key>
<dict>
<key>UsbConnector</key>
<integer>0</integer>
<key>port</key>
<data>
BQAAAA==
</data>
</dict>
<key>HS16</key>
<dict>
<key>UsbConnector</key>
<integer>0</integer>
<key>port</key>
<data>
BgAAAA==
</data>
</dict>
</dict>
</dict>
<key>model</key>
<string>iMacPro1,1</string>
</dict>
<key>iMacPro1,1-UHC1</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.apple.driver.AppleUSBMergeNub</string>
<key>IOClass</key>
<string>AppleUSBMergeNub</string>
<key>IONameMatch</key>
<string>UHC1</string>
<key>IOPCIPrimaryMatch</key>
<string>0x29348086</string>
<key>IOProbeScore</key>
<integer>5000</integer>
<key>IOProviderClass</key>
<string>AppleUSBUHCIPCI</string>
<key>IOProviderMergeProperties</key>
<dict>
<key>port-count</key>
<data>
AgAAAA==
</data>
<key>ports</key>
<dict>
<key>LS01</key>
<dict>
<key>UsbConnector</key>
<integer>0</integer>
<key>port</key>
<data>
AQAAAA==
</data>
</dict>
<key>LS02</key>
<dict>
<key>UsbConnector</key>
<integer>0</integer>
<key>port</key>
<data>
AgAAAA==
</data>
</dict>
</dict>
</dict>
<key>model</key>
<string>iMacPro1,1</string>
</dict>
<key>iMacPro1,1-UHC2</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.apple.driver.AppleUSBMergeNub</string>
<key>IOClass</key>
<string>AppleUSBMergeNub</string>
<key>IONameMatch</key>
<string>UHC2</string>
<key>IOPCIPrimaryMatch</key>
<string>0x29358086</string>
<key>IOProbeScore</key>
<integer>5000</integer>
<key>IOProviderClass</key>
<string>AppleUSBUHCIPCI</string>
<key>IOProviderMergeProperties</key>
<dict>
<key>port-count</key>
<data>
AgAAAA==
</data>
<key>ports</key>
<dict>
<key>LS03</key>
<dict>
<key>UsbConnector</key>
<integer>0</integer>
<key>port</key>
<data>
AQAAAA==
</data>
</dict>
<key>LS04</key>
<dict>
<key>UsbConnector</key>
<integer>0</integer>
<key>port</key>
<data>
AgAAAA==
</data>
</dict>
</dict>
</dict>
<key>model</key>
<string>iMacPro1,1</string>
</dict>
<key>iMacPro1,1-UHC3</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.apple.driver.AppleUSBMergeNub</string>
<key>IOClass</key>
<string>AppleUSBMergeNub</string>
<key>IONameMatch</key>
<string>UHC3</string>
<key>IOPCIPrimaryMatch</key>
<string>0x29368086</string>
<key>IOProbeScore</key>
<integer>5000</integer>
<key>IOProviderClass</key>
<string>AppleUSBUHCIPCI</string>
<key>IOProviderMergeProperties</key>
<dict>
<key>port-count</key>
<data>
AgAAAA==
</data>
<key>ports</key>
<dict>
<key>LS05</key>
<dict>
<key>UsbConnector</key>
<integer>0</integer>
<key>port</key>
<data>
AQAAAA==
</data>
</dict>
<key>LS06</key>
<dict>
<key>UsbConnector</key>
<integer>0</integer>
<key>port</key>
<data>
AgAAAA==
</data>
</dict>
</dict>
</dict>
<key>model</key>
<string>iMacPro1,1</string>
</dict>
</dict>
<key>OSBundleRequired</key>
<string>Root</string>
</dict>
</plist>

View file

@ -0,0 +1,414 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>BuildMachineOSBuild</key>
<string>19H2</string>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>VirtualSMC</string>
<key>CFBundleIdentifier</key>
<string>as.vit9696.VirtualSMC</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>VirtualSMC</string>
<key>CFBundlePackageType</key>
<string>KEXT</string>
<key>CFBundleShortVersionString</key>
<string>1.1.8</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleSupportedPlatforms</key>
<array>
<string>MacOSX</string>
</array>
<key>CFBundleVersion</key>
<string>1.1.8</string>
<key>DTCompiler</key>
<string>com.apple.compilers.llvm.clang.1_0</string>
<key>DTPlatformBuild</key>
<string>12A7209</string>
<key>DTPlatformName</key>
<string>macosx</string>
<key>DTPlatformVersion</key>
<string>10.15.6</string>
<key>DTSDKBuild</key>
<string>19G68</string>
<key>DTSDKName</key>
<string>macosx10.15</string>
<key>DTXcode</key>
<string>1200</string>
<key>DTXcodeBuild</key>
<string>12A7209</string>
<key>IOKitPersonalities</key>
<dict>
<key>as.vit9696.VirtualSMC</key>
<dict>
<key>CFBundleIdentifier</key>
<string>as.vit9696.VirtualSMC</string>
<key>IOClass</key>
<string>VirtualSMC</string>
<key>IODeviceMemory</key>
<array>
<array>
<dict>
<key>address</key>
<integer>768</integer>
<key>length</key>
<integer>32</integer>
</dict>
</array>
<array>
<dict>
<key>address</key>
<integer>4277141504</integer>
<key>length</key>
<integer>65536</integer>
</dict>
</array>
</array>
<key>IOInterruptControllers</key>
<array>
<string>io-apic-0</string>
</array>
<key>IOInterruptSpecifiers</key>
<array>
<data>
BgAAAAAAAAA=
</data>
</array>
<key>IOMatchCategory</key>
<string>IOACPIPlatformDevice</string>
<key>IOName</key>
<string>SMC</string>
<key>IOProbeScore</key>
<integer>60000</integer>
<key>IOProviderClass</key>
<string>AppleACPIPlatformExpert</string>
<key>Keystore</key>
<dict>
<key>Generic</key>
<array>
<dict>
<key>attr</key>
<data>
iA==
</data>
<key>comment</key>
<string>Total fan number, this should be put to a plugin</string>
<key>name</key>
<data>
Rk51bQ==
</data>
<key>type</key>
<data>
dWk4IA==
</data>
<key>value</key>
<data>
AA==
</data>
</dict>
<dict>
<key>attr</key>
<data>
gA==
</data>
<key>comment</key>
<string>CPU plimit</string>
<key>name</key>
<data>
TVNUYw==
</data>
<key>type</key>
<data>
dWk4IA==
</data>
<key>value</key>
<data>
AA==
</data>
</dict>
<dict>
<key>attr</key>
<data>
gA==
</data>
<key>comment</key>
<string>FAN plimit (supposedly)</string>
<key>name</key>
<data>
TVNUZg==
</data>
<key>type</key>
<data>
dWk4IA==
</data>
<key>value</key>
<data>
AA==
</data>
</dict>
<dict>
<key>attr</key>
<data>
gA==
</data>
<key>comment</key>
<string>Memory plimit</string>
<key>name</key>
<data>
TVNUbQ==
</data>
<key>type</key>
<data>
dWk4IA==
</data>
<key>value</key>
<data>
AA==
</data>
</dict>
<dict>
<key>attr</key>
<data>
gA==
</data>
<key>comment</key>
<string>This should be 1 on laptops, and is overriden by sensors</string>
<key>name</key>
<data>
QkFUUA==
</data>
<key>type</key>
<data>
ZmxhZw==
</data>
<key>value</key>
<data>
AA==
</data>
</dict>
<dict>
<key>attr</key>
<data>
gA==
</data>
<key>comment</key>
<string>Only MacPros have custom illumination controllers</string>
<key>name</key>
<data>
THNOTQ==
</data>
<key>type</key>
<data>
dWk4IA==
</data>
<key>value</key>
<data>
AA==
</data>
</dict>
</array>
<key>GenericDesktopV1</key>
<array/>
<key>GenericDesktopV2</key>
<array/>
<key>GenericLaptopV1</key>
<array/>
<key>GenericLaptopV2</key>
<array/>
<key>GenericV1</key>
<array>
<dict>
<key>attr</key>
<data>
gA==
</data>
<key>comment</key>
<string>GPU plimit</string>
<key>name</key>
<data>
TVNUZw==
</data>
<key>type</key>
<data>
dWk4IA==
</data>
<key>value</key>
<data>
AA==
</data>
</dict>
</array>
<key>GenericV2</key>
<array>
<dict>
<key>attr</key>
<data>
gA==
</data>
<key>comment</key>
<string>E plimit (???)</string>
<key>name</key>
<data>
TVNUZQ==
</data>
<key>type</key>
<data>
dWk4IA==
</data>
<key>value</key>
<data>
AA==
</data>
</dict>
<dict>
<key>attr</key>
<data>
gA==
</data>
<key>comment</key>
<string>I plimit (???)</string>
<key>name</key>
<data>
TVNUaQ==
</data>
<key>type</key>
<data>
dWk4IA==
</data>
<key>value</key>
<data>
AA==
</data>
</dict>
<dict>
<key>attr</key>
<data>
gA==
</data>
<key>comment</key>
<string>J plimit (???)</string>
<key>name</key>
<data>
TVNUag==
</data>
<key>type</key>
<data>
dWk4IA==
</data>
<key>value</key>
<data>
AA==
</data>
</dict>
</array>
</dict>
<key>ModelInfo</key>
<dict>
<key>GenericV1</key>
<dict>
<key>branch</key>
<data>
ajUyAAAAAAA=
</data>
<key>hwname</key>
<data>
c21jLXBpa2V0b24A
</data>
<key>platform</key>
<data>
ajUyAAAAAAA=
</data>
<key>rev</key>
<data>
AXQPAAAE
</data>
<key>revfb</key>
<data>
AXQPAAAE
</data>
<key>revfu</key>
<data>
AXQPAAAE
</data>
</dict>
<key>GenericV2</key>
<dict>
<key>branch</key>
<data>
ajUyAAAAAAA=
</data>
<key>hwname</key>
<data>
c21jLWh1cm9ucml2ZXIA
</data>
<key>platform</key>
<data>
ajUyAAAAAAA=
</data>
<key>rev</key>
<data>
AigPAAAH
</data>
<key>revfb</key>
<data>
AigPAAAH
</data>
<key>revfu</key>
<data>
AigPAAAH
</data>
</dict>
<key>GenericV3</key>
<dict>
<key>hwname</key>
<data>
c21jLWh1cm9ucml2ZXIA
</data>
<key>platform</key>
<data>
ajUyAAAAAAA=
</data>
</dict>
</dict>
<key>_STA</key>
<integer>11</integer>
<key>name</key>
<data>
QVBQMDAwMQA=
</data>
</dict>
</dict>
<key>LSMinimumSystemVersion</key>
<string>10.6</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2017 vit9696. All rights reserved.</string>
<key>OSBundleCompatibleVersion</key>
<string>1.0</string>
<key>OSBundleLibraries</key>
<dict>
<key>as.vit9696.Lilu</key>
<string>1.2.0</string>
<key>com.apple.iokit.IOACPIFamily</key>
<string>1.0.0d1</string>
<key>com.apple.kpi.bsd</key>
<string>10.0.0</string>
<key>com.apple.kpi.dsep</key>
<string>10.0.0</string>
<key>com.apple.kpi.iokit</key>
<string>10.0.0</string>
<key>com.apple.kpi.libkern</key>
<string>10.0.0</string>
<key>com.apple.kpi.mach</key>
<string>10.0.0</string>
<key>com.apple.kpi.unsupported</key>
<string>10.0.0</string>
</dict>
<key>OSBundleRequired</key>
<string>Root</string>
</dict>
</plist>

View file

@ -0,0 +1,115 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict/>
<key>files2</key>
<dict/>
<key>rules</key>
<dict>
<key>^Resources/</key>
<true/>
<key>^Resources/.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^Resources/.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Resources/Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/</key>
<dict>
<key>nested</key>
<true/>
<key>weight</key>
<real>10</real>
</dict>
<key>^.*</key>
<true/>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^Resources/</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^Resources/.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^Resources/.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Resources/Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^[^/]+$</key>
<dict>
<key>nested</key>
<true/>
<key>weight</key>
<real>10</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>

View file

@ -0,0 +1,149 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>BuildMachineOSBuild</key>
<string>15G31</string>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>VoodooHDA</string>
<key>CFBundleIdentifier</key>
<string>org.voodoo.driver.VoodooHDA</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>VoodooHDA</string>
<key>CFBundlePackageType</key>
<string>KEXT</string>
<key>CFBundleShortVersionString</key>
<string>2.9.2</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleSupportedPlatforms</key>
<array>
<string>MacOSX</string>
</array>
<key>CFBundleVersion</key>
<string>2.9.2</string>
<key>DTCompiler</key>
<string>com.apple.compilers.llvm.clang.1_0</string>
<key>DTPlatformBuild</key>
<string>7D1014</string>
<key>DTPlatformVersion</key>
<string>GM</string>
<key>DTSDKBuild</key>
<string>15E60</string>
<key>DTSDKName</key>
<string>macosx10.11</string>
<key>DTXcode</key>
<string>0731</string>
<key>DTXcodeBuild</key>
<string>7D1014</string>
<key>IOKitPersonalities</key>
<dict>
<key>VoodooHDA</key>
<dict>
<key>AllowMSI</key>
<true/>
<key>Boost</key>
<integer>1</integer>
<key>CFBundleIdentifier</key>
<string>org.voodoo.driver.VoodooHDA</string>
<key>DisableInputMonitor</key>
<true/>
<key>IOClass</key>
<string>VoodooHDADevice</string>
<key>IOMatchCategory</key>
<string>VoodooHDADevice</string>
<key>IOPCIClassMatch</key>
<string>0x04020000&amp;0xfffe0000</string>
<key>IOProviderClass</key>
<string>IOPCIDevice</string>
<key>IOUserClientClass</key>
<string>VoodooHDAUserClient</string>
<key>InhibitCache</key>
<false/>
<key>MixerValues</key>
<dict>
<key>PCM</key>
<integer>100</integer>
<key>Rec</key>
<integer>90</integer>
<key>iGain</key>
<integer>90</integer>
<key>iMix</key>
<integer>100</integer>
</dict>
<key>NodesToPatch</key>
<array>
<dict>
<key>Caps</key>
<string>0x373e</string>
<key>Codec</key>
<integer>4</integer>
<key>Comment</key>
<string>Example of possible values</string>
<key>Config</key>
<string>0x90a70120</string>
<key>Conns</key>
<string>12,13,24</string>
<key>Control</key>
<string>20</string>
<key>DAC</key>
<string>2</string>
<key>Enable</key>
<string>1</string>
<key>Node</key>
<integer>12</integer>
<key>Select</key>
<string>13</string>
<key>SwitchCh</key>
<string>0</string>
<key>Type</key>
<string>4</string>
</dict>
<dict>
<key>Codec</key>
<integer>2</integer>
<key>Comment</key>
<string>To disable back sound on ALC codec set enable=0</string>
<key>Enable</key>
<string>1</string>
<key>Node</key>
<integer>11</integer>
</dict>
</array>
<key>Noise</key>
<integer>0</integer>
<key>Vectorize</key>
<true/>
<key>VoodooHDAEnableHalfMicVolumeFix</key>
<false/>
<key>VoodooHDAEnableHalfVolumeFix</key>
<false/>
<key>VoodooHDAEnableMuteFix</key>
<false/>
<key>VoodooHDAEnableVolumeChangeFix</key>
<false/>
<key>VoodooHDAVerboseLevel</key>
<integer>0</integer>
</dict>
</dict>
<key>OSBundleLibraries</key>
<dict>
<key>com.apple.iokit.IOAudioFamily</key>
<string>1.1fc9</string>
<key>com.apple.iokit.IOPCIFamily</key>
<string>2.1</string>
<key>com.apple.kpi.iokit</key>
<string>9.0.0</string>
<key>com.apple.kpi.libkern</key>
<string>9.0.0</string>
<key>com.apple.kpi.mach</key>
<string>9.0.0</string>
<key>com.apple.kpi.unsupported</key>
<string>9.0.0</string>
</dict>
</dict>
</plist>

View file

@ -0,0 +1,105 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict/>
<key>files2</key>
<dict/>
<key>rules</key>
<dict>
<key>^Resources/</key>
<true/>
<key>^Resources/.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^Resources/.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/</key>
<dict>
<key>nested</key>
<true/>
<key>weight</key>
<real>10</real>
</dict>
<key>^.*</key>
<true/>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^Resources/</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^Resources/.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^Resources/.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^[^/]+$</key>
<dict>
<key>nested</key>
<true/>
<key>weight</key>
<real>10</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>

View file

@ -0,0 +1,106 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>BuildMachineOSBuild</key>
<string>19H2</string>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>WhateverGreen</string>
<key>CFBundleIdentifier</key>
<string>as.vit9696.WhateverGreen</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>WhateverGreen</string>
<key>CFBundlePackageType</key>
<string>KEXT</string>
<key>CFBundleShortVersionString</key>
<string>1.4.4</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleSupportedPlatforms</key>
<array>
<string>MacOSX</string>
</array>
<key>CFBundleVersion</key>
<string>1.4.4</string>
<key>DTCompiler</key>
<string>com.apple.compilers.llvm.clang.1_0</string>
<key>DTPlatformBuild</key>
<string>12A7209</string>
<key>DTPlatformName</key>
<string>macosx</string>
<key>DTPlatformVersion</key>
<string>10.15.6</string>
<key>DTSDKBuild</key>
<string>19G68</string>
<key>DTSDKName</key>
<string>macosx10.15</string>
<key>DTXcode</key>
<string>1200</string>
<key>DTXcodeBuild</key>
<string>12A7209</string>
<key>IOKitPersonalities</key>
<dict>
<key>NVHDAEnabler</key>
<dict>
<key>CFBundleIdentifier</key>
<string>as.vit9696.WhateverGreen</string>
<key>IOClass</key>
<string>NVHDAEnabler</string>
<key>IOMatchCategory</key>
<string>IOFramebuffer</string>
<key>IOPCIClassMatch</key>
<string>0x03000000&amp;0xff000000</string>
<key>IOPCIMatch</key>
<string>0x000010de&amp;0x0000ffff</string>
<key>IOProbeScore</key>
<integer>300000</integer>
<key>IOProviderClass</key>
<string>IOPCIDevice</string>
</dict>
<key>as.vit9696.WhateverGreen</key>
<dict>
<key>CFBundleIdentifier</key>
<string>as.vit9696.WhateverGreen</string>
<key>IOClass</key>
<string>WhateverGreen</string>
<key>IOMatchCategory</key>
<string>WhateverGreen</string>
<key>IOProviderClass</key>
<string>IOResources</string>
<key>IOResourceMatch</key>
<string>IOKit</string>
</dict>
</dict>
<key>LSMinimumSystemVersion</key>
<string>10.8</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright © 2018 vit9696. All rights reserved.</string>
<key>OSBundleCompatibleVersion</key>
<string>1.0</string>
<key>OSBundleLibraries</key>
<dict>
<key>as.vit9696.Lilu</key>
<string>1.2.0</string>
<key>com.apple.iokit.IOPCIFamily</key>
<string>1.0.0b1</string>
<key>com.apple.kpi.bsd</key>
<string>12.0.0</string>
<key>com.apple.kpi.dsep</key>
<string>12.0.0</string>
<key>com.apple.kpi.iokit</key>
<string>12.0.0</string>
<key>com.apple.kpi.libkern</key>
<string>12.0.0</string>
<key>com.apple.kpi.mach</key>
<string>12.0.0</string>
<key>com.apple.kpi.unsupported</key>
<string>12.0.0</string>
</dict>
<key>OSBundleRequired</key>
<string>Root</string>
</dict>
</plist>

View file

@ -0,0 +1,115 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict/>
<key>files2</key>
<dict/>
<key>rules</key>
<dict>
<key>^Resources/</key>
<true/>
<key>^Resources/.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^Resources/.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Resources/Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/</key>
<dict>
<key>nested</key>
<true/>
<key>weight</key>
<real>10</real>
</dict>
<key>^.*</key>
<true/>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^Resources/</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^Resources/.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^Resources/.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Resources/Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^[^/]+$</key>
<dict>
<key>nested</key>
<true/>
<key>weight</key>
<real>10</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>

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.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,50 @@
### Notes
Catalina installs the same way as Mojave.
Tested with macOS Catalina 10.15.7 with OpenCore-0.6.7-RELEASE.zip release
(March, 2021).
Note: Our `config.plist` is buggy and we need to fix it!
Note: Use `create_iso_catalina.sh` for generating a macOS Catalina based "ISO"
(actually DMG) image.
Attention: Use 64-bit Ubuntu 20.04 LTS as the host OS for "best" results.
Guestfish output results may vary across platforms.
```
git submodule init && git submodule update
cp -a ../resources/OcBinaryData/Resources EFI/OC/Resources # symlink hacks don't work
# Normal OpenCore Image
rm -f OpenCore.qcow2; sudo ./opencore-image-ng.sh --cfg config.plist --img OpenCore.qcow2
# OpenCore w/ ShowPicker Disabled
rm -f OpenCore-nopicker.qcow2; sudo ./opencore-image-ng.sh --cfg config-nopicker.plist --img OpenCore-nopicker.qcow2
# Passthrough Optimized OpenCore
rm -f OpenCore-Passthrough.qcow2; sudo ./opencore-image-ng.sh --cfg config-pt.plist --img OpenCore-Passthrough.qcow2
```
Note: https://github.com/thenickdude/KVM-Opencore is one of the best resources
for customizing `OpenCore.qcow2`. Thanks Nick! :)
### Links
* https://github.com/acidanthera/OpenCorePkg/releases
* https://github.com/williambj1/OpenCore-Factory/releases
* https://opencore.slowgeek.com/ (neat!)
* https://github.com/chris1111/USB-3.0-NEC/releases (thanks Chris!)
* https://github.com/khronokernel/Opencore-Vanilla-Desktop-Guide/blob/master/clover-conversion/clover-efi.md
* https://insanelymacdiscord.github.io/Getting-Started-With-OpenCore/
* https://dortania.github.io/Anti-Hackintosh-Buyers-Guide/
* https://dortania.github.io/OpenCore-Desktop-Guide/troubleshooting/debug.html

View file

@ -0,0 +1,883 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>ACPI</key>
<dict>
<key>Add</key>
<array>
<dict>
<key>Comment</key>
<string>add DTGP method</string>
<key>Enabled</key>
<true/>
<key>Path</key>
<string>SSDT-DTGP.aml</string>
</dict>
<dict>
<key>Comment</key>
<string>Fake EC and USBX Power</string>
<key>Enabled</key>
<true/>
<key>Path</key>
<string>SSDT-EC.aml</string>
</dict>
<dict>
<key>Comment</key>
<string>USB 2.0 Injection</string>
<key>Enabled</key>
<true/>
<key>Path</key>
<string>SSDT-EHCI.aml</string>
</dict>
<dict>
<key>Comment</key>
<string>CPU AGPM Plugin=1</string>
<key>Enabled</key>
<true/>
<key>Path</key>
<string>SSDT-PLUG.aml</string>
</dict>
</array>
<key>Delete</key>
<array>
<dict>
<key>All</key>
<false/>
<key>Comment</key>
<string>Delete CpuPm</string>
<key>Enabled</key>
<false/>
<key>OemTableId</key>
<data>Q3B1UG0AAAA=</data>
<key>TableLength</key>
<integer>0</integer>
<key>TableSignature</key>
<data>U1NEVA==</data>
</dict>
<dict>
<key>All</key>
<false/>
<key>Comment</key>
<string>Delete Cpu0Ist</string>
<key>Enabled</key>
<false/>
<key>OemTableId</key>
<data>Q3B1MElzdAA=</data>
<key>TableLength</key>
<integer>0</integer>
<key>TableSignature</key>
<data>U1NEVA==</data>
</dict>
</array>
<key>Patch</key>
<array>
<dict>
<key>Comment</key>
<string>_Q11 to XQ11</string>
<key>Count</key>
<integer>1</integer>
<key>Enabled</key>
<false/>
<key>Find</key>
<data>X1ExMQ==</data>
<key>Limit</key>
<integer>0</integer>
<key>Mask</key>
<data></data>
<key>OemTableId</key>
<data></data>
<key>Replace</key>
<data>WFExMQ==</data>
<key>ReplaceMask</key>
<data></data>
<key>Skip</key>
<integer>0</integer>
<key>TableLength</key>
<integer>0</integer>
<key>TableSignature</key>
<data></data>
</dict>
<dict>
<key>Comment</key>
<string>_Q12 to XQ12</string>
<key>Count</key>
<integer>1</integer>
<key>Enabled</key>
<false/>
<key>Find</key>
<data>X1ExMg==</data>
<key>Limit</key>
<integer>0</integer>
<key>Mask</key>
<data></data>
<key>OemTableId</key>
<data></data>
<key>Replace</key>
<data>WFExMg==</data>
<key>ReplaceMask</key>
<data></data>
<key>Skip</key>
<integer>0</integer>
<key>TableLength</key>
<integer>0</integer>
<key>TableSignature</key>
<data></data>
</dict>
</array>
<key>Quirks</key>
<dict>
<key>FadtEnableReset</key>
<false/>
<key>NormalizeHeaders</key>
<false/>
<key>RebaseRegions</key>
<false/>
<key>ResetHwSig</key>
<false/>
<key>ResetLogoStatus</key>
<false/>
</dict>
</dict>
<key>Booter</key>
<dict>
<key>MmioWhitelist</key>
<array/>
<key>Quirks</key>
<dict>
<key>AvoidRuntimeDefrag</key>
<true/>
<key>DevirtualiseMmio</key>
<false/>
<key>DisableSingleUser</key>
<false/>
<key>DisableVariableWrite</key>
<false/>
<key>DiscardHibernateMap</key>
<false/>
<key>EnableSafeModeSlide</key>
<true/>
<key>EnableWriteUnprotector</key>
<true/>
<key>ForceExitBootServices</key>
<false/>
<key>ProtectMemoryRegions</key>
<false/>
<key>ProtectSecureBoot</key>
<false/>
<key>ProtectUefiServices</key>
<false/>
<key>ProvideCustomSlide</key>
<true/>
<key>ProvideMaxSlide</key>
<integer>0</integer>
<key>RebuildAppleMemoryMap</key>
<false/>
<key>SetupVirtualMap</key>
<false/>
<key>SignalAppleOS</key>
<false/>
<key>SyncRuntimePermissions</key>
<false/>
</dict>
</dict>
<key>DeviceProperties</key>
<dict>
<key>Add</key>
<dict>
<key>PciRoot(0x1)/Pci(0x1F,0x0)</key>
<dict>
<key>compatible</key>
<string>pci8086,2916</string>
<key>device-id</key>
<data>
FikA
</data>
<key>name</key>
<string>pci8086,2916</string>
</dict>
</dict>
<key>Delete</key>
<dict>
<key>PciRoot(0x0)/Pci(0x1b,0x0)</key>
<array>
<string>MaximumBootBeepVolume</string>
</array>
</dict>
</dict>
<key>Kernel</key>
<dict>
<key>Add</key>
<array>
<dict>
<key>Arch</key>
<string>Any</string>
<key>BundlePath</key>
<string>VoodooHDA.kext</string>
<key>Comment</key>
<string></string>
<key>Enabled</key>
<true/>
<key>ExecutablePath</key>
<string>Contents/MacOS/VoodooHDA</string>
<key>MaxKernel</key>
<string></string>
<key>MinKernel</key>
<string></string>
<key>PlistPath</key>
<string>Contents/Info.plist</string>
</dict>
<dict>
<key>Arch</key>
<string>x86_64</string>
<key>BundlePath</key>
<string>Lilu.kext</string>
<key>Comment</key>
<string>Patch engine</string>
<key>Enabled</key>
<true/>
<key>ExecutablePath</key>
<string>Contents/MacOS/Lilu</string>
<key>MaxKernel</key>
<string></string>
<key>MinKernel</key>
<string>12.0.0</string>
<key>PlistPath</key>
<string>Contents/Info.plist</string>
</dict>
<dict>
<key>Arch</key>
<string>x86_64</string>
<key>BundlePath</key>
<string>VirtualSMC.kext</string>
<key>Comment</key>
<string>SMC emulator</string>
<key>Enabled</key>
<false/>
<key>ExecutablePath</key>
<string>Contents/MacOS/VirtualSMC</string>
<key>MaxKernel</key>
<string></string>
<key>MinKernel</key>
<string>12.0.0</string>
<key>PlistPath</key>
<string>Contents/Info.plist</string>
</dict>
<dict>
<key>Arch</key>
<string>x86_64</string>
<key>BundlePath</key>
<string>WhateverGreen.kext</string>
<key>Comment</key>
<string>Video patches</string>
<key>Enabled</key>
<true/>
<key>ExecutablePath</key>
<string>Contents/MacOS/WhateverGreen</string>
<key>MaxKernel</key>
<string></string>
<key>MinKernel</key>
<string>12.0.0</string>
<key>PlistPath</key>
<string>Contents/Info.plist</string>
</dict>
<dict>
<key>BundlePath</key>
<string>AGPMInjector.kext</string>
<key>Comment</key>
<string></string>
<key>Enabled</key>
<true/>
<key>ExecutablePath</key>
<string></string>
<key>MaxKernel</key>
<string></string>
<key>MinKernel</key>
<string></string>
<key>PlistPath</key>
<string>Contents/Info.plist</string>
</dict>
<dict>
<key>BundlePath</key>
<string>USBPorts.kext</string>
<key>Comment</key>
<string></string>
<key>Enabled</key>
<true/>
<key>ExecutablePath</key>
<string></string>
<key>MaxKernel</key>
<string></string>
<key>MinKernel</key>
<string></string>
<key>PlistPath</key>
<string>Contents/Info.plist</string>
</dict>
<dict>
<key>Arch</key>
<string>x86_64</string>
<key>BundlePath</key>
<string>MCEReporterDisabler.kext</string>
<key>Comment</key>
<string>AppleMCEReporter disabler</string>
<key>Enabled</key>
<true/>
<key>ExecutablePath</key>
<string></string>
<key>MaxKernel</key>
<string></string>
<key>MinKernel</key>
<string>19.0.0</string>
<key>PlistPath</key>
<string>Contents/Info.plist</string>
</dict>
</array>
<key>Block</key>
<array>
<dict>
<key>Arch</key>
<string>Any</string>
<key>Comment</key>
<string></string>
<key>Enabled</key>
<false/>
<key>Identifier</key>
<string>com.apple.driver.AppleTyMCEDriver</string>
<key>MaxKernel</key>
<string></string>
<key>MinKernel</key>
<string></string>
</dict>
</array>
<key>Emulate</key>
<dict>
<key>Cpuid1Data</key>
<data>
VAYFAAAAAAAAAAAAAAAAAA==
</data>
<key>Cpuid1Mask</key>
<data>
////AAAAAAAAAAAAAAAAAA==
</data>
</dict>
<key>Force</key>
<array>
<dict>
<key>Arch</key>
<string>Any</string>
<key>BundlePath</key>
<string>System/Library/Extensions/IONetworkingFamily.kext</string>
<key>Comment</key>
<string>Patch engine</string>
<key>Enabled</key>
<false/>
<key>Identifier</key>
<string>com.apple.iokit.IONetworkingFamily</string>
<key>ExecutablePath</key>
<string>Contents/MacOS/IONetworkingFamily</string>
<key>MaxKernel</key>
<string>13.99.99</string>
<key>MinKernel</key>
<string></string>
<key>PlistPath</key>
<string>Contents/Info.plist</string>
</dict>
</array>
<key>Patch</key>
<array>
<dict>
<key>Base</key>
<string>_cpu_topology_sort</string>
<key>Comment</key>
<string>algrey - cpu_topology_sort -disable _x86_validate_topology</string>
<key>Count</key>
<integer>1</integer>
<key>Enabled</key>
<true/>
<key>Find</key>
<data>
6AAA//8=
</data>
<key>Identifier</key>
<string>kernel</string>
<key>Limit</key>
<integer>0</integer>
<key>Mask</key>
<data>
/wAA//8=
</data>
<key>MaxKernel</key>
<string>20.99.99</string>
<key>MinKernel</key>
<string>17.0.0</string>
<key>Replace</key>
<data>
Dx9EAAA=
</data>
<key>ReplaceMask</key>
<data>
</data>
<key>Skip</key>
<integer>0</integer>
</dict>
<dict>
<key>Base</key>
<string></string>
<key>Comment</key>
<string>algrey - cpuid_set_cpufamily - force CPUFAMILY_INTEL_PENRYN</string>
<key>Count</key>
<integer>1</integer>
<key>Enabled</key>
<true/>
<key>Find</key>
<data>
MduAPQAAAAAGdQA=
</data>
<key>Identifier</key>
<string>kernel</string>
<key>Limit</key>
<integer>0</integer>
<key>Mask</key>
<data>
/////wAAAP///wA=
</data>
<key>MaxKernel</key>
<string>20.99.99</string>
<key>MinKernel</key>
<string>17.0.0</string>
<key>Replace</key>
<data>
u7xP6njpXQAAAJA=
</data>
<key>ReplaceMask</key>
<data>
</data>
<key>Skip</key>
<integer>0</integer>
</dict>
</array>
<key>Quirks</key>
<dict>
<key>AppleCpuPmCfgLock</key>
<false/>
<key>AppleXcpmCfgLock</key>
<false/>
<key>AppleXcpmExtraMsrs</key>
<false/>
<key>AppleXcpmForceBoost</key>
<false/>
<key>CustomSMBIOSGuid</key>
<false/>
<key>DisableIoMapper</key>
<false/>
<key>DisableLinkeditJettison</key>
<true/>
<key>DisableRtcChecksum</key>
<false/>
<key>DummyPowerManagement</key>
<true/>
<key>ExternalDiskIcons</key>
<false/>
<key>IncreasePciBarSize</key>
<false/>
<key>LapicKernelPanic</key>
<false/>
<key>PanicNoKextDump</key>
<false/>
<key>PowerTimeoutKernelPanic</key>
<false/>
<key>ThirdPartyDrives</key>
<false/>
<key>XhciPortLimit</key>
<false/>
</dict>
<key>Scheme</key>
<dict>
<key>FuzzyMatch</key>
<true/>
<key>KernelArch</key>
<string>x86_64</string>
<key>KernelCache</key>
<string>Auto</string>
</dict>
</dict>
<key>Misc</key>
<dict>
<key>BlessOverride</key>
<array/>
<key>Boot</key>
<dict>
<key>ConsoleAttributes</key>
<integer>0</integer>
<key>HibernateMode</key>
<string>Auto</string>
<key>HideAuxiliary</key>
<false/>
<key>PickerAttributes</key>
<integer>1</integer>
<key>PickerAudioAssist</key>
<false/>
<key>PickerMode</key>
<string>External</string>
<key>PollAppleHotKeys</key>
<true/>
<key>ShowPicker</key>
<false/>
<key>TakeoffDelay</key>
<integer>0</integer>
<key>Timeout</key>
<integer>0</integer>
</dict>
<key>Debug</key>
<dict>
<key>AppleDebug</key>
<false/>
<key>ApplePanic</key>
<false/>
<key>DisableWatchDog</key>
<false/>
<key>DisplayDelay</key>
<integer>0</integer>
<key>DisplayLevel</key>
<integer>2147483650</integer>
<key>SerialInit</key>
<false/>
<key>SysReport</key>
<false/>
<key>Target</key>
<integer>3</integer>
</dict>
<key>Entries</key>
<array/>
<key>Security</key>
<dict>
<key>AllowNvramReset</key>
<true/>
<key>AllowSetDefault</key>
<false/>
<key>ApECID</key>
<integer>0</integer>
<key>AuthRestart</key>
<false/>
<key>BootProtect</key>
<string>None</string>
<key>DmgLoading</key>
<string>Signed</string>
<key>EnablePassword</key>
<false/>
<key>ExposeSensitiveData</key>
<integer>6</integer>
<key>HaltLevel</key>
<integer>2147483648</integer>
<key>PasswordHash</key>
<data></data>
<key>PasswordSalt</key>
<data></data>
<key>ScanPolicy</key>
<integer>0</integer>
<key>SecureBootModel</key>
<string>Disabled</string>
<key>Vault</key>
<string>Optional</string>
</dict>
<key>Tools</key>
<array>
<dict>
<key>Arguments</key>
<string></string>
<key>Auxiliary</key>
<false/>
<key>Comment</key>
<string>Not signed for security reasons</string>
<key>Enabled</key>
<true/>
<key>Name</key>
<string>UEFI Shell</string>
<key>Path</key>
<string>OpenShell.efi</string>
</dict>
<dict>
<key>Arguments</key>
<string>Shutdown</string>
<key>Auxiliary</key>
<true/>
<key>Comment</key>
<string>Perform shutdown</string>
<key>Enabled</key>
<true/>
<key>Name</key>
<string>Shutdown</string>
<key>Path</key>
<string>ResetSystem.efi</string>
</dict>
</array>
</dict>
<key>NVRAM</key>
<dict>
<key>Add</key>
<dict>
<key>4D1EDE05-38C7-4A6A-9CC6-4BCCA8B38C14</key>
<dict>
<key>DefaultBackgroundColor</key>
<data>AAAAAA==</data>
<key>UIScale</key>
<data>AQ==</data>
</dict>
<key>4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102</key>
<dict>
<key>rtc-blacklist</key>
<data></data>
</dict>
<key>7C436110-AB2A-4BBB-A880-FE41995C9F82</key>
<dict>
<key>SystemAudioVolume</key>
<data>Rg==</data>
<key>boot-args</key>
<string>-v keepsyms=1 tlbto_us=0 vti=9</string>
<key>run-efi-updater</key>
<string>No</string>
<key>csr-active-config</key>
<data>ZwAAAA==</data>
<key>prev-lang:kbd</key>
<data>ZW4tVVM6MA==</data>
</dict>
</dict>
<key>Delete</key>
<dict>
<key>4D1EDE05-38C7-4A6A-9CC6-4BCCA8B38C14</key>
<array>
<string>UIScale</string>
<string>DefaultBackgroundColor</string>
</array>
<key>4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102</key>
<array>
<string>rtc-blacklist</string>
</array>
<key>7C436110-AB2A-4BBB-A880-FE41995C9F82</key>
<array>
<string>boot-args</string>
</array>
</dict>
<key>LegacyEnable</key>
<false/>
<key>LegacyOverwrite</key>
<false/>
<key>LegacySchema</key>
<dict>
<key>7C436110-AB2A-4BBB-A880-FE41995C9F82</key>
<array>
<string>EFILoginHiDPI</string>
<string>EFIBluetoothDelay</string>
<string>LocationServicesEnabled</string>
<string>SystemAudioVolume</string>
<string>SystemAudioVolumeDB</string>
<string>SystemAudioVolumeSaved</string>
<string>bluetoothActiveControllerInfo</string>
<string>bluetoothInternalControllerInfo</string>
<string>flagstate</string>
<string>fmm-computer-name</string>
<string>nvda_drv</string>
<string>prev-lang:kbd</string>
</array>
<key>8BE4DF61-93CA-11D2-AA0D-00E098032B8C</key>
<array>
<string>Boot0080</string>
<string>Boot0081</string>
<string>Boot0082</string>
<string>BootNext</string>
<string>BootOrder</string>
</array>
</dict>
<key>WriteFlash</key>
<true/>
</dict>
<key>PlatformInfo</key>
<dict>
<key>Automatic</key>
<true/>
<key>Generic</key>
<dict>
<key>AdviseWindows</key>
<false/>
<key>MLB</key>
<string>C02717306J9JG361M</string>
<key>ROM</key>
<data>
m7zhIYfl
</data>
<key>SpoofVendor</key>
<true/>
<key>SystemProductName</key>
<string>iMacPro1,1</string>
<key>SystemSerialNumber</key>
<string>C02TM2ZBHX87</string>
<key>SystemUUID</key>
<string>007076A6-F2A2-4461-BBE5-BAD019F8025A</string>
</dict>
<key>UpdateDataHub</key>
<true/>
<key>UpdateNVRAM</key>
<true/>
<key>UpdateSMBIOS</key>
<true/>
<key>UpdateSMBIOSMode</key>
<string>Create</string>
</dict>
<key>UEFI</key>
<dict>
<key>APFS</key>
<dict>
<key>EnableJumpstart</key>
<true/>
<key>GlobalConnect</key>
<false/>
<key>HideVerbose</key>
<false/>
<key>JumpstartHotPlug</key>
<true/>
<key>MinDate</key>
<integer>0</integer>
<key>MinVersion</key>
<integer>0</integer>
</dict>
<key>Audio</key>
<dict>
<key>AudioCodec</key>
<integer>0</integer>
<key>AudioDevice</key>
<string>PciRoot(0x1)/Pci(0x1,0x0)/Pci(0x0,0x1)</string>
<key>AudioOut</key>
<integer>0</integer>
<key>AudioSupport</key>
<false/>
<key>MinimumVolume</key>
<integer>20</integer>
<key>PlayChime</key>
<false/>
<key>VolumeAmplifier</key>
<integer>0</integer>
</dict>
<key>ConnectDrivers</key>
<true/>
<key>Drivers</key>
<array>
<string>VBoxHfs.efi</string>
<string>OpenRuntime.efi</string>
<string>OpenCanopy.efi</string>
<string>#AudioDxe.efi</string>
<string>#OpenUsbKbDxe.efi</string>
<string>#UsbMouseDxe.efi</string>
<string>#Ps2KeyboardDxe.efi</string>
<string>#Ps2MouseDxe.efi</string>
<string>#HiiDatabase.efi</string>
<string>#NvmExpressDxe.efi</string>
<string>#XhciDxe.efi</string>
<string>#ExFatDxe.efi</string>
<string>#PartitionDxe.efi</string>
<string>#CrScreenshotDxe.efi</string>
</array>
<key>Input</key>
<dict>
<key>KeyFiltering</key>
<false/>
<key>KeyForgetThreshold</key>
<integer>5</integer>
<key>KeyMergeThreshold</key>
<integer>2</integer>
<key>KeySupport</key>
<true/>
<key>KeySupportMode</key>
<string>Auto</string>
<key>KeySwap</key>
<false/>
<key>PointerSupport</key>
<false/>
<key>PointerSupportMode</key>
<string>ASUS</string>
<key>TimerResolution</key>
<integer>50000</integer>
</dict>
<key>Output</key>
<dict>
<key>ClearScreenOnModeSwitch</key>
<false/>
<key>ConsoleMode</key>
<string></string>
<key>DirectGopRendering</key>
<false/>
<key>IgnoreTextInGraphics</key>
<false/>
<key>ProvideConsoleGop</key>
<true/>
<key>ReconnectOnResChange</key>
<false/>
<key>ReplaceTabWithSpace</key>
<false/>
<key>Resolution</key>
<string>1920x1080@32</string>
<key>SanitiseClearScreen</key>
<false/>
<key>TextRenderer</key>
<string>BuiltinGraphics</string>
<key>UgaPassThrough</key>
<false/>
</dict>
<key>ProtocolOverrides</key>
<dict>
<key>AppleAudio</key>
<false/>
<key>AppleBootPolicy</key>
<false/>
<key>AppleDebugLog</key>
<false/>
<key>AppleEvent</key>
<false/>
<key>AppleFramebufferInfo</key>
<false/>
<key>AppleImageConversion</key>
<false/>
<key>AppleImg4Verification</key>
<false/>
<key>AppleKeyMap</key>
<false/>
<key>AppleRtcRam</key>
<false/>
<key>AppleSecureBoot</key>
<false/>
<key>AppleSmcIo</key>
<false/>
<key>AppleUserInterfaceTheme</key>
<false/>
<key>DataHub</key>
<false/>
<key>DeviceProperties</key>
<false/>
<key>FirmwareVolume</key>
<false/>
<key>HashServices</key>
<false/>
<key>OSInfo</key>
<false/>
<key>UnicodeCollation</key>
<false/>
</dict>
<key>Quirks</key>
<dict>
<key>ExitBootServicesDelay</key>
<integer>0</integer>
<key>IgnoreInvalidFlexRatio</key>
<false/>
<key>ReleaseUsbOwnership</key>
<false/>
<key>RequestBootVarRouting</key>
<true/>
<key>TscSyncTimeout</key>
<integer>0</integer>
<key>UnblockFsConnect</key>
<true/>
<key>ConnectDrivers</key>
<true/>
</dict>
</dict>
</dict>
</plist>

View file

@ -0,0 +1,886 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>ACPI</key>
<dict>
<key>Add</key>
<array>
<dict>
<key>Comment</key>
<string>add DTGP method</string>
<key>Enabled</key>
<true/>
<key>Path</key>
<string>SSDT-DTGP.aml</string>
</dict>
<dict>
<key>Comment</key>
<string>Fake EC and USBX Power</string>
<key>Enabled</key>
<true/>
<key>Path</key>
<string>SSDT-EC.aml</string>
</dict>
<dict>
<key>Comment</key>
<string>USB 2.0 Injection</string>
<key>Enabled</key>
<true/>
<key>Path</key>
<string>SSDT-EHCI.aml</string>
</dict>
<dict>
<key>Comment</key>
<string>CPU AGPM Plugin=1</string>
<key>Enabled</key>
<true/>
<key>Path</key>
<string>SSDT-PLUG.aml</string>
</dict>
</array>
<key>Delete</key>
<array>
<dict>
<key>All</key>
<false/>
<key>Comment</key>
<string>Delete CpuPm</string>
<key>Enabled</key>
<false/>
<key>OemTableId</key>
<data>Q3B1UG0AAAA=</data>
<key>TableLength</key>
<integer>0</integer>
<key>TableSignature</key>
<data>U1NEVA==</data>
</dict>
<dict>
<key>All</key>
<false/>
<key>Comment</key>
<string>Delete Cpu0Ist</string>
<key>Enabled</key>
<false/>
<key>OemTableId</key>
<data>Q3B1MElzdAA=</data>
<key>TableLength</key>
<integer>0</integer>
<key>TableSignature</key>
<data>U1NEVA==</data>
</dict>
</array>
<key>Patch</key>
<array>
<dict>
<key>Comment</key>
<string>_Q11 to XQ11</string>
<key>Count</key>
<integer>1</integer>
<key>Enabled</key>
<false/>
<key>Find</key>
<data>X1ExMQ==</data>
<key>Limit</key>
<integer>0</integer>
<key>Mask</key>
<data></data>
<key>OemTableId</key>
<data></data>
<key>Replace</key>
<data>WFExMQ==</data>
<key>ReplaceMask</key>
<data></data>
<key>Skip</key>
<integer>0</integer>
<key>TableLength</key>
<integer>0</integer>
<key>TableSignature</key>
<data></data>
</dict>
<dict>
<key>Comment</key>
<string>_Q12 to XQ12</string>
<key>Count</key>
<integer>1</integer>
<key>Enabled</key>
<false/>
<key>Find</key>
<data>X1ExMg==</data>
<key>Limit</key>
<integer>0</integer>
<key>Mask</key>
<data></data>
<key>OemTableId</key>
<data></data>
<key>Replace</key>
<data>WFExMg==</data>
<key>ReplaceMask</key>
<data></data>
<key>Skip</key>
<integer>0</integer>
<key>TableLength</key>
<integer>0</integer>
<key>TableSignature</key>
<data></data>
</dict>
</array>
<key>Quirks</key>
<dict>
<key>FadtEnableReset</key>
<false/>
<key>NormalizeHeaders</key>
<false/>
<key>RebaseRegions</key>
<false/>
<key>ResetHwSig</key>
<false/>
<key>ResetLogoStatus</key>
<false/>
</dict>
</dict>
<key>Booter</key>
<dict>
<key>MmioWhitelist</key>
<array/>
<key>Quirks</key>
<dict>
<key>AvoidRuntimeDefrag</key>
<true/>
<key>DevirtualiseMmio</key>
<false/>
<key>DisableSingleUser</key>
<false/>
<key>DisableVariableWrite</key>
<false/>
<key>DiscardHibernateMap</key>
<false/>
<key>EnableSafeModeSlide</key>
<true/>
<key>EnableWriteUnprotector</key>
<true/>
<key>ForceExitBootServices</key>
<false/>
<key>ProtectMemoryRegions</key>
<false/>
<key>ProtectSecureBoot</key>
<false/>
<key>ProtectUefiServices</key>
<false/>
<key>ProvideCustomSlide</key>
<true/>
<key>ProvideMaxSlide</key>
<integer>0</integer>
<key>RebuildAppleMemoryMap</key>
<false/>
<key>SetupVirtualMap</key>
<false/>
<key>SignalAppleOS</key>
<false/>
<key>SyncRuntimePermissions</key>
<false/>
</dict>
</dict>
<key>DeviceProperties</key>
<dict>
<key>Add</key>
<dict>
<key>PciRoot(0x1)/Pci(0x1F,0x0)</key>
<dict>
<key>compatible</key>
<string>pci8086,2916</string>
<key>device-id</key>
<data>
FikA
</data>
<key>name</key>
<string>pci8086,2916</string>
</dict>
</dict>
<key>Delete</key>
<dict>
<key>PciRoot(0x0)/Pci(0x1b,0x0)</key>
<array>
<string>MaximumBootBeepVolume</string>
</array>
</dict>
</dict>
<key>Kernel</key>
<dict>
<key>Add</key>
<array>
<dict>
<key>BundlePath</key>
<string>mXHCD.kext</string>
<key>Comment</key>
<string>Hello There</string>
<key>Enabled</key>
<true/>
<key>ExecutablePath</key>
<string>Contents/MacOS/mXHCD</string>
<key>MaxKernel</key>
<string></string>
<key>MinKernel</key>
<string></string>
<key>PlistPath</key>
<string>Contents/Info.plist</string>
</dict>
<dict>
<key>BundlePath</key>
<string>Lilu.kext</string>
<key>Comment</key>
<string>Patch engine</string>
<key>Enabled</key>
<true/>
<key>ExecutablePath</key>
<string>Contents/MacOS/Lilu</string>
<key>MaxKernel</key>
<string></string>
<key>MinKernel</key>
<string></string>
<key>PlistPath</key>
<string>Contents/Info.plist</string>
</dict>
<dict>
<key>BundlePath</key>
<string>VirtualSMC.kext</string>
<key>Comment</key>
<string>SMC emulator</string>
<key>Enabled</key>
<false/>
<key>ExecutablePath</key>
<string>Contents/MacOS/VirtualSMC</string>
<key>MaxKernel</key>
<string></string>
<key>MinKernel</key>
<string></string>
<key>PlistPath</key>
<string>Contents/Info.plist</string>
</dict>
<dict>
<key>BundlePath</key>
<string>WhateverGreen.kext</string>
<key>Comment</key>
<string>Video patches</string>
<key>Enabled</key>
<true/>
<key>ExecutablePath</key>
<string>Contents/MacOS/WhateverGreen</string>
<key>MaxKernel</key>
<string></string>
<key>MinKernel</key>
<string></string>
<key>PlistPath</key>
<string>Contents/Info.plist</string>
</dict>
<dict>
<key>BundlePath</key>
<string>AppleALC.kext</string>
<key>Comment</key>
<string>Audio patches</string>
<key>Enabled</key>
<true/>
<key>ExecutablePath</key>
<string>Contents/MacOS/AppleALC</string>
<key>MaxKernel</key>
<string></string>
<key>MinKernel</key>
<string></string>
<key>PlistPath</key>
<string>Contents/Info.plist</string>
</dict>
<dict>
<key>BundlePath</key>
<string>AGPMInjector.kext</string>
<key>Comment</key>
<string></string>
<key>Enabled</key>
<true/>
<key>ExecutablePath</key>
<string></string>
<key>MaxKernel</key>
<string></string>
<key>MinKernel</key>
<string></string>
<key>PlistPath</key>
<string>Contents/Info.plist</string>
</dict>
<dict>
<key>BundlePath</key>
<string>USBPorts.kext</string>
<key>Comment</key>
<string></string>
<key>Enabled</key>
<true/>
<key>ExecutablePath</key>
<string></string>
<key>MaxKernel</key>
<string></string>
<key>MinKernel</key>
<string></string>
<key>PlistPath</key>
<string>Contents/Info.plist</string>
</dict>
<dict>
<key>BundlePath</key>
<string>MCEReporterDisabler.kext</string>
<key>Comment</key>
<string></string>
<key>Enabled</key>
<true/>
<key>ExecutablePath</key>
<string></string>
<key>MaxKernel</key>
<string></string>
<key>MinKernel</key>
<string></string>
<key>PlistPath</key>
<string>Contents/Info.plist</string>
</dict>
</array>
<key>Block</key>
<array>
<dict>
<key>Comment</key>
<string></string>
<key>Enabled</key>
<false/>
<key>Identifier</key>
<string>com.apple.driver.AppleTyMCEDriver</string>
<key>MaxKernel</key>
<string></string>
<key>MinKernel</key>
<string></string>
</dict>
</array>
<key>Emulate</key>
<dict>
<key>Cpuid1Data</key>
<data>VwYFAAAAAAAAAAAAAAAAAA==</data>
<key>Cpuid1Mask</key>
<data>/////wAAAAAAAAAAAAAAAA==</data>
</dict>
<key>Patch</key>
<array>
<dict>
<key>Base</key>
<string></string>
<key>Comment</key>
<string>algrey - cpuid_set_generic_info - disable check to allow leaf7</string>
<key>Count</key>
<integer>1</integer>
<key>Enabled</key>
<true/>
<key>Find</key>
<data>ADoPgg==</data>
<key>Identifier</key>
<string>kernel</string>
<key>Limit</key>
<integer>0</integer>
<key>Mask</key>
<data></data>
<key>MaxKernel</key>
<string>19.99.99</string>
<key>MinKernel</key>
<string>17.0.0</string>
<key>Replace</key>
<data>AAAPgg==</data>
<key>ReplaceMask</key>
<data></data>
<key>Skip</key>
<integer>0</integer>
</dict>
<dict>
<key>Base</key>
<string>_cpu_topology_sort</string>
<key>Comment</key>
<string>algrey - cpu_topology_sort -disable _x86_validate_topology</string>
<key>Count</key>
<integer>1</integer>
<key>Enabled</key>
<true/>
<key>Find</key>
<data>6AAA//8=</data>
<key>Identifier</key>
<string>kernel</string>
<key>Limit</key>
<integer>0</integer>
<key>Mask</key>
<data>/wAA//8=</data>
<key>MaxKernel</key>
<string>19.99.99</string>
<key>MinKernel</key>
<string>17.0.0</string>
<key>Replace</key>
<data>Dx9EAAA=</data>
<key>ReplaceMask</key>
<data></data>
<key>Skip</key>
<integer>0</integer>
</dict>
<dict>
<key>Base</key>
<string></string>
<key>Comment</key>
<string>algrey - cpuid_set_cpufamily - force CPUFAMILY_INTEL_PENRYN</string>
<key>Count</key>
<integer>1</integer>
<key>Enabled</key>
<true/>
<key>Find</key>
<data>MduAPQAAAAAGdQA=</data>
<key>Identifier</key>
<string>kernel</string>
<key>Limit</key>
<integer>0</integer>
<key>Mask</key>
<data>/////wAAAP///wA=</data>
<key>MaxKernel</key>
<string>19.99.99</string>
<key>MinKernel</key>
<string>17.0.0</string>
<key>Replace</key>
<data>u7xP6njpXQAAAJA=</data>
<key>ReplaceMask</key>
<data></data>
<key>Skip</key>
<integer>0</integer>
</dict>
<dict>
<key>Base</key>
<string></string>
<key>Comment</key>
<string>algrey - - skip cpuid_cores_per_package test -10.15</string>
<key>Count</key>
<integer>0</integer>
<key>Enabled</key>
<true/>
<key>Find</key>
<data>gz0AAAAAAA8AAAAAAItdvA==</data>
<key>Identifier</key>
<string>kernel</string>
<key>Limit</key>
<integer>0</integer>
<key>Mask</key>
<data>//8AAAD///8AAAAA/////w==</data>
<key>MaxKernel</key>
<string>19.99.99</string>
<key>MinKernel</key>
<string>19.0.0</string>
<key>Replace</key>
<data>AAAAAAAAAQAAAAAAAAAAAA==</data>
<key>ReplaceMask</key>
<data>AAAAAAAADwAAAAAAAAAAAA==</data>
<key>Skip</key>
<integer>0</integer>
</dict>
<dict>
<key>Base</key>
<string></string>
<key>Comment</key>
<string>algrey - - skip cpuid_cores_per_package test</string>
<key>Count</key>
<integer>0</integer>
<key>Enabled</key>
<true/>
<key>Find</key>
<data>gz0AAAAAAHQAi128</data>
<key>Identifier</key>
<string>kernel</string>
<key>Limit</key>
<integer>0</integer>
<key>Mask</key>
<data>//8AAAD///8A////</data>
<key>MaxKernel</key>
<string>18.99.99</string>
<key>MinKernel</key>
<string>17.0.0</string>
<key>Replace</key>
<data>AAAAAAAAAQAAAAAA</data>
<key>ReplaceMask</key>
<data>AAAAAAAADwAAAAAA</data>
<key>Skip</key>
<integer>0</integer>
</dict>
</array>
<key>Quirks</key>
<dict>
<key>AppleCpuPmCfgLock</key>
<false/>
<key>AppleXcpmCfgLock</key>
<false/>
<key>AppleXcpmExtraMsrs</key>
<false/>
<key>AppleXcpmForceBoost</key>
<false/>
<key>CustomSMBIOSGuid</key>
<false/>
<key>DisableIoMapper</key>
<false/>
<key>DisableRtcChecksum</key>
<false/>
<key>DummyPowerManagement</key>
<true/>
<key>ExternalDiskIcons</key>
<false/>
<key>IncreasePciBarSize</key>
<false/>
<key>LapicKernelPanic</key>
<false/>
<key>PanicNoKextDump</key>
<false/>
<key>PowerTimeoutKernelPanic</key>
<false/>
<key>ThirdPartyDrives</key>
<false/>
<key>XhciPortLimit</key>
<false/>
</dict>
</dict>
<key>Misc</key>
<dict>
<key>BlessOverride</key>
<array/>
<key>Boot</key>
<dict>
<key>ConsoleAttributes</key>
<integer>0</integer>
<key>HibernateMode</key>
<string>Auto</string>
<key>HideAuxiliary</key>
<false/>
<key>PickerAttributes</key>
<integer>1</integer>
<key>PickerAudioAssist</key>
<false/>
<key>PickerMode</key>
<string>External</string>
<key>PollAppleHotKeys</key>
<true/>
<key>ShowPicker</key>
<true/>
<key>TakeoffDelay</key>
<integer>0</integer>
<key>Timeout</key>
<integer>0</integer>
</dict>
<key>Debug</key>
<dict>
<key>AppleDebug</key>
<false/>
<key>ApplePanic</key>
<false/>
<key>DisableWatchDog</key>
<false/>
<key>DisplayDelay</key>
<integer>0</integer>
<key>DisplayLevel</key>
<integer>2147483650</integer>
<key>SysReport</key>
<false/>
<key>Target</key>
<integer>3</integer>
</dict>
<key>Entries</key>
<array/>
<key>Security</key>
<dict>
<key>AllowNvramReset</key>
<true/>
<key>AllowSetDefault</key>
<false/>
<key>AuthRestart</key>
<false/>
<key>BootProtect</key>
<string>None</string>
<key>ExposeSensitiveData</key>
<integer>6</integer>
<key>HaltLevel</key>
<integer>2147483648</integer>
<key>ScanPolicy</key>
<integer>0</integer>
<key>Vault</key>
<string>Optional</string>
</dict>
<key>Tools</key>
<array>
<dict>
<key>Arguments</key>
<string></string>
<key>Auxiliary</key>
<false/>
<key>Comment</key>
<string>Not signed for security reasons</string>
<key>Enabled</key>
<true/>
<key>Name</key>
<string>UEFI Shell</string>
<key>Path</key>
<string>OpenShell.efi</string>
</dict>
<dict>
<key>Arguments</key>
<string>Shutdown</string>
<key>Auxiliary</key>
<true/>
<key>Comment</key>
<string>Perform shutdown</string>
<key>Enabled</key>
<true/>
<key>Name</key>
<string>Shutdown</string>
<key>Path</key>
<string>ResetSystem.efi</string>
</dict>
</array>
</dict>
<key>NVRAM</key>
<dict>
<key>Add</key>
<dict>
<key>4D1EDE05-38C7-4A6A-9CC6-4BCCA8B38C14</key>
<dict>
<key>DefaultBackgroundColor</key>
<data>AAAAAA==</data>
<key>UIScale</key>
<data>AQ==</data>
</dict>
<key>4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102</key>
<dict>
<key>rtc-blacklist</key>
<data></data>
</dict>
<key>7C436110-AB2A-4BBB-A880-FE41995C9F82</key>
<dict>
<key>SystemAudioVolume</key>
<data>Rg==</data>
<key>boot-args</key>
<string>-v keepsyms=1</string>
<key>run-efi-updater</key>
<string>No</string>
<key>csr-active-config</key>
<data>AAAAAA==</data>
<key>prev-lang:kbd</key>
<data>ZW4tVVM6MA==</data>
</dict>
</dict>
<key>Delete</key>
<dict>
<key>4D1EDE05-38C7-4A6A-9CC6-4BCCA8B38C14</key>
<array>
<string>UIScale</string>
<string>DefaultBackgroundColor</string>
</array>
<key>4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102</key>
<array>
<string>rtc-blacklist</string>
</array>
<key>7C436110-AB2A-4BBB-A880-FE41995C9F82</key>
<array>
<string>boot-args</string>
</array>
</dict>
<key>LegacyEnable</key>
<false/>
<key>LegacyOverwrite</key>
<false/>
<key>LegacySchema</key>
<dict>
<key>7C436110-AB2A-4BBB-A880-FE41995C9F82</key>
<array>
<string>EFILoginHiDPI</string>
<string>EFIBluetoothDelay</string>
<string>LocationServicesEnabled</string>
<string>SystemAudioVolume</string>
<string>SystemAudioVolumeDB</string>
<string>SystemAudioVolumeSaved</string>
<string>bluetoothActiveControllerInfo</string>
<string>bluetoothInternalControllerInfo</string>
<string>flagstate</string>
<string>fmm-computer-name</string>
<string>nvda_drv</string>
<string>prev-lang:kbd</string>
</array>
<key>8BE4DF61-93CA-11D2-AA0D-00E098032B8C</key>
<array>
<string>Boot0080</string>
<string>Boot0081</string>
<string>Boot0082</string>
<string>BootNext</string>
<string>BootOrder</string>
</array>
</dict>
<key>WriteFlash</key>
<true/>
</dict>
<key>PlatformInfo</key>
<dict>
<key>Automatic</key>
<true/>
<key>Generic</key>
<dict>
<key>AdviseWindows</key>
<false/>
<key>MLB</key>
<string>C02717306J9JG361M</string>
<key>ROM</key>
<data>
m7zhIYfl
</data>
<key>SpoofVendor</key>
<true/>
<key>SystemProductName</key>
<string>iMacPro1,1</string>
<key>SystemSerialNumber</key>
<string>C02TM2ZBHX87</string>
<key>SystemUUID</key>
<string>007076A6-F2A2-4461-BBE5-BAD019F8025A</string>
</dict>
<key>UpdateDataHub</key>
<true/>
<key>UpdateNVRAM</key>
<true/>
<key>UpdateSMBIOS</key>
<true/>
<key>UpdateSMBIOSMode</key>
<string>Create</string>
</dict>
<key>UEFI</key>
<dict>
<key>APFS</key>
<dict>
<key>EnableJumpstart</key>
<true/>
<key>GlobalConnect</key>
<false/>
<key>HideVerbose</key>
<true/>
<key>JumpstartHotPlug</key>
<false/>
<key>MinDate</key>
<integer>-1</integer>
<key>MinVersion</key>
<integer>-1</integer>
</dict>
<key>Audio</key>
<dict>
<key>AudioCodec</key>
<integer>0</integer>
<key>AudioDevice</key>
<string>PciRoot(0x1)/Pci(0x1,0x0)/Pci(0x0,0x1)</string>
<key>AudioOut</key>
<integer>0</integer>
<key>AudioSupport</key>
<false/>
<key>MinimumVolume</key>
<integer>20</integer>
<key>PlayChime</key>
<false/>
<key>VolumeAmplifier</key>
<integer>0</integer>
</dict>
<key>ConnectDrivers</key>
<true/>
<key>Drivers</key>
<array>
<string>OpenRuntime.efi</string>
<string>VBoxHfs.efi</string>
<string>OpenCanopy.efi</string>
</array>
<key>Input</key>
<dict>
<key>KeyFiltering</key>
<false/>
<key>KeyForgetThreshold</key>
<integer>5</integer>
<key>KeyMergeThreshold</key>
<integer>2</integer>
<key>KeySupport</key>
<true/>
<key>KeySupportMode</key>
<string>Auto</string>
<key>KeySwap</key>
<false/>
<key>PointerSupport</key>
<false/>
<key>PointerSupportMode</key>
<string>ASUS</string>
<key>TimerResolution</key>
<integer>50000</integer>
</dict>
<key>Output</key>
<dict>
<key>ClearScreenOnModeSwitch</key>
<false/>
<key>ConsoleMode</key>
<string></string>
<key>DirectGopRendering</key>
<false/>
<key>IgnoreTextInGraphics</key>
<false/>
<key>ProvideConsoleGop</key>
<true/>
<key>ReconnectOnResChange</key>
<false/>
<key>ReplaceTabWithSpace</key>
<false/>
<key>Resolution</key>
<string>1920x1080@32</string>
<key>SanitiseClearScreen</key>
<false/>
<key>TextRenderer</key>
<string>BuiltinGraphics</string>
</dict>
<key>ProtocolOverrides</key>
<dict>
<key>AppleAudio</key>
<false/>
<key>AppleBootPolicy</key>
<false/>
<key>AppleDebugLog</key>
<false/>
<key>AppleEvent</key>
<false/>
<key>AppleImageConversion</key>
<false/>
<key>AppleKeyMap</key>
<false/>
<key>AppleRtcRam</key>
<false/>
<key>AppleSmcIo</key>
<false/>
<key>AppleUserInterfaceTheme</key>
<false/>
<key>DataHub</key>
<false/>
<key>DeviceProperties</key>
<false/>
<key>FirmwareVolume</key>
<false/>
<key>HashServices</key>
<false/>
<key>OSInfo</key>
<false/>
<key>UnicodeCollation</key>
<false/>
</dict>
<key>Quirks</key>
<dict>
<key>DeduplicateBootOrder</key>
<true/>
<key>ExitBootServicesDelay</key>
<integer>0</integer>
<key>IgnoreInvalidFlexRatio</key>
<false/>
<key>ReleaseUsbOwnership</key>
<false/>
<key>RequestBootVarRouting</key>
<true/>
<key>TscSyncTimeout</key>
<integer>0</integer>
<key>UnblockFsConnect</key>
<false/>
</dict>
</dict>
</dict>
</plist>

View file

@ -0,0 +1,883 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>ACPI</key>
<dict>
<key>Add</key>
<array>
<dict>
<key>Comment</key>
<string>add DTGP method</string>
<key>Enabled</key>
<true/>
<key>Path</key>
<string>SSDT-DTGP.aml</string>
</dict>
<dict>
<key>Comment</key>
<string>Fake EC and USBX Power</string>
<key>Enabled</key>
<true/>
<key>Path</key>
<string>SSDT-EC.aml</string>
</dict>
<dict>
<key>Comment</key>
<string>USB 2.0 Injection</string>
<key>Enabled</key>
<true/>
<key>Path</key>
<string>SSDT-EHCI.aml</string>
</dict>
<dict>
<key>Comment</key>
<string>CPU AGPM Plugin=1</string>
<key>Enabled</key>
<true/>
<key>Path</key>
<string>SSDT-PLUG.aml</string>
</dict>
</array>
<key>Delete</key>
<array>
<dict>
<key>All</key>
<false/>
<key>Comment</key>
<string>Delete CpuPm</string>
<key>Enabled</key>
<false/>
<key>OemTableId</key>
<data>Q3B1UG0AAAA=</data>
<key>TableLength</key>
<integer>0</integer>
<key>TableSignature</key>
<data>U1NEVA==</data>
</dict>
<dict>
<key>All</key>
<false/>
<key>Comment</key>
<string>Delete Cpu0Ist</string>
<key>Enabled</key>
<false/>
<key>OemTableId</key>
<data>Q3B1MElzdAA=</data>
<key>TableLength</key>
<integer>0</integer>
<key>TableSignature</key>
<data>U1NEVA==</data>
</dict>
</array>
<key>Patch</key>
<array>
<dict>
<key>Comment</key>
<string>_Q11 to XQ11</string>
<key>Count</key>
<integer>1</integer>
<key>Enabled</key>
<false/>
<key>Find</key>
<data>X1ExMQ==</data>
<key>Limit</key>
<integer>0</integer>
<key>Mask</key>
<data></data>
<key>OemTableId</key>
<data></data>
<key>Replace</key>
<data>WFExMQ==</data>
<key>ReplaceMask</key>
<data></data>
<key>Skip</key>
<integer>0</integer>
<key>TableLength</key>
<integer>0</integer>
<key>TableSignature</key>
<data></data>
</dict>
<dict>
<key>Comment</key>
<string>_Q12 to XQ12</string>
<key>Count</key>
<integer>1</integer>
<key>Enabled</key>
<false/>
<key>Find</key>
<data>X1ExMg==</data>
<key>Limit</key>
<integer>0</integer>
<key>Mask</key>
<data></data>
<key>OemTableId</key>
<data></data>
<key>Replace</key>
<data>WFExMg==</data>
<key>ReplaceMask</key>
<data></data>
<key>Skip</key>
<integer>0</integer>
<key>TableLength</key>
<integer>0</integer>
<key>TableSignature</key>
<data></data>
</dict>
</array>
<key>Quirks</key>
<dict>
<key>FadtEnableReset</key>
<false/>
<key>NormalizeHeaders</key>
<false/>
<key>RebaseRegions</key>
<false/>
<key>ResetHwSig</key>
<false/>
<key>ResetLogoStatus</key>
<false/>
</dict>
</dict>
<key>Booter</key>
<dict>
<key>MmioWhitelist</key>
<array/>
<key>Quirks</key>
<dict>
<key>AvoidRuntimeDefrag</key>
<true/>
<key>DevirtualiseMmio</key>
<false/>
<key>DisableSingleUser</key>
<false/>
<key>DisableVariableWrite</key>
<false/>
<key>DiscardHibernateMap</key>
<false/>
<key>EnableSafeModeSlide</key>
<true/>
<key>EnableWriteUnprotector</key>
<true/>
<key>ForceExitBootServices</key>
<false/>
<key>ProtectMemoryRegions</key>
<false/>
<key>ProtectSecureBoot</key>
<false/>
<key>ProtectUefiServices</key>
<false/>
<key>ProvideCustomSlide</key>
<true/>
<key>ProvideMaxSlide</key>
<integer>0</integer>
<key>RebuildAppleMemoryMap</key>
<false/>
<key>SetupVirtualMap</key>
<false/>
<key>SignalAppleOS</key>
<false/>
<key>SyncRuntimePermissions</key>
<false/>
</dict>
</dict>
<key>DeviceProperties</key>
<dict>
<key>Add</key>
<dict>
<key>PciRoot(0x1)/Pci(0x1F,0x0)</key>
<dict>
<key>compatible</key>
<string>pci8086,2916</string>
<key>device-id</key>
<data>
FikA
</data>
<key>name</key>
<string>pci8086,2916</string>
</dict>
</dict>
<key>Delete</key>
<dict>
<key>PciRoot(0x0)/Pci(0x1b,0x0)</key>
<array>
<string>MaximumBootBeepVolume</string>
</array>
</dict>
</dict>
<key>Kernel</key>
<dict>
<key>Add</key>
<array>
<dict>
<key>Arch</key>
<string>Any</string>
<key>BundlePath</key>
<string>VoodooHDA.kext</string>
<key>Comment</key>
<string></string>
<key>Enabled</key>
<true/>
<key>ExecutablePath</key>
<string>Contents/MacOS/VoodooHDA</string>
<key>MaxKernel</key>
<string></string>
<key>MinKernel</key>
<string></string>
<key>PlistPath</key>
<string>Contents/Info.plist</string>
</dict>
<dict>
<key>Arch</key>
<string>x86_64</string>
<key>BundlePath</key>
<string>Lilu.kext</string>
<key>Comment</key>
<string>Patch engine</string>
<key>Enabled</key>
<true/>
<key>ExecutablePath</key>
<string>Contents/MacOS/Lilu</string>
<key>MaxKernel</key>
<string></string>
<key>MinKernel</key>
<string>12.0.0</string>
<key>PlistPath</key>
<string>Contents/Info.plist</string>
</dict>
<dict>
<key>Arch</key>
<string>x86_64</string>
<key>BundlePath</key>
<string>VirtualSMC.kext</string>
<key>Comment</key>
<string>SMC emulator</string>
<key>Enabled</key>
<false/>
<key>ExecutablePath</key>
<string>Contents/MacOS/VirtualSMC</string>
<key>MaxKernel</key>
<string></string>
<key>MinKernel</key>
<string>12.0.0</string>
<key>PlistPath</key>
<string>Contents/Info.plist</string>
</dict>
<dict>
<key>Arch</key>
<string>x86_64</string>
<key>BundlePath</key>
<string>WhateverGreen.kext</string>
<key>Comment</key>
<string>Video patches</string>
<key>Enabled</key>
<true/>
<key>ExecutablePath</key>
<string>Contents/MacOS/WhateverGreen</string>
<key>MaxKernel</key>
<string></string>
<key>MinKernel</key>
<string>12.0.0</string>
<key>PlistPath</key>
<string>Contents/Info.plist</string>
</dict>
<dict>
<key>BundlePath</key>
<string>AGPMInjector.kext</string>
<key>Comment</key>
<string></string>
<key>Enabled</key>
<true/>
<key>ExecutablePath</key>
<string></string>
<key>MaxKernel</key>
<string></string>
<key>MinKernel</key>
<string></string>
<key>PlistPath</key>
<string>Contents/Info.plist</string>
</dict>
<dict>
<key>BundlePath</key>
<string>USBPorts.kext</string>
<key>Comment</key>
<string></string>
<key>Enabled</key>
<true/>
<key>ExecutablePath</key>
<string></string>
<key>MaxKernel</key>
<string></string>
<key>MinKernel</key>
<string></string>
<key>PlistPath</key>
<string>Contents/Info.plist</string>
</dict>
<dict>
<key>Arch</key>
<string>x86_64</string>
<key>BundlePath</key>
<string>MCEReporterDisabler.kext</string>
<key>Comment</key>
<string>AppleMCEReporter disabler</string>
<key>Enabled</key>
<true/>
<key>ExecutablePath</key>
<string></string>
<key>MaxKernel</key>
<string></string>
<key>MinKernel</key>
<string>19.0.0</string>
<key>PlistPath</key>
<string>Contents/Info.plist</string>
</dict>
</array>
<key>Block</key>
<array>
<dict>
<key>Arch</key>
<string>Any</string>
<key>Comment</key>
<string></string>
<key>Enabled</key>
<false/>
<key>Identifier</key>
<string>com.apple.driver.AppleTyMCEDriver</string>
<key>MaxKernel</key>
<string></string>
<key>MinKernel</key>
<string></string>
</dict>
</array>
<key>Emulate</key>
<dict>
<key>Cpuid1Data</key>
<data>
VAYFAAAAAAAAAAAAAAAAAA==
</data>
<key>Cpuid1Mask</key>
<data>
////AAAAAAAAAAAAAAAAAA==
</data>
</dict>
<key>Force</key>
<array>
<dict>
<key>Arch</key>
<string>Any</string>
<key>BundlePath</key>
<string>System/Library/Extensions/IONetworkingFamily.kext</string>
<key>Comment</key>
<string>Patch engine</string>
<key>Enabled</key>
<false/>
<key>Identifier</key>
<string>com.apple.iokit.IONetworkingFamily</string>
<key>ExecutablePath</key>
<string>Contents/MacOS/IONetworkingFamily</string>
<key>MaxKernel</key>
<string>13.99.99</string>
<key>MinKernel</key>
<string></string>
<key>PlistPath</key>
<string>Contents/Info.plist</string>
</dict>
</array>
<key>Patch</key>
<array>
<dict>
<key>Base</key>
<string>_cpu_topology_sort</string>
<key>Comment</key>
<string>algrey - cpu_topology_sort -disable _x86_validate_topology</string>
<key>Count</key>
<integer>1</integer>
<key>Enabled</key>
<true/>
<key>Find</key>
<data>
6AAA//8=
</data>
<key>Identifier</key>
<string>kernel</string>
<key>Limit</key>
<integer>0</integer>
<key>Mask</key>
<data>
/wAA//8=
</data>
<key>MaxKernel</key>
<string>20.99.99</string>
<key>MinKernel</key>
<string>17.0.0</string>
<key>Replace</key>
<data>
Dx9EAAA=
</data>
<key>ReplaceMask</key>
<data>
</data>
<key>Skip</key>
<integer>0</integer>
</dict>
<dict>
<key>Base</key>
<string></string>
<key>Comment</key>
<string>algrey - cpuid_set_cpufamily - force CPUFAMILY_INTEL_PENRYN</string>
<key>Count</key>
<integer>1</integer>
<key>Enabled</key>
<true/>
<key>Find</key>
<data>
MduAPQAAAAAGdQA=
</data>
<key>Identifier</key>
<string>kernel</string>
<key>Limit</key>
<integer>0</integer>
<key>Mask</key>
<data>
/////wAAAP///wA=
</data>
<key>MaxKernel</key>
<string>20.99.99</string>
<key>MinKernel</key>
<string>17.0.0</string>
<key>Replace</key>
<data>
u7xP6njpXQAAAJA=
</data>
<key>ReplaceMask</key>
<data>
</data>
<key>Skip</key>
<integer>0</integer>
</dict>
</array>
<key>Quirks</key>
<dict>
<key>AppleCpuPmCfgLock</key>
<false/>
<key>AppleXcpmCfgLock</key>
<false/>
<key>AppleXcpmExtraMsrs</key>
<false/>
<key>AppleXcpmForceBoost</key>
<false/>
<key>CustomSMBIOSGuid</key>
<false/>
<key>DisableIoMapper</key>
<false/>
<key>DisableLinkeditJettison</key>
<true/>
<key>DisableRtcChecksum</key>
<false/>
<key>DummyPowerManagement</key>
<true/>
<key>ExternalDiskIcons</key>
<false/>
<key>IncreasePciBarSize</key>
<false/>
<key>LapicKernelPanic</key>
<false/>
<key>PanicNoKextDump</key>
<false/>
<key>PowerTimeoutKernelPanic</key>
<false/>
<key>ThirdPartyDrives</key>
<false/>
<key>XhciPortLimit</key>
<false/>
</dict>
<key>Scheme</key>
<dict>
<key>FuzzyMatch</key>
<true/>
<key>KernelArch</key>
<string>x86_64</string>
<key>KernelCache</key>
<string>Auto</string>
</dict>
</dict>
<key>Misc</key>
<dict>
<key>BlessOverride</key>
<array/>
<key>Boot</key>
<dict>
<key>ConsoleAttributes</key>
<integer>0</integer>
<key>HibernateMode</key>
<string>Auto</string>
<key>HideAuxiliary</key>
<false/>
<key>PickerAttributes</key>
<integer>1</integer>
<key>PickerAudioAssist</key>
<false/>
<key>PickerMode</key>
<string>External</string>
<key>PollAppleHotKeys</key>
<true/>
<key>ShowPicker</key>
<true/>
<key>TakeoffDelay</key>
<integer>0</integer>
<key>Timeout</key>
<integer>0</integer>
</dict>
<key>Debug</key>
<dict>
<key>AppleDebug</key>
<false/>
<key>ApplePanic</key>
<false/>
<key>DisableWatchDog</key>
<false/>
<key>DisplayDelay</key>
<integer>0</integer>
<key>DisplayLevel</key>
<integer>2147483650</integer>
<key>SerialInit</key>
<false/>
<key>SysReport</key>
<false/>
<key>Target</key>
<integer>3</integer>
</dict>
<key>Entries</key>
<array/>
<key>Security</key>
<dict>
<key>AllowNvramReset</key>
<true/>
<key>AllowSetDefault</key>
<false/>
<key>ApECID</key>
<integer>0</integer>
<key>AuthRestart</key>
<false/>
<key>BootProtect</key>
<string>None</string>
<key>DmgLoading</key>
<string>Signed</string>
<key>EnablePassword</key>
<false/>
<key>ExposeSensitiveData</key>
<integer>6</integer>
<key>HaltLevel</key>
<integer>2147483648</integer>
<key>PasswordHash</key>
<data></data>
<key>PasswordSalt</key>
<data></data>
<key>ScanPolicy</key>
<integer>0</integer>
<key>SecureBootModel</key>
<string>Disabled</string>
<key>Vault</key>
<string>Optional</string>
</dict>
<key>Tools</key>
<array>
<dict>
<key>Arguments</key>
<string></string>
<key>Auxiliary</key>
<false/>
<key>Comment</key>
<string>Not signed for security reasons</string>
<key>Enabled</key>
<true/>
<key>Name</key>
<string>UEFI Shell</string>
<key>Path</key>
<string>OpenShell.efi</string>
</dict>
<dict>
<key>Arguments</key>
<string>Shutdown</string>
<key>Auxiliary</key>
<true/>
<key>Comment</key>
<string>Perform shutdown</string>
<key>Enabled</key>
<true/>
<key>Name</key>
<string>Shutdown</string>
<key>Path</key>
<string>ResetSystem.efi</string>
</dict>
</array>
</dict>
<key>NVRAM</key>
<dict>
<key>Add</key>
<dict>
<key>4D1EDE05-38C7-4A6A-9CC6-4BCCA8B38C14</key>
<dict>
<key>DefaultBackgroundColor</key>
<data>AAAAAA==</data>
<key>UIScale</key>
<data>AQ==</data>
</dict>
<key>4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102</key>
<dict>
<key>rtc-blacklist</key>
<data></data>
</dict>
<key>7C436110-AB2A-4BBB-A880-FE41995C9F82</key>
<dict>
<key>SystemAudioVolume</key>
<data>Rg==</data>
<key>boot-args</key>
<string>-v keepsyms=1 tlbto_us=0 vti=9</string>
<key>run-efi-updater</key>
<string>No</string>
<key>csr-active-config</key>
<data>ZwAAAA==</data>
<key>prev-lang:kbd</key>
<data>ZW4tVVM6MA==</data>
</dict>
</dict>
<key>Delete</key>
<dict>
<key>4D1EDE05-38C7-4A6A-9CC6-4BCCA8B38C14</key>
<array>
<string>UIScale</string>
<string>DefaultBackgroundColor</string>
</array>
<key>4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102</key>
<array>
<string>rtc-blacklist</string>
</array>
<key>7C436110-AB2A-4BBB-A880-FE41995C9F82</key>
<array>
<string>boot-args</string>
</array>
</dict>
<key>LegacyEnable</key>
<false/>
<key>LegacyOverwrite</key>
<false/>
<key>LegacySchema</key>
<dict>
<key>7C436110-AB2A-4BBB-A880-FE41995C9F82</key>
<array>
<string>EFILoginHiDPI</string>
<string>EFIBluetoothDelay</string>
<string>LocationServicesEnabled</string>
<string>SystemAudioVolume</string>
<string>SystemAudioVolumeDB</string>
<string>SystemAudioVolumeSaved</string>
<string>bluetoothActiveControllerInfo</string>
<string>bluetoothInternalControllerInfo</string>
<string>flagstate</string>
<string>fmm-computer-name</string>
<string>nvda_drv</string>
<string>prev-lang:kbd</string>
</array>
<key>8BE4DF61-93CA-11D2-AA0D-00E098032B8C</key>
<array>
<string>Boot0080</string>
<string>Boot0081</string>
<string>Boot0082</string>
<string>BootNext</string>
<string>BootOrder</string>
</array>
</dict>
<key>WriteFlash</key>
<true/>
</dict>
<key>PlatformInfo</key>
<dict>
<key>Automatic</key>
<true/>
<key>Generic</key>
<dict>
<key>AdviseWindows</key>
<false/>
<key>MLB</key>
<string>C02717306J9JG361M</string>
<key>ROM</key>
<data>
m7zhIYfl
</data>
<key>SpoofVendor</key>
<true/>
<key>SystemProductName</key>
<string>iMacPro1,1</string>
<key>SystemSerialNumber</key>
<string>C02TM2ZBHX87</string>
<key>SystemUUID</key>
<string>007076A6-F2A2-4461-BBE5-BAD019F8025A</string>
</dict>
<key>UpdateDataHub</key>
<true/>
<key>UpdateNVRAM</key>
<true/>
<key>UpdateSMBIOS</key>
<true/>
<key>UpdateSMBIOSMode</key>
<string>Create</string>
</dict>
<key>UEFI</key>
<dict>
<key>APFS</key>
<dict>
<key>EnableJumpstart</key>
<true/>
<key>GlobalConnect</key>
<false/>
<key>HideVerbose</key>
<false/>
<key>JumpstartHotPlug</key>
<true/>
<key>MinDate</key>
<integer>0</integer>
<key>MinVersion</key>
<integer>0</integer>
</dict>
<key>Audio</key>
<dict>
<key>AudioCodec</key>
<integer>0</integer>
<key>AudioDevice</key>
<string>PciRoot(0x1)/Pci(0x1,0x0)/Pci(0x0,0x1)</string>
<key>AudioOut</key>
<integer>0</integer>
<key>AudioSupport</key>
<false/>
<key>MinimumVolume</key>
<integer>20</integer>
<key>PlayChime</key>
<false/>
<key>VolumeAmplifier</key>
<integer>0</integer>
</dict>
<key>ConnectDrivers</key>
<true/>
<key>Drivers</key>
<array>
<string>VBoxHfs.efi</string>
<string>OpenRuntime.efi</string>
<string>OpenCanopy.efi</string>
<string>#AudioDxe.efi</string>
<string>#OpenUsbKbDxe.efi</string>
<string>#UsbMouseDxe.efi</string>
<string>#Ps2KeyboardDxe.efi</string>
<string>#Ps2MouseDxe.efi</string>
<string>#HiiDatabase.efi</string>
<string>#NvmExpressDxe.efi</string>
<string>#XhciDxe.efi</string>
<string>#ExFatDxe.efi</string>
<string>#PartitionDxe.efi</string>
<string>#CrScreenshotDxe.efi</string>
</array>
<key>Input</key>
<dict>
<key>KeyFiltering</key>
<false/>
<key>KeyForgetThreshold</key>
<integer>5</integer>
<key>KeyMergeThreshold</key>
<integer>2</integer>
<key>KeySupport</key>
<true/>
<key>KeySupportMode</key>
<string>Auto</string>
<key>KeySwap</key>
<false/>
<key>PointerSupport</key>
<false/>
<key>PointerSupportMode</key>
<string>ASUS</string>
<key>TimerResolution</key>
<integer>50000</integer>
</dict>
<key>Output</key>
<dict>
<key>ClearScreenOnModeSwitch</key>
<false/>
<key>ConsoleMode</key>
<string></string>
<key>DirectGopRendering</key>
<false/>
<key>IgnoreTextInGraphics</key>
<false/>
<key>ProvideConsoleGop</key>
<true/>
<key>ReconnectOnResChange</key>
<false/>
<key>ReplaceTabWithSpace</key>
<false/>
<key>Resolution</key>
<string>1920x1080@32</string>
<key>SanitiseClearScreen</key>
<false/>
<key>TextRenderer</key>
<string>BuiltinGraphics</string>
<key>UgaPassThrough</key>
<false/>
</dict>
<key>ProtocolOverrides</key>
<dict>
<key>AppleAudio</key>
<false/>
<key>AppleBootPolicy</key>
<false/>
<key>AppleDebugLog</key>
<false/>
<key>AppleEvent</key>
<false/>
<key>AppleFramebufferInfo</key>
<false/>
<key>AppleImageConversion</key>
<false/>
<key>AppleImg4Verification</key>
<false/>
<key>AppleKeyMap</key>
<false/>
<key>AppleRtcRam</key>
<false/>
<key>AppleSecureBoot</key>
<false/>
<key>AppleSmcIo</key>
<false/>
<key>AppleUserInterfaceTheme</key>
<false/>
<key>DataHub</key>
<false/>
<key>DeviceProperties</key>
<false/>
<key>FirmwareVolume</key>
<false/>
<key>HashServices</key>
<false/>
<key>OSInfo</key>
<false/>
<key>UnicodeCollation</key>
<false/>
</dict>
<key>Quirks</key>
<dict>
<key>ExitBootServicesDelay</key>
<integer>0</integer>
<key>IgnoreInvalidFlexRatio</key>
<false/>
<key>ReleaseUsbOwnership</key>
<false/>
<key>RequestBootVarRouting</key>
<true/>
<key>TscSyncTimeout</key>
<integer>0</integer>
<key>UnblockFsConnect</key>
<true/>
<key>ConnectDrivers</key>
<true/>
</dict>
</dict>
</dict>
</plist>

View file

@ -0,0 +1,38 @@
#!/usr/bin/env bash
# Create a "ISO" (DMG) image for powering offline macOS installations
# Bail at first ISO creation error
set -e
display_help() {
echo "Usage: $(basename $0) [-h] [<path/to/install_app.app> <path/to/output_iso_file.iso>]"
exit 0
}
if [ "$1" == "-h" ] ; then
display_help
fi
if [ "$#" -eq 2 ]
then
in_path=$1
dmg_path=$2
elif [ "$#" -eq 0 ]
then
in_path=/Applications/Install\ macOS\ Catalina.app
dmg_path=~/Desktop/Catalina.iso
echo "Using default paths:"
echo "Install app: $in_path"
echo "Output disk: $dmg_path"
else
display_help
fi
# Borrrowed from multiple internet sources
hdiutil create -o "$dmg_path" -size 9g -layout GPTSPUD -fs HFS+J
hdiutil attach "$dmg_path" -noverify -mountpoint /Volumes/install_build
sudo "$in_path/Contents/Resources/createinstallmedia" --volume /Volumes/install_build --nointeraction
# createinstallmedia may leave a bunch of subvolumes still mounted when it exits, so we need to use -force here.
hdiutil detach --force "/Volumes/Install macOS Catalina"

View file

@ -0,0 +1,163 @@
#!/usr/bin/env bash
# https://github.com/kraxel/imagefish
######################################################################
# defaults
iso=""
img=""
cfg=""
######################################################################
# create work dir
function msg() {
local txt="$1"
local bold="\x1b[1m"
local normal="\x1b[0m"
echo -e "${bold}### ${txt}${normal}"
}
function do_cleanup() {
msg "cleaning up ..."
if test "$GUESTFISH_PID" != ""; then
guestfish --remote -- exit >/dev/null 2>&1 || true
fi
sudo rm -rf "$WORK"
}
WORK="${TMPDIR-/var/tmp}/${0##*/}-$$"
mkdir "$WORK" || exit 1
trap 'do_cleanup' EXIT
BASE="$(dirname $0)"
######################################################################
# parse args
function print_help() {
cat <<EOF
usage: $0 [ options ]
options:
--iso <iso-image>
--img <disk-image>
--cfg <clover-config>
EOF
}
while test "$1" != ""; do
case "$1" in
--iso)
iso="$2"
shift; shift
;;
--img)
img="$2"
shift; shift
;;
--cfg)
cfg="$2"
shift; shift
;;
esac
done
######################################################################
# guestfish script helpers
function fish() {
echo "#" "$@"
guestfish --remote -- "$@" || exit 1
}
function fish_init() {
local format
case "$img" in
*.raw) format="raw" ;;
*) format="qcow2";;
esac
msg "creating and adding disk image"
fish disk-create $img $format 384M
fish add $img
fish run
}
function fish_fini() {
fish umount-all
}
######################################################################
# sanity checks
if test ! -f "$cfg"; then
echo "ERROR: cfg not found: $cfg"
exit 1
fi
if test -f "$img"; then
if test "$allow_override" = "yes"; then
rm -f "$img"
else
echo "ERROR: image exists: $img"
exit 1
fi
fi
######################################################################
# go!
msg "copy files from local folder"
BASE="$(dirname $0)"
cp -a $BASE/EFI $WORK
find "$WORK"
#msg "[debug] list drivers in EFI/OC"
#(cd $WORK/EFI/OC; find driver* -print)
export LIBGUESTFS_BACKEND=direct
eval $(guestfish --listen)
if test "$GUESTFISH_PID" = ""; then
echo "ERROR: starting guestfish failed"
exit 1
fi
fish_init
msg "partition disk image"
fish part-init /dev/sda gpt
fish part-add /dev/sda p 2048 300000
fish part-add /dev/sda p 302048 -2048
fish part-set-gpt-type /dev/sda 1 C12A7328-F81F-11D2-BA4B-00A0C93EC93B
fish part-set-bootable /dev/sda 1 true
fish mkfs vfat /dev/sda1 label:EFI
fish mkfs vfat /dev/sda2 label:OpenCoreBoot
fish mount /dev/sda2 /
fish mkdir /ESP
fish mount /dev/sda1 /ESP
msg "copy files to disk image"
cp -v "$cfg" $WORK/config.plist
fish mkdir /ESP/EFI
fish mkdir /ESP/EFI/OC
fish mkdir /ESP/EFI/OC/Kexts
fish mkdir /ESP/EFI/OC/ACPI
fish mkdir /ESP/EFI/OC/Resources
fish mkdir /ESP/EFI/OC/Tools
fish copy-in $WORK/EFI/BOOT /ESP/EFI
fish copy-in $WORK/EFI/OC/OpenCore.efi /ESP/EFI/OC
fish copy-in $WORK/EFI/OC/Drivers /ESP/EFI/OC/
fish copy-in $WORK/EFI/OC/Kexts /ESP/EFI/OC/
fish copy-in $WORK/EFI/OC/ACPI /ESP/EFI/OC/
fish copy-in $WORK/EFI/OC/Resources /ESP/EFI/OC/
fish copy-in $WORK/EFI/OC/Tools /ESP/EFI/OC/
# Note
fish copy-in startup.nsh /
BASE="$(dirname $0)"
fish copy-in "$WORK/config.plist" /ESP/EFI/OC/
fish find /ESP/
fish_fini

1
OpenCore-Catalina/startup.nsh Executable file
View file

@ -0,0 +1 @@
fs0:\EFI\BOOT\BOOTx64.efi

252
README.md Normal file
View file

@ -0,0 +1,252 @@
### Note
This `README.md` documents the process of creating a `Virtual Hackintosh`
system.
Note: All blobs and resources included in this repository are re-derivable (all
instructions are included!).
:green_heart: Looking for **commercial** support with this stuff? I am [available
over email](mailto:dhiru.kholia@gmail.com?subject=[GitHub]%20OSX-KVM%20Commercial%20Support%20Request&body=Hi%20-%20We%20are%20interested%20in%20purchasing%20commercial%20support%20options%20for%20your%20project.) for a chat for **commercial support options only**.
Working with `Proxmox` and macOS? See [Nick's blog for sure](https://www.nicksherlock.com/).
Yes, we support offline macOS installations now 🎉
### Contributing Back
This project can always use your help, time and attention. I am looking for
help (pull-requests!) with the following work items:
* Documentation around running macOS on popular cloud providers (Hetzner, GCP,
AWS). See the `Is This Legal?` section and associated references.
* Document (share) how you use this project to build + test open-source
projects / get your stuff done.
* Document how to use this project for XNU kernel debugging and development.
* Document the process to create and reuse VM snapshots. Instantaneous macOS
boots would be nice this way.
* Document the process to launch a bunch of headless macOS VMs (build farm).
* Document usage of [munki](https://github.com/munki/munki) to deploy software
to such a `build farm`.
* Enable VNC + SSH support out of the box or more easily.
* Better support + docs for AMD Ryzen.
* Robustness improvements are always welcome!
* (Not so) crazy idea - automate the macOS installation via OpenCV.
### Requirements
* A modern Linux distribution. E.g. Ubuntu 20.04 LTS 64-bit or later.
* QEMU >= 4.2.0
* A CPU with Intel VT-x / AMD SVM support is required (`egrep '(vmx|svm)' /proc/cpuinfo`)
* A CPU with SSE4.1 support is required for >= macOS Sierra
* A CPU with AVX2 support is required for >= macOS Mojave
Note: Older AMD CPU(s) are known to be problematic. AMD FX-8350 works but
Phenom II X3 720 does not. Ryzen processors work just fine.
### Installation Preparation
* KVM may need the following tweak on the host machine to work.
```
echo 1 | sudo tee /sys/module/kvm/parameters/ignore_msrs
```
To make this change permanent, you may use the following command.
```
sudo cp kvm.conf /etc/modprobe.d/kvm.conf # for intel boxes
```
* Install QEMU and other packages.
```
sudo apt-get install qemu uml-utilities virt-manager git \
wget libguestfs-tools p7zip-full -y
```
This step may need to be adapted for your Linux distribution.
* Clone this repository on your QEMU system. Files from this repository are
used in the following steps.
```
cd ~
git clone --depth 1 https://github.com/kholia/OSX-KVM.git
cd OSX-KVM
```
* Fetch macOS installer.
```
./fetch-macOS-v2.py
```
ATTENTION: Installing `Big Sur` is NOT recommended at this time, unless you
are a Hackintosh developer! Let the `Big Sur` setup sit at the `Country
Selection` screen and other similar places for a while ;)
You can choose your desired macOS version here. After executing this step,
you should have the `BaseSystem.dmg` file in the current folder.
Sample run:
```
$ ./fetch-macOS-v2.py
1. High Sierra (10.13)
2. Mojave (10.14)
3. Catalina (10.15) - RECOMMENDED
4. Latest (Big Sur - 11)
Choose a product to download (1-4): 3
```
Note: Modern NVIDIA GPUs are supported on HighSierra but not on later
versions.
* Convert the downloaded `BaseSystem.dmg` file into the `BaseSystem.img` file.
```
qemu-img convert BaseSystem.dmg -O raw BaseSystem.img
```
* Create a virtual HDD image where macOS will be installed. If you change the
name of the disk image from `mac_hdd.img` to something else, the boot scripts
will need to be updated to point to the new image name.
```
qemu-img create -f qcow2 mac_hdd_ng.img 128G
```
NOTE: Create this HDD image file on a fast SSD/NVMe disk for best results.
* Now you are ready to install macOS 🚀
### Installation
- CLI method (primary). Just run the `OpenCore-Boot.sh` script to start the
installation process.
```
./OpenCore-Boot.sh
```
Note: This same script works for Big Sur, Catalina, Mojave, and High Sierra.
- You are all set! 🙌
- (OPTIONAL) Use this macOS VM disk with libvirt (virt-manager / virsh stuff).
- Edit `macOS-libvirt-Catalina.xml` file and change the various file paths (search
for `CHANGEME` strings in that file). The following command should do the
trick usually.
```
sed "s/CHANGEME/$USER/g" macOS-libvirt-Catalina.xml > macOS.xml
virt-xml-validate macOS.xml
```
- Create a VM by running the following command.
```bash
virsh --connect qemu:///system define macOS.xml
```
- Launch `virt-manager` and start the `macOS` virtual machine.
Note: You may need to run `sudo ip link delete tap0` command before
`virt-manager` is able to start the `macOS` VM.
### Setting Expectations Right
Nice job on setting up a `Virtual Hackintosh` system! Such a system can be used
for a variety of purposes (e.g. software builds, testing, reversing work), and
it may be all you need, along with some tweaks documented in this repository.
However, such a system lacks graphical acceleration, a reliable sound sub-system,
USB (3) functionality and other similar things. To enable these things, take a
look at our [notes](notes.md). We would like to resume our testing and
documentation work around this area. Please [reach out to us](mailto:dhiru.kholia@gmail.com?subject=[GitHub]%20OSX-KVM%20Funding%20Support)
if you are able to fund this area of work.
It is possible to have 'beyond-native-apple-hw' performance but it does require
work, patience, and a bit of luck (perhaps?).
### Post-Installation
* See [networking notes](networking-qemu-kvm-howto.txt) to setup guest networking.
I have the following commands present in `/etc/rc.local`.
```
#!/usr/bin/env bash
sudo ip tuntap add dev tap0 mode tap
sudo ip link set tap0 up promisc on
sudo ip link set dev virbr0 up
sudo ip link set dev tap0 master virbr0
```
This has been enough for me so far.
Note: You may need to [enable the `rc.local` functionality manually on modern Ubuntu versions](https://linuxmedium.com/how-to-enable-etc-rc-local-with-systemd-on-ubuntu-20-04/).
* To passthrough GPUs and other devices, see [these notes](notes.md).
* Need a different resolution? Check out the [notes](notes.md) included in this repository.
* To generate your own SMBIOS, use [GenSMBIOS](https://github.com/corpnewt/GenSMBIOS).
### Is This Legal?
The "secret" Apple OSK string is widely available on the Internet. It is also included in a public court document [available here](http://www.rcfp.org/sites/default/files/docs/20120105_202426_apple_sealing.pdf). I am not a lawyer but it seems that Apple's attempt(s) to get the OSK string treated as a trade secret did not work out. Due to these reasons, the OSK string is freely included in this repository.
Please review the ['Legality of Hackintoshing' documentation bits from Dortania's OpenCore Install Guide](https://dortania.github.io/OpenCore-Install-Guide/why-oc.html#legality-of-hackintoshing).
Gabriel Somlo also has [some thoughts](http://www.contrib.andrew.cmu.edu/~somlo/OSXKVM/) on the legal aspects involved in running macOS under QEMU/KVM.
You may also find [this 'Announcing Amazon EC2 Mac instances for macOS' article](https://aws.amazon.com/about-aws/whats-new/2020/11/announcing-amazon-ec2-mac-instances-for-macos/
) interesting.
### Motivation
My aim is to enable macOS based educational tasks, builds + testing, kernel
debugging, reversing, and macOS security research in an easy, reproducible
manner without getting 'invested' in Apple's closed ecosystem (too heavily).
These `Virtual Hackintosh` systems are not intended to replace the genuine
physical macOS systems.
Personally speaking, this repository has been a way for me to 'exit' the Apple
ecosystem. It has helped me to test and compare the interoperability of `Canon
CanoScan LiDE 120` scanner, and `Brother HL-2250DN` laser printer. And these
devices now work decently enough on modern versions of Ubuntu (Yay for free
software). Also, a long time back, I had to completely wipe my (then) brand new
`MacBook Pro (Retina, 15-inch, Late 2013)` and install Xubuntu on it - as the
`OS X` kernel kept crashing on it!
Backstory: I was a (poor) student in Canada in a previous life and Apple made [my work on cracking Apple Keychains](https://github.com/openwall/john/blob/bleeding-jumbo/src/keychain_fmt_plug.c) a lot harder than it needed to be. This is how I got interested in Hackintosh systems.

7
References.md Normal file
View file

@ -0,0 +1,7 @@
### References
* http://www.contrib.andrew.cmu.edu/~somlo/OSXKVM/
* https://www.kraxel.org/blog/2017/09/running-macos-as-guest-in-kvm/
* https://github.com/foxlet/macOS-Simple-KVM

78
UNRAID.md Normal file
View file

@ -0,0 +1,78 @@
# Setting up OSX-KVM with UNRAID (Unraid OS)
Note: SpaceInvaderOne has a community app called `macinabox`, and it is a Docker container that can automate the entire process that creates the VM and disks. This guide aims to provide utility in choosing specific macOS versions or bootloaders, and understanding the process of how this repository's resources can be used in hypervisor types (UNRAID, ESXi, etc.).
- [Setting up OSX-KVM with UNRAID](#setting-up-osx-kvm-with-unraid)
- [Motivation](#motivation)
- [Pre-Requisites](#pre-requisites)
- [Preparing the VM](#preparing-the-vm)
- [Starting the VM](#starting-the-vm)
- [Optional Notes](#optional-notes)
- [Misc](#misc)
- [Resources](#resources)
## Motivation
This guide solely uses the files generated from this repository to construct a VM for use in UNRAID. This means updates to and features of this repository should be compatible with creating VMs in UNRAID. This type of setup also aims to utilize UNRAID's advantages to address items in the [Contributing Back](https://github.com/kholia/OSX-KVM#contributing-back) section of the main repository, including creating/re-using VM snapshots, build farms, VNC+SSH support, and capacity of delivering a bare-metal-like experience for development. Further customization in setting up Hackintosh on KVM is beyond the scope of this documentation, but feel free to provide relevant [supplemental resources](#resources).
## Pre-Requisites
Follow the [Installation Preparation](https://github.com/kholia/OSX-KVM#installation-preparation) guide and have your disk image `mac_hdd_ng.img` and installation media `BaseSystem.dmg` ready.
Ensure you have VM support and passthrough parameters prepared (VFIO devices, PCI controllers, VNC remote, etc.). You should also have a way of reading/writing to the appropriate locations in your UNRAID server (I use `Krusader`).
## Preparing the VM
Below are sample instructions for setting up the VM. We will keep the necessary files in the same directory for simplicity.
* Place these 3 files `BaseSystem.img`, `mac_hdd_ng.img` and `OSX-KVM/OpenCore-Catalina/OpenCore.qcow2` into the directory of your VM
* ie: Into `/mnt/user/domains/BigSur`, where domains is the folder for your VMs
* Create a new VM and edit the XML. Use the OSX-KVM repository's `macOS-libvirt-Catalina.xml` as a guide
* ie: You also have the option to use the GUI to adjust the CPUs, RAM, setting the OS installation media and disk images, as well as the devices you wish to pass into the VM. However, each time the template is edited via the GUI, you must go in the XML editor and paste the qemu args at the bottom of the XML file.
* Note: The opencore qcow2 file should be prioritized first, it will contain the EFI boot partition that you can modify after installation using the OpenCore Configurator
* Check that the three files' primary vDisk bus is SATA, and verify types:
* OpenCore.qcow2 `<driver name='qemu' type='qcow2' cache='writeback'/>`
* BaseSystem.img `<driver name='qemu' type='raw' cache='writeback'/>`
* mac_hdd_ng.img `<driver name='qemu' type='qcow2' cache='writeback'/>`
* After successful installation, the BaseSystem.img entry can be safely deleted from the XML
## Starting the VM
* Initialize the VM, and select the macOS base system when OpenCore prompts
* Once the installer boots, go into disk utility and erase the qemu drive that relatively matches the space you've allocated in the qemu-img args
* ie: Erase the disk and use these params - APFS, GUID Partition Table
* After installation, you may need to change the NIC to `vmxnet3` or `e1000-82545em` to login with your Apple ID or install your apps from the AppStore (consult [Resources](#resources) for other network interface types)
* Download OpenCore Configurator and mount the EFI partition called `EFI o` (Tools > Mount EFI)
![OpenCore EFI Partitions](screenshots/unraid-oc-efi.png)
* Open the plist from Tools > Scan Configurations
![OpenCore plist](screenshots/unraid-oc-plist.png)
* Customize aml/kext/nvram/drivers and save
* Note: Making modifications here will write to the `OpenCore.qcow2` file copied from this repository.
## Optional Notes
In no particular order,
* For the RX 5700XT, the boot-args `agdpmod=pikera` is necessary to successfully boot. Change in `NVRAM > UUID > boot-args (right-click) > WhateverGreen > agdpmod=pikera`
* Use VNC or another GPU until able to configure the EFI partition, or pre-configure the qcow2 file
* Simplify updates by creating another VM template that does not passthrough the GPU (noVNC)
* During OS updates, multiple restarts occur. If you use an AMD GPU that has the reset-bug, this process can be jarring
* Each restart there will be another boot option alongside your default one (from the update), choose that one until the update is complete
* For passing PCIe USB controllers. ensure they work with macOS and ensure its free by vfio-bind them on server boot
When there is a home for this section, feel free to share optimizations and configurations that require modifications to the qemu args, XML, config plist, etc.
## Misc
qemu args
```
<qemu:commandline>
<qemu:arg value='-usb'/>
<qemu:arg value='-device'/>
<qemu:arg value='usb-kbd,bus=usb-bus.0'/>
<qemu:arg value='-device'/>
<qemu:arg value='isa-applesmc,osk=ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc'/>
<qemu:arg value='-smbios'/>
<qemu:arg value='type=2'/>
<qemu:arg value='-cpu'/>
<qemu:arg value='Penryn,kvm=on,vendor=GenuineIntel,+invtsc,vmware-cpuid-freq=on,+pcid,+ssse3,+sse4.2,+popcnt,+avx,+aes,+xsave,+xsaveopt,check'/>
</qemu:commandline>
```
## Resources
* [https://forums.unraid.net/topic/84430-hackintosh-tips-to-make-a-bare-metal-macos/](https://forums.unraid.net/topic/84430-hackintosh-tips-to-make-a-bare-metal-macos/)
* [SpaceInvaderOne: How to Easily Install macOS Catalina Mojave or HighSierra as a VM on Unraid](https://www.youtube.com/watch?v=g_jk9D2e5q0)
* [Macinabox GitHub Repository](https://github.com/SpaceinvaderOne/Macinabox)

71
Xcode-Tutorial.md Normal file
View file

@ -0,0 +1,71 @@
### Developing on Virtualized macOS
1. Install Xcode from the Apple App Store or from the [Apple developer website](https://developers.apple.com).
2. Create an Xcode project as usual.
3. Connect the `Apple Device` (called `iPhone` from now on) to the macOS VM.
This can be done in two ways:
Method 1: Use USB passthrough technique to connect an entire USB controller
(to which `iPhone` is connected) to the macOS VM. This method is covered in
these [notes](notes.md#usb-passthrough-notes).
If USB passthrough is not an option, use `Method 2`.
Method 2. You can use the [USB Network Gate](https://www.eltima.com/products/usb-over-ethernet/)
software to pass USB devices to macOS VMs over the network (LAN / Wi-Fi).
![USB Network Gate - USB over Ethernet Sharing Software](https://www.eltima.com/imgnew/products/usb-over-ethernet/illustrationShare.png)
This software comes with a free trial and supports a wide variety of
operating systems. If your operating system is not supported directly, you can
deploy this software on a Raspberry Pi.
Once you have it installed on the host computer (the one with the USB device
that you will be sharing), you can install it on the macOS VM. Make sure to
allow the extension in `System Preferences > Security & Privacy` and reboot.
Once that is finished, you can open up `USB Network Gate` on the client
(macOS VM) and click `Add Server` and type in the IP address of the Raspberry Pi
or other device (to which the `iPhone` is connected). Finally, you have to
trust the computer on your `iPhone`, and it should be completely set up!
At this point, the `iPhone` should work as usual - showing up in
Finder, Xcode, etc.
4. At this point, the macOS VM has an Xcode project and has access to the
`iPhone`. Continue using Xcode as usual to build, deploy, and test the Xcode
project.
### Setup USB Network Gate on Raspberry Pi
These steps were tested on RPi 3B+ running `Raspberry Pi OS with desktop
(August 20th 2020)`.
```
sudo apt update
sudo apt upgrade -y
sudo reboot
sudo apt install raspberrypi-kernel-headers
wget https://cdn.electronic.us/products/usb-over-ethernet/linux/download/eveusb_armv7l.deb
sudo apt install ./eveusb_armv7l.deb
```
To get proper VNC resolution (for headless systems), insert the following lines
in `/boot/config.txt` on the RPi system.
```
dtparam=audio=on # note: existing line
hdmi_force_hotplug=1
hdmi_group=2
hdmi_mode=82
```
Enable VNC on the RPi system using the `sudo raspi-config nonint do_vnc 0`
command.

453
backups/fetch-macOS.py Executable file
View file

@ -0,0 +1,453 @@
#!/usr/bin/env python3
# encoding: utf-8
#
# https://github.com/munki/macadmin-scripts/blob/master/installinstallmacos.py
#
# Copyright 2017 Greg Neagle.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Thanks to Tim Sutton for ideas, suggestions, and sample code.
#
# Updated in May of 2019 by Dhiru Kholia.
'''installinstallmacos.py
A tool to download the parts for an Install macOS app from Apple's
softwareupdate servers and install a functioning Install macOS app onto an
empty disk image'''
# https://github.com/foxlet/macOS-Simple-KVM/blob/master/tools/FetchMacOS/fetch-macos.py
# is pretty similar.
# Bad hack
import warnings
warnings.filterwarnings("ignore", category=DeprecationWarning)
import os
import gzip
import argparse
import plistlib
import subprocess
from xml.dom import minidom
from xml.parsers.expat import ExpatError
import sys
if sys.version_info[0] < 3:
import urlparse as urlstuff
else:
import urllib.parse as urlstuff
# Quick fix for python 3.9 and above
if sys.version_info[0] == 3 and sys.version_info[1] >= 9:
from types import MethodType
def readPlist(self,filepath):
with open(filepath, 'rb') as f:
p = plistlib._PlistParser(dict)
rootObject = p.parse(f)
return rootObject
# adding the method readPlist() to plistlib
plistlib.readPlist = MethodType(readPlist, plistlib)
# https://github.com/foxlet/macOS-Simple-KVM/blob/master/tools/FetchMacOS/fetch-macos.py (unused)
# https://github.com/munki/macadmin-scripts
catalogs = {
"CustomerSeed": "https://swscan.apple.com/content/catalogs/others/index-10.16customerseed-10.16-10.15-10.14-10.13-10.12-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog",
"DeveloperSeed": "https://swscan.apple.com/content/catalogs/others/index-10.16seed-10.16-10.15-10.14-10.13-10.12-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog",
"PublicSeed": "https://swscan.apple.com/content/catalogs/others/index-10.16beta-10.16-10.15-10.14-10.13-10.12-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog",
"PublicRelease": "https://swscan.apple.com/content/catalogs/others/index-10.16-10.15-10.14-10.13-10.12-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog",
"20": "https://swscan.apple.com/content/catalogs/others/index-11-10.15-10.14-10.13-10.12-10.11-10.10-10.9-mountainlion-lion-snowleopard-leopard.merged-1.sucatalog"
}
def get_default_catalog():
'''Returns the default softwareupdate catalog for the current OS'''
return catalogs["20"]
# return catalogs["PublicRelease"]
# return catalogs["DeveloperSeed"]
class ReplicationError(Exception):
'''A custom error when replication fails'''
pass
def cmd_exists(cmd):
return subprocess.call("type " + cmd, shell=True,
stdout=subprocess.PIPE, stderr=subprocess.PIPE) == 0
def replicate_url(full_url,
root_dir='/tmp',
show_progress=False,
ignore_cache=False,
attempt_resume=False, installer=False, product_title=""):
'''Downloads a URL and stores it in the same relative path on our
filesystem. Returns a path to the replicated file.'''
# hack
print("[+] Fetching %s" % full_url)
if installer and "BaseSystem.dmg" not in full_url and "Big Sur" not in product_title:
return
if "Big Sur" in product_title and "InstallAssistant.pkg" not in full_url:
return
attempt_resume = True
# path = urllib.parse.urlsplit(full_url)[2]
path = urlstuff.urlsplit(full_url)[2]
relative_url = path.lstrip('/')
relative_url = os.path.normpath(relative_url)
# local_file_path = os.path.join(root_dir, relative_url)
local_file_path = relative_url
# print("Downloading %s..." % full_url)
if cmd_exists('wget'):
if not installer:
download_cmd = ['wget', "-c", "--quiet", "-x", "-nH", full_url]
# this doesn't work as there are multiple metadata files with the same name!
# download_cmd = ['wget', "-c", "--quiet", full_url]
else:
download_cmd = ['wget', "-c", full_url]
else:
if not installer:
download_cmd = ['curl', "--silent", "--show-error", "-o", local_file_path, "--create-dirs", full_url]
else:
local_file_path = os.path.basename(local_file_path)
download_cmd = ['curl', "-o", local_file_path, full_url]
try:
subprocess.check_call(download_cmd)
except subprocess.CalledProcessError as err:
raise ReplicationError(err)
return local_file_path
def parse_server_metadata(filename):
'''Parses a softwareupdate server metadata file, looking for information
of interest.
Returns a dictionary containing title, version, and description.'''
title = ''
vers = ''
try:
md_plist = plistlib.readPlist(filename)
except (OSError, IOError, ExpatError) as err:
print('Error reading %s: %s' % (filename, err), file=sys.stderr)
return {}
vers = md_plist.get('CFBundleShortVersionString', '')
localization = md_plist.get('localization', {})
preferred_localization = (localization.get('English') or
localization.get('en'))
if preferred_localization:
title = preferred_localization.get('title', '')
metadata = {}
metadata['title'] = title
metadata['version'] = vers
"""
{'title': 'macOS Mojave', 'version': '10.14.5'}
{'title': 'macOS Mojave', 'version': '10.14.6'}
"""
return metadata
def get_server_metadata(catalog, product_key, workdir, ignore_cache=False):
'''Replicate ServerMetaData'''
try:
url = catalog['Products'][product_key]['ServerMetadataURL']
try:
smd_path = replicate_url(
url, root_dir=workdir, ignore_cache=ignore_cache)
return smd_path
except ReplicationError as err:
print('Could not replicate %s: %s' % (url, err), file=sys.stderr)
return None
except KeyError:
# print('Malformed catalog.', file=sys.stderr)
return None
def parse_dist(filename):
'''Parses a softwareupdate dist file, returning a dict of info of
interest'''
dist_info = {}
try:
dom = minidom.parse(filename)
except ExpatError:
print('Invalid XML in %s' % filename, file=sys.stderr)
return dist_info
except IOError as err:
print('Error reading %s: %s' % (filename, err), file=sys.stderr)
return dist_info
titles = dom.getElementsByTagName('title')
if titles:
dist_info['title_from_dist'] = titles[0].firstChild.wholeText
auxinfos = dom.getElementsByTagName('auxinfo')
if not auxinfos:
return dist_info
auxinfo = auxinfos[0]
key = None
value = None
children = auxinfo.childNodes
# handle the possibility that keys from auxinfo may be nested
# within a 'dict' element
dict_nodes = [n for n in auxinfo.childNodes
if n.nodeType == n.ELEMENT_NODE and
n.tagName == 'dict']
if dict_nodes:
children = dict_nodes[0].childNodes
for node in children:
if node.nodeType == node.ELEMENT_NODE and node.tagName == 'key':
key = node.firstChild.wholeText
if node.nodeType == node.ELEMENT_NODE and node.tagName == 'string':
value = node.firstChild.wholeText
if key and value:
dist_info[key] = value
key = None
value = None
return dist_info
def download_and_parse_sucatalog(sucatalog, workdir, ignore_cache=False):
'''Downloads and returns a parsed softwareupdate catalog'''
try:
localcatalogpath = replicate_url(
sucatalog, root_dir=workdir, ignore_cache=ignore_cache)
except ReplicationError as err:
print('Could not replicate %s: %s' % (sucatalog, err), file=sys.stderr)
exit(-1)
if os.path.splitext(localcatalogpath)[1] == '.gz':
with gzip.open(localcatalogpath) as the_file:
content = the_file.read()
try:
catalog = plistlib.readPlistFromString(content)
return catalog
except ExpatError as err:
print('Error reading %s: %s' % (localcatalogpath, err), file=sys.stderr)
exit(-1)
else:
try:
catalog = plistlib.readPlist(localcatalogpath)
return catalog
except (OSError, IOError, ExpatError) as err:
print('Error reading %s: %s' % (localcatalogpath, err), file=sys.stderr)
exit(-1)
def find_mac_os_installers(catalog):
'''Return a list of product identifiers for what appear to be macOS
installers'''
mac_os_installer_products = []
if 'Products' in catalog:
for product_key in catalog['Products'].keys():
product = catalog['Products'][product_key]
try:
if product['ExtendedMetaInfo'][
'InstallAssistantPackageIdentifiers']:
mac_os_installer_products.append(product_key)
except KeyError:
continue
return mac_os_installer_products
def os_installer_product_info(catalog, workdir, ignore_cache=False):
'''Returns a dict of info about products that look like macOS installers'''
product_info = {}
installer_products = find_mac_os_installers(catalog)
for product_key in installer_products:
product_info[product_key] = {}
filename = get_server_metadata(catalog, product_key, workdir)
if filename:
product_info[product_key] = parse_server_metadata(filename)
else:
# print('No server metadata for %s' % product_key)
product_info[product_key]['title'] = None
product_info[product_key]['version'] = None
product = catalog['Products'][product_key]
product_info[product_key]['PostDate'] = product['PostDate']
distributions = product['Distributions']
dist_url = distributions.get('English') or distributions.get('en')
try:
dist_path = replicate_url(
dist_url, root_dir=workdir, ignore_cache=ignore_cache)
except ReplicationError as err:
print('Could not replicate %s: %s' % (dist_url, err),
file=sys.stderr)
else:
dist_info = parse_dist(dist_path)
product_info[product_key]['DistributionPath'] = dist_path
product_info[product_key].update(dist_info)
if not product_info[product_key]['title']:
product_info[product_key]['title'] = dist_info.get('title_from_dist')
if not product_info[product_key]['version']:
product_info[product_key]['version'] = dist_info.get('VERSION')
return product_info
def replicate_product(catalog, product_id, workdir, ignore_cache=False, product_title=""):
'''Downloads all the packages for a product'''
product = catalog['Products'][product_id]
for package in product.get('Packages', []):
# TO-DO: Check 'Size' attribute and make sure
# we have enough space on the target
# filesystem before attempting to download
if 'URL' in package:
try:
replicate_url(
package['URL'], root_dir=workdir,
show_progress=True, ignore_cache=ignore_cache,
attempt_resume=(not ignore_cache), installer=True, product_title=product_title)
except ReplicationError as err:
print('Could not replicate %s: %s' % (package['URL'], err), file=sys.stderr)
exit(-1)
if 'MetadataURL' in package:
try:
replicate_url(package['MetadataURL'], root_dir=workdir,
ignore_cache=ignore_cache, installer=True)
except ReplicationError as err:
print('Could not replicate %s: %s' % (package['MetadataURL'], err), file=sys.stderr)
exit(-1)
def find_installer_app(mountpoint):
'''Returns the path to the Install macOS app on the mountpoint'''
applications_dir = os.path.join(mountpoint, 'Applications')
for item in os.listdir(applications_dir):
if item.endswith('.app'):
return os.path.join(applications_dir, item)
return None
def determine_version(version, title, product_info):
if version:
if version == 'latest':
from distutils.version import StrictVersion
latest_version = StrictVersion('0.0.0')
for index, product_id in enumerate(product_info):
if not title or product_info[product_id]['title'] == title:
d = product_info[product_id]['version']
if d > latest_version:
latest_version = d
if latest_version == StrictVersion("0.0.0"):
print("Could not find latest version {}")
exit(1)
version = str(latest_version)
for index, product_id in enumerate(product_info):
v = product_info[product_id]['version']
if v == version:
return product_id, product_info[product_id]['title']
print("Could not find version {}. Versions available are:".format(version))
for _, pid in enumerate(product_info):
print("- {}".format(product_info[pid]['version']))
exit(1)
# display a menu of choices (some seed catalogs have multiple installers)
print('%2s %12s %10s %11s %s' % ('#', 'ProductID', 'Version',
'Post Date', 'Title'))
for index, product_id in enumerate(product_info):
print('%2s %12s %10s %11s %s' % (
index + 1,
product_id,
product_info[product_id]['version'],
product_info[product_id]['PostDate'].strftime('%Y-%m-%d'),
product_info[product_id]['title']
))
answer = input(
'\nChoose a product to download (1-%s): ' % len(product_info))
try:
index = int(answer) - 1
if index < 0:
raise ValueError
product_id = list(product_info.keys())[index]
return product_id, product_info[product_id]['title']
except (ValueError, IndexError):
pass
print('Invalid input provided.')
exit(0)
def main():
'''Do the main thing here'''
"""
if os.getuid() != 0:
sys.exit('This command requires root (to install packages), so please '
'run again with sudo or as root.')
"""
parser = argparse.ArgumentParser()
parser.add_argument('--workdir', metavar='path_to_working_dir',
default='.',
help='Path to working directory on a volume with over '
'10G of available space. Defaults to current working '
'directory.')
parser.add_argument('--version', metavar='version',
default=None,
help='The version to download in the format of '
'"$major.$minor.$patch", e.g. "10.15.4". Can '
'be "latest" to download the latest version.')
parser.add_argument('--title', metavar='title',
default=None,
help='When using "--version latest", you can use '
'this to filter the search to only products with '
'this title')
parser.add_argument('--compress', action='store_true',
help='Output a read-only compressed disk image with '
'the Install macOS app at the root. This is now the '
'default. Use --raw to get a read-write sparse image '
'with the app in the Applications directory.')
parser.add_argument('--raw', action='store_true',
help='Output a read-write sparse image '
'with the app in the Applications directory. Requires '
'less available disk space and is faster.')
parser.add_argument('--ignore-cache', action='store_true',
help='Ignore any previously cached files.')
args = parser.parse_args()
su_catalog_url = get_default_catalog()
if not su_catalog_url:
print('Could not find a default catalog url for this OS version.', file=sys.stderr)
exit(-1)
# download sucatalog and look for products that are for macOS installers
catalog = download_and_parse_sucatalog(
su_catalog_url, args.workdir, ignore_cache=args.ignore_cache)
product_info = os_installer_product_info(
catalog, args.workdir, ignore_cache=args.ignore_cache)
if not product_info:
print('No macOS installer products found in the sucatalog.', file=sys.stderr)
exit(-1)
product_id, product_title = determine_version(args.version, args.title, product_info)
print(product_id, product_title)
# download all the packages for the selected product
replicate_product(catalog, product_id, args.workdir, ignore_cache=args.ignore_cache, product_title=product_title)
if __name__ == '__main__':
main()

74
boot-macOS-headless.sh Executable file
View file

@ -0,0 +1,74 @@
#!/usr/bin/env bash
# Special thanks to:
# https://github.com/Leoyzen/KVM-Opencore
# https://github.com/thenickdude/KVM-Opencore/
# https://github.com/qemu/qemu/blob/master/docs/usb2.txt
#
# qemu-img create -f qcow2 mac_hdd_ng.img 128G
#
# echo 1 | sudo tee -a /sys/module/kvm/parameters/ignore_msrs # this is required
#
# Usage:
#
# $ boot-macOS-headless.sh
#
# (qemu) change vnc password
# Password: ********
#
# Note: Using RealVNC client, connect to `<localhost:5901>`.
# E.g. `vncviewer localhost:5901`
#
# Note: After installation, start using the `OpenCore-nopicker.qcow2` image.
############################################################################
# NOTE: Tweak the "MY_OPTIONS" line in case you are having booting problems!
############################################################################
# Changelog:
# - Add support for 'savevm'
# - Fix cpuid related warning on EPYC
# - Fix 'savevm' support
MY_OPTIONS="+pcid,+ssse3,+sse4.2,+popcnt,+avx,+aes,+xsave,+xsaveopt,check"
# This script works for Catalina as well as Mojave. Tested with macOS 10.14.6 and macOS 10.15.6.
ALLOCATED_RAM="3072" # MiB
CPU_SOCKETS="1"
CPU_CORES="2"
CPU_THREADS="4"
REPO_PATH="."
OVMF_DIR="."
# for snapshots
export TMPDIR=$PWD
# shellcheck disable=SC2054
args=(
-enable-kvm -m "$ALLOCATED_RAM" -cpu Penryn,kvm=on,vendor=GenuineIntel,+invtsc,vmware-cpuid-freq=on,"$MY_OPTIONS"
-machine q35
-usb -device usb-kbd -device usb-tablet
-smp "$CPU_THREADS",cores="$CPU_CORES",sockets="$CPU_SOCKETS"
-device isa-applesmc,osk="ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc"
-drive if=pflash,format=raw,readonly,snapshot=off,file="$REPO_PATH/$OVMF_DIR/OVMF_CODE.fd"
-drive if=pflash,format=raw,snapshot=on,file="$REPO_PATH/$OVMF_DIR/OVMF_VARS-1024x768.fd"
-smbios type=2
-device ich9-ahci,id=sata
# -drive id=OpenCoreBoot,if=none,snapshot=on,format=qcow2,file="$REPO_PATH/OpenCore-Catalina/OpenCore.qcow2"
-drive id=OpenCoreBoot,if=none,snapshot=on,format=qcow2,file="$REPO_PATH/OpenCore-Catalina/OpenCore-nopicker.qcow2"
-device ide-hd,bus=sata.2,drive=OpenCoreBoot
-device ide-hd,bus=sata.3,drive=InstallMedia
-drive id=InstallMedia,if=none,file="$REPO_PATH/BaseSystem.img",format=raw
# -drive id=MacHDD,if=none,snapshot=on,file="$REPO_PATH/mac_hdd_ng.img",format=qcow2
-drive id=MacHDD,if=none,snapshot=off,file="$REPO_PATH/mac_hdd_ng.img",format=qcow2
-device ide-hd,bus=sata.4,drive=MacHDD
-netdev user,id=net0 -device vmxnet3,netdev=net0,id=net0,mac=52:54:00:c9:18:27
-monitor stdio
-vga vmware
-display none
-vnc 0.0.0.0:1,password -k en-us
)
qemu-system-x86_64 "${args[@]}"

59
boot-passthrough.sh Executable file
View file

@ -0,0 +1,59 @@
#!/usr/bin/env bash
# Special thanks to:
# https://github.com/Leoyzen/KVM-Opencore
# https://github.com/thenickdude/KVM-Opencore/
# https://github.com/qemu/qemu/blob/master/docs/usb2.txt
#
# qemu-img create -f qcow2 mac_hdd_ng.img 128G
#
# echo 1 > /sys/module/kvm/parameters/ignore_msrs (this is required)
############################################################################
# NOTE: Tweak the "MY_OPTIONS" line in case you are having booting problems!
############################################################################
MY_OPTIONS="+pcid,+ssse3,+sse4.2,+popcnt,+avx,+aes,+xsave,+xsaveopt,check"
# This script works for Big Sur, Catalina, Mojave, and High Sierra. Tested with
# macOS 10.15.6, macOS 10.14.6, and macOS 10.13.6
ALLOCATED_RAM="3072" # MiB
CPU_SOCKETS="1"
CPU_CORES="2"
CPU_THREADS="4"
REPO_PATH="./"
OVMF_DIR="."
# Note: This script assumes that you are doing CPU + GPU passthrough. This
# script will need to be modified for your specific needs!
#
# We recommend doing the initial macOS installation without using passthrough
# stuff. In other words, don't use this script for the initial macOS
# installation.
# shellcheck disable=SC2054
args=(
-enable-kvm -m "$ALLOCATED_RAM" -cpu host,vendor=GenuineIntel,kvm=on,vmware-cpuid-freq=on,+invtsc,+hypervisor
-machine pc-q35-2.9
-smp "$CPU_THREADS",cores="$CPU_CORES",sockets="$CPU_SOCKETS"
-vga none
-device pcie-root-port,bus=pcie.0,multifunction=on,port=1,chassis=1,id=port.1
-device vfio-pci,host=01:00.0,bus=port.1,multifunction=on
-device vfio-pci,host=01:00.1,bus=port.1
-usb -device usb-kbd -device usb-tablet
-device isa-applesmc,osk="ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc"
-drive if=pflash,format=raw,readonly,file="$REPO_PATH/$OVMF_DIR/OVMF_CODE.fd"
-drive if=pflash,format=raw,file="$REPO_PATH/$OVMF_DIR/OVMF_VARS-1024x768.fd"
-smbios type=2
-drive id=MacHDD,if=none,file=./mac_hdd_ng.img
-device ide-drive,bus=sata.2,drive=MacHDD
-drive id=OpenCoreBoot,if=none,snapshot=on,format=qcow2,file="$REPO_PATH/OpenCore-Catalina/OpenCore-Passthrough.qcow2"
-device ide-hd,bus=sata.3,drive=OpenCoreBoot
-netdev tap,id=net0,ifname=tap0,script=no,downscript=no -device vmxnet3,netdev=net0,id=net0,mac=52:54:00:c9:18:27
-monitor stdio
-display none
)
qemu-system-x86_64 "${args[@]}"

1
bridge.conf Normal file
View file

@ -0,0 +1 @@
allow virbr0

491
fetch-macOS-v2.py Executable file
View file

@ -0,0 +1,491 @@
#!/usr/bin/env python3
# pylint: disable=C0301,C0116,C0103,R0903
"""
Gather recovery information for Macs.
Copyright (c) 2019, vit9696
macrecovery is a tool that helps to automate recovery interaction. It can be
used to download diagnostics and recovery as well as analyse MLB.
Requires python to run. Run with `-h` argument to see all available arguments.
Upstream: https://github.com/acidanthera/OpenCorePkg/tree/master/Utilities/macrecovery
pylint -> Your code has been rated at -0.08/10 ;(
"""
import os
import sys
import json
import random
import argparse
try:
from urllib.request import Request, urlopen
from urllib.parse import urlparse
except ImportError:
from urllib2 import Request, urlopen
from urlparse import urlparse
SELF_DIR = os.path.dirname(os.path.realpath(__file__))
RECENT_MAC = 'Mac-7BA5B2D9E42DDD94'
MLB_ZERO = '00000000000000000'
MLB_VALID = 'C02749200YGJ803AX'
MLB_PRODUCT = '00000000000J80300'
TYPE_SID = 16
TYPE_K = 64
TYPE_FG = 64
INFO_PRODUCT = 'AP'
INFO_IMAGE_LINK = 'AU'
INFO_IMAGE_HASH = 'AH'
INFO_IMAGE_SESS = 'AT'
INFO_SIGN_LINK = 'CU'
INFO_SIGN_HASH = 'CH'
INFO_SIGN_SESS = 'CT'
INFO_REQURED = [INFO_PRODUCT, INFO_IMAGE_LINK, INFO_IMAGE_HASH, INFO_IMAGE_SESS,
INFO_SIGN_LINK, INFO_SIGN_HASH, INFO_SIGN_SESS]
def run_query(url, headers, post=None, raw=False):
if post is not None:
data = '\n'.join([entry + '=' + post[entry] for entry in post])
if sys.version_info[0] >= 3:
data = data.encode('utf-8')
else:
data = None
req = Request(url=url, headers=headers, data=data)
response = urlopen(req)
if raw:
return response
return dict(response.info()), response.read()
def generate_id(itype, nid=None):
valid_chars = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F']
if nid is None:
return ''.join(random.choice(valid_chars) for i in range(itype))
return nid
def product_mlb(mlb):
return '00000000000' + mlb[11] + mlb[12] + mlb[13] + mlb[14] + '00'
def mlb_from_eeee(eeee):
if len(eeee) != 4:
print('ERROR: Invalid EEEE code length!')
sys.exit(1)
return '00000000000' + eeee + '00'
def get_session(args):
headers = {
'Host': 'osrecovery.apple.com',
'Connection': 'close',
'User-Agent': 'InternetRecovery/1.0',
}
headers, output = run_query('http://osrecovery.apple.com/', headers)
if args.verbose:
print('Session headers:')
for header in headers:
print('{}: {}'.format(header, headers[header]))
for header in headers:
if header.lower() == 'set-cookie':
cookies = headers[header].split('; ')
for cookie in cookies:
if cookie.startswith('session='):
return cookie
raise RuntimeError('No session in headers ' + str(headers))
def get_image_info(session, bid, mlb=MLB_ZERO, diag=False, os_type='default', cid=None):
headers = {
'Host': 'osrecovery.apple.com',
'Connection': 'close',
'User-Agent': 'InternetRecovery/1.0',
'Cookie': session,
'Content-Type': 'text/plain',
}
post = {
'cid': generate_id(TYPE_SID, cid),
'sn': mlb,
'bid': bid,
'k': generate_id(TYPE_K),
'fg': generate_id(TYPE_FG)
}
if diag:
url = 'http://osrecovery.apple.com/InstallationPayload/Diagnostics'
else:
url = 'http://osrecovery.apple.com/InstallationPayload/RecoveryImage'
post['os'] = os_type
headers, output = run_query(url, headers, post)
if sys.version_info[0] >= 3:
output = output.decode('utf-8')
info = {}
for line in output.split('\n'):
try:
key, value = line.split(': ')
info[key] = value
except:
continue
for k in INFO_REQURED:
if k not in info:
raise RuntimeError('Missing key ' + k)
return info
def save_image(url, sess, filename='', directory=''):
purl = urlparse(url)
headers = {
'Host': purl.hostname,
'Connection': 'close',
'User-Agent': 'InternetRecovery/1.0',
'Cookie': '='.join(['AssetToken', sess])
}
if filename == '':
filename = os.path.basename(purl.path)
if filename.find('/') >= 0 or filename == '':
raise RuntimeError('Invalid save path ' + filename)
print('Saving ' + url + ' to ' + filename + '...')
with open(os.path.join(directory, filename), 'wb') as fhandle:
response = run_query(url, headers, raw=True)
total_size = int(response.headers['content-length']) / float(2 ** 20)
# print(total_size)
if total_size < 1:
total_size = response.headers['content-length']
print("Note: The total download size is %s bytes" % total_size)
else:
print("Note: The total download size is %0.2f MB" % total_size)
size = 0
while True:
chunk = response.read(2 ** 20)
if not chunk:
break
fhandle.write(chunk)
size += len(chunk)
print('\r{} MBs downloaded...'.format(size / (2 ** 20)), end='')
sys.stdout.flush()
print('\rDownload complete!' + ' ' * 32)
def action_download(args):
"""
Reference information for queries:
Recovery latest:
cid=3076CE439155BA14
sn=...
bid=Mac-E43C1C25D4880AD6
k=4BE523BB136EB12B1758C70DB43BDD485EBCB6A457854245F9E9FF0587FB790C
os=latest
fg=B2E6AA07DB9088BE5BDB38DB2EA824FDDFB6C3AC5272203B32D89F9D8E3528DC
Recovery default:
cid=4A35CB95FF396EE7
sn=...
bid=Mac-E43C1C25D4880AD6
k=0A385E6FFC3DDD990A8A1F4EC8B98C92CA5E19C9FF1DD26508C54936D8523121
os=default
fg=B2E6AA07DB9088BE5BDB38DB2EA824FDDFB6C3AC5272203B32D89F9D8E3528DC
Diagnostics:
cid=050C59B51497CEC8
sn=...
bid=Mac-E43C1C25D4880AD6
k=37D42A8282FE04A12A7D946304F403E56A2155B9622B385F3EB959A2FBAB8C93
fg=B2E6AA07DB9088BE5BDB38DB2EA824FDDFB6C3AC5272203B32D89F9D8E3528DC
"""
session = get_session(args)
info = get_image_info(session, bid=args.board_id, mlb=args.mlb,
diag=args.diagnostics, os_type=args.os_type)
if args.verbose:
print(info)
print('Downloading ' + info[INFO_PRODUCT] + '...')
dmgname = '' if args.basename == '' else args.basename + '.dmg'
save_image(info[INFO_IMAGE_LINK], info[INFO_IMAGE_SESS], dmgname, args.outdir)
cnkname = '' if args.basename == '' else args.basename + '.chunklist'
save_image(info[INFO_SIGN_LINK], info[INFO_SIGN_SESS], cnkname, args.outdir)
return 0
def action_selfcheck(args):
"""
Sanity check server logic for recovery:
if not valid(bid):
return error()
ppp = get_ppp(sn)
if not valid(ppp):
return latest_recovery(bid = bid) # Returns newest for bid.
if valid(sn):
if os == 'default':
return default_recovery(sn = sn, ppp = ppp) # Returns oldest for sn.
else:
return latest_recovery(sn = sn, ppp = ppp) # Returns newest for sn.
return default_recovery(ppp = ppp) # Returns oldest.
"""
session = get_session(args)
valid_default = get_image_info(session, bid=RECENT_MAC, mlb=MLB_VALID,
diag=False, os_type='default')
valid_latest = get_image_info(session, bid=RECENT_MAC, mlb=MLB_VALID,
diag=False, os_type='latest')
product_default = get_image_info(session, bid=RECENT_MAC, mlb=MLB_PRODUCT,
diag=False, os_type='default')
product_latest = get_image_info(session, bid=RECENT_MAC, mlb=MLB_PRODUCT,
diag=False, os_type='latest')
generic_default = get_image_info(session, bid=RECENT_MAC, mlb=MLB_ZERO,
diag=False, os_type='default')
generic_latest = get_image_info(session, bid=RECENT_MAC, mlb=MLB_ZERO,
diag=False, os_type='latest')
if args.verbose:
print(valid_default)
print(valid_latest)
print(product_default)
print(product_latest)
print(generic_default)
print(generic_latest)
if valid_default[INFO_PRODUCT] == valid_latest[INFO_PRODUCT]:
# Valid MLB must give different default and latest if this is not a too new product.
print('ERROR: Cannot determine any previous product, got {}'.format(valid_default[INFO_PRODUCT]))
return 1
if product_default[INFO_PRODUCT] != product_latest[INFO_PRODUCT]:
# Product-only MLB must give the same value for default and latest.
print('ERROR: Latest and default do not match for product MLB, got {} and {}'.format(
product_default[INFO_PRODUCT], product_latest[INFO_PRODUCT]))
return 1
if generic_default[INFO_PRODUCT] != generic_latest[INFO_PRODUCT]:
# Zero MLB always give the same value for default and latest.
print('ERROR: Generic MLB gives different product, got {} and {}'.format(
generic_default[INFO_PRODUCT], generic_latest[INFO_PRODUCT]))
return 1
if valid_latest[INFO_PRODUCT] != generic_latest[INFO_PRODUCT]:
# Valid MLB must always equal generic MLB.
print('ERROR: Cannot determine unified latest product, got {} and {}'.format(
valid_latest[INFO_PRODUCT], generic_latest[INFO_PRODUCT]))
return 1
if product_default[INFO_PRODUCT] != valid_default[INFO_PRODUCT]:
# Product-only MLB can give the same value with valid default MLB.
# This is not an error for all models, but for our chosen code it is.
print('ERROR: Valid and product MLB give mismatch, got {} and {}'.format(
product_default[INFO_PRODUCT], valid_default[INFO_PRODUCT]))
return 1
print('SUCCESS: Found no discrepancies with MLB validation algorithm!')
return 0
def action_verify(args):
"""
Try to verify MLB serial number.
"""
session = get_session()
generic_latest = get_image_info(session, bid=RECENT_MAC, mlb=MLB_ZERO,
diag=False, os_type='latest')
uvalid_default = get_image_info(session, bid=args.board_id, mlb=args.mlb,
diag=False, os_type='default')
uvalid_latest = get_image_info(session, bid=args.board_id, mlb=args.mlb,
diag=False, os_type='latest')
uproduct_default = get_image_info(session, bid=args.board_id, mlb=product_mlb(args.mlb),
diag=False, os_type='default')
if args.verbose:
print(generic_latest)
print(uvalid_default)
print(uvalid_latest)
print(uproduct_default)
# Verify our MLB number.
if uvalid_default[INFO_PRODUCT] != uvalid_latest[INFO_PRODUCT]:
if uvalid_latest[INFO_PRODUCT] == generic_latest[INFO_PRODUCT]:
print('SUCCESS: {} MLB looks valid and supported!'.format(args.mlb))
else:
print('SUCCESS: {} MLB looks valid, but probably unsupported!'.format(args.mlb))
return 0
print('UNKNOWN: Run selfcheck, check your board-id, or try again later!')
# Here we have matching default and latest products. This can only be true for very
# new models. These models get either latest or special builds.
if uvalid_default[INFO_PRODUCT] == generic_latest[INFO_PRODUCT]:
print('UNKNOWN: {} MLB can be valid if very new!'.format(args.mlb))
return 0
if uproduct_default[INFO_PRODUCT] != uvalid_default[INFO_PRODUCT]:
print('UNKNOWN: {} MLB looks invalid, other models use product {} instead of {}!'.format(
args.mlb, uproduct_default[INFO_PRODUCT], uvalid_default[INFO_PRODUCT]))
return 0
print('UNKNOWN: {} MLB can be valid if very new and using special builds!'.format(args.mlb))
return 0
def action_guess(args):
"""
Attempt to guess which model does this MLB belong.
"""
mlb = args.mlb
anon = mlb.startswith('000')
with open(args.board_db, 'r') as fhandle:
db = json.load(fhandle)
supported = {}
session = get_session(args)
generic_latest = get_image_info(session, bid=RECENT_MAC, mlb=MLB_ZERO,
diag=False, os_type='latest')
for model in db:
try:
if anon:
# For anonymous lookup check when given model does not match latest.
model_latest = get_image_info(session, bid=model, mlb=MLB_ZERO,
diag=False, os_type='latest')
if model_latest[INFO_PRODUCT] != generic_latest[INFO_PRODUCT]:
if db[model] == 'current':
print('WARN: Skipped {} due to using latest product {} instead of {}'.format(
model, model_latest[INFO_PRODUCT], generic_latest[INFO_PRODUCT]))
continue
user_default = get_image_info(session, bid=model, mlb=mlb,
diag=False, os_type='default')
if user_default[INFO_PRODUCT] != generic_latest[INFO_PRODUCT]:
supported[model] = [db[model], user_default[INFO_PRODUCT], generic_latest[INFO_PRODUCT]]
else:
# For normal lookup check when given model has mismatching normal and latest.
user_latest = get_image_info(session, bid=model, mlb=mlb,
diag=False, os_type='latest')
user_default = get_image_info(session, bid=model, mlb=mlb,
diag=False, os_type='default')
if user_latest[INFO_PRODUCT] != user_default[INFO_PRODUCT]:
supported[model] = [db[model], user_default[INFO_PRODUCT], user_latest[INFO_PRODUCT]]
except Exception as e:
print('WARN: Failed to check {}, exception: {}'.format(model, str(e)))
if len(supported) > 0:
print('SUCCESS: MLB {} looks supported for:'.format(mlb))
for model in supported:
print('- {}, up to {}, default: {}, latest: {}'.format(model, supported[model][0],
supported[model][1], supported[model][2]))
return 0
print('UNKNOWN: Failed to determine supported models for MLB {}!'.format(mlb))
# https://stackoverflow.com/questions/2280334/shortest-way-of-creating-an-object-with-arbitrary-attributes-in-python
class gdata:
"""
A string to make pylint happy ;)
"""
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
def main():
parser = argparse.ArgumentParser(description='Gather recovery information for Macs')
parser.add_argument('--action', choices=['download', 'selfcheck', 'verify', 'guess'], default='',
help='Action to perform: "download" - performs recovery downloading,'
' "selfcheck" checks whether MLB serial validation is possible, "verify" performs'
' MLB serial verification, "guess" tries to find suitable mac model for MLB.')
parser.add_argument('-o', '--outdir', type=str, default=os.getcwd(),
help='customise output directory for downloading, defaults to current directory')
parser.add_argument('-n', '--basename', type=str, default='',
help='customise base name for downloading, defaults to remote name')
parser.add_argument('-b', '--board-id', type=str, default=RECENT_MAC,
help='use specified board identifier for downloading, defaults to ' + RECENT_MAC)
parser.add_argument('-m', '--mlb', type=str, default=MLB_ZERO,
help='use specified logic board serial for downloading, defaults to ' + MLB_ZERO)
parser.add_argument('-e', '--code', type=str, default='',
help='generate product logic board serial with specified product EEEE code')
parser.add_argument('-os', '--os-type', type=str, default='default', choices=['default', 'latest'],
help='use specified os type, defaults to default ' + MLB_ZERO)
parser.add_argument('-diag', '--diagnostics', action='store_true', help='download diagnostics image')
parser.add_argument('-v', '--verbose', action='store_true', help='print debug information')
parser.add_argument('-db', '--board-db', type=str, default=os.path.join(SELF_DIR, 'boards.json'),
help='use custom board list for checking, defaults to boards.json')
args = parser.parse_args()
if args.code != '':
args.mlb = mlb_from_eeee(args.code)
if len(args.mlb) != 17:
print('ERROR: Cannot use MLBs in non 17 character format!')
sys.exit(1)
if args.action == 'download':
return action_download(args)
if args.action == 'selfcheck':
return action_selfcheck(args)
if args.action == 'verify':
return action_verify(args)
if args.action == 'guess':
return action_guess(args)
# No action specified, so present a download menu instead
products = [
{"name": "High Sierra (10.13)", "b": "Mac-7BA5B2D9E42DDD94", "m": "00000000000J80300"},
{"name": "Mojave (10.14)", "b": "Mac-7BA5B2DFE22DDD8C", "m": "00000000000KXPG00"},
{"name": "Catalina (10.15) - RECOMMENDED", "b": "Mac-00BE6ED71E35EB86", "m": "00000000000000000"},
# {"name": "Latest (Big Sur - 11)", "b": "Mac-E43C1C25D4880AD6", "m": "00000000000000000", "os_type": "latest"}
{"name": "Latest (Big Sur - 11)", "b": "Mac-E43C1C25D4880AD6", "m": "00000000000000000", "os_type": "default"}
]
for index, product in enumerate(products):
name = product["name"]
print('%s. %12s' % (index + 1, name))
answer = input('\nChoose a product to download (1-%s): ' % len(products))
try:
index = int(answer) - 1
if index < 0:
raise ValueError
except (ValueError, IndexError):
pass
# action
product = products[index]
try:
os_type = product["os_type"]
except:
os_type = "default"
args = gdata(mlb = product["m"], board_id = product["b"], diagnostics =
False, os_type = os_type, verbose=False, basename="", outdir=".")
action_download(args)
if __name__ == '__main__':
sys.exit(main())

View file

@ -0,0 +1,33 @@
1. How do I symbolicate kernel panic traces?
Just add keepsyms=1 to either the Kernel Flags setting in /Library/Preferences/SystemConfiguration/com.apple.Boot.plist,
or to the boot-args NVRAM variable. Reboot, and any subsequent panics will be automatically symbolicated. You can run
mangled C++ symbols through the c++filt command line utility to get the proper C++ function signatures.
$ sudo nvram boot-args="-v keepsyms=1"
Thanks for Phil Dennis-Jordan for this great tip.
2. Debugging a AVX related crash which occurs at bootup.
$ nm /System/Library/Extensions/corecrypto.kext/Contents/MacOS/corecrypto | grep avx
0000000000001840 T _ccsha256_vng_intel_avx1_compress
0000000000036708 T _ccsha256_vng_intel_avx2_compress
0000000000026973 T _ccsha512_vng_intel_avx1_compress
00000000000327cb T _ccsha512_vng_intel_avx2_compress
000000000001d960 T _gcmDecrypt_avx1
000000000001c980 T _gcmEncrypt_avx1
$ gdb /System/Library/Extensions/corecrypto.kext/Contents/MacOS/corecrypto
(gdb) x/16i 0x0000000000001840
0x1840: push %rbp
0x1841: mov %rsp,%rbp
0x1844: push %rbx
0x1845: push %r12
0x1847: push %r13
0x1849: push %r14
0x184b: push %r15
0x184d: sub $0x168,%rsp
0x1854: lea 0x60(%rsp),%rax
0x1859: and $0xffffffffffffffe0,%rax
0x185d: vmovdqa %ymm0,(%rax) <--- the crash occurs here due to lack of "xsave" support

3
kvm.conf Normal file
View file

@ -0,0 +1,3 @@
options kvm_intel nested=1
options kvm_intel emulate_invalid_guest_state=0
options kvm ignore_msrs=1 report_ignored_msrs=0

4
macOS-Cloud.md Normal file
View file

@ -0,0 +1,4 @@
Add notes from Constantin Jacob.
Note: This pretty much violates everything hardware-wise in the macOS EULA that
one could violate.

211
macOS-libvirt-Catalina.xml Normal file
View file

@ -0,0 +1,211 @@
<?xml version='1.0' encoding='UTF-8'?>
<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
<!--
macOS libvirt XML configuration.
Run "virt-xml-validate macOS-libvirt-Catalina.xml" to validate this file.
To install this file, you may place it at ~/.config/libvirt/qemu/
and run: virsh define macOS-libvirt.xml.
This configuration has been tested in Ubuntu 20.04 with stock QEMU-KVM.
Move/rename images and loader/nvmram files and paths as you wish.
!!! Don't forget to replace CHANGEME with your values !!!
Adjust memory and currentMemory to 3145728 if you want only 3 GiB.
Consider removing some cpu features if your hardware lacks support.
Replace spice with vnc if you prefer it.
Current network configuration is a local bridge (192.157.12x.x).
Change it to if you prefer a public bridge instead:
Change interface to <interface type='user'>
and remove the <source bridge='virbr0'/>
Or use virt-manager to edit this line instead of virsh edit.
Note: Default configuration caused severe clock problems
under Fedora 27 w/ i7-5820K. This is because Darwin uses
tsc (time since last tick) for time, and for me did not
fall back to rtc in the event of a clock mismatch with
libvirt's default time source. Therefore we must explicitly
give the clock a tsc timer for kvm to pass to the guest.
See comments on the <kvm> and <clock> attributes.
-->
<name>macOS</name>
<uuid>2aca0dd6-cec9-4717-9ab2-0b7b13d111c3</uuid>
<title>macOS</title>
<memory unit='KiB'>4194304</memory>
<currentMemory unit='KiB'>4194304</currentMemory>
<vcpu placement='static'>4</vcpu>
<os>
<type arch='x86_64' machine='pc-q35-4.2'>hvm</type>
<!-- We don't need patched OVMF anymore when using latest OpenCore, stock one is okay -->
<loader readonly='yes' type='pflash'>/home/CHANGEME/OSX-KVM/OVMF_CODE.fd</loader>
<nvram>/home/CHANGEME/OSX-KVM/OVMF_VARS-1024x768.fd</nvram>
</os>
<features>
<acpi/>
<apic/>
</features>
<clock offset='utc'>
<timer name='rtc' tickpolicy='catchup'/>
<timer name='pit' tickpolicy='delay'/>
<timer name='hpet' present='no'/>
</clock>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' cache='writeback' io='threads'/>
<source file='/home/CHANGEME/OSX-KVM/OpenCore-Catalina/OpenCore.qcow2'/>
<target dev='sda' bus='sata'/>
<boot order='2'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' cache='writeback' io='threads'/>
<source file='/home/CHANGEME/OSX-KVM/mac_hdd_ng.img'/>
<target dev='sdb' bus='sata'/>
<boot order='1'/>
<address type='drive' controller='0' bus='0' target='0' unit='1'/>
</disk>
<disk type="file" device="disk">
<driver name="qemu" type="raw" cache="writeback"/>
<source file="/home/CHANGEME/OSX-KVM/BaseSystem.img"/>
<target dev="sdc" bus="sata"/>
<boot order="3"/>
<address type="drive" controller="0" bus="0" target="0" unit="2"/>
</disk>
<controller type='sata' index='0'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x2'/>
</controller>
<controller type='pci' index='0' model='pcie-root'/>
<controller type='pci' index='1' model='pcie-root-port'>
<model name='pcie-root-port'/>
<target chassis='1' port='0x8'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0' multifunction='on'/>
</controller>
<controller type='pci' index='2' model='pcie-root-port'>
<model name='pcie-root-port'/>
<target chassis='2' port='0x9'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
</controller>
<controller type='pci' index='3' model='pcie-root-port'>
<model name='pcie-root-port'/>
<target chassis='3' port='0xa'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
</controller>
<controller type='pci' index='4' model='pcie-root-port'>
<model name='pcie-root-port'/>
<target chassis='4' port='0xb'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x3'/>
</controller>
<controller type='pci' index='5' model='pcie-root-port'>
<model name='pcie-root-port'/>
<target chassis='5' port='0xc'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x4'/>
</controller>
<controller type='pci' index='6' model='pcie-root-port'>
<model name='pcie-root-port'/>
<target chassis='6' port='0xd'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x5'/>
</controller>
<controller type='pci' index='7' model='pcie-root-port'>
<model name='pcie-root-port'/>
<target chassis='7' port='0xe'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x6'/>
</controller>
<controller type='virtio-serial' index='0'>
<address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
</controller>
<controller type='usb' index='0' model='ich9-ehci1'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x7'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci1'>
<master startport='0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0' multifunction='on'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci2'>
<master startport='2'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x1'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci3'>
<master startport='4'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x2'/>
</controller>
<!-- Make sure you put your nic in bus 0x0 and slot 0x0y(y is numeric), this will make nic built-in and apple-store work-->
<interface type='bridge'>
<mac address='52:54:00:8e:e2:66'/>
<source bridge='virbr0'/>
<target dev='tap0'/>
<model type='vmxnet3'/>
</interface>
<serial type='pty'>
<target type='isa-serial' port='0'>
<model name='isa-serial'/>
</target>
</serial>
<console type='pty'>
<target type='serial' port='0'/>
</console>
<channel type='unix'>
<target type='virtio' name='org.qemu.guest_agent.0'/>
<address type='virtio-serial' controller='0' bus='0' port='1'/>
</channel>
<graphics type='spice' autoport='yes'>
<listen type='address'/>
</graphics>
<video>
<model type="vga" vram="65536" heads="1" primary="yes"/>
</video>
<!-- If you wanna passthrough GPU, make sure the gfx and audio are in the same bus (like 0x01) but different function (0x00 and 0x01)-->
<!-- <hostdev mode='subsystem' type='pci' managed='yes'>
<driver name='vfio'/>
<source>
<address domain='0x0000' bus='0x2d' slot='0x00' function='0x0'/>
</source>
<rom file='/mnt/disks/backups/BIOS/RX580/Ellesmere.rom'/>
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0' multifunction='on'/>
</hostdev>
<hostdev mode='subsystem' type='pci' managed='yes'>
<driver name='vfio'/>
<source>
<address domain='0x0000' bus='0x2d' slot='0x00' function='0x1'/>
</source>
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x1'/>
</hostdev> -->
<!-- If you wanna passthrough onboard audio(like 30:00.4), make sure you put it in bus 0x00 and slot 0x0y(y is numeric), otherwise AppleALC won't recognized it -->
<!-- <hostdev mode='subsystem' type='pci' managed='yes'>
<driver name='vfio'/>
<source>
<address domain='0x0000' bus='0x30' slot='0x00' function='0x4'/>
</source>
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
</hostdev> -->
<memballoon model='none'/>
</devices>
<!-- Note: Enable the next line when SELinux is enabled -->
<!-- seclabel type='dynamic' model='selinux' relabel='yes'/> -->
<qemu:commandline>
<qemu:arg value='-device'/>
<qemu:arg value='isa-applesmc,osk=ourhardworkbythesewordsguardedpleasedontsteal(c)AppleComputerInc'/>
<qemu:arg value='-smbios'/>
<qemu:arg value='type=2'/>
<qemu:arg value='-device'/>
<qemu:arg value='usb-tablet'/>
<qemu:arg value='-device'/>
<qemu:arg value='usb-kbd'/>
<qemu:arg value='-cpu'/>
<qemu:arg value='Penryn,kvm=on,vendor=GenuineIntel,+invtsc,vmware-cpuid-freq=on,+pcid,+ssse3,+sse4.2,+popcnt,+avx,+aes,+xsave,+xsaveopt,check'/>
<!-- <qemu:arg value='Penryn,vendor=GenuineIntel,+hypervisor,+invtsc,kvm=on,+fma,+avx,+avx2,+aes,+ssse3,+sse4_2,+popcnt,+sse4a,+bmi1,+bmi2'/> -->
<!-- If you wanna use cpu host-passthrough mode, uncomments below-->
<!-- <qemu:arg value='host,vendor=GenuineIntel,+hypervisor,+invtsc,kvm=on,+fma,+avx,+avx2,+aes,+ssse3,+sse4_2,+popcnt,+sse4a,+bmi1,+bmi2'/> -->
<!-- If you wanna use cpu emulating mode like Skylake-Server, uncomments below-->
<!-- <qemu:arg value='Skylake-Server,vendor=GenuineIntel,+hypervisor,+invtsc,kvm=on,+fma,+avx,+avx2,+aes,+ssse3,+sse4_2,+popcnt,+sse4a,+bmi1,+bmi2'/> -->
</qemu:commandline>
</domain>

View file

@ -0,0 +1,98 @@
There are two main ways to set up networking on OS X / macOS, as it does not
function with what QEMU defaults to for network settings:
-----------------------------------
User Mode Networking (Easier Setup)
-----------------------------------
By default, QEMU uses user mode networking (SLiRP). This networking mode is the
slowest and is not visible via the outside network, but requires no host-side
setup, so it's perfect if you just want internet but don't care about latency
or about connecting to the VM from an external source.
In order to do this, change the line in your qemu-system-x86_64 command (found
in boot-macOS.sh) to the following:
-netdev user,id=net0 -device network_adapter,netdev=net0,id=net0,mac=52:54:00:c9:18:27 \
Once you set network_adapter to the preferred adapter, no further setup is required; your
internet should Just Werk™ in your virtual machine!
For further information on detailed configuration options, see QEMU's
documentation on networking ( http://wiki.qemu.org/Documentation/Networking )
Here is the list of network adapters supported by macOS,
e1000-82545em - The problem that we run into here is that OS X is nitpicky
about what emulated networking devices it is willing to accept. The
e1000-82545em is a known adapter that can be used on pretty much any version of
MacOS.
To use this adapter, replace network_adapter with e1000-82545em
vmxnet3 - An alternative solution to e1000 is to use vmxnet3 instead. Unlike
the e1000, vmxnet3 is a paravirtualized NIC, which can allow for better
performance (in theory). The only catch is that the you need to have a recent
version of MacOS (10.11 or later).
To use this adapter, replace network_adapter with vmxnet3
-----------------------------------
Tap Networking (Better Performance)
-----------------------------------
Installing "virt-manager" automagically creates the "virbr0" local private bridge :-)
sudo apt-get install uml-utilities virt-manager
sudo ip tuntap add dev tap0 mode tap
sudo ip link set tap0 up promisc on
sudo brctl addif virbr0 tap0
sudo ip link set dev virbr0 up # as needed
sudo ip link set dev tap0 master virbr0
Note: If `virbr0` network interface is not present on your system, it may
have been deactivated. Try enabling it by using the following commands,
virsh net-start default
virsh net-autostart default
Add "-netdev tap,id=net0,ifname=tap0,script=no,downscript=no -device e1000-82545em,netdev=net0,id=net0,mac=52:54:00:c9:18:27 \"
to your qemu-system-x86_64 command.
QEMU networking tip
-------------------
# printf '52:54:00:AB:%02X:%02X\n' $((RANDOM%256)) $((RANDOM%256)) # generates QEMU compatible mac addresses!
------------------
Bridged Networking
------------------
QEMU defaults to using NAT for its guests. It has a built-in DHCP server that
provides addresses from the 192.168.12x.0 subnet. However, this configuration
makes file sharing, printer sharing, and other common networking activities
harder to use in a home network.
Bridged networking allows your QEMU guest to get an address on the same subnet
as the host computer. For example, many home networks let the wireless router
handle IP assignment via DHCP. Here are the steps for setting up the bridge.
To setup bridged networking from the command line, refer to this documentation
at the Ubuntu website. https://help.ubuntu.com/community/KVM/Networking
Ultimately, the script for booting the QEMU guest will need a line similar to
the following to enable bridged networking in the guest:
-netdev bridge,id=net0,br=virbr0,"helper=/usr/lib/qemu/qemu-bridge-helper"
On some systems the `qemu-bridge-helper` file has incorrect permissions. For it
to work, it needs to be setuid root. This can be accomplished with this command:
$ sudo chmod u+s /usr/lib/qemu/qemu-bridge-helper
Note that this is sometimes viewed as a security hole. Be careful and understand
what you are doing before running this command.

598
notes.md Normal file
View file

@ -0,0 +1,598 @@
### App Store problems
Do you see the "Your device or computer could not be verified" message when you
try to login to the App Store? If yes, here are the steps to fix it.
* Make sure that your wired ethernet connection is called "en0" (and not "en1" or
something else). Use "ifconfig" command to verify this.
* If the wired ethernet connection is not called "en0", then then go to Network
in System Preferences and delete all the devices, and apply the changes. Next,
go to the console and type in `sudo rm /Library/Preferences/SystemConfiguration/NetworkInterfaces.plist`.
Finally reboot, and then use the App Store without problems.
This fix was found by `Glnk2012` of https://www.tonymacx86.com/ site.
Also tweaking the `smbios.plist` file can help (?).
### Change resolution in OpenCore
```diff
diff --git a/OpenCore-Catalina/config.plist b/OpenCore-Catalina/config.plist
index 4754e8c..489570f 100644
--- a/OpenCore-Catalina/config.plist
+++ b/OpenCore-Catalina/config.plist
@@ -692,7 +692,7 @@
<key>ConsoleMode</key>
<string></string>
<key>Resolution</key>
- <string>Max</string>
+ <string>1920x1080</string>
<key>ClearScreenOnModeSwitch</key>
<false/>
<key>IgnoreTextInGraphics</key>
```
Ensure that the OVMF resolution is set equal to resolution set in your OpenCore
qcow2 file (default is 1024x768). This can be done via the OVMF menu, which you
can reach with a press of the ESC button during the OVMF boot logo (before
OpenCore boot screen appears). In the OVMF menu settings, set Device Manager ->
OVMF Platform Configuration -> Change Preferred Resolution for Next Boot to the
desired value (default is 1024x768). Commit changes and exit the OVMF menu.
Note: The macOS VM's resolution can be changed via `Settings -> Displays`
option easily.
### GPU passthrough notes
These steps will need to be adapted for your particular setup. A host machine
with IOMMU support is required. Consult the Arch Wiki article linked to at the
bottom of this file for exact requirements and other details.
I am running Ubuntu 17.04 on Intel i5-6500 + ASUS Z170-AR motherboard + NVIDIA
1050 Ti.
Tip: Use https://github.com/Benjamin-Dobell/nvidia-update to install nVidia
drivers on macOS.
* Enable IOMMU support on the host machine.
Append the given line to `GRUB_CMDLINE_LINUX_DEFAULT` in `/etc/default/grub`.
##### Intel Systems
`iommu=pt intel_iommu=on rd.driver.pre=vfio-pci video=vesafb:off,efifb:off`
##### AMD Systems
`iommu=pt amd_iommu=on rd.driver.pre=vfio-pci video=vesafb:off,efifb:off`
* Uninstall NVIDIA drivers from the host machine and blacklist the required modules.
```
$ cat /etc/modprobe.d/blacklist.conf
... <existing stuff>
blacklist radeon
blacklist nouveau
blacklist nvidia
```
* Enable the required kernel modules.
```
# echo "vfio" >> /etc/modules
# echo "vfio_iommu_type1" >> /etc/modules
# echo "vfio_pci" >> /etc/modules
# echo "vfio_virqfd" >> /etc/modules
```
* Isolate the passthrough PCIe devices with vfio-pci, with the help of `lspci
-nnk` command. Adapt these commands to suit your hardware setup.
```
$ lspci -nn
...
01:00.0 ... NVIDIA Corporation [GeForce GTX 1050 Ti] [10de:1c82]
01:00.1 Audio device: NVIDIA Corporation Device [10de:0fb9]
03:00.0 USB controller: ASMedia ASM1142 USB 3.1 Host Controller [1b21:1242]
```
```
# echo "options vfio-pci ids=10de:1c82,10de:0fb9 disable_vga=1" > /etc/modprobe.d/vfio.conf
```
* Update initramfs, GRUB and then reboot.
```
$ sudo update-grub2
$ sudo update-initramfs -k all -u
```
* Verify that the IOMMU is enabled, and vfio_pci is working as expected.
Consult Arch Wiki again for help on this. (Often running `lspci -vvv` and
verifying that the expected devices are using `vfio-pci` as their `Kernel driver in use` is sufficient)
* On the macOS VM, install a NVIDIA Web Driver version which is appropriate for
the macOS version. Consult http://www.macvidcards.com/drivers.html for more
information.
For example, macOS 10.12.5 requires version `378.05.05.15f01` whereas macOS
10.12.6 requires version `378.05.05.25f01`.
* Updating SMBIOS for the macOS to `iMac14,2` might be required. I did not do
so myself.
* To reuse the keyboard and mouse devices from the host, setup "Automatic
login" in System Preferences in macOS and configure Synergy software.
Note: Many AMD GPU devices (e.g. AMD RX 480 & RX 580) should be natively
supported in macOS High Sierra.
### USB passthrough notes
These steps will need to be adapted for your particular setup.
* Isolate the passthrough PCIe devices with vfio-pci, with the help of `lspci
-nnk` command.
```
$ lspci -nn
...
01:00.0 ... NVIDIA Corporation [GeForce GTX 1050 Ti] [10de:1c82]
01:00.1 Audio device: NVIDIA Corporation Device [10de:0fb9]
03:00.0 USB controller: ASMedia ASM1142 USB 3.1 Host Controller [1b21:1242]
```
Add `1b21:1242` to `/etc/modprobe.d/vfio.conf` file in the required format.
* Update initramfs, and then reboot.
```
$ sudo update-initramfs -k all -u
```
* Use the helper scripts to isolate the USB controller.
```
$ scripts/lsgroup.sh
### Group 7 ###
00:1c.0 PCI bridge: Intel Corporation Sunrise ...
### Group 15 ###
06:00.0 Audio device: Creative Labs Sound Core3D ...
### Group 5 ###
00:17.0 SATA controller: Intel Corporation Sunrise ...
### Group 13 ###
03:00.0 USB controller: ASMedia ASM1142 USB 3.1 Host Controller
```
```
$ scripts/vfio-group.sh 13
```
* Add `-device vfio-pci,host=03:00.0,bus=pcie.0 \` line to `boot-passthrough.sh`.
* Boot the VM, and devices attached to the ASMedia USB controller should just work under macOS.
### Synergy Notes
* Get Synergy from https://sourceforge.net/projects/synergy-stable-builds.
I installed "synergy-v1.8.8-stable-MacOSX-x86_64.dmg" on the macOS guest and
configured it as a client.
For automatically starting Synergy on macOS, add Synergy to "Login Items",
System Preferences -> Users & Groups -> Select your user account -> Login Items
-> Add a login item
* On the Linux host machine, install "synergy-v1.8.8-stable-Linux-x86_64.deb"
or newer, configure `~/.synergy.conf` and run `synergys` command.
* The included `.synergy.conf` will need to be adapted according to your setup.
### Accelerated Graphics
See `UEFI/README.md` for GPU passthrough notes.
Note: There is no working QXL driver for macOS so far.
Links:
- https://www.kraxel.org/blog/2019/09/display-devices-in-qemu/
- https://www.kraxel.org/blog/2019/06/macos-qemu-guest/
### Virtual Sound Device
*Warning: The OpenCore distribution that comes with OSX-KVM already has
`VoodooHDA OC`. Do NOT mix VoodooHDA with AppleALC. You may want to consider
HDA passthrough if it is practical or use HDMI audio instead*
Note: The emulated sound output can be choppy, and distorted. Use Sound Card /
USB Sound Card passthrough instead.
Note: It seems that playback of Flash videos requires an audio device to be
present.
### Building QEMU from source
See http://wiki.qemu-project.org/Hosts/Linux for help.
```
$ git clone https://github.com/qemu/qemu.git
$ cd qemu
$ mkdir build; cd build
$ ../configure --prefix=/home/$(whoami)/QEMU --enable-trace-backend=simple \
--enable-debug --target-list=x86_64-softmmu,aarch64-softmmu --audio-drv-list=pa
$ make -j8; make install
```
### Connect iPhone / iPad to macOS guest
Please passthrough a PCIe USB card to the virtual machine to be able to connect
iDevices (iPhone / iPad) to it.
### Exposing AES-NI instructions to macOS
Add `+aes` argument to the `-cpu` option in `boot-macOS.sh` file.
``` diff
diff --git a/boot-macOS.sh b/boot-macOS.sh
index 5948b8a..3acc123 100755
--- a/boot-macOS.sh
+++ b/boot-macOS.sh
@@ -18,7 +18,7 @@
# Use "-device usb-tablet" instead of "-device usb-mouse" for better mouse
# behaviour. This requires QEMU >= 2.9.0.
-qemu-system-x86_64 -enable-kvm -m 3072 -cpu Penryn,kvm=off,vendor=GenuineIntel \
+qemu-system-x86_64 -enable-kvm -m 3072 -cpu Penryn,kvm=off,vendor=GenuineIntel,+aes \
-machine pc-q35-2.4 \
-smp 4,cores=2 \
-usb -device usb-kbd -device usb-mouse \
```
Other host CPU features can be similarly exposed to the macOS guest.
The following command can be used on macOS to verify that AES-NI instructions are exposed,
```
sysctl -a | grep machdep.features
```
On machines with OpenSSL installed, the following two commands can be used to
check AES-NI performance,
```
openssl speed aes-128-cbc
openssl speed -evp aes-128-cbc # uses AES-NI
```
### Exposing AVX and AVX2 instructions to macOS
Exposing AVX and AVX2 instructions to macOS requires support for these
instructions on the host CPU.
The `boot-clover.sh` script already exposes AVX and AVX2 instructions to the
macOS guest by default. Modify or comment out the `MY_OPTIONS` line in
`boot-clover.sh` file in case you are having problems.
To enable AVX2, do the following change,
`Clover boot menu -> Options -> Binaries patching -> Fake CPUID -> 0x0306C0 # for Haswell`
For details, see [this wiki](https://clover-wiki.zetam.org/Configuration/KernelAndKextPatches) page.
Once enabled, the following commands can be used to confirm the presence of AVX
and AVX2 instructions on the macOS guest.
```
$ sysctl -a | grep avx
hw.optional.avx2_0: 1
hw.optional.avx1_0: 1
$ sysctl -a | grep leaf7
machdep.cpu.leaf7_features: SMEP BMI1 AVX2 BMI2
machdep.cpu.leaf7_feature_bits: 424
```
### Enabling Hypervisor.Framework (Nested Virtualization / Docker for Mac / Android Emulator / etc)
Docker for Mac, the Android Emulator and other virtualization products require
nested virtualization in the form of the `Hypervisor Framework` to work on
macOS.
Use the `sysctl kern.hv_support` (output `1` is good) command to check if
`Hypervisor` is enabled within the macOS VM.
If `Hypervisor` is not enabled, check that you have the required CPU features.
Run the `sysctl -a | grep machdep.cpu.features` command and look for the
presence of `VMX` flag.
If the `VMX` flag is missing, use the following steps to enable it:
- Make sure that `kvm_intel` module is loaded properly. This is documented in our
[main documentation](./README.md).
- Make sure the VM is booted with VMX support passed through using one of the
two below strategies:
- You may add `vmx,rdtscp` arguments to the `-cpu` option in `boot-macOS.sh`
file (easier option).
- You may add `+vmx,` to the front of `MY_OPTIONS` in the boot script while
changing `-cpu Penryn` to `-cpu Skylake-Client` or [any other suitable supported CPU](https://manpages.ubuntu.com/manpages/disco/man7/qemu-cpu-models.7.html).
Note: Host CPU passthrough is troublesome and not generally recommended.
Note: You may need to `Reset NVRAM` on the next reboot, but after that you
should see a `1` when you re-check `sysctl kern.hv_support`.
### Using virtio-blk-pci with macOS
Newer macOS (namely Mojave+) have support for some virtio drivers.
This can be enabled by applying the following change to `boot-macOS-NG.sh` to
get some performance gain.
```diff
- -device ide-hd,bus=sata.4,drive=MacHDD \
+ -device virtio-blk-pci,drive=MacHDD \
```
### Permission problems with libvirt / qemu?
```
sudo setfacl -m u:libvirt-qemu:rx <path> # fix virt-manager perm problems
```
### Extract .pkg files
* http://mackyle.github.io/xar/ is unmaintained and may fail for many `.pkg` files.
* Use a modern version of `7-Zip` instead.
```
7z l example.pkg
7z x example.pkg
gunzip -c <something>.pkg/Payload | cpio -i
```
### QEMU quits with `gtk initialization failed`
Append the `display=none` argument to your QEMU execution script (this has
already been done for `boot-passthrough.sh`)
### ISO/DMG (`createinstallmedia` generated) install medium not detected
In OpenCore's `config.plist` and set `ScanPolicy` to `0` ([For more information, check the Dortania Troubleshooting Guide](https://dortania.github.io/OpenCore-Install-Guide/troubleshooting/troubleshooting.html#can-t-see-macos-partitions))
### Attach physical drive to QEMU VM
*Note: If using NVMe, passing the controller may be a better option then passing it as a block device*
Run `ls -la /dev/disk/by-id/` to get the unique mapping for the device you want to attach to the VM (like `sda`, `sdb`, `nvme0n1`, while you can attach only a partition like `sda1`, this is not recommended)
```
$ ls -la /dev/disk/by-id
total 0
drwxr-xr-x 2 root root 360 Jul 29 08:14 .
drwxr-xr-x 8 root root 160 Jul 29 08:14 ..
lrwxrwxrwx 1 root root 9 Jul 29 08:14 ata-ST2000FFFFF-FFFFFF_FFFFFFFF -> ../../sda
lrwxrwxrwx 1 root root 10 Jul 29 08:14 ata-ST2000FFFFF-FFFFFF_FFFFFFFF-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 Jul 29 08:14 ata-ST2000FFFFF-FFFFFF_FFFFFFFF-part2 -> ../../sda2
lrwxrwxrwx 1 root root 13 Jul 29 08:14 nvme-eui.ffffffffffffffff -> ../../nvme0n1
lrwxrwxrwx 1 root root 15 Jul 29 08:14 nvme-eui.ffffffffffffffff-part1 -> ../../nvme0n1p1
lrwxrwxrwx 1 root root 15 Jul 29 08:14 nvme-eui.ffffffffffffffff-part2 -> ../../nvme0n1p2
lrwxrwxrwx 1 root root 13 Jul 29 08:14 nvme-Samsung_SSD_960_EVO_512GB_FFFFFFFFFFFFFFF -> ../../nvme0n1
lrwxrwxrwx 1 root root 15 Jul 29 08:14 nvme-Samsung_SSD_960_EVO_512GB_FFFFFFFFFFFFFFF-part1 -> ../../nvme0n1p1
lrwxrwxrwx 1 root root 15 Jul 29 08:14 nvme-Samsung_SSD_960_EVO_512GB_FFFFFFFFFFFFFFF-part2 -> ../../nvme0n1p2
lrwxrwxrwx 1 root root 9 Jul 29 08:14 wwn-0xffffffffffffffff -> ../../sda
lrwxrwxrwx 1 root root 10 Jul 29 08:14 wwn-0xffffffffffffffff-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 Jul 29 08:14 wwn-0xffffffffffffffff-part2 -> ../../sda2
```
Then edit your QEMU launch script and add these lines (adapt to it your
hardware), then launch the script using `sudo` (because you cannot write to a
block device without `root` permissions)
```
-drive id=NVMeDrive,if=none,file=/dev/disk/by-id/nvme-Samsung_SSD_960_EVO_512GB_FFFFFFFFFFFFFFF,format=raw \
-device ide-hd,bus=sata.4,drive=NVMeDrive \
```
### Run the Virtual Machine on Boot
* Edit your QEMU launch script and set the absolute path of `OSX-KVM` as the
value of `REPO_PATH`
* Edit `/etc/rc.local` and add the absolute path of the script (with or without
`sudo` depending on your needs) to the bottom of the script.
### Setup SSH for internal remote access
Presuming your network interface has a statically defined internal IP (on Ubuntu).
```
$ sudo apt install openssh-server -y
$ sudo ufw allow ssh
$ sudo update-rc.d ssh defaults
$ sudo systemctl enable ssh
$ sudo systemctl enable ssh.socket
$ sudo systemctl enable ssh.service
```
### AMD GPU Notes
- https://www.nicksherlock.com/2020/11/working-around-the-amd-gpu-reset-bug-on-proxmox/
- Consider using CMMChris's [RadeonBoost.kext](https://forums.macrumors.com/threads/tired-of-low-geekbench-scores-use-radeonboost.2231366/)
for the RX480, RX580, RX590 and Radeon VII GPUs.
### USB passthrough notes
#### USB 3.0 flash drive
The following USB configuration works for usb passthrough of a USB 3.0 flash
drive to Fedora 25 guest.
-device nec-usb-xhci,id=xhci \
-device usb-host,bus=xhci.0,vendorid=0x0781,productid=0x5590 \
-usb -device usb-mouse,bus=usb-bus.0 -device usb-kbd,bus=usb-bus.0 \
...
#### Moto G3 phone
The following USB configuration works for usb passthrough of a Moto G3 phone to
Fedora 25 guest.
-device usb-host,bus=usb-bus.0,vendorid=0x22b8,productid=0x002e \
-usb -device usb-mouse,bus=usb-bus.0 -device usb-kbd,bus=usb-bus.0 \
...
#### CoolerMaster keyboard
The following USB configuration works for usb passthrough of a CoolerMaster
keyboard to macOS Sierra guest!
-device usb-host,bus=usb-bus.0,vendorid=0x2516,productid=0x0004 \
-usb -device usb-tablet,bus=usb-bus.0 -device usb-kbd,bus=usb-bus.0 \
...
#### Virtual USB disk
The following USB configuration works for attaching a virtual USB disk to macOS
Sierra guest. Use "qemu-img" to create "disk.raw" virtual disk.
-drive if=none,id=usbstick,file=disk.raw,format=raw \
-device usb-storage,bus=usb-bus.0,drive=usbstick \
...
However USB passthrough of EHCI, and XHCI (USB 3.0) devices does not work with
macOS Sierra. See https://bugs.launchpad.net/qemu/+bug/1509336 for
confirmation. According to this bug report, USB passthrough does not work with
versions >= Mac OS X El Capitan guests.
It seems that this problem can be fixed by using OVMF + Clover.
Update: OVMF + Clover doesn't help. It seems that macOS is missing the required
drivers for the EHCI, and XHCI controllers that are exposed by QEMU.
### Generate macOS Mojave / Catalina installation ISO.
This step currently needs to be run on an existing macOS system.
```
cd ~/OSX-KVM/scripts
./create_dmg_catalina.sh
```
### Tweaks for macOS
1. Disable `Energy Saver` in `System Preferences`.
2. Disable `Screen Saver` in `System Preferences -> Desktop & Screen Saver`.
3. Turn off indexing using the following command.
```
sudo mdutil -a -i off
```
4. Enable `Remote Login` (aka SSH) via `System Preferences -> Sharing`.
### Snapshot Debugging Tips
- Get `savevm` to work:
```
(qemu) savevm
Error while writing VM state: No space left on device
```
Ensure that you have plenty of free space in `/var/tmp` and `/`.
To use a separate storage location for storing snapshots, use the following
trick (from `zimbatm`):
```
export TMPDIR=$PWD/tmp
```
### 'Fix' weird boot problems
```
cp OVMF_VARS-1024x768.fd.bak OVMF_VARS-1024x768.fd
```
### 'Fix' time drift problems
Run the following command periodically from root's crontab:
```
sntp -S pool.ntp.org
```
### Pass through all CPU cores / threads
macOS requires a core count that is a power of 2, but some modern CPUs have odd
counts - like 6 cores and 12 threads.
So how can we harness the entire CPU in the VM?
There are strategies that mix smp/sockets/cores/threads/maxcpu arguments and
use odd socket counts to arrive at even core counts, and even let you specify
that some of the cores are hyperthreaded.
Specifically for the case of an Intel i7 processor with 6 cores and 12 total
threads, altering the boot script to contain these variables and the following
modified SMP line results in a full CPU core/thread pass through:
```
CPU_SOCKETS="3"
CPU_CORES="2"
CPU_THREADS="2"
CPU_TOTAL="12"
```
The `-smp line` should read something like the following:
```
-smp "$CPU_TOTAL",cores="$CPU_CORES",sockets="$CPU_SOCKETS",threads="$CPU_THREADS",maxcpus="$CPU_TOTAL"
```

12
resources/.synergy.conf Normal file
View file

@ -0,0 +1,12 @@
# Run "synergys" on Linux host
section: screens
uber:
mac:
end
section: links
uber:
right = mac
mac:
left = uber
end

Binary file not shown.

BIN
resources/OVMF_VARS.fd Normal file

Binary file not shown.

@ -0,0 +1 @@
Subproject commit 9446405e44d7e17a84655c335ae5efe47d81608d

8
resources/README.md Normal file
View file

@ -0,0 +1,8 @@
Use `idadif.py` to apply the `kernel.dif` patch to the macOS `kernel` binary.
```
$ sha256sum kernel*
be90edb9653be25e1747cefc1ec9fd452b90dd917ba9eb391a76f260f84cd9f0 kernel <-- patched 10.15.4 kernel
ac2fc51e53519a3147359e2b25dd8aa6b1fa79d41f92091cc058b2aab7e901d6 kernel.bak <-- original 10.15.4 kernel
```

47
resources/idadif.py Normal file
View file

@ -0,0 +1,47 @@
#!/usr/bin/env python
# Small IDA .dif patcher - https://stalkr.net/files/ida/idadif.py
import re
from sys import argv,exit
def patch(file, dif, revert=False):
code = open(file,'rb').read()
dif = open(dif,'r').read()
m = re.findall('([0-9a-fA-F]+): ([0-9a-fA-F]+) ([0-9a-fA-F]+)', dif)
for offset,orig,new in m:
o, orig, new = int(offset,16), orig.decode('hex'), new.decode('hex')
if revert:
if code[o]==new:
code = code[:o]+orig+code[o+1:]
else:
raise Exception("patched byte at %s is not %02X" % (offset, ord(new)))
else:
if code[o]==orig:
code = code[:o]+new+code[o+1:]
else:
raise Exception("original byte at %s is not %02X" % (offset, ord(orig)))
open(file,'wb').write(code)
def main():
if len(argv)<3:
print("Usage: %s <binary> <IDA.dif file> [revert]" % (argv[0]))
print("Applies given IDA .dif file to patch binary; use revert to revert patch.")
exit(0)
file, dif, revert = argv[1], argv[2], False
if len(argv)>3:
revert = True
print("Reverting patch %r on file %r" % (dif, file))
else:
print("Patching file %r with %r" % (file, dif))
try:
patch(file, dif, revert)
print("Done")
except Exception as e:
print("Error: %s" % str(e))
exit(1)
if __name__ == "__main__":
main()

8
resources/kernel.dif Normal file
View file

@ -0,0 +1,8 @@
This difference file was created by IDA
kernel
0000000000787C73: E8 90
0000000000787C74: 78 90
0000000000787C75: E8 90
0000000000787C76: AA 90
0000000000787C77: FF 90

95
resources/kernel_autopatcher.py Executable file
View file

@ -0,0 +1,95 @@
#!/usr/bin/env python
#
# NOTE -> https://github.com/kholia/OSX-KVM/blob/master/reversing-notes.md
#
# https://github.com/radareorg/radare2-r2pipe/blob/master/python/examples/libgraph.py
# https://github.com/radareorg/radare2-r2pipe/tree/master/python
#
# https://www.hex-rays.com/wp-content/uploads/2019/12/xnu_debugger_primer.pdf
# https://geosn0w.github.io/Debugging-macOS-Kernel-For-Fun/
#
# sudo apt-get install radare2 # Ubuntu 20.04 LTS
# pip install r2pipe
#
# This software is Copyright (c) 2020, Dhiru Kholia. This program is provided
# for educational, research, and non-commercial personal use only.
# !!! ATTENTION !!! Any commercial usage against the Apple EULA is at your own
# risk!
#
# Note: Commercial usage and redistribution is forbidden (not allowed).
#
# THIS SOFTWARE IS PROVIDED BY <COPYRIGHT HOLDER> 'AS IS' AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
# EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
# OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# $ ./kernel_autopatcher.py kernel
# [+] Processing <kernel> file...
# [+] Patching done!
#
# (Re)Tested against the default "kernel" from macOS Catalina 10.15.7 in
# October, 2020.
#
# Note: Disable SIP on the macOS VM (We do it via OpenCore's config.plist)
# `00000000` - SIP completely enabled
# `30000000` - Allow unsigned kexts and writing to protected fs locations
# `67000000` - SIP completely disabled
#
# Note: sudo mount -uw /
#
# Kernel location (Catalina): /System/Library/Kernels/kernel
#
# $ md5sum kernel*
# 3966d407c344708d599500c60c1194c0 kernel
# 8530d3422795652ed320293ecc127770 kernel.patched
#
# Test command -> sudo /usr/bin/AssetCacheManagerUtil activate
import r2pipe
import sys
import os
def patcher(fname):
target_symbol = "sym._cpuid_get_feature_names"
# analysis code
# r2 = r2pipe.open(fname, ["-2"]) # -2 -> disable stderr messages
r2 = r2pipe.open(fname, ["-2", "-w"]) # -2 -> disable stderr messages
print("[+] Processing <%s> file..." % fname)
r2.cmd('aa')
# print(r2.cmd("pdf @ sym._cpuid_get_feature_names"))
result = r2.cmdj("axtj %s" % target_symbol)
if not result:
print("[!] Can't find xrefs to <%s>. Aborting!" % target_symbol)
sys.exit(2)
# print(result)
r2.cmd("s `axt sym._cpuid_get_feature_names~[1]`") # jump to the function call site
result = r2.cmdj("pdj 1")
if not result:
print("[!] Can't disassemble instruction at function call site. Aborting!")
sys.exit(3)
opcode_size = result[0]["size"]
assert (opcode_size == 5) # sanity check, call sym._cpuid_get_feature_name -> 5 bytes
# patching code
# > pa nop
r2.cmd("\"wa nop;nop;nop;nop;nop\"")
r2.quit()
print("[+] Patching done!")
if __name__ == "__main__":
if len(sys.argv) > 1:
path = sys.argv[1]
patcher(path)
else:
print("Usage: %s [path-to-kernel-file]" % (sys.argv[0]))
sys.exit(1)

583
reversing-notes.md Normal file
View file

@ -0,0 +1,583 @@
#### Problem
On a macOS virtual machine,
```
$ sudo /usr/bin/AssetCacheManagerUtil activate
AssetCacheManagerUtil[] Failed to activate content caching: Error Domain=ACSMErrorDomain Code=5 "virtual machine"...
```
It seems that the `Content Caching` functionality is not available when macOS
is running in a virtual machine. How can we enable this feature on our macOS
VM?
#### April 2020 Update
I was able to patch the Catalina 10.15.4 kernel to disable the VMM detection.
Original function:
![Original function](screenshots/macOS-kernel-patching-1.png)
Patched function:
![Patched function](screenshots/macOS-kernel-patching-2.png)
```
static int
cpu_features SYSCTL_HANDLER_ARGS
{
__unused struct sysctl_oid *unused_oidp = oidp;
__unused void *unused_arg1 = arg1;
__unused int unused_arg2 = arg2;
char buf[512];
buf[0] = '\0';
// cpuid_get_feature_names(cpuid_features(), buf, sizeof(buf));
cpuid_get_feature_names(cpuid_features(), buf, sizeof(buf)); // NOP this <-- NOTE!
return SYSCTL_OUT(req, buf, strlen(buf) + 1);
}
...
"bsd/dev/i386/sysctl.c" 980 lines --13%--
```
See `bsd/dev/i386/sysctl.c 138: cpuid_get_feature_names(cpuid_features` too.
Useful commands:
```
sudo mount -uw /
sudo mv /System/Library/Kernels/kernel /System/Library/Kernels/kernel.bak
sudo kextcache -i /
```
Update: Use `resources/kernel_autopatcher.py` to patch your kernels! :-)
#### March 2020 Update
Update: This approach causes the macOS VM to consume multiple CPU(s) 100% on
the host!
See `osfmk/i386/tsc.c 142: if (cpuid_vmm_present()) {` for details.
Instead of trying to hack things from within the VM, we can turn off VMM
detection from the outside.
See [boot-macOS-Catalina.sh](./boot-macOS-Catalina.sh) to see how it is done.
Essentially, we add `hypervisor=off,vmx=on,kvm=off` flags to the QEMU's CPU
configuration.
Once this is done,
```
$ sysctl -a | grep VMM
<nothing>
$ sudo /usr/bin/AssetCacheManagerUtil activate
2020-03-14 19:05:21.416 AssetCacheManagerUtil[1313:53576] Content caching activated.
2020-03-14 19:05:21.417 AssetCacheManagerUtil[1313:53576] Restart devices to take advantage of content caching immediately
$ sudo /usr/bin/AssetCacheManagerUtil status
2020-03-14 19:10:31.154 AssetCacheManagerUtil[1362:54464] Content caching status: {
Activated = 1;
Active = 1;
CacheDetails = {
};
CacheFree = 119663451136;
CacheLimit = 0;
CacheStatus = OK;
CacheUsed = 0;
Parents = (
);
Peers = (
);
PersonalCacheFree = 119663451136;
PersonalCacheLimit = 0;
PersonalCacheUsed = 0;
Port = 49363;
PrivateAddresses = (
"192.168.100.137"
);
PublicAddress = "11.XX.YY.ZZ";
RegistrationStatus = 1;
RestrictedMedia = 0;
ServerGUID = "XXX";
StartupStatus = OK;
TotalBytesAreSince = "2020-03-15 02:05:06 +0000";
TotalBytesDropped = 0;
TotalBytesImported = 0;
TotalBytesReturnedToChildren = 0;
TotalBytesReturnedToClients = 0;
TotalBytesReturnedToPeers = 0;
TotalBytesStoredFromOrigin = 0;
TotalBytesStoredFromParents = 0;
TotalBytesStoredFromPeers = 0;
}
```
w00t!
I found this technique from [this article](https://superuser.com/questions/1387935/hiding-virtual-machine-status-from-guest-operating-system). Thanks!
This was tested on macOS Mojave 10.14.6 and on macOS Catalina 10.15.3.
#### CPU flags
```
$ sysctl -a | grep VMM
machdep.cpu.features: FPU ... VMM PCID XSAVE OSXSAVE AVX1.0
```
Turning off `kvm=on` flag doesn't help in hiding the `VMM` flag.
https://github.com/hjuutilainen/adminscripts/blob/master/check-if-virtual-machine.py
uses the same trick to detect if macOS is running in a VM.
#### VM detection code in macOS
This code was found in the `AssetCache` binary.
```objective-c
char __cdecl -[ECConfig runningInVM](ECConfig *self, SEL a2)
{
void *v2; // rax
void *v3; // r15
__int64 v4; // r13
size_t v5; // r12
__int64 v6; // r13
int *v7; // rax
char *v8; // rax
bool v9; // bl
__int64 v10; // r12
__int64 v11; // r12
int *v12; // rax
char *v13; // rax
__int64 v14; // rbx
size_t v15; // rcx
void *v16; // rax
void *v17; // r14
char result; // al
__int64 *v19; // [rsp+0h] [rbp-40h]
size_t v20; // [rsp+8h] [rbp-38h]
__int64 v21; // [rsp+10h] [rbp-30h]
v20 = 0LL;
*__error() = 0;
if ( sysctlbyname("machdep.cpu.features", 0LL, &v20, 0LL, 0LL) || v20 - 1 > 0xF423F )
{
v10 = qword_100394620;
if ( (unsigned __int8)os_log_type_enabled(qword_100394620, 16LL) )
{
v11 = objc_retain(v10);
v12 = __error();
v13 = strerror(*v12);
*((_DWORD *)&v19 - 8) = 134218242;
*(__int64 **)((char *)&v19 - 28) = 0LL;
*((_WORD *)&v19 - 10) = 2080;
*(__int64 **)((char *)&v19 - 18) = (__int64 *)v13;
_os_log_error_impl(&_mh_execute_header, v11, 16LL, aSysctlMachdepC, &v19 - 4, 22LL);
objc_release(v11);
v9 = 0;
goto LABEL_21;
}
LABEL_12:
v9 = 0;
goto LABEL_21;
}
v2 = malloc(v20);
v3 = v2;
if ( !v2 )
{
v14 = qword_100394620;
if ( (unsigned __int8)os_log_type_enabled(qword_100394620, 16LL) )
{
v15 = v20;
*((_DWORD *)&v19 - 4) = 134217984;
*(__int64 **)((char *)&v19 - 12) = (__int64 *)v15;
_os_log_error_impl(&_mh_execute_header, v14, 16LL, aOutOfMemoryLd, &v19 - 2, 12LL);
v9 = 0;
goto LABEL_21;
}
goto LABEL_12;
}
if ( sysctlbyname("machdep.cpu.features", v2, &v20, 0LL, 0LL) )
{
v4 = qword_100394620;
if ( (unsigned __int8)os_log_type_enabled(qword_100394620, 16LL) )
{
v19 = (__int64 *)&v19;
v5 = v20;
v6 = objc_retain(v4);
v7 = __error();
v8 = strerror(*v7);
*((_DWORD *)&v19 - 8) = 134218242;
*(__int64 **)((char *)&v19 - 28) = (__int64 *)v5;
*((_WORD *)&v19 - 10) = 2080;
*(__int64 **)((char *)&v19 - 18) = (__int64 *)v8;
_os_log_error_impl(&_mh_execute_header, v6, 16LL, aSysctlMachdepC, &v19 - 4, 22LL);
objc_release(v6);
}
v9 = 0;
}
else
{
v16 = objc_msgSend(&OBJC_CLASS___NSString, "stringWithUTF8String:", v3);
v17 = (void *)objc_retainAutoreleasedReturnValue(v16);
v9 = (unsigned __int8)objc_msgSend(v17, "isEqualToString:", CFSTR("VMM"))
|| (unsigned __int8)objc_msgSend(v17, "hasPrefix:", CFSTR("VMM "))
|| (unsigned __int8)objc_msgSend(v17, "hasSuffix:", CFSTR(" VMM"))
|| (unsigned __int8)objc_msgSend(v17, "containsString:", CFSTR(" VMM "));
objc_release(v17);
}
free(v3);
LABEL_21:
result = __stack_chk_guard;
if ( __stack_chk_guard == v21 )
result = v9;
return result;
}
```
The following code was found in `AssetCacheManagerService` binary,
```objective-c
char __cdecl -[ACMSManager _canActivateWithReason:](ACMSManager *self, SEL a2, id *a3)
{
__int64 v3; // rax
id *v4; // r14
OS_os_log *v5; // rax
__int64 v6; // rbx
char v7; // bl
__int64 v8; // r15
struct objc_object *v9; // rax
void *v10; // r12
void *v11; // rax
OS_os_log *v12; // rax
__int64 v13; // rbx
char result; // al
__int64 v15; // [rsp+0h] [rbp-30h]
v15 = v3;
v4 = a3;
if ( (unsigned __int8)-[ACMSManager runningInVM](self, "runningInVM", v3) )
{
v5 = -[ACMSManager logHandle](self, "logHandle");
v6 = objc_retainAutoreleasedReturnValue(v5);
if ( (unsigned __int8)os_log_type_enabled(v6, 0LL) )
{
*((_WORD *)&v15 - 8) = 0;
_os_log_impl(&_mh_execute_header, v6, 0LL, aRunninginvm_2, &v15 - 2, 2LL);
}
objc_release(v6);
if ( v4 )
{
objc_retainAutorelease(CFSTR("virtual machine"));
*v4 = (id)CFSTR("virtual machine");
}
v7 = 0;
}
else
{
v8 = _kACSMSettingsDenyActivationKey;
v9 = -[ACMSManager _managedPrefSettingForKey:](self, "_managedPrefSettingForKey:", _kACSMSettingsDenyActivationKey);
v10 = (void *)objc_retainAutoreleasedReturnValue(v9);
v11 = objc_msgSend(&OBJC_CLASS___NSNumber, "class");
if ( !(unsigned __int8)objc_msgSend(v10, "isKindOfClass:", v11) )
{
objc_release(v10);
v10 = 0LL;
}
if ( (unsigned __int8)objc_msgSend(v10, "boolValue") == 1 )
{
v12 = -[ACMSManager logHandle](self, "logHandle");
v13 = objc_retainAutoreleasedReturnValue(v12);
if ( (unsigned __int8)os_log_type_enabled(v13, 0LL) )
{
*((_DWORD *)&v15 - 4) = 138412290;
*(__int64 *)((char *)&v15 - 12) = v8;
_os_log_impl(&_mh_execute_header, v13, 0LL, asc_10000E438, &v15 - 2, 12LL);
}
objc_release(v13);
if ( v4 )
{
objc_retainAutorelease(CFSTR("disabled by your system administrator"));
*v4 = (id)CFSTR("disabled by your system administrator");
}
v7 = 0;
}
else
{
v7 = 1;
if ( v4 )
*v4 = 0LL;
}
objc_release(v10);
}
result = __stack_chk_guard;
if ( __stack_chk_guard == v15 )
result = v7;
return result;
}
```
```objective-c
ACMSManager *__cdecl -[ACMSManager init](ACMSManager *self, SEL a2)
{
...
if ( sysctlbyname("machdep.cpu.features", 0LL, &v59, 0LL, 0LL) || v59 - 1 > 0xF423F )
{
v33 = objc_msgSend(v26, "logHandle");
v34 = objc_retainAutoreleasedReturnValue(v33);
if ( (unsigned __int8)os_log_type_enabled(v34, 0LL) )
{
v35 = *__error();
*((_DWORD *)&v45 - 8) = 134218240;
*(__int64 *)((char *)&v45 - 28) = 0LL;
*((_WORD *)&v45 - 10) = 1024;
*(_DWORD *)((char *)&v45 - 18) = v35;
_os_log_impl(&_mh_execute_header, v34, 0LL, aSysctlMachdepC, &v45 - 4, 18LL);
}
v36 = v34;
}
else
{
v27 = malloc(v59);
v28 = v27;
if ( v27 )
{
if ( sysctlbyname("machdep.cpu.features", v27, &v59, 0LL, 0LL) )
{
v29 = objc_msgSend(v26, "logHandle");
v30 = objc_retainAutoreleasedReturnValue(v29);
if ( (unsigned __int8)os_log_type_enabled(v30, 0LL) )
{
v58 = &v45;
v31 = v59;
v32 = *__error();
*((_DWORD *)&v45 - 8) = 134218240;
*(__int64 *)((char *)&v45 - 28) = v31;
*((_WORD *)&v45 - 10) = 1024;
*(_DWORD *)((char *)&v45 - 18) = v32;
_os_log_impl(&_mh_execute_header, v30, 0LL, aSysctlMachdepC, &v45 - 4, 18LL);
}
objc_release(v30);
v2 = v60;
}
else
{
v40 = ((__int64 (__fastcall *)(void *, const char *, void *))objc_msgSend)(
&OBJC_CLASS___NSString,
"stringWithUTF8String:",
v28);
v41 = objc_retainAutoreleasedReturnValue(v40);
v42 = (void *)v41;
v43 = ((__int64 (__fastcall *)(__int64, const char *, const __CFString *))objc_msgSend)(
v41,
"isEqualToString:",
CFSTR("VMM"));
v2 = v60;
if ( v43
|| (unsigned __int8)objc_msgSend(v42, "hasPrefix:", CFSTR("VMM "))
|| (unsigned __int8)objc_msgSend(v42, "hasSuffix:", CFSTR(" VMM"))
|| (unsigned __int8)objc_msgSend(v42, "containsString:", CFSTR(" VMM ")) )
{
objc_msgSend(v26, "setRunningInVM:", 1LL);
}
objc_release(v42);
}
free(v28);
goto LABEL_23;
}
v37 = objc_msgSend(v26, "logHandle");
v38 = objc_retainAutoreleasedReturnValue(v37);
if ( (unsigned __int8)os_log_type_enabled(v38, 0LL) )
{
v39 = v59;
*((_DWORD *)&v45 - 4) = 134217984;
*(__int64 *)((char *)&v45 - 12) = v39;
_os_log_impl(&_mh_execute_header, v38, 0LL, aOutOfMemoryLd, &v45 - 2, 12LL);
}
v36 = v38;
}
```
The `AssetCacheManagerService` binary seems to be our target.
I ran the following queries to spot these binaries,
```
$ find / -name "*AssetCache*" -exec grep -i "virtual machine" {} \; 2>/dev/null
$ find / -exec grep -Hn "ACSMErrorDomain" {} \; 2>/dev/null
```
Running `http://newosxbook.com/tools/XPoCe2.html` indicates that
`/usr/bin/AssetCacheManagerUtil` talks with `AssetCacheManagerService`.
After attaching `lldb` to `AssetCacheManagerService`,
```
$ nm AssetCacheManagerService | grep VM
000000010000bb97 t -[ACMSManager runningInVM]
000000010000bbaa t -[ACMSManager setRunningInVM:]
0000000100012928 s _OBJC_IVAR_$_ACMSManager._runningInVM
(lldb) break set --name '-[ACMSManager setRunningInVM:]'
Breakpoint 1: where = AssetCacheManagerService`-[ACMSManager setRunningInVM:], address = 0x0000000105bf5baa
(lldb) break set --name '-[ACMSManager _canActivateWithReason:]'
Breakpoint 2: where = AssetCacheManagerService`-[ACMSManager _canActivateWithReason:], address = 0x0000000105bf33f4
(lldb) break set --name '-[ACMSManager runningInVM]'
Breakpoint 3: where = AssetCacheManagerService`-[ACMSManager runningInVM], address = 0x0000000105bf5b97
Process 940 stopped
* thread #3, queue = 'com.apple.AssetCacheManagerService.ACMSManager.workQueue', stop reason = breakpoint 2.1
frame #0: 0x0000000105bf33f4 AssetCacheManagerService`-[ACMSManager _canActivateWithReason:]
AssetCacheManagerService`-[ACMSManager _canActivateWithReason:]:
-> 0x105bf33f4 <+0>: pushq %rbp
0x105bf33f5 <+1>: movq %rsp, %rbp
0x105bf33f8 <+4>: pushq %r15
0x105bf33fa <+6>: pushq %r14
Target 0: (AssetCacheManagerService) stopped.
```
#### Fix ideas
* Patch `AssetCacheManagerService` binary?
* Kernel patching - change the way `sysctlbyname` behaves?
* Manipulate function execution using Frida?
#### Patch #1
![Patching runningInVM method](screenshots/ida-patch.png?raw=true "Patching runningInVM()")
After this binary patch is applied, `activation` seems to be working ;)
```
$ sudo /usr/bin/AssetCacheManagerUtil activate
... Failed to activate content caching: Error Domain=ACSMErrorDomain Code=3 "already activated"...
```
However, `sudo /usr/bin/AssetCacheManagerUtil status` fails to work just yet.
```
$ sudo /usr/bin/AssetCacheManagerUtil status
2018-11-10 19:29:24.051 AssetCacheManagerUtil[419:3473] Content caching status: {
Activated = 0;
Active = 0;
CacheDetails = {
};
CacheFree = 2000000000;
CacheLimit = 2000000000;
CacheStatus = OK;
CacheUsed = 0;
Parents = (
);
Peers = (
);
PersonalCacheFree = 2000000000;
PersonalCacheLimit = 2000000000;
PersonalCacheUsed = 0;
Port = 0;
RegistrationError = "NOT_ACTIVATED";
RegistrationResponseCode = 403;
RegistrationStatus = "-1";
RestrictedMedia = 0;
ServerGUID = "XXX";
StartupStatus = FAILED;
TotalBytesAreSince = "2018-11-11 03:27:25 +0000";
TotalBytesDropped = 0;
TotalBytesImported = 0;
TotalBytesReturnedToChildren = 0;
TotalBytesReturnedToClients = 0;
TotalBytesReturnedToPeers = 0;
TotalBytesStoredFromOrigin = 0;
TotalBytesStoredFromParents = 0;
TotalBytesStoredFromPeers = 0;
}
```
It seems more patching of the involved binaries (`/usr/libexec/AssetCache/AssetCache`) is required?
Note: The `AssetCacheManagerService.dif` included in this repository was
derived on a macOS 10.14.1 system.
#### Patch #2
Change the four `VMM` strings to `XXX` in the `/usr/libexec/AssetCache/AssetCache` binary.
```
$ pwd
/usr/libexec/AssetCache
$ sudo codesign --remove-signature AssetCache
$ sudo /usr/bin/AssetCacheManagerUtil status
2018-11-10 23:40:07.459 AssetCacheManagerUtil[973:21653] Content caching status: {
Activated = 1;
Active = 0;
CacheDetails = {
};
CacheFree = 2000000000;
CacheLimit = 2000000000;
CacheStatus = OK;
CacheUsed = 0;
Parents = (
);
Peers = (
);
PersonalCacheFree = 2000000000;
PersonalCacheLimit = 2000000000;
PersonalCacheUsed = 0;
Port = 49181;
RegistrationStarted = "2018-11-11 07:38:48 +0000";
RegistrationStatus = 0;
RestrictedMedia = 0;
ServerGUID = "XXX";
StartupStatus = PENDING;
TotalBytesAreSince = "2018-11-11 07:38:48 +0000";
TotalBytesDropped = 0;
TotalBytesImported = 0;
TotalBytesReturnedToChildren = 0;
TotalBytesReturnedToClients = 0;
TotalBytesReturnedToPeers = 0;
TotalBytesStoredFromOrigin = 0;
TotalBytesStoredFromParents = 0;
TotalBytesStoredFromPeers = 0;
}
```
A bit of progress I think ;)
Note: However, it seems that more reversing and patching work is required.
#### Questions
* I haven't been able to see this `sysctlbyname("machdep.cpu.features"...` call
being hit in `lldb`.
Maybe this call is executed once at program startup?
* Can we use DTrace on macOS to trace execution of this call in a system-wide
fashion?
### References
* https://geosn0w.github.io/Debugging-macOS-Kernel-For-Fun/
* https://www.hex-rays.com/wp-content/uploads/2019/12/xnu_debugger_primer.pdf

47
run-diagnostics.sh Executable file
View file

@ -0,0 +1,47 @@
#!/usr/bin/env bash
# run-diagnostics.sh: checks common virtualization programs, modules and
# options. Written by Foxlet <foxlet@furcode.co>. Modified by Dhiru for OSX-KVM
# project.
#
# Note: This script is borrowed from https://github.com/foxlet/macOS-Simple-KVM
# project.
echo "== Distro Info ==" >&2
lsb_release -a 2>/dev/null
echo -e "\n== Loaded Modules ==" >&2
lsmod | grep kvm
lsmod | grep amd_iommu
lsmod | grep intel_iommu
v=$(cat /sys/module/kvm/parameters/ignore_msrs)
if [ "$v" != "Y" ]; then
echo -e "\nATTENTION: /sys/module/kvm/parameters/ignore_msrs setting seems to be incorrect!"
fi
echo -e "\n== Installed Binaries ==" >&2
if [ -x "$(command -v qemu-system-x86_64)" ]; then
qemu-system-x86_64 --version
else
echo -e "qemu is not installed." >&2
fi
if [ -x "$(command -v virt-manager)" ]; then
echo -e "virt-manager version $(virt-manager --version)"
else
echo -e "virt-manager is not installed." >&2
fi
if [ -x "$(command -v python)" ]; then
python --version
else
echo -e "python is not installed." >&2
fi
echo -e "\n== Networking ==" >&2
ip link show virbr0 >/dev/null 2>&1
if [ "$?" != 0 ]; then
echo -e "Interface virbr0 doesn't seem to exist. Check your networking configuration." >&2
else
echo -e "Found virbr0. Good."
fi

BIN
screenshots/ida-patch.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 935 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

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