diff --git a/Cargo.lock b/Cargo.lock index e606319fd..c9a660ebf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -455,7 +455,7 @@ dependencies = [ "polly", "rand", "rutabaga_gfx", - "thiserror 2.0.12", + "thiserror 2.0.18", "utils", "virtio-bindings", "vm-fdt", @@ -809,7 +809,7 @@ dependencies = [ "sha2", "sm3", "strum", - "thiserror 2.0.12", + "thiserror 2.0.18", ] [[package]] @@ -828,7 +828,7 @@ dependencies = [ "bitflags 2.10.0", "log", "static_assertions", - "thiserror 2.0.12", + "thiserror 2.0.18", ] [[package]] @@ -840,7 +840,7 @@ dependencies = [ "libc", "log", "static_assertions", - "thiserror 2.0.12", + "thiserror 2.0.18", ] [[package]] @@ -958,9 +958,8 @@ dependencies = [ [[package]] name = "linux-loader" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "870c3814345f050991f99869417779f6062542bcf4ed81db7a1b926ad1306638" +version = "0.13.2" +source = "git+https://github.com/d-e-s-o/linux-loader.git?branch=topic%2Fvm-memory-0.18#7bf0eb82734ff5cad8a1e5d263925f825ea22c6d" dependencies = [ "vm-memory", ] @@ -1606,11 +1605,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ - "thiserror-impl 2.0.12", + "thiserror-impl 2.0.18", ] [[package]] @@ -1626,9 +1625,9 @@ dependencies = [ [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", @@ -1801,12 +1800,12 @@ checksum = "7e21282841a059bb62627ce8441c491f09603622cd5a21c43bfedc85a2952f23" [[package]] name = "vm-memory" -version = "0.16.2" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd5e56d48353c5f54ef50bd158a0452fc82f5383da840f7b8efc31695dd3b9d" +checksum = "9b55e753c7725603745cb32b2287ef7ef3da05c03c7702cda3fa8abe25ae0465" dependencies = [ "libc", - "thiserror 1.0.69", + "thiserror 2.0.18", "winapi", ] diff --git a/src/arch/Cargo.toml b/src/arch/Cargo.toml index 4b6efd6c5..253fdb85b 100644 --- a/src/arch/Cargo.toml +++ b/src/arch/Cargo.toml @@ -12,7 +12,7 @@ efi = [] [dependencies] libc = ">=0.2.39" -vm-memory = { version = ">=0.13", features = ["backend-mmap"] } +vm-memory = { version = "0.18", features = ["backend-mmap"] } vmm-sys-util = ">= 0.14" arch_gen = { path = "../arch_gen" } diff --git a/src/arch/src/x86_64/mptable.rs b/src/arch/src/x86_64/mptable.rs index 1b4511453..161528f1b 100644 --- a/src/arch/src/x86_64/mptable.rs +++ b/src/arch/src/x86_64/mptable.rs @@ -12,7 +12,7 @@ use std::slice; use libc::c_char; use arch_gen::x86::mpspec; -use vm_memory::{Address, ByteValued, Bytes, GuestAddress, GuestMemory, GuestMemoryMmap}; +use vm_memory::{Address, ByteValued, Bytes, GuestAddress, GuestMemoryBackend, GuestMemoryMmap}; // This is a workaround to the Rust enforcement specifying that any implementation of a foreign // trait (in this case `ByteValued`) where: diff --git a/src/arch/src/x86_64/regs.rs b/src/arch/src/x86_64/regs.rs index 06378c593..7c224a0d3 100644 --- a/src/arch/src/x86_64/regs.rs +++ b/src/arch/src/x86_64/regs.rs @@ -10,7 +10,7 @@ use std::mem; use super::gdt::{gdt_entry, kvm_segment_from_gdt}; use kvm_bindings::{kvm_fpu, kvm_regs, kvm_sregs}; use kvm_ioctls::VcpuFd; -use vm_memory::{Address, Bytes, GuestAddress, GuestMemory, GuestMemoryMmap}; +use vm_memory::{Address, Bytes, GuestAddress, GuestMemoryBackend, GuestMemoryMmap}; // Initial pagetables. const PML4_START: u64 = 0x9000; diff --git a/src/devices/Cargo.toml b/src/devices/Cargo.toml index c933b2bca..432fe3b9d 100644 --- a/src/devices/Cargo.toml +++ b/src/devices/Cargo.toml @@ -30,7 +30,7 @@ pw = { package = "pipewire", version = "0.8.0", optional = true } rand = "0.9.2" thiserror = { version = "2.0", optional = true } virtio-bindings = "0.2.0" -vm-memory = { version = ">=0.13", features = ["backend-mmap"] } +vm-memory = { version = "0.18", features = ["backend-mmap"] } zerocopy = { version = "0.8.26", optional = true, features = ["derive"] } krun_display = { path = "../krun_display", optional = true, features = ["bindgen_clang_runtime"] } krun_input = { path = "../krun_input", features = ["bindgen_clang_runtime"], optional = true } diff --git a/src/devices/src/virtio/balloon/device.rs b/src/devices/src/virtio/balloon/device.rs index 9b34da82b..de6c396df 100644 --- a/src/devices/src/virtio/balloon/device.rs +++ b/src/devices/src/virtio/balloon/device.rs @@ -3,7 +3,7 @@ use std::convert::TryInto; use std::io::Write; use utils::eventfd::EventFd; -use vm_memory::{ByteValued, GuestMemory, GuestMemoryMmap}; +use vm_memory::{ByteValued, GuestMemoryBackend, GuestMemoryMmap}; use super::super::{ ActivateError, ActivateResult, BalloonError, DeviceQueue, DeviceState, QueueConfig, diff --git a/src/devices/src/virtio/console/process_rx.rs b/src/devices/src/virtio/console/process_rx.rs index 9ccec8fd1..b0f9cb339 100644 --- a/src/devices/src/virtio/console/process_rx.rs +++ b/src/devices/src/virtio/console/process_rx.rs @@ -2,7 +2,7 @@ use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::{Arc, Mutex}; use std::{io, thread}; -use vm_memory::{GuestMemory, GuestMemoryError, GuestMemoryMmap, GuestMemoryRegion}; +use vm_memory::{GuestMemoryBackend, GuestMemoryError, GuestMemoryMmap}; use crate::virtio::console::console_control::ConsoleControl; use crate::virtio::console::port_io::PortInput; @@ -89,19 +89,18 @@ fn read_to_desc( input: &mut (dyn PortInput + Send), eof: &mut bool, ) -> Result { - desc.mem - .try_access(desc.len as usize, desc.addr, |_, len, addr, region| { - let mut target = region.get_slice(addr, len).unwrap(); - match input.read_volatile(&mut target) { - Ok(n) => { - if n == 0 { - *eof = true - } - Ok(n) - } - // We can't return an error otherwise we would not know how many bytes were processed before WouldBlock - Err(e) if e.kind() == io::ErrorKind::WouldBlock => Ok(0), - Err(e) => Err(GuestMemoryError::IOError(e)), + let mut total = 0; + for slice in desc.mem.get_slices(desc.addr, desc.len as usize) { + let mut slice = slice?; + match input.read_volatile(&mut slice) { + Ok(0) => { + *eof = true; + break; } - }) + Ok(n) => total += n, + Err(e) if e.kind() == io::ErrorKind::WouldBlock => break, + Err(e) => return Err(GuestMemoryError::IOError(e)), + } + } + Ok(total) } diff --git a/src/devices/src/virtio/console/process_tx.rs b/src/devices/src/virtio/console/process_tx.rs index c2c996554..bae5fc632 100644 --- a/src/devices/src/virtio/console/process_tx.rs +++ b/src/devices/src/virtio/console/process_tx.rs @@ -2,7 +2,7 @@ use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::{Arc, Mutex}; use std::{io, thread}; -use vm_memory::{GuestMemory, GuestMemoryError, GuestMemoryMmap, GuestMemoryRegion}; +use vm_memory::{GuestMemoryBackend, GuestMemoryError, GuestMemoryMmap}; use crate::virtio::console::port_io::PortOutput; use crate::virtio::{DescriptorChain, InterruptTransport, Queue}; @@ -76,22 +76,24 @@ fn write_desc_to_output( output: &mut (dyn PortOutput + Send), interrupt: &InterruptTransport, ) -> Result { - desc.mem - .try_access(desc.len as usize, desc.addr, |_, len, addr, region| { - let src = region.get_slice(addr, len).unwrap(); - loop { - log::trace!("Tx {src:?}, write_volatile {len} bytes"); - match output.write_volatile(&src) { - // try_access seem to handle partial write for us (we will be invoked again with an offset) - Ok(n) => break Ok(n), - // We can't return an error otherwise we would not know how many bytes were processed before WouldBlock - Err(e) if e.kind() == io::ErrorKind::WouldBlock => { - log::trace!("Tx wait for output (would block)"); - interrupt.signal_used_queue(); - output.wait_until_writable(); - } - Err(e) => break Err(GuestMemoryError::IOError(e)), + let mut total = 0; + for slice in desc.mem.get_slices(desc.addr, desc.len as usize) { + let slice = slice?; + loop { + log::trace!("Tx {slice:?}, write_volatile {} bytes", slice.len()); + match output.write_volatile(&slice) { + Ok(n) => { + total += n; + break; + } + Err(e) if e.kind() == io::ErrorKind::WouldBlock => { + log::trace!("Tx wait for output (would block)"); + interrupt.signal_used_queue(); + output.wait_until_writable(); } + Err(e) => return Err(GuestMemoryError::IOError(e)), } - }) + } + } + Ok(total) } diff --git a/src/devices/src/virtio/descriptor_utils.rs b/src/devices/src/virtio/descriptor_utils.rs index 1a40642f9..680b62357 100644 --- a/src/devices/src/virtio/descriptor_utils.rs +++ b/src/devices/src/virtio/descriptor_utils.rs @@ -13,8 +13,9 @@ use std::result; use crate::virtio::queue::DescriptorChain; use vm_memory::{ - Address, ByteValued, Bytes, GuestAddress, GuestMemory, GuestMemoryError, GuestMemoryMmap, - GuestMemoryRegion, Le16, Le32, Le64, VolatileMemory, VolatileMemoryError, VolatileSlice, + Address, ByteValued, Bytes, GuestAddress, GuestMemoryBackend, GuestMemoryError, + GuestMemoryMmap, GuestMemoryRegion, Le16, Le32, Le64, VolatileMemory, VolatileMemoryError, + VolatileSlice, }; use super::file_traits::{FileReadWriteAtVolatile, FileReadWriteVolatile}; diff --git a/src/devices/src/virtio/gpu/virtio_gpu.rs b/src/devices/src/virtio/gpu/virtio_gpu.rs index dc4bc99d6..c944e26ef 100644 --- a/src/devices/src/virtio/gpu/virtio_gpu.rs +++ b/src/devices/src/virtio/gpu/virtio_gpu.rs @@ -36,7 +36,7 @@ use rutabaga_gfx::{ }; #[cfg(target_os = "macos")] use utils::worker_message::WorkerMessage; -use vm_memory::{GuestAddress, GuestMemory, GuestMemoryMmap, VolatileSlice}; +use vm_memory::{GuestAddress, GuestMemoryBackend, GuestMemoryMmap, VolatileSlice}; use super::{GpuError, Result}; use crate::virtio::display::DisplayInfo; diff --git a/src/devices/src/virtio/queue.rs b/src/devices/src/virtio/queue.rs index 2fb74289d..a96ee0bae 100644 --- a/src/devices/src/virtio/queue.rs +++ b/src/devices/src/virtio/queue.rs @@ -11,8 +11,8 @@ use std::num::Wrapping; use std::sync::atomic::{fence, Ordering}; use virtio_bindings::virtio_ring::VRING_USED_F_NO_NOTIFY; use vm_memory::{ - Address, ByteValued, Bytes, GuestAddress, GuestMemory, GuestMemoryError, GuestMemoryMmap, - VolatileMemoryError, + Address, ByteValued, Bytes, GuestAddress, GuestMemoryBackend, GuestMemoryError, + GuestMemoryMmap, VolatileMemoryError, }; /// Size of used ring header: flags (u16) + idx (u16) diff --git a/src/devices/src/virtio/vsock/packet.rs b/src/devices/src/virtio/vsock/packet.rs index 9d1349cab..9ff311d55 100644 --- a/src/devices/src/virtio/vsock/packet.rs +++ b/src/devices/src/virtio/vsock/packet.rs @@ -27,7 +27,7 @@ use std::result; use nix::sys::socket::{sockaddr, AddressFamily}; use nix::sys::socket::{SockaddrLike, SockaddrStorage}; use utils::byte_order; -use vm_memory::{self, Address, GuestAddress, GuestMemory, GuestMemoryError}; +use vm_memory::{self, Address, GuestAddress, GuestMemoryBackend, GuestMemoryError}; use super::super::DescriptorChain; use super::defs; @@ -193,7 +193,7 @@ pub struct VsockPacket { buf_size: usize, } -fn get_host_address( +fn get_host_address( mem: &T, guest_addr: GuestAddress, size: usize, diff --git a/src/kernel/Cargo.toml b/src/kernel/Cargo.toml index e8e96d88c..2da4039ab 100644 --- a/src/kernel/Cargo.toml +++ b/src/kernel/Cargo.toml @@ -4,6 +4,6 @@ version = "0.1.0" edition = "2021" [dependencies] -vm-memory = { version = ">=0.13", features = ["backend-mmap"] } +vm-memory = { version = "0.18", features = ["backend-mmap"] } utils = { path = "../utils" } diff --git a/src/kernel/src/loader/mod.rs b/src/kernel/src/loader/mod.rs index 416fa5dac..28f71187f 100644 --- a/src/kernel/src/loader/mod.rs +++ b/src/kernel/src/loader/mod.rs @@ -12,7 +12,7 @@ use std::ffi::CString; use std::fmt; use super::cmdline::Error as CmdlineError; -use vm_memory::{Address, Bytes, GuestAddress, GuestMemory, GuestMemoryMmap}; +use vm_memory::{Address, Bytes, GuestAddress, GuestMemoryBackend, GuestMemoryMmap}; #[derive(Debug, Eq, PartialEq)] pub enum Error { diff --git a/src/libkrun/Cargo.toml b/src/libkrun/Cargo.toml index 0d14bc18a..598d8c1a3 100644 --- a/src/libkrun/Cargo.toml +++ b/src/libkrun/Cargo.toml @@ -42,8 +42,8 @@ kvm-bindings = { version = ">=0.11", features = ["fam-wrappers"] } kvm-ioctls = ">=0.21" aws-nitro = { path = "../aws_nitro", optional = true } nitro-enclaves = { version = "0.5.0", optional = true } -vm-memory = { version = ">=0.13", features = ["backend-mmap"] } +vm-memory = { version = "0.18", features = ["backend-mmap"] } [lib] name = "krun" -crate-type = ["cdylib"] +crate-type = ["cdylib", "lib"] diff --git a/src/smbios/Cargo.toml b/src/smbios/Cargo.toml index de9836ec0..2830a0d30 100644 --- a/src/smbios/Cargo.toml +++ b/src/smbios/Cargo.toml @@ -4,4 +4,4 @@ version = "0.1.0" edition = "2021" [dependencies] -vm-memory = { version = ">=0.13", features = ["backend-mmap"] } +vm-memory = { version = "0.18", features = ["backend-mmap"] } diff --git a/src/vmm/Cargo.toml b/src/vmm/Cargo.toml index ecf441697..1ae7d61f3 100644 --- a/src/vmm/Cargo.toml +++ b/src/vmm/Cargo.toml @@ -21,10 +21,10 @@ aws-nitro = [] crossbeam-channel = ">=0.5.15" flate2 = "1.0.35" libc = ">=0.2.39" -linux-loader = { version = "0.13.0", features = ["bzimage", "elf", "pe"] } +linux-loader = { git = "https://github.com/d-e-s-o/linux-loader.git", branch = "topic/vm-memory-0.18", features = ["bzimage", "elf", "pe"] } log = "0.4.0" nix = { version = "0.30.1", features = ["fs", "term"] } -vm-memory = { version = ">=0.13", features = ["backend-mmap"] } +vm-memory = { version = "0.18", features = ["backend-mmap"] } vmm-sys-util = ">=0.14" krun_display = { path = "../krun_display", optional = true, features = ["bindgen_clang_runtime"] } krun_input = { path = "../krun_input", optional = true, features = ["bindgen_clang_runtime"] } diff --git a/src/vmm/src/builder.rs b/src/vmm/src/builder.rs index 9dc1abe9b..1248895a1 100644 --- a/src/vmm/src/builder.rs +++ b/src/vmm/src/builder.rs @@ -94,7 +94,7 @@ use vm_memory::mmap::MmapRegion; use vm_memory::Address; use vm_memory::Bytes; #[cfg(not(feature = "aws-nitro"))] -use vm_memory::GuestMemory; +use vm_memory::GuestMemoryBackend; #[cfg(all(target_arch = "x86_64", not(feature = "tee")))] use vm_memory::GuestRegionMmap; use vm_memory::{GuestAddress, GuestMemoryMmap}; @@ -125,7 +125,7 @@ pub enum StartMicrovmError { /// Cannot read firmware contents from file. FirmwareRead(io::Error), /// Memory regions are overlapping or mmap fails. - GuestMemoryMmap(vm_memory::Error), + GuestMemoryMmap(String), /// The BZIP2 decoder couldn't decompress the kernel. ImageBz2Decoder(io::Error), /// Cannot find compressed kernel in file. @@ -1339,9 +1339,13 @@ fn load_payload( guest_mem .insert_region(Arc::new( GuestRegionMmap::new(kernel_region, GuestAddress(kernel_guest_addr)) - .map_err(StartMicrovmError::GuestMemoryMmap)?, + .ok_or_else(|| { + StartMicrovmError::GuestMemoryMmap( + "Failed to create GuestRegionMmap".to_string(), + ) + })?, )) - .map_err(StartMicrovmError::GuestMemoryMmap)?, + .map_err(|e| StartMicrovmError::GuestMemoryMmap(format!("{e:?}")))?, GuestAddress(kernel_entry_addr), None, None, @@ -1500,7 +1504,7 @@ pub fn create_guest_memory( arch_mem_regions.extend(shm_manager.regions()); let guest_mem = GuestMemoryMmap::from_ranges(&arch_mem_regions) - .map_err(StartMicrovmError::GuestMemoryMmap)?; + .map_err(|e| StartMicrovmError::GuestMemoryMmap(format!("{e:?}")))?; let (guest_mem, entry_addr, initrd_config, cmdline) = load_payload(vm_resources, guest_mem, &arch_mem_info, payload)?; diff --git a/src/vmm/src/linux/tee/amdsnp/mod.rs b/src/vmm/src/linux/tee/amdsnp/mod.rs index 1474a0be8..78c0bdd6d 100644 --- a/src/vmm/src/linux/tee/amdsnp/mod.rs +++ b/src/vmm/src/linux/tee/amdsnp/mod.rs @@ -13,7 +13,7 @@ use launch::{error::FirmwareError, firmware::Firmware, *}; use kvm_bindings::{kvm_enc_region, CpuId, KVM_CPUID_FLAG_SIGNIFCANT_INDEX}; use kvm_ioctls::VmFd; use vm_memory::{ - Bytes, GuestAddress, GuestMemory, GuestMemoryMmap, GuestMemoryRegion, GuestRegionMmap, + Bytes, GuestAddress, GuestMemoryBackend, GuestMemoryMmap, GuestMemoryRegion, GuestRegionMmap, }; #[derive(Debug)] diff --git a/src/vmm/src/linux/vstate.rs b/src/vmm/src/linux/vstate.rs index 02282b668..317126724 100644 --- a/src/vmm/src/linux/vstate.rs +++ b/src/vmm/src/linux/vstate.rs @@ -64,8 +64,8 @@ use utils::sm::StateMachine; #[cfg(feature = "tee")] use utils::worker_message::{MemoryProperties, WorkerMessage}; use vm_memory::{ - Address, GuestAddress, GuestMemory, GuestMemoryError, GuestMemoryMmap, GuestMemoryRegion, - GuestRegionMmap, + Address, GuestAddress, GuestMemoryBackend, GuestMemoryError, GuestMemoryMmap, + GuestMemoryRegion, GuestRegionMmap, }; #[cfg(feature = "amd-sev")] diff --git a/src/vmm/src/macos/vstate.rs b/src/vmm/src/macos/vstate.rs index f4c9ccabf..616f3eca8 100644 --- a/src/vmm/src/macos/vstate.rs +++ b/src/vmm/src/macos/vstate.rs @@ -24,7 +24,7 @@ use devices::legacy::VcpuList; use hvf::{HvfVcpu, HvfVm, VcpuExit, Vcpus}; use utils::eventfd::EventFd; use vm_memory::{ - Address, GuestAddress, GuestMemory, GuestMemoryError, GuestMemoryMmap, GuestMemoryRegion, + Address, GuestAddress, GuestMemoryBackend, GuestMemoryError, GuestMemoryMmap, GuestMemoryRegion, }; /// Errors associated with the wrappers over KVM ioctls. diff --git a/src/vmm/src/worker.rs b/src/vmm/src/worker.rs index d0131b994..2f14ac1f4 100644 --- a/src/vmm/src/worker.rs +++ b/src/vmm/src/worker.rs @@ -16,7 +16,7 @@ use libc::{fallocate, madvise, FALLOC_FL_KEEP_SIZE, FALLOC_FL_PUNCH_HOLE, MADV_D use std::ffi::c_void; #[cfg(feature = "tee")] use vm_memory::{ - guest_memory::GuestMemory, Address, GuestAddress, GuestMemoryRegion, MemoryRegionAddress, + guest_memory::GuestMemoryBackend, Address, GuestAddress, GuestMemoryRegion, MemoryRegionAddress, }; pub fn start_worker_thread(