From 636d681677ff7a047738ecb1b9f89f91fc826335 Mon Sep 17 00:00:00 2001 From: Eric Curtin Date: Tue, 30 Dec 2025 01:30:41 +0000 Subject: [PATCH] Fix fw write for ExternalKernel payload on aarch64 When using the efi feature on aarch64 with ExternalKernel payload (direct kernel boot), the code incorrectly tried to write EFI firmware to guest memory address 0, which wasn't mapped. ExternalKernel payload calls arch_memory_regions with firmware_size=None, so no memory region is allocated for firmware. However, with the efi feature enabled, firmware_data is always Some(EDK2_BINARY), causing the write to fail with FirmwareInvalidAddress(InvalidGuestAddress(0)). Skip firmware writing for ExternalKernel payload since direct kernel boot doesn't use EFI firmware. Signed-off-by: Eric Curtin --- src/vmm/src/builder.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/vmm/src/builder.rs b/src/vmm/src/builder.rs index 71bc2bfb1..534648c5f 100644 --- a/src/vmm/src/builder.rs +++ b/src/vmm/src/builder.rs @@ -1500,10 +1500,14 @@ pub fn create_guest_memory( let (guest_mem, entry_addr, initrd_config, cmdline) = load_payload(vm_resources, guest_mem, &arch_mem_info, payload)?; - if let Some(firmware_data) = firmware_data.as_ref() { - guest_mem - .write(firmware_data, GuestAddress(arch_mem_info.firmware_addr)) - .map_err(StartMicrovmError::FirmwareInvalidAddress)?; + // Only write firmware if data exists AND this isn't an ExternalKernel payload + // (ExternalKernel does direct kernel boot and doesn't use EFI firmware) + if !matches!(payload, Payload::ExternalKernel(_)) { + if let Some(firmware_data) = firmware_data.as_ref() { + guest_mem + .write(firmware_data, GuestAddress(arch_mem_info.firmware_addr)) + .map_err(StartMicrovmError::FirmwareInvalidAddress)?; + } } let payload_config = PayloadConfig {