Author Posted August 22, 2019 Rev 5052 Implemented a possibility to change injected kext. For example you want to test new version of VoodooPS2.kext while you have another one. Place new kext in folder /EFI/CLOVER/kexts/Off and your old kext in /EFI/CLOVER/kexts/Other as usual. Then go to menu and click disable one and enable another. Screenshots i.e. kexts in the folder Off are disabled by default. 12
Posted August 23, 2019 Rev 5051 In a multi-GPU system, Clover will now detect to which GPU the monitor is connected, and put it first on the GPU list. It is also now possible to use in config.plist at Devices/Properties, instead of the DevicePath where we want to inject properties, the string "PrimaryGPU" or "SecondaryGPU". This can be used for injecting some properties always to active or inactive GPU. An example for a case where this can come handy, and more information on how to use it, is detailed here. Also, when using the config.plist option GUI/ShowOptimus, it will now show correctly at the bottom of GUI if monitor is currently connected to Intel or Discrete. 10 1
Author Posted September 2, 2019 Rev 5060 Implemented patch to no kext dump at panic which is useful to diagnose. The patch is a copy from same patch in OpenCore. 8
Author Posted September 3, 2019 Rev 5064 Implemented a possibility to Clear CMOS from Clover. If you forgot a password for BIOS you need no more to take a screwdriver. You may boot into Clover and then type SPACE key on reset button in second row. I am not sure if the method will work for every hardware and hope we can find methods for different computers. 9 3 1
Posted September 4, 2019 Rev 5068 Clover at sourceforge is synced to EDK2 tagged as edk2-stable201908. This version of EDK2 is not on EDK2's sourceforge svn which is no longer maintened. It is github only. UDK2018 support is terminated due to incompatibility. Get fresh copy of EDK2 from tag edk2-stable201908 copy Clover/Patches_for_EDK2 over EDK2 tree clean rebuild Clover 4 1
Author Posted October 9, 2019 Rev 5094-5-gbe7ab87d (github) Implemented mask patching for kexts, kernel and boot.efi. Syntax is follow There are new fields MaskFind and MaskReplace which are bit mask. If they are absent then for backward compatibility old behavior consumed. If present MaskFind Some bit =1 means source must be same as find string. =0 means source may have any bit. If MaskFind is not set then full string must be exactly as find string. MaskReplace Some bit =1 means this bit will be replaced by replace string. =0 means source bit remains untouched. If MaskReplace is not set then full string will be replace. Example (joke) If you want to find all occurrence of word "clever" or "Clever" and replace it to "clover" or "Clover" correspondingly then you have to choose the pattern Find 43 6c 65 76 65 72 MaskFind DF FF FF FF FF FF See 0xDF have bit 0x20 unset to not differ capital letter. Replace 43 6c 6f 76 65 72 MaskReplace 00 00 FF 00 00 00 So we set to replace only one letter. A mask len can be smaller then find/replace string. Zero will be assumed to fill the string. So for this example we can set MaskReplace 00 00 FF I thing we can use this method also for internal Clover patches like FakeCPUID to simplify patterns and make it more universal for future systems. Some next work requires. Rev 5094-6-gd139fa45 One change. For MaskFind the default bits are 0xff so for the example above we can set MaskFind DF assuming all other bits should be 0xFF meaning strict correspondence of search string to pattern. 12
Posted December 18, 2019 Rev 5101 Kext folders Since December 17th 2019 there is new folder where you can store your kexts : 10' : all versions, all boot modes (normal, install, recovery). Basically same as 'Other'. 10_normal : all version, boot mode "normal", means NOT recovery, NOT install 10_install : all version, installer 10_recovery : all version, recovery 10.{major version} : all boot mode for any minor version of this major version 10.{major version}_normal, _recovery, _install : you understood it now. 10.{major version}.0 OR 10.{major version}.{minor version} : all boot mode for this particular version. add _normal, _recovery, _install : same as before for this particular version. 5 1 1
Author Posted February 17, 2020 Rev 5104 Clover switched to C++ programming language. Thanks to Jief_Machak. C++ proposition Programming tips will follow. 7 1
Author Posted April 8, 2020 Rev 5109 GUI rendering engine rewritten to C++ but not a copy of old engine. It is rather new engine. First it draw transparent menu over Banner. Other transparency differences. Looks like Second there is no more a bug with screen resolution changed by F9. Now it is possible! Now theme designers should more carefully check all images. New engine is more rigorous to images. However they may named icons as *.png as it should be. Not .icns as before. 5
Author Posted April 23, 2020 Rev 5114 commit 01f33f7 Here I implemented a detect arbitrary Linux version booted by grub. To check I created 3 folders and I see three new entries in Clover menu even though there is no such Linux UUU. 3 1
Author Posted April 24, 2020 Rev 5114 commit 21f4bc6cb4b7eb28b2fb7b60647c044b479a2f6a I have to explain extended capabilities for kext patches, as well as kernel and booter. <key>KernelToPatch</key> <array> <dict> <key>Comment</key> <string>Disable panic kext logging on 10.14 Release kernel</string> <key>Disabled</key> <true/> <key>Find</key> <data>igKEwHRC</data> <key>MaskFind</key> <data>////////</data> <key>MatchOS</key> <string>10.14</string> <key>Replace</key> <data>igKEwOtC</data> <key>MaskReplace</key> <data>AAAAAP8A</data> </dict> Find = <.....> byte array to search MaskFind = <00 FF 01> etc. Bit 0 means don't compare. Bit 1 means must be same. if MaskFind has length less then Find array, then rest of bytes will be full checked. Replace = <...> byte array to replace NEW! If Replace array is less then Find array then the rest of bytes will not be changed. MaskReplace = <FF 00 02> etc. Bit 0 means keep untouched. Bit 1 means replace with a bit from Replace array. If MaskReplace array is less the Replace array then the rest of bytes will not be changed. If MaskFind or MaskReplace are absent then old behavior assumed, full array search and full array replace. 6
Author Posted April 25, 2020 Rev 5114 commit 615b7109448b32b1f1889324d8e59f78110e2ebb The feature to improve search and replace pattern in kernel/kext/booter. First we find a start position with some pattern. Then we search a string inside the range from start. I also created an utility that do the same search manually from command line. See [For Hackers] Utility to search a masked string Config.plist will be more complex <dict> <key>Comment</key> <string>Lapic panic patch example</string> <key>MatchOS</key> <string>All</string> <key>Disabled</key> <true/> <key>StartPattern</key> <data>ACnHeAAx241H+oM=</data> <key>MaskStart</key> <data>/////wA=</data> <key>Find</key> <data>6AAA//+DAAAAAAAA</data> <key>MaskFind</key> <data>/wAA////AAAAAP//</data> <key>Replace</key> <data>6AAA//8xwJCQkJCQ</data> <key>MaskReplace</key> <data>/wAA////////////</data> <key>RangeFind</key> <integer>200</integer> </dict> StartPattern is a byte string to search from where to start. In this case <0029C7780031DB8D47FA83> MaskStart in this case <FFFFFFFF00>. It is shorter then StartPattern so the rest of bytes will be FF <FFFFFFFF00FFFFFFFFFFFF> It means that all bytes must be strict equal except 5th byte where mask = 00. This byte can be any. RangeFind is a number of byte to check. So StartPattern was found at address=X Find array will be searching in the range [X, X+RangeFind]. Again Find string is masked with MaskFind. If found at address Y then the range [Y, Y+ReplaceLength] will be replaced by Replace string accounting MaskReplace. PS. I know it is very difficult to get so I wrote this several times. Hope good hackers will use this possibility. And I am not fully tested Clover. Bugs are possible although the utility was fully checked. 7
Author Posted April 28, 2020 Rev 5114 commit a621438d7c226d024ea313bea5b75da962672805 Symbolic patching. Now the Clover is able to find a procedure inside kext or kernel (mach-o format) to apply patches inside it. It is faster and should be version independent if no major changes. The syntax is present in config-sample.plist <dict> <key>Comment</key> <string>Symbolic patch example got lapic panic</string> <key>MatchOS</key> <string>All</string> <key>Disabled</key> <true/> <key>Procedure</key> <string>_lapic_interrupt</string> <key>Find</key> <data>6AAA//+DAAAAAAAA</data> <key>MaskFind</key> <data>/wAA////AAAAAP//</data> <key>Replace</key> <data>6AAA//8xwJCQkJCQ</data> <key>MaskReplace</key> <data>/wAA////////////</data> <key>RangeFind</key> <integer>200</integer> </dict> New here is Procedure = "_lapic_interrupt" as an example. It can be any other procedure found in disassembled text. For kexts names are more complex because of C++. Later I will do check by substring to simplify this case. Anyway before use in Clover you may double check if the patch works using FindMask utility. 8 2
Author Posted May 11, 2020 Rev 5116 commit d5305c8cc858254dede21f59dd8964980b1ce56a Exclude KernelCPU patch. This technology introduced at 10.6 system to prevent kernel crash on unsupported CPU. It patched CPUID and erases SSE3 features check. It is wrong. There are many other places with check and many utilities is a system uses SSE3 command. The right way is using FakeCPUID and in the case of old CPU using CPU commands emulator (embedded in special kernel or as separate kext). So I excluded this patch from Clover. Rev 5116 commit 0b7eed38f14400c8501228a30dcc023e1132cec3 Exclude DropOEM_DSM methods. OEM DSDT often has own _DSM methods which is written for Windows and not reliable for macOS. These methods can't be present if we want to write own _DSM methods. Double method causes crash. Old Clover patch DropOEM_DSM assumes user to check what DSM he want to drop. Nobody uses it! The right way is always drop. And mostly the best way is to rename all OEM methods <key>DSDT</key> <dict> <key>Patches</key> <array> <dict> <key>Find</key> <data>X0RTTQ==</data> <key>Comment</key> <string>Rename oem _DSM to ZDSM</string> <key>Replace</key> <data>WkRTTQ==</data> </dict> 3
Author Posted May 11, 2020 Rev 5116 commit 84ebcbb439e0a998a4a3295327b113fc6c1ee157 NoDefaultProperties will be true by default. When we set Inject for graphics card Clover will inject some set of properties most of them useful while some properties prevent new systems to start the graphics. I see many advices to not inject graphics but this is strauss strategy. It is better to inject safe properties and may be add your own properties then just switch off injection. There is a setting NoDefaultProperties invented for this case but users don't want to read instructions and just know nothing about it. So since next realease the setting will be default true allowing you safely inject properties. As far as I remember it should be set to false in the case of Nvidia Tesla (9600GT for example) in ElCapitan. I apologise in advance for some backward incompatibility. 4
Author Posted May 11, 2020 Rev 5116 commit 9fae59d10c365fa2cd2b1a3221bf7b9ecfbc1e5f We excluded old CloverThemeManager from distribution. It is good program but somehow deprecated. Use new Clover.app having the same functionality. 4
Author Posted July 9, 2020 Rev 5119 commit 620401d Included OcQuirks and OpenRuntime into Clover repository. The drivers will be built at Clover compilation. Further they will be improved and included into package. 13
Author Posted July 15, 2020 Rev 5119 commit cd2318129, 60901993b Now OcQuirks.plist excluded because it embedded to config.plist as section "Quirks". See config-sample.plist. Moreover there is a menu to tune the set of quirks from Clover GUI Reveal hidden contents 18 1
Author Posted July 22, 2020 Rev 5120 commit f7c13f0b8 Repaired symbolic kext patching. For example you may eliminate violet strips on the start screen with AMD videocards by this patch not using whatevergreen. Reveal hidden contents 7
Author Posted October 16, 2020 Rev 5123->5125 Since rev5123 we make joined bootloader Clover+OpenCore. It started as Clover using Clover's GUI and ability to change settings and then started OpenCore to inject and patche kexts and start macOS. Starting Windows and other OSes is done by Clover's way. There are new section in config.plist named Quirks that collect setting for OpenCore but some setting is just delegated from Clover because it can change it on the fly. There is a correspondence of OpenCore and traditional Clover settings to easy migrate from OpenCore to new Clover. OpenCore Clover AppleCpuPmCfgLock AppleIntelCPUPM AppleXcpmCfgLock KernelPm DisableRtcChecksum AppleRTC LapicKernelPanic KernelLapic About kernel and kext patches there is the follow. 1. OC accounts them as same and name "kernel" in the place of name of kext. Clover has different section for Kernel patches, kexts patches and Booter (boot.efi) patches. 2. Clover deal only with 64 bit arch while OC has "Arch" parameter. Other fields are OpenCore Clover Base Procedure Comment Comment Count Count Enabled Disabled Skip Skip Identifier Name Find Find Mask MaskFind Replace Replace ReplaceMask MaskReplace MaxKernel - MinKernel - - MatchOS - InfoPlistPatch - RangeFind 3. Procedure name in OpenCore must be long like __ZN8AppleRTC18setupDateTimeAlarmEPK11RTCDateTime Clover can use short name. In the example it can be setupDateTimeAlarm. 4. OpenCore assumes byte mask while Clover assumes bit masking. In the case of 0xFF00FF it will be the same. More careful see documentation for OpenCore and samples for Clover at this page. 5. RangeFind restrict search in Clover by several bytes. I don't know if OpenCore is able do the same. 6. Patches in OpenCore can be "Enabled" by setting the variable while in Clover they are enabled by default. User can disable it in the config.plist or in Clover GUI. 7. For Kernel patches we had additional "StartPattern" and corresponding "MaskStart" to define a place from what we want to search. OpenCore has no such service. Later we will extend the possibility. 11 8
Author Posted February 7 Rev 5129 commit 5d75cb7 There are rumors that DataHubDxe is not needed and all is working without it. It is not true especially if a novice created his first hackintosh. DataHubDxe sends OEM model, FSBFrequency, ARTFrequency, Clover's boot-log and many other things to macOS to be used by OS or by other projects. One of them is ARTFrequency introduced since Skylake CPU. macOS up to BigSur 11.2 calculates the value not correctly so we have to help it. Now the XNU sources is published so we can see how it happen. See issue https://github.com/CloverHackyColor/CloverBootloader/issues/351 So this commit make DataHub protocol is always included into Clover and you may not use the driver DataHubDxe.efi. As well the settings UseARTFrequency is true for Skylake and up by default. I also should mention that the list of supported CPU in BigSur is still much shorter then in Clover so you have to use FakeCPUID feature. 4 1
Author Posted February 21 Rev 5130 commit 3b1f57ba8 ACPI->RenameDevices was <dict> before. But Plist Editors may sort <dict> so we have not sure about order of execution. I recommend to rewrite this patches to be an array. Array always keeps original order. For example, it was <key>RenameDevices</key> <dict> <key>_SB.PCI0.RP05.PXSX</key> <string>UPSB</string> <key>_SB.PCI0.RP05.UPSB.DSB1.NHI0</key> <string>UPS0</string> <key>_SB.PCI0.RP03.PXSX</key> <string>BRG3</string> </dict> See, second rename depends on first rename so we must sure in order. New Clover proposes to rewrite this as <key>RenameDevices</key> <array> <dict> <key>_SB.PCI0.RP05.PXSX</key> <string>UPSB</string> </dict> <dict> <key>_SB.PCI0.RP05.UPSB.DSB1.NHI0</key> <string>UPS0</string> </dict> <dict> <key>_SB.PCI0.RP03.PXSX</key> <string>BRG3</string> </dict> </array> In this case the order will be guaranteed. Backward compatibility: New Clover will understand old config.plist. You may not change it. Old Clover will not understand new config.plist and may crash. So rewrite your config.plist if you sure it is needed and you will not return to older Clover. 3 2