Jump to content

Clover Change Explanations


172 posts in this topic

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

Снимок экрана 2019-08-22 в 23.24.49.png

 

Снимок экрана 2019-08-22 в 23.25.10.png

 

Снимок экрана 2019-08-22 в 23.25.23.png

 

i.e. kexts in the folder Off are disabled by default.

  • Like 12

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.

  • Like 10
  • Thanks 1
  • 2 weeks later...

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.

Снимок экрана 2019-09-02 в 20.42.21.png

  • Like 8

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.

screenshot2.png

 

I am not sure if the method will work for every hardware and hope we can find methods for different computers.

  • Like 9
  • Thanks 3
  • Confused 1

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
  • Like 4
  • Thanks 1
  • 1 month later...

Rev 5094-5-gbe7ab87d (github)

Implemented mask patching for kexts, kernel and boot.efi.

Syntax is follow

Screenshot 2019-10-09 at 06.37.00.png

 

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.

  • Like 12
  • 2 months later...

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.

 

 

  • Like 5
  • Thanks 1
  • Confused 1
  • 1 month later...

Rev 5104

Clover switched to C++ programming language. Thanks to Jief_Machak.

C++ proposition

Programming tips will follow.

  • Like 7
  • Thanks 1
  • 1 month later...

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

Снимок экрана 2020-04-08 в 13.13.28.png

 

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.

  • Like 5
  • 3 weeks later...

Rev 5114 commit 01f33f7

Here I implemented a detect arbitrary Linux version booted by grub.

To check I created 3 folders

Снимок экрана 2020-04-23 в 13.16.24.png

and I see three new entries in Clover menu even though there is no such Linux UUU.

Снимок экрана 2020-04-23 в 14.18.47.png

  • Like 3
  • Confused 1

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.

  • Like 6

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.

  • Like 7

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.

  • Like 8
  • Confused 2
  • 2 weeks later...

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>

 

  • Like 3

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. 

 

  • Like 4

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.

  • Like 4
  • 1 month later...

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.

  • Like 13

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

 

  • Like 18
  • Thanks 1

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

 

  • Like 7
  • 2 months later...

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.

  • Like 11
  • Thanks 8
  • 3 months later...

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.

 

  • Like 4
  • Thanks 1
  • 2 weeks later...

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.

  • Like 3
  • Thanks 2