Libreboot Build System Audit 5

Leah Rowe

9 June 2024

Return to index

Article published by: Leah Rowe

Date of publication: 9 June 2024

A new release is now available, with these changes. Learn more by reading about the Libreboot 20240612 release.


Libreboot is a free/opensource boot firmware project. It replaces your proprietary BIOS/UEFI firmware, on supported x86 and ARM computers. It does this by providing an automated build system to download, patch and compile the various upstream sources (e.g. coreboot, GRUB, SeaBIOS). Coreboot is used for hardware initialisation, configuring everything from your CPU, memory controller all way to peripherals, readying the hardware so that it can run software, e.g. Linux/BSD operating systems. You can essentially think of lbmk, which is Libreboot’s build system, as a source-based package manager. It is what the Libreboot releases are built with. The lbmk build system essentially implements a coreboot distro, the same way you might think of a Linux distribution.

Extensive auditing has been performed on lbmk, since the Libreboot 20240504 release. These audits fix bugs, reduce code bloat and generally improve the efficiency of lbmk, adding and removing features in a careful, conservative way, with a focus on clean code. Remember the magic words: code equals bugs.

This article covers changes from Libreboot 20240504, up to revision 2ee186aee3aa3ab9619ed9549bd3b82909dcfbd0 from 9 June 2024.

You can read about the previous audit in the article for Libreboot Build System Audit 4.

Modest code size reduction

There are 1482 lines of shell script in the build system, versus 1680 in the Libreboot 20240504 release. Libreboot’s build system is written purely in POSIX sh; not BASH, not KSH, not ZSH, jush sh!

This is a difference of 198 lines, or a 12% reduction. Despite the reduction, numerous features have been added and a large number of bugs were fixed.

Summarised list of changes

Changes are in order per category, from newest to oldest:

Feature changes

Bug fixes

Some of these changes fix actual issues that were found in testing, while others were fixed before being triggered/reported and are thus preventative bug fixes. The logic in lbmk has been very intensively audited as is customary!

The changes are, from newest to earliest:

General code cleanup

In addition to general very sweeping code cleanup, condensing code lines where possible and so on:

Revision updates

Some revisions were updated as part of standard routine, but happened to be done during this audit. Those updates are as follows:


Bump SeaBIOS to revision e5f2e4c69643bc3cd385306a9e5d29e11578148c, which has these changes relative to the old one:

* e5f2e4c6 pciinit: don't misalign large BARs
* 731c88d5 stdvgaio: Only read/write one color palette entry at a time
* c5a361c0 stdvga: Add stdvga_set_vertical_size() helper function
* 22c91412 stdvga: Rename stdvga_get_vde() to stdvga_get_vertical_size()
* 549463db stdvga: Rename stdvga_set_scan_lines() to stdvga_set_character_height()
* c67914ac stdvga: Rename stdvga_set_text_block_specifier() to stdvga_set_font_location()
* aa94925d stdvga: Rework stdvga palette index paging interface functions
* 8de51a5a stdvga: Rename stdvga_toggle_intensity() to stdvga_set_palette_blinking()
* 96c7781f stdvga: Add comments to interface functions in stdvga.c
* 2996819f stdvga: Rename CGA palette functions
* 91368088 stdvgamodes: Improve naming of dac palette tables
* 70f43981 stdvgamodes: No need to store pelmask in vga_modes[]
* 1588fd14 vgasrc: Rename vgahw_get_linesize() to vgahw_minimum_linelength()
* d73e18bb vgasrc: Use curmode_g instead of vmode_g when mode is the current video mode
* 192e23b7 vbe: implement function 09h (get/set palette data)
* 3722c21d vgasrc: round up save/restore size
* 5d87ff25 vbe: Add VBE 2.0+ OemData field to struct vbe_info
* 163fd9f0 fix smbios blob length overflow
* 82faf1d5 Add LBA 64bit support for reads beyond 2TB.
* 3f082f38 Add AHCI Power ON + ICC_ACTIVE into port setup code
* 3ae88886 esp-scsi: terminate DMA transfer when ESP data transfer completes
* a6ed6b70 limit address space used for pci devices.


Updated to revision 5b4fdd1 from 2 May 2024, rebasing the MX workaround patch.

This imports upstream changes, relative to the previous revision:

* 5b4fdd1 z60_flashprog.rules: Add udev rule for CH347
* 72c9e40 meson: Check for CPU families with known raw mem access
* 3458220 platform/meson: Port pciutils/pci.h workaround to Meson
* f279762 platform/meson: Check for libi386 on NetBSD
* 14da5f7 README: Convert to Markdown
* 8ddea57 README: Document branching and release policy
* 2522456 util/ Fix path
* cbf9c11 spi: Don't cross 16MiB boundaries with long writes
* 823a704 dediprog: Skip warning on first attempt to read device string
* e8463c8 dediprog: Revise prefix check for given programmer id
* 38af1a1 dediprog: Revise id matching
* 4661e7c amd_spi100: Use flashprog_read_chunked() for progress reporting
* cdcfda2 read_memmapped: Use flashprog_read_chunked() for progress reporting
* 7679b5c spi25: Replace spi_read_chunked() with more abstract version
* ca1c7fd spi25: Normalize parameters of spi_nbyte_read()
* e36e3dc dediprog: Use default_spi_write_256
* 522a86d linux_spi: Use default_spi_read()/_write_256()
* 806509b cli_classic: Turn progress reporting into a progress bar
* 842d678 libflashrom: Return progress state to the library user
* aa714dd flashprog.c: Let select_erase_functions() return byte count
* 2eed4cf serprog: Add SPI Mode and CS Mode commands
* 821a085 dediprog: Implement id reading for SF600 and later
* 274e655 dediprog: Read device string early
* 0057822 dediprog: Add protocol detection for SF700 & SF600Plus-G2
* fb176d2 dediprog: Use more general 4BA write mode for newer protocols
* 0ab5c3d dediprog: Split device type and version parsing
* bdef5c2 dediprog: Use unsigned conversions to parse device string
* 5262e29 dediprog: Try to request 32B device string (instead of 16B)
* e76e21f dediprog: Get rid of some unnecessary hex constants
* 5a09d1e udelay: Lower the sleep vs delay threshold
* 03ad4a4 linux_mtd: Provide no-op delay implementation
* 211c6ec serprog: Refine flushing before synchronization
* 383b7fe serprog: Test synchronicity before trying to synchronize
* d7318ea serprog: Move synchronicity test into separate function
* 9a11cbf Let the flash context directly point to the used master
* aabb3e0 writeprotect: Hook wp functions into the chip driver
* 89569d6 memory_mapped: Reduce `decode_sizes` to a single `max_rom_decode`
* 929d2e1 internal: Pass programmer context down into chipset enables
* 7c717c3 internal: Pass programmer context down into board enables
* e3a2688 Pass programmer context to programmer->init()
* 2b66ad9 Start implementing struct flashprog_programmer
* 4517e92 memory_bus: Drop stale `size == 0` workaround and FIXME
* b197402 memory_bus: Split register mapping into own function
* 0e76d99 memory_bus: Move (un)map_flash_region into par master
* 9eec407 Perform default mapping only for respective chips
* 56b53dd wbsio_spi: Request memory mapping locally
* 5596190 it87spi: Request memory mapping locally
* 46449b4 spi25: Drop stale `bus == SPI` guards
* ab6b18f spi25: Move 4BA preparations into spi_prepare_4ba() hook
* 901fb95 Add prepare/finish_access() hooks for chip drivers
* a96aaa3 dediprog: Support long writes of 16MiB and more
* 1338936 Consider 4BA support when filtering erase functions
* 8d36db6 flashprog.8: Fix up serprog example
* d2ac303 flashprog.8: document new serprog cs parameter
* d1b9153 chipset_enable.c: Add Genoa to mendocino entry

As a reminder:

Libreboot now uses Flashprog instead of Flashrom; Flashprog is a fork of Flashrom, lead by Nico Huber after a dispute with the new leadership of Flashrom, and it was felt that Flashprog is a better choice for Libreboot.

Git log

This entire set of changelogs is based on the precise Git history in lbmk, relative to Libreboot 20240504 which is from where the audit began.

The latest changes are listed first, going all the way down to earlier changes:

* 2ee186ae minor code cleanup in the build system 
* c5441bb9 re-add ability to use cbfs grub.cfg as default 
* d33556c6 trees: exit with error if project undefined 
* 1799a336 build: also make a lock file during release build 
* 78426a97 more useful lock message 
* e80c4b73 create a lock file during builds 
* a0710ef9 hide e() output on for loop 
* 86eb566b fix regression 
* fbcdf33f download xtree *before*, not after 
* 6a3d8a96 fix deletion path in nuke() 
* 3478b288 less confusing error in download() 
* f3f5b99c hide stderr on download() 
* 3440e1f6 simplify download() 
* 75b39dbe fix redundancy in download() 
* 26df6e7a simplify singletree() 
* 9cdf4192 further simplify nuke() 
* 1cede024 simplify link_crossgcc() 
* 77e482aa simplify nuke() 
*   42e97950 Merge pull request 'Add dependency scripts for Fedora 40 and Ubuntu 24.04' (#220) from fuel-pcbox/lbmk:master into master 
| * 046007b4 Add dependency scripts for Fedora 40 and Ubuntu 24.04 
* | a0eb79df add crossgcc tarballs to config/submodules/ 
* | b0d1ad32 support downloading *files* as submodules 
* | 1a44fcfa remove unnecessary line break 
* | 74ae84af add a return at the end of mkdirs 
* | c202dc61 move download logic to 
* | 08d0a1d5 shorten a string in e() 
* | 9b00b30a move uefiextract to elf/uefitool/ 
* 05d301bd fix submodule path 
* 7e15859b simplify prep_submodules() 
* acd3608b unified handling of git clone/reset/am 
* 668bcbf6 trees: simplified copy_elf() handling 
* 3eef7f37 simplify submodule handling 
* 4b1b1f50 provide feedback for repository downloads 
* d4324768 download "depend" projects *before* 
* a4549e93 reduced indentation in fetch_submodule 
* 11c47ba7 reduced indentation in prep_submodules 
* 9c1ea8f9 *never* run git submodule update 
* 137321eb rename variable for clarity 
* 7bfb1d62 trees: don't check empty path in copy_elf() 
* 0b7566cb trees: fix build issue caused by bad elf check 
* 7aa9f224 trees: fix listfile check in copy_elf() 
* 06c78e13 trees: don't say check elf/ if build.list missing 
* dea41f13 trees: don't do elfcheck if build.list missing 
* 3bd562a2 define mdfiles/images in config/submodules/docs/ 
* bff75628 libopencm3 to config/submodules/ on stm32-vserprog 
* d9b9f6db add tinyusb to config/submodule/ for pico-sdk 
* 099ee3f4 config/git: use "depend" for serprog dependencies 
* d0f99c2f trees: unified coreboot makeargs 
* a7889c5a trees: use multiple threads to build cbutils 
* d41658f1 move handle_coreboot_utils to script/trees 
* c0822ac4 put coreboot utils in elf/, not cbutils/ 
* d1ba0851 fix build issue building coreboot utils 
* 7e49fe4b trees: skip single-tree build if a build exists 
* 12774274 use correct memtest86plus path in script/roms 
* 8511615e put memtest86plus builds in elf/memtest86plus/ 
* 176b936d put flashprog builds in elf/flashprog/ 
* 48cbb30d trees: also print "DONE! check elf/dir" on single 
* 315fed5f trees: handle build-test on multi-tree projects 
* b8112af9 use singletree() to decide submodules 
* 78f7e429 move cbcfgsdir variable to 
* 810ad480 move cfgsdir/datadir variables to 
* ba36f26d handle build.list from config/data/, not config/ 
* bea089bb don't use build.list to detect multi-tree projects 
* 6e1b8087 move id check to too 
* 62c25ac7 move root check to (bugfix) 
* 75382a41 bugfix: move dependencies handling to 
* c6aff769 bump untitled revision again 
* 414a605a bump untitled revision in git config 
* 7d562679 bugfix: check environmental variables right 
* 53dd4bc4 more friendly output from e() 
* c2793e7a badcmd: don't print "no context given" 
* 49ae4f91 badcmd: link directly to the maintenance manual 
* 00653aab better help text on invalid commands 
* afac9a06 build: print the project website address on help 
* 1e534e7d add projectsite file: point to 
* 429e91f9 make GRUB multi-tree and re-add xhci patches 
* 9daf7f05 u-boot on qemu: remove currently unused x86 target 
* 6d59f1d0 grub.cfg: scan /boot/grub.cfg last 
* 2becc736 grub.cfg: scan grub2/ last 
* cfc5265f grub.cfg: search a reduced list of devs/partitions 
* 42b5b58d grub.cfg: scan grub.cfg from ESP 
* b3d58f1e grub.cfg: split up try_user_config 
* 2ea5e61c grub.cfg: don't search for *_grub.cfg 
* c742a89d grub.cfg: remove unnecessary path for isolinux 
* e0b2216f grub.cfg: don't scan EFI on btrfs subvols 
*   38135f9e Merge pull request 'Fix building vboot on i686' (#218) from lukeshu/lbmk:lukeshu/i686 into master 
| * 221206b4 Fix building vboot on i686 
* | a76dda93 remove unnecessary assignment 
* | 17a9d11d do not remove .submodules 
* | 13d4b6d3 delete u-boot test/lib/strlcat.c using nuke() 
* | f6cbc501 import nuke() from cbmk cdce8ba70b 
* 7fbcb7be coreboot t440p/w541: enable nvme in grub_scan_disk 
* 47f582d4 ./vendor download: skip if blob path is /dev/null 
* e7cb10d6 do not allow dashes in coreboot target names 
* e9b9e825 ./vendor download: more fine-tuned error control 
* 0dd0dfaf don't error on main targets 
* a4bd49de roms: allow user override of grub_scan_disk 
* b00800a7 grub.cfg: actually support setting boot order 
* 4488745c trees: use CPUS=x on regular coreboot make 
* 7d50e09f update gitignore 
* b78f62c7 roms: fix bad eval when comparing options 
* b11e4c9f grub.cfg: add spdx header 
* 3998a3ba re-configure grub_scan_disk on various targets 
* 1c4d6498 remove grub_scan_disk in all target.cfg files 
* e1883f1d grub.cfg: use grub_scan_disk to set boot order 
* c94cecd8 GRUB: remove XHCI patches for now (will re-add) 
* ff2997d6 minor correction 
* d855408a roms: make grubfirst if seabios_withgrub=y 
* ec761c88 coreboot: only run GRUB as a secondary payload 
* 64c64bcf flashprog: bump to 5b4fdd1 from 2 May 2024 
* 914852dd rename include/ to include/ 
* dc7b72f3 roms: rename bstr variable 
* 5c14e8e1 general code cleanup in the build system 
* 48c2cef8 build: simplify git_init() 
* db06bbdb build: do root check before git check 
* 8d199a31 build: simplify git checks 
* 8da2559b fix bad check for version/versiondate 
* d32968c7 trees: reset makeargs per target/project 
* 7bab0cf9 trees: also use UPDATED_SUBMODULES=1 on crossgcc 
* 0a50eaf2 trees: add UPDATED_SUBMODULES to coreboot make 
* ff0840bd trees: write -C on the make command first not last 
* b91ee727 config: add backup coreboot submodule repositories 
* 4a3ebe84 coreboot/default: remove chromeec from module.list 
* 9c5890e9 break if a submodule clone succeeds 
* fdb08143 coreboot: only download the necessary submodules 
* 1cb255e8 allow finer control of git submodules 
* 5d87eea7 build: hide git-init output 
* b8ec7d56 generate version file if .git not found 
* 87c361f3 update/trees: remove unused variable 
* da427272 move repo copying to a new function 
* 093c4a36 move link_crossgcc to end of file 
* 73a2d991 move xgcc linking to a new function 
* d7749876 skip submodules if .gitmodules missing 
* c3e1aa34 merge patch_submodules in prep_submodules 
* a4163330 split submodule handling to new function 
* aa4faf08 remove errant line break 
* 00142696 remove another meaningless check 
* fc3b0ba8 shorter variable names 
* dae10dd4 remove meaningless check 
* c148fa53 remove variable not meaningfully used 
* 079afb5b add CHANGELOG to .gitignore 
*   0d8781ef Merge pull request 'Fix E6400 display reference clock patches' (#214) from nic3-14159/lbmk:fix-e6400-igpu-ref-clock into master 
| * 9f50e362 Fix E6400 display reference clock patches 
* e5a5935d fix building coreboot images on i686 hosts 
*   a2ac4d13 Merge pull request 'Also try unlocking encrypted volume on NVMe' (#213) from mkukri/lbmk:master into master 
| * 77ebd050 Also try unlocking encrypted volume on NVMe 
* | 287d0555 Merge pull request 'Add NVMe support to GRUB2 payload' (#212) from mkukri/lbmk:master into master 
| * abe6717c Add NVMe support to GRUB2 payload 
* |   47d77c94 Merge pull request 'Fix E6400 display issue with 1440 x 900 panel' (#211) from nic3-14159/lbmk:fix-e6400-igpu-ref-clock into master 
|\ \  
| * | 8629873a Fix E6400 display issue with 1440 x 900 panel 
| |/  
* |   0beecd1b Merge pull request 'Add pt qwerty keymap to lbmk' (#210) from samuraikid/lbmk:master into master 
|\ \  
| * | 8d723d14 Add pt qwerty keymap to lbmk 
* | | 835e5ad0 fix invalid command in git_prep() 
| |/  
* | 1e54db29 allow patching submodules 
* | 00e00a18 don't delete .git if src/project/project 
* | 245b4eb2 build/roms: skip target if config/ dir missing 
* | aadccc59 more minor cleanup in the build system 
* | 5b8928c7 remove fetch_from_upstream() 
* | 71baf653 don't return 1 in mkrom_tarball 
* | 1fe9c4b8 mktar_release to mkrom_tarball 
* | cc7ed692 build/roms: rename moverom to copyrom 
* | b40118ae minor code cleanup in the build system 
* 998f30ad build/roms: simplify serprog list command 
* 21a7efaa build/roms: simplified config payload checks 
* 5b5dccd6 further simplify config handling 
* 8418ea9a greatly simplified config handling 
* 53b394f5 move config checks to detect_firmware 
* bb7255c3 print an error upon ill-defined target 
* 3f73f3d0 remove redundant check 
* 32923f56 simplify defconfig check 
* f8e3ca3b Remove .git if XBMK_RELEASE=y 
* dd851caa build: remove initcmd() and simplify main() 
* 4ea843a4 build: initialise git first (before commands) 
* 5702f5a4 build: remove excmd() and simplify main() 
* b76a70c3 build: don't make script_path a global variable 
* 839ef680 lbmk: allow easier sync with cbmk 
* 885fcebd remove help commands (user should read docs) 
* c6ba0a0e delete check_git() 
* 313c4c01 build: define "xp" in the global variables 
* 350857ff build: simplify for loop in fetch_trees() 
* 8e05399d build: simplified downloads in fetch_trees() 
* 914ff1ad ./build release: don't do u-boot-only archives 
* 5c3fb9a4 build: use utc+0 when initialising git repo dates 
* e281966f remove check_project() (always set variables) 
* ee2bf0d2 build: simplify deletions in fetch_trees() 
* 39df6230 build: delete mkversion() (just print relname) 
* a40a6129 build/roms: clean up tarball handling 
* e5ffb2af rm src/u-boot/*/test/lib/strlcat.c in u-boot 
* c149cbb8 build: remove mkrom_images 
* 4135ce5e build: use same tarball name on uboot-only release 
* 189b70dd build/roms: create full release tarball name 
* 36d45474 don't bother checking for GNU tar 
* f0b604fc remove insert_version_files() 
* 267c13cc cleanup: remove mkvdir 
* 08c9f94a unified sha512sum creation for tarballs 
* 1ce7e339 move rom tarball creation to script/roms 
* 190495d2 disable x301 for next release (for now) 
* 03fae0cf remove redundant function extract_ref() 
* f66ceef6 print two line breaks before confirming release 
* cc339741 remove haswell mrc blob (libre raminit stable now) 
* 05fbd392 remove all status checks. only handle release. 
* 8ba0fd83 remove errant comment 
* d7ce26dc move script/*/* to script/ 
* 029291e5 merge script/vendor/* into include/ 
* c8fb24bb build: print usage for special commands 
* 5f63b594 merge script/update/release into build 
* e1ea5dd0 bump seabios to e5f2e4c69643bc3cd385306a9e5d29e11578148c 
* 052414c0 build: further prevent non-lbmk-work-directory 
* fb8d0c86 build: exit if not running from lbmk directory 
* 38aaaecf build/roms: print serprog help 
* e3cb3a40 merge script/build/serprog with script/build/roms 
* 297af7e6 build/roms: remove unnecessary command 
* 5e4009b5 merge include/ with include/ 
* 58400fc4 correct copyright info 
* aa5937ed build/roms: don't rely on x in handle_target 
* 580a5559 build/roms: don't use exit status from skip_board 
* 2fcbff68 build/roms: split up main() 
* d13d9308 build/roms: allow searching status by mismatch 

This is 211 changes, since Libreboot 20240504.

Markdown file for this page:

Subscribe to RSS for this site

Site map

This HTML page was generated by the Untitled Static Site Generator.