WARNING: THIS SITE IS A MIRROR OF GITHUB.COM / IT CANNOT LOGIN OR REGISTER ACCOUNTS / THE CONTENTS ARE PROVIDED AS-IS / THIS SITE ASSUMES NO RESPONSIBILITY FOR ANY DISPLAYED CONTENT OR LINKS / IF YOU FOUND SOMETHING MAY NOT GOOD FOR EVERYONE, CONTACT ADMIN AT ilovescratch@foxmail.com
Skip to content

libkrun-efi: macos doesn't work with external kernel: FirmwareInvalidAddress(InvalidGuestAddress(GuestAddress(0))) #466

@Kern--

Description

@Kern--

When using libkrun-efi to start a vm with an extneral kernel, I'm consistently getting this error:

[2025-11-13T22:11:53Z ERROR krun] Building the microVM failed: FirmwareInvalidAddress(InvalidGuestAddress(GuestAddress(0)))

Looking through the code, it looks like when using efi, firmware_data and firmware_size are set here:

libkrun/src/vmm/src/builder.rs

Lines 1411 to 1412 in 3847069

#[cfg(feature = "efi")]
let (firmware_data, firmware_size) = (Some(EDK2_BINARY), Some(EDK2_BINARY.len()));

But firmware_size is not passed through when initializing the memory regions:

libkrun/src/vmm/src/builder.rs

Lines 1443 to 1447 in 3847069

#[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))]
let (arch_mem_info, mut arch_mem_regions) = match payload {
Payload::ExternalKernel(external_kernel) => {
arch::arch_memory_regions(mem_size, external_kernel.initramfs_size, None)
}

Then writing the firmware data fails here:

libkrun/src/vmm/src/builder.rs

Lines 1476 to 1480 in 3847069

if let Some(firmware_data) = firmware_data.as_ref() {
guest_mem
.write(firmware_data, GuestAddress(arch_mem_info.firmware_addr))
.map_err(StartMicrovmError::FirmwareInvalidAddress)?;
}

I was able to fix it by passing firmware_size through, but I was also able to fix it by setting firmware_data and firmware_size to None. I'm guessing the former is the correct solution, is that right?

diff --git a/src/vmm/src/builder.rs b/src/vmm/src/builder.rs
index c9f5ec6..cc0d00c 100644
--- a/src/vmm/src/builder.rs
+++ b/src/vmm/src/builder.rs
@@ -1443,7 +1443,7 @@ fn create_guest_memory(
     #[cfg(any(target_arch = "aarch64", target_arch = "riscv64"))]
     let (arch_mem_info, mut arch_mem_regions) = match payload {
         Payload::ExternalKernel(external_kernel) => {
-            arch::arch_memory_regions(mem_size, external_kernel.initramfs_size, None)
+            arch::arch_memory_regions(mem_size, external_kernel.initramfs_size, firmware_size)
         }
         _ => arch::arch_memory_regions(mem_size, 0, firmware_size),
     };

libkrun version: libkrun-efi 1.16.0 (installed via brew slp/krunkit)
macos version: 15.6.1

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions