From 996da092dd7a844c150e0d9d03af73905a5f68e6 Mon Sep 17 00:00:00 2001 From: radex Date: Sun, 4 Oct 2026 15:17:06 +0200 Subject: [PATCH 1/5] mk/qemu: ensure UEFI vars are writable On some platforms (e.g. Nix), the template variables file is non-writable. So, we need to make the copy writable before we can use it with qemu --- mk/qemu.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/mk/qemu.mk b/mk/qemu.mk index e2e2d819e..707cf60ea 100644 --- a/mk/qemu.mk +++ b/mk/qemu.mk @@ -358,6 +358,7 @@ qemu-deps: $(BUILD)/fw_vars.bin .PRECIOUS: $(BUILD)/fw_vars.bin $(BUILD)/fw_vars.bin: $(PFLASH1) cp "$<" "$@" + chmod +w "$@" endif $(EXTRA_DISK): From b668e904bcec3a8434c47116d35a37c419272dfc Mon Sep 17 00:00:00 2001 From: radex Date: Sun, 4 Oct 2026 17:19:34 +0200 Subject: [PATCH 2/5] mk/qemu: improved Nix(OS) UEFI path search The /run/libvirt/nix-ovmf/* paths cannot be relied upon to exist. As far as I can tell, this is only available on NixOS with libvirtd enabled. On the other hand, on any Nix platform, UEFI firmware binaries can be found relative to the the qemu binary (including when using nix shell). --- mk/qemu.mk | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mk/qemu.mk b/mk/qemu.mk index 707cf60ea..03144ccb0 100644 --- a/mk/qemu.mk +++ b/mk/qemu.mk @@ -5,6 +5,8 @@ QEMUFLAGS?=-d guest_errors -name "Redox OS $(ARCH)" netboot?=no redoxer?=no VGA_SUPPORTED=no +QEMU_PATH?=$(shell command -v $(QEMU)) +QEMU_BASE_DIR?=$(shell if [ $(QEMU_PATH) ]; then realpath $$(dirname $(QEMU_PATH))/..; fi) ifeq ($(ARCH),i586) audio?=ac97 @@ -40,6 +42,7 @@ else ifeq ($(ARCH),x86_64) PFLASH0=$(firstword \ $(wildcard /usr/share/qemu/edk2-x86_64-code.fd) \ $(wildcard /run/libvirt/nix-ovmf/edk2-x86_64-code.fd) \ + $(wildcard $(QEMU_BASE_DIR)/share/qemu/edk2-x86_64-code.fd) \ $(wildcard /opt/homebrew/opt/qemu/share/qemu/edk2s-x86_64-code.fd) \ ) endif @@ -79,6 +82,7 @@ else ifeq ($(ARCH),aarch64) PFLASH0=$(firstword \ $(wildcard /usr/share/qemu/edk2-aarch64-code.fd) \ $(wildcard /run/libvirt/nix-ovmf/edk2-aarch64-code.fd) \ + $(wildcard $(QEMU_BASE_DIR)/share/qemu/edk2-aarch64-code.fd) \ $(wildcard /opt/homebrew/opt/qemu/share/qemu/edk2-aarch64-code.fd) \ ) endif @@ -113,6 +117,7 @@ else ifeq ($(ARCH),riscv64gc) $(wildcard /usr/share/edk2/riscv/RISCV_VIRT_CODE.fd) \ $(wildcard /usr/share/qemu/edk2-riscv-code.fd) \ $(wildcard /run/libvirt/nix-ovmf/edk2-riscv-code.fd) \ + $(wildcard $(QEMU_BASE_DIR)/share/qemu/edk2-riscv-code.fd) \ $(wildcard /opt/homebrew/opt/qemu/share/qemu/edk2-riscv-code.fd) \ ) PFLASH1=$(firstword \ @@ -120,6 +125,7 @@ else ifeq ($(ARCH),riscv64gc) $(wildcard /usr/share/edk2/riscv/RISCV_VIRT_VARS.fd) \ $(wildcard /usr/share/qemu/edk2-riscv-vars.fd) \ $(wildcard /run/libvirt/nix-ovmf/edk2-riscv-vars.fd) \ + $(wildcard $(QEMU_BASE_DIR)/share/qemu/edk2-riscv-vars.fd) \ $(wildcard /opt/homebrew/opt/qemu/share/qemu/edk2-riscv-vars.fd) \ ) ifneq ($(usb),no) From 21f69c1c43c6f432a293b2052b3ee5e6c296e620 Mon Sep 17 00:00:00 2001 From: radex Date: Sun, 4 Oct 2026 17:24:16 +0200 Subject: [PATCH 3/5] mk/qemu: more helpful error on missing UEFI As best I can tell, on aarch64 and riscv64gc, the UEFI firmware is *required* for Redox to run. If not found, qemu will still run, but will get stuck. It's better to error out explicitly and early. This does not appear to be the case on x86_64 where skipping the firmware load still appears to boot Redox successfully, hence I didn't add the error there. --- mk/qemu.mk | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/mk/qemu.mk b/mk/qemu.mk index 03144ccb0..2e49790b1 100644 --- a/mk/qemu.mk +++ b/mk/qemu.mk @@ -85,6 +85,7 @@ else ifeq ($(ARCH),aarch64) $(wildcard $(QEMU_BASE_DIR)/share/qemu/edk2-aarch64-code.fd) \ $(wildcard /opt/homebrew/opt/qemu/share/qemu/edk2-aarch64-code.fd) \ ) + PFLASH0_NEEDED=yes endif else FIRMWARE=$(BUILD)/qemu_uboot.rom @@ -120,6 +121,7 @@ else ifeq ($(ARCH),riscv64gc) $(wildcard $(QEMU_BASE_DIR)/share/qemu/edk2-riscv-code.fd) \ $(wildcard /opt/homebrew/opt/qemu/share/qemu/edk2-riscv-code.fd) \ ) + PFLASH0_NEEDED=yes PFLASH1=$(firstword \ $(wildcard /usr/share/qemu-efi-riscv64/RISCV_VIRT_VARS.fd) \ $(wildcard /usr/share/edk2/riscv/RISCV_VIRT_VARS.fd) \ @@ -128,6 +130,7 @@ else ifeq ($(ARCH),riscv64gc) $(wildcard $(QEMU_BASE_DIR)/share/qemu/edk2-riscv-vars.fd) \ $(wildcard /opt/homebrew/opt/qemu/share/qemu/edk2-riscv-vars.fd) \ ) + PFLASH1_NEEDED=yes ifneq ($(usb),no) QEMUFLAGS+=-device qemu-xhci -device usb-kbd -device usb-tablet endif @@ -367,6 +370,10 @@ $(BUILD)/fw_vars.bin: $(PFLASH1) chmod +w "$@" endif +qemu-deps: + $(if $(PFLASH0_NEEDED),$(if $(PFLASH0),,$(error UEFI firmware needed but not found)),) + $(if $(PFLASH1_NEEDED),$(if $(PFLASH1),,$(error UEFI variables needed but not found)),) + $(EXTRA_DISK): truncate -s 1g $@ From 08e45bc160a9de094571b1d0fe0aad989fe68890 Mon Sep 17 00:00:00 2001 From: radex Date: Sun, 4 Oct 2026 19:29:20 +0200 Subject: [PATCH 4/5] nix: make qemu for all architectures available --- flake.nix | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/flake.nix b/flake.nix index 3226874d5..60ddcb702 100644 --- a/flake.nix +++ b/flake.nix @@ -86,7 +86,8 @@ # with FSTOOLS_IN_PODMAN=1 these are not needed # without it, the installer fails to link FUSE somehow #fuse - qemu_kvm + qemu_kvm # for host arch + qemu ]; LD_LIBRARY_PATH = pkgs.lib.makeLibraryPath buildInputs; From 09e72447476bb177f618136d25a5b11889f2692c Mon Sep 17 00:00:00 2001 From: radex Date: Mon, 5 Oct 2026 20:24:35 +0200 Subject: [PATCH 5/5] mk/qemu: remove redundant search paths with qemu-relative firmware search, we don't need NixOS libvirtd's paths or Homebrew paths (the latter are equivalent to qemu-relative) --- mk/qemu.mk | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/mk/qemu.mk b/mk/qemu.mk index 2e49790b1..af4ec9800 100644 --- a/mk/qemu.mk +++ b/mk/qemu.mk @@ -5,6 +5,7 @@ QEMUFLAGS?=-d guest_errors -name "Redox OS $(ARCH)" netboot?=no redoxer?=no VGA_SUPPORTED=no +# for qemu-relative firmware search QEMU_PATH?=$(shell command -v $(QEMU)) QEMU_BASE_DIR?=$(shell if [ $(QEMU_PATH) ]; then realpath $$(dirname $(QEMU_PATH))/..; fi) @@ -41,9 +42,7 @@ else ifeq ($(ARCH),x86_64) ifeq ($(FIRMWARE),) PFLASH0=$(firstword \ $(wildcard /usr/share/qemu/edk2-x86_64-code.fd) \ - $(wildcard /run/libvirt/nix-ovmf/edk2-x86_64-code.fd) \ $(wildcard $(QEMU_BASE_DIR)/share/qemu/edk2-x86_64-code.fd) \ - $(wildcard /opt/homebrew/opt/qemu/share/qemu/edk2s-x86_64-code.fd) \ ) endif endif @@ -81,9 +80,7 @@ else ifeq ($(ARCH),aarch64) ifeq ($(FIRMWARE),) PFLASH0=$(firstword \ $(wildcard /usr/share/qemu/edk2-aarch64-code.fd) \ - $(wildcard /run/libvirt/nix-ovmf/edk2-aarch64-code.fd) \ $(wildcard $(QEMU_BASE_DIR)/share/qemu/edk2-aarch64-code.fd) \ - $(wildcard /opt/homebrew/opt/qemu/share/qemu/edk2-aarch64-code.fd) \ ) PFLASH0_NEEDED=yes endif @@ -117,18 +114,14 @@ else ifeq ($(ARCH),riscv64gc) $(wildcard /usr/share/qemu-efi-riscv64/RISCV_VIRT_CODE.fd) \ $(wildcard /usr/share/edk2/riscv/RISCV_VIRT_CODE.fd) \ $(wildcard /usr/share/qemu/edk2-riscv-code.fd) \ - $(wildcard /run/libvirt/nix-ovmf/edk2-riscv-code.fd) \ $(wildcard $(QEMU_BASE_DIR)/share/qemu/edk2-riscv-code.fd) \ - $(wildcard /opt/homebrew/opt/qemu/share/qemu/edk2-riscv-code.fd) \ ) PFLASH0_NEEDED=yes PFLASH1=$(firstword \ $(wildcard /usr/share/qemu-efi-riscv64/RISCV_VIRT_VARS.fd) \ $(wildcard /usr/share/edk2/riscv/RISCV_VIRT_VARS.fd) \ $(wildcard /usr/share/qemu/edk2-riscv-vars.fd) \ - $(wildcard /run/libvirt/nix-ovmf/edk2-riscv-vars.fd) \ $(wildcard $(QEMU_BASE_DIR)/share/qemu/edk2-riscv-vars.fd) \ - $(wildcard /opt/homebrew/opt/qemu/share/qemu/edk2-riscv-vars.fd) \ ) PFLASH1_NEEDED=yes ifneq ($(usb),no)