A GUIDE TO USING LATEBLOOM
Q. What is LATEBLOOM?
A. Latebloom is a experimental software workaround for the race condition encountered when booting MacPro 4,1 and MacPro 5,1 computers using macOS 11.3+. The software workaround is supplied as latebloom.kext. The term kext is shorthand for kernel extension. Kexts are used by developers to load code directly into the macOS kernel. Kernel extensions can be injected to the OS in the pre-boot environment by a boot loader such as OpenCore.
Q. Who developed latebloom?
A. MacRumors user
@Syncretic created latebloom.kext and posted it to MacRumors for beta testing in the MP 1,1-5,1 forum thread
Latebloom - An experimental workaround for the 11.3+ race condition. The author described latebloom.kext as follows, "This kext hooks the IOPCIFamily PCI Bus Probe routine and adds delays as specified by its arguments.”
Q. Who can use this software?
A. Latebloom is experimental software currently undergoing beta testing by MacRumors MacPro forum users and available to users accessing the forums.
Q. Who should use this software?
A. The latebloom kext is designed as a workaround to a booting issue for MacPro 4,1 and MacPro 5,1 users unable to boot Big Sur 11.3+ and Monterey beta versions that cannot reliably boot due to an unknown root cause. This kext has been designed around the presumption that the issue involves PCIe bus enumeration.
Q. How is the kext incorporated into macOS 11.3+?
A. The kext can be injected into the operating system prior to macOS booting by two methods. The method described in the forum thread uses the OpenCore boot loader to install, run and update macOS Big Sur and Monterey. The OpenCore config.plist is used to inject the kext into macOS. Note that latebloom.kext is not needed for macOS Catalina. Latebloom.kext is only required in Big Sur versions 11.3+. If OpenCore is not used to inject latebloom, in can be incorporated by direct kernel linking; however, Syncretic has not tested this method at this time.
Q. Who should NOT use latebloom.kext?
A. One should have familiarity with using the Mac terminal, OpenCore documentation, creating and modifying an EFI, creating and modifying the OpenCore config.plist, verifying, validating and loading config.plist, installing OpenCore debug version, blessing disks. To learn more about OpenCore see the MacRumors forum MP1,1-5,1 thread
OpenCore on the Mac Pro.
Q. I am psyched to try latebloom, where do I begin?
A. 1. Have a working backup of your Mac and its data.
2. Have a backup bootable OS on a disk you are not experimenting with.
Q. Why did you suggest installing OpenCore debug version?
A. The debug version of OpenCore will allow you to examine its log for errors which may be reported. Many testers of latebloom are using the debug version and as a race condition may be affected by the software used, using the debug version may provide one less variable in latebloom testing.
GETTING STARTED
1. You have OpenCore debug version ready to be installed and understand the parameters necessary to configure it so that it can generate error logs and/or outputs you need. See the OpenCore Reference Manual for documentation on debugging with OpenCore.
2. Install OpenCore debug version following the instructions found in the Wiki post,
Post #1 of the MacRumors forum MP 1,1-5,1 thread
OpenCore on the Mac Pro. You will need to complete and understand the instructions in PART I, PART II, PART III and PART IV.
WORKING WITH LATEBLOOM
1. Download the latest version of latebloom.kext from the Wiki post,
Post #1 of MacRumors MP 1,1-5,1 forum thread
Latebloom - An experimental workaround for the 11.3+ race condition. The kext is an attachment to
Post #1.
2. Mount the EFI on the disk of the macOS that you will be testing with latebloom. Copy latebloom.kext into the kext folder.
/Volumes/EFI/EFI/OC/Kexts
. This is the folder where you will also find Lilu.kext and WhateverGreen.kext used by OpenCore.
3. Make a copy of your tested, working config.plist used with a macOS less than version 11.3.
4. Use your favorite config.plist editor/configurator to add the code for latebloom to the Kernel | Add section of config.plist. Latebloom's code must follow the Add sections for Lilu.kext and WhateverGreen.kext in this order. Note that the value for MinKernel is set to 20.4.0 so that latebloom.kext is only loaded for macOS versions 11.3+. In other words you cannot expect to see the latebloom kext loaded for Catalina or Big Sur versions earlier than 11.3+. The following code was provided by
@Syncretic.
Code:
<dict>
<key>Arch</key>
<string>x86_64</string>
<key>BundlePath</key>
<string>latebloom.kext</string>
<key>Comment</key>
<string>PCI delay for BS/Monterey</string>
<key>Enabled</key>
<true/>
<key>ExecutablePath</key>
<string>Contents/MacOS/latebloom</string>
<key>MaxKernel</key>
<string></string>
<key>MinKernel</key>
<string>20.4.0</string>
<key>PlistPath</key>
<string>Contents/Info.plist</string>
</dict>
5. Edit config.plist
NVRAM | Add | 7C436110-AB2A-4BBB-A880-FE41995C9F82 | boot-args | string value
You will add to the existing string value the 3 parameters latebloom.kext uses for configuration.
The values for these parameters and their defaults are described in Syncretic's Wiki post,
Post #1.
The parameters are:
latebloom
lb_range
lb_debug
Sample starting values can be: latebloom=100 lb_range=20 lb_debug=1
Below is a sample boot-args string value incorporating the 3 latebloom parameters:
-lilubetaall -wegbeta agdpmod=pikera shikigva=80 unfairgva=1 mbasd=1 -wegtree -no_compat_check no32exec=0 latebloom=100 lb_range=20 lb_debug=1 -v
You may also wish to boot OpenCore in verbose mode in order to be able to see the boot loading process.
To implement verbose mode add -v to the boot-args string value.
6. Read over the
User-reported Results for latebloom tests in Latebloom
Post #2 to help you determine starting values for your latebloom parameters. If a system is similar to yours and good results were obtained, try starting with those parameters.
7. Verify, validate and load your config.plist following these instructions by
@cdf from the MacRumors MP 1,1-5,1 forum thread
OpenCore on the Mac Pro:
To verify, validate, and load the configuration:
Place config.plist in your home folder
In Terminal, enter:
plutil -convert xml1 config.plist && plutil config.plist
You should see "config.plist: OK". If not, recheck your edits.
Location of OpenCore Utility files on my system. Note that the EFI OC 0.7.1 Debug folder is not required, just used by me for handy storage of unmodified OpenCore files in the EFI Volume.
Copy
EFI/Utilities/ocvalidate
to your home folder, shown in Finder with a house icon.
(After the validation, you can delete ocvalidate.)
In Terminal, enter:
xattr -c ocvalidate && ./ocvalidate config.plist
You should see "Completed validating config.plist in x ms. No issues found.". If not recheck your edits.
Copy config.plist back to
/Volumes/EFI/EFI/OC
8. Make certain that the disk containing the macOS you are testing is blessed or the only disk containing a working version of OpenCore in your system. During the boot loading process if OpenCore can find another version of OpenCore in your system it may boot using an unintended version of OpenCore and its' config.plist depending on the boot order of the disks in your system.
9. If your macOS boots successfully verify the version of OpenCore is correct using terminal command:
nvram 4D1FDA02-38C7-4A6A-9CC6-4BCCA8B30102:opencore-version
10. If your macOS boots successfully verify that latebloom.kext has been loaded and hooked using terminal. Code provided by
@startergo.
log show --predicate 'sender == "latebloom" and message contains "Hook placed successfully"' --start $(date "+%Y-%m-%d") --debug
11. Record the the parameters you obtained the best results with. Record your MacPro hardware configuration. To collect information on your system for posting, the latebloom check v10.app created by @
Macschrauber, is available for download as an attachment at the bottom of
Post #277 is suggested. Please publish your results individually in a post to this thread.
@Syncretic will review your results and analyze them and update the results for all to see in User-reported results
Post #2. Note that
Post #2 cannot be edited by thread users; thread users need to post their results individually and
@Syncretic will update
Post #2 as time permits.)
12. Latebloom Version 0.20
Adapted from @Syncretic post on latebloom version 0.20
Latebloom version 0.20 adds a condensed boot-arg arrangement. Latebloom 0.19 and earlier boot-args still work, latebloom=, lb_range=, and lb_debug= so version 0.20 can work as a drop-in replacement for the earlier versions.
The version 0.20 syntax for the abbreviated version of the boot-args is, lbloom=, where the syntax is lbloom=delay,range,debug.
The values for delay/range/debug must all be decimal, maximum 4 digits. Any argument that's missing is presumed to be 0. Any parse error (such as a non-numeric typo) will cause all subsequent arguments to be set to 0. The default delay remains 60ms.
The log message indicating that the hook is set is slightly changed. The new version adds the actual delay/range/debug values at the end.
Log Message Example:
_____[ !!! *** latebloom *** !!! ]: Hook placed successfully. Count = 0 :: 120,50,1.
Argument Examples:
- lbloom=90,20,1: delay of 90, range of 20 (70..110), debug on.
- lbloom=110,,1: delay of 110, range 0, debug on (this is identical to lbloom=110,0,1, but one character shorter, in case you need to squeeze every byte out of your boot-args).
- lbloom=77: delay of 77, range 0, debug off. Again, this is identical to lbloom=77,0,0 or lbloom=77,,, but saves a few characters of boot-args.
Things to watch out for:
- lbloom=,20,1: this does NOT produce the default of 60; the missing first argument is taken as 0, and latebloom will not do anything at all. (The same thing would happen with an empty lbloom=)
- lbloom=60,-10,1: the '-' is considered non-numeric, so the range will be set to 0; in addition, this will make the flay rod go skew on the treadle (i.e. confuse the simplistic parser), which will then set debug to 0 as well.
- latebloom=100 lb_range=20 lb_debug=1 lbloom=90,10: This scenario was present in earlier versions, but undocumented - if any of the latebloom boot-args appears more than once, the last one "wins." In this case, the delay will be 90, the range will be 10, and debug will be 0. The exceptions to the "last one wins" rule are (effectively) latebloom=0 or lbloom=0; as soon as the parser sees an effective delay of 0, parsing stops and the kext does nothing, so a subsequent latebloom=100 would be ignored.