description |
---|
We'll go through the config.plist sections, one at a time for a Skylake desktop setup. |
I like to start with either the stock config.plist that Clover gives you, or with just a blank canvas. In the next examples, I'll show you how I set things up from scratch; if you start from somewhere else, you may have more things checked/set than I do - but you'll want to follow along with what I do.
I'll also include the raw xml examples too in order to show those that work with a text editor (as I prefer to).
The default Clover settings are pretty overdone and can cause some issues. We'll keep this section fairly minimal, and I'll go through a bit of why we do that for each part as well.
<key>ACPI</key>
<dict>
<key>DSDT</key>
<dict>
<key>Fixes</key>
<dict>
<key>AddMCHC</key>
<true/>
<key>FixHPET</key>
<true/>
<key>FixIPIC</key>
<true/>
<key>FixRTC</key>
<true/>
<key>FixShutdown</key>
<true/>
<key>FixTMR</key>
<true/>
</dict>
<key>Patches</key>
<array>
<dict>
<key>Comment</key>
<string>change XHCI to XHC</string>
<key>Disabled</key>
<false/>
<key>Find</key>
<data>
WEhDSQ==
</data>
<key>Replace</key>
<data>
WEhDXw==
</data>
</dict>
<dict>
<key>Comment</key>
<string>change XHC1 to XHC</string>
<key>Disabled</key>
<false/>
<key>Find</key>
<data>
WEhDMQ==
</data>
<key>Replace</key>
<data>
WEhDXw==
</data>
</dict>
<dict>
<key>Comment</key>
<string>change SAT0 to SATA</string>
<key>Disabled</key>
<false/>
<key>Find</key>
<data>
U0FUMA==
</data>
<key>Replace</key>
<data>
U0FUQQ==
</data>
</dict>
</array>
</dict>
<key>DropTables</key>
<array>
<dict>
<key>Signature</key>
<string>DMAR</string>
</dict>
<dict>
<key>Signature</key>
<string>MATS</string>
</dict>
</array>
<key>FixHeaders</key>
<true/>
<key>SSDT</key>
<dict>
<key>Generate</key>
<dict>
<key>PluginType</key>
<true/>
</dict>
</dict>
</dict>
The first thing we'll go over is the Patches section. This section allows us to dynamically rename parts of the DSDT via Clover. Since we're not running a real mac, and macOS is pretty particular with how things are named, we can make non-destructive changes to keep things mac-friendly. We have three entries here:
- change XHCI to XHC - helps avoid a conflict with built-in USB injectors
- change XHC1 to XHC - helps avoid a conflict with built-in USB injectors
- change SAT0 to SATA - for potential SATA compatibility
If we look then at the Fixes section, we'll see that we have a few things checked (there are 2 pages, so I included 2 screenshots):
- FixShutdown - this can help with some boards that prefer to restart instead of shutdown. Sometimes it can cause shutdown issues on other boards (ironic, right?), so if you have issues shutting down with this enabled, look at disabling it.
- The remaining fixes help avoid IRQ conflicts and etc, and are not known to cause issues. They may not be necessary for all hardware, but do not negatively impact anything if applied.
We touched in gently on DSDT with our Patches section - and this is a a bit of an extension of that. SSDT is like a sub-section of DSDT. The Drop Tables section allows us to omit certain SSDT tables from loading (as I mentioned before, mac and PC DSDT is different, and macOS can be rather picky). The two that I've added are as follows:
- DMAR - this prevents some issues with Vt-d; which is PCI passthrough for VMs, and not very functional (if at all?) on Hackintoshes.
- MATS - with High Sierra on up this table is parsed, and can sometimes contain unprintable characters that can lead to a kernel panic.
The only other things we've done on this page are enable these two checkboxes.
- FixHeaders - this is just a double-up of our MATS table dropping. This checkbox tells Clover to sanitize headers to avoid kernel panics related to unprintable characters.
- PluginType - this injects some DSDT data to get X86PlatformPlugin to load - giving us a leg-up on native CPU power management. This setting only works on Haswell and newer CPUs though.
We don't need to do too much here, but we'll tweak a few things.
<key>Boot</key>
<dict>
<key>Arguments</key>
<string>keepsyms=1 dart=0 debug=0x100 -v</string>
<key>DefaultVolume</key>
<string>LastBootedVolume</string>
<key>Timeout</key>
<integer>5</integer>
</dict>
We have a few boot args set here:
-v
- this enables verbose mode, which shows all the behind-the-scenes text that scrolls by as you're booting instead of the Apple logo and progress bar. It's invaluable to any Hackintosher, as it gives you an inside look at the boot process, and can help you identify issues, problem kexts, etc.dart=0
- this is just an extra layer of protection against Vt-d issues.debug=0x100
- this prevents a reboot on a kernel panic. That way you can (hopefully) glean some useful info and follow the breadcrumbs to get past the issues.keepsyms=1
- this is a companion setting todebug=0x100
that tells the OS to also print the symbols on a kernel panic. That can give some more helpful insight as to what's causing the panic itself.
These are the only other settings I've updated in this section.
- DefaultBootVolume - this uses NVRAM to remember which volume was last booted by Clover, and auto-select that at the next boot.
- Timeout - this is the number of seconds before the DefaultBootVolume auto-boots. You can set this to
-1
to avoid all timeout, or to0
to skip the GUI entirely. If set to0
, you can press any keys at boot to get the GUI to show back up in case of issues.
Nothing here - just the stock settings. You could adjust this if Clover's scaling needs changes, but I don't mess with it.
Again, nothing here gets changed in most setups I've worked with.
We'll handle some slick property injection for WhateverGreen here, and do some basic audio setup.
<key>Devices</key>
<dict>
<key>Audio</key>
<dict>
<key>Inject</key>
<integer>1</integer>
<key>ResetHDA</key>
<true/>
</dict>
<key>Properties</key>
<dict>
<key>PciRoot(0x0)/Pci(0x2,0x0)</key>
<dict>
<key>AAPL,ig-platform-id</key>
<data>
AAASGQ==
</data>
<key>framebuffer-patch-enable</key>
<data>
AQAAAA==
</data>
<key>framebuffer-stolenmem</key>
<data>
AAAwAQ==
</data>
</dict>
</dict>
<key>USB</key>
<dict>
<key>FixOwnership</key>
<true/>
</dict>
</dict>
This section remains empty for our example setup. In the past, almost-supported iGPUs (like the HD 4400) would get faked to a supported iGPU here, but we'll be using the cleaner Properties section for this.
Under this section, we ensure that Inject and FixOwnership are selected to avoid issues with hanging at a half-printed line somewhere around the Enabling Legacy Matching
verbose line. You can also get past that by enabling XHCI Hand Off in BIOS.
Here we set our audio to inject Layout 1 - this may or may not be compatible with your codec, but you can check on AppleALC's Supported Codec Page.
We also enabled ResetHDA which puts the codec back in a neutral state between OS reboots. This prevents some issues with no audio after booting to another OS and then back.
This section is setup via Headkaze's Intel Framebuffer Patching Guide and applies only one actual property to begin, which is the ig-platform-id. The way we get the proper value for this is to look at the ig-platform-id we intend to use, then swap the pairs of hex bytes.
If we think of our ig-plat as 0xAABBCCDD
, our swapped version would look like 0xDDCCBBAA
.
The two ig-platform-id's we use are as follows:
0x19120000
- this is used when the iGPU is used to drive a display00001219
when hex-swappedAAASGQ==
when the hex-swapped version is converted to base64
0x19120001
- this is used when the iGPU is only used for compute tasks, and doesn't drive a display01001219
when hex-swappedAQASGQ==
when the hex-swapped version is converted to base64
We also add 2 more properties, framebuffer-patch-enable and framebuffer-stolenmem. The first enables patching via WhateverGreen.kext, and the second sets the min stolen memory to 19MB.
We have nothing to do here.
<key>GUI</key>
<dict>
<key>Scan</key>
<dict>
<key>Entries</key>
<true/>
<key>Tool</key>
<true/>
</dict>
</dict>
The only settings I've tweaked on this page are the Scan settings. I've selected Custom, then checked everything except Legacy and Kernel. This just omits some of the unbootable entries in Clover to clean up the menu.
I haven't added anything here, but you can hide unwanted volumes here. You can do so by either adding the volume's name, or UUID.
To hide extra APFS entries, add the following to this list:
Preboot
VM
To hide all Recovery partitions, add Recovery
to the list.
To get the UUID of a drive to hide, you can use the following terminal command:
diskutil info diskXsY | grep -i "Partition UUID" | rev | cut -d' ' -f 1 | rev
Make sure to replace diskXsY
with the actual disk number of the volume you'd like to hide.
If you want to test out a new theme (and I suggest you look at clover-next-black), you can add the unzipped theme folder to the /Volumes/EFI/EFI/CLOVER/themes directory, then type the name of the folder in the Theme text field to apply it.
In the past, we'd setup the iGPU here, but since we already did that via Properties in the Devices section, we have nothing to really configure here. NOTE: When Clover detects an Intel iGPU, it automatically enables Intel Injection if the Graphics section doesn't exist in the config.plist. To bypass this, you can explicitly disable injection using the raw XML below, or by clicking the "Inject Intel" button once to check it, and once to uncheck it in CC.
<key>Graphics</key>
<dict>
<key>Inject</key>
<false/>
</dict>
<key>KernelAndKextPatches</key>
<dict>
<key>KernelPm</key>
<true/>
<key>KextsToPatch</key>
<array>
<dict>
<key>Comment</key>
<string>Port limit increase</string>
<key>Disabled</key>
<false/>
<key>Find</key>
<data>
g710////EA==
</data>
<key>InfoPlistPatch</key>
<false/>
<key>MatchOS</key>
<string>10.12.x</string>
<key>Name</key>
<string>com.apple.driver.usb.AppleUSBXHCI</string>
<key>Replace</key>
<data>
g710////Gw==
</data>
</dict>
<dict>
<key>Comment</key>
<string>Port limit increase (RehabMan)</string>
<key>Disabled</key>
<false/>
<key>Find</key>
<data>
g32IDw+DpwQAAA==
</data>
<key>InfoPlistPatch</key>
<false/>
<key>MatchOS</key>
<string>10.13.x</string>
<key>Name</key>
<string>com.apple.driver.usb.AppleUSBXHCI</string>
<key>Replace</key>
<data>
g32ID5CQkJCQkA==
</data>
</dict>
<dict>
<key>Comment</key>
<string>Port limit increase (PMHeart)</string>
<key>Disabled</key>
<true/>
<key>Find</key>
<data>
g/sPD4MDBQAA
</data>
<key>InfoPlistPatch</key>
<false/>
<key>MatchOS</key>
<string>10.14.0</string>
<key>Name</key>
<string>com.apple.driver.usb.AppleUSBXHCI</string>
<key>Replace</key>
<data>
g/sPkJCQkJCQ
</data>
</dict>
<dict>
<key>Comment</key>
<string>Port limit increase (Ricky)</string>
<key>Disabled</key>
<false/>
<key>Find</key>
<data>
g/sPD4OPBAAA
</data>
<key>InfoPlistPatch</key>
<false/>
<key>MatchOS</key>
<string>10.14.x</string>
<key>Name</key>
<string>com.apple.driver.usb.AppleUSBXHCI</string>
<key>Replace</key>
<data>
g/sPkJCQkJCQ
</data>
</dict>
<dict>
<key>Comment</key>
<string>External Icons Patch</string>
<key>Disabled</key>
<false/>
<key>Find</key>
<data>
RXh0ZXJuYWw=
</data>
<key>InfoPlistPatch</key>
<false/>
<key>Name</key>
<string>AppleAHCIPort</string>
<key>Replace</key>
<data>
SW50ZXJuYWw=
</data>
</dict>
</array>
</dict>
In this section, we've enabled a few settings and added some kext patches.
We have a couple checkboxes selected here:
- Apple RTC - this ensures that we don't have a BIOS reset on reboot.
- KernelPM - this setting prevents writing to MSR 0xe2 which can prevent a kernel panic at boot.
We added 4 different kexts to patch here. Three of them are for USB port limit increases, and the last acts as an orange icons fix - when internal drives are hotpluggable, and treated as external drives.
You'll notice that there are MatchOS values set for each of the USB port limit patches. You can remove any of the entries for OS versions you don't intend to run. They won't do any harm being there, but if you want a clean, minimal plist, there's no sense in having them.
<key>RtVariables</key>
<dict>
<key>BooterConfig</key>
<string>0x28</string>
<key>CsrActiveConfig</key>
<string>0x3E7</string>
<key>MLB</key>
<string>C02634902QXGPF7FB</string>
<key>ROM</key>
<string>UseMacAddr0</string>
</dict>
<key>SMBIOS</key>
<dict>
<key>BoardSerialNumber</key>
<string>C02634902QXGPF7FB</string>
<key>ProductName</key>
<string>iMac17,1</string>
<key>SerialNumber</key>
<string>C02S8DY7GG7L</string>
<key>SmUUID</key>
<string>DD574F3E-5774-414A-8FF9-5B0089B09480</string>
</dict>
For setting up the SMBIOS info, I use acidanthera's macserial application. I wrote a python script that can leverage it as well (and auto-saves to the config.plist when selected). There's plenty of info that's left blank to allow Clover to fill in the blanks; this means that updating Clover will update the info passed, and not require you to also update your config.plist.
For this Skylake example, I chose the iMac17,1 SMBIOS.
To get the SMBIOS info generated with macserial, you can run it with the -a
argument (which generates serials and board serials for all supported platforms). You can also parse it with grep
to limit your search to one SMBIOS type.
With our iMac17,1 example, we would run macserial like so via the terminal:
macserial -a | grep -i iMac17,1
Which would give us output similar to the following:
iMac17,1 | C02S8DY7GG7L | C02634902QXGPF7FB
iMac17,1 | C02T4WZSGG7L | C02703104GUGPF71M
iMac17,1 | C02QQAYPGG7L | C025474014NGPF7FB
iMac17,1 | C02SNLZ3GG7L | C02645501CDGPF7AD
iMac17,1 | C02QQRY8GG7L | C025474054NGPF71F
iMac17,1 | C02QK1ZXGG7L | C02542200GUGPF7JC
iMac17,1 | C02SL0YXGG7L | C026436004NGPF7JA
iMac17,1 | C02QW0J5GG7L | C02552130QXGPF7JA
iMac17,1 | C02RXDZYGG7L | C02626100GUGPF71H
iMac17,1 | C02R4MYRGG7L | C02603200GUGPF7JA
The order is Product | Serial | Board Serial (MLB)
The iMac17,1
part gets copied to SMBIOS -> Product Name.
The Serial
part gets copied to SMBIOS -> Serial Number.
The Board Serial
part gets copied to SMBIOS -> Board Serial Number as well as Rt Variables -> MLB.
We can create an SmUUID by running uuidgen
in the terminal (or it's auto-generated via my GenSMBIOS script) - and that gets copied to SMBIOS -> SmUUID.
We set Rt Variables -> ROM to UseMacAddr0
which just utilizes our onboard Mac address - this should be unique enough to not conflict with any others.
BooterConfig gets set to 0x28
, and CsrActiveConfig is set to 0x3e7
which effectively disables SIP. You can choose a number of other options to enable/disable sections of SIP. Some common ones are as follows:
0x0
- SIP completely enabled0x3
- Allow unsigned kexts and writing to protected fs locations0x3e7
- SIP completely disabled
<key>SystemParameters</key>
<dict>
<key>InjectKexts</key>
<string>Yes</string>
<key>InjectSystemID</key>
<true/>
</dict>
This setting has 3 modes:
Yes
- this tells Clover to inject kexts from the EFI regardless.No
- this tells Clover not to inject kexts from the EFI.Detect
- this has Clover inject kexts only if FakeSMC.kext is not in the kext cache.
We set it to Yes
to make sure that all the kexts we added before get injected properly.
This setting tells clover to set the SmUUID as the system-id
at boot - which is important for iMessage and such.
At this point, you can do File -> Save to save the config.plist. If you have issues saving directly to the EFI, you can save it on the Desktop, then just copy it over. I'll leave the sample config.plist here too.