-
Notifications
You must be signed in to change notification settings - Fork 123
Description
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