From 7c879f48c8a4c3f16611c0f5d06a005247d89bea Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 13 Aug 2026 12:34:55 +0000 Subject: [PATCH] Bundle qboot for x86-64 qboot is the firmware for QEMU's `microvm` machine type, which a guest can be booted on with no boot loader, no PCI bus and no ACPI. That is worth a few seconds of every job's startup, and it needs a firmware this tarball doesn't carry. `-kernel` reads like a way around the firmware and isn't one: QEMU stages the kernel and publishes where it starts, but something running in the guest still has to jump there, and on this machine type that is qboot. qboot is also what leaves an MP table behind, which is the only place a guest configured without ACPI can read the machine's CPUs and interrupt routing from -- NetBSD 11's MICROVM kernel, the first consumer, is configured exactly that way. Handed bios-256k.bin instead, it never starts and says nothing about why. It is prebuilt in QEMU's own pc-bios directory, so it is copied from the same tree the binary is built from and can't disagree with it. --- changelog.md | 8 ++++++++ ci.rb | 7 +++++++ test.rb | 1 + 3 files changed, 16 insertions(+) diff --git a/changelog.md b/changelog.md index af80d9f..dc92915 100644 --- a/changelog.md +++ b/changelog.md @@ -7,6 +7,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +* Bundle `qboot.rom` in the `qemu-system-x86_64` tarball. qboot is the firmware + for QEMU's `microvm` machine type, and the only one that can boot a PVH kernel + there, which is how a guest skips the boot loader, the PCI bus and ACPI + entirely + ([cross-platform-actions/action#151](https://github.com/cross-platform-actions/action/issues/151)) + ### Removed * Stop bundling the Linaro UEFI firmware for ARM64. `linaro_uefi.fd` is no diff --git a/ci.rb b/ci.rb index 4680e7e..cdbf516 100755 --- a/ci.rb +++ b/ci.rb @@ -77,11 +77,18 @@ def bundle_firmware end class X86_64 < Architecture + # qboot.rom is the firmware for the `microvm` machine type, and the only one + # that can boot a PVH kernel there: QEMU hands the kernel to the firmware + # through fw_cfg rather than entering it itself, and qboot is also what + # leaves an MP table behind for a guest configured without ACPI. Given + # bios-256k.bin instead, such a guest never starts and says nothing at all + # about why. FIRMWARES = %w[ bios-256k.bin efi-e1000.rom efi-virtio.rom kvmvapic.bin + qboot.rom vgabios-stdvga.bin ].freeze diff --git a/test.rb b/test.rb index d3c74e3..6645cd3 100755 --- a/test.rb +++ b/test.rb @@ -62,6 +62,7 @@ def assert_statically_linked(architecture) efi-e1000.rom efi-virtio.rom kvmvapic.bin + qboot.rom vgabios-stdvga.bin uefi.fd ]