Skip to content

Commit ed443c1

Browse files
committed
fix: Avoid using deprecated vm-memory functions
With vm-memory 0.13.0, we introduced versions of the Read and Write traits for operations on guest memory (`VolatileRead` and `VolatileWrite`). These replace various `Read` and `Write` based APIs that had suboptional performance due to requiring to first copy all data from guest memory to hypervisor memory to ensure soundness. See also rust-vmm/vm-memory#217. Signed-off-by: Patrick Roy <[email protected]>
1 parent 098da65 commit ed443c1

File tree

5 files changed

+14
-16
lines changed

5 files changed

+14
-16
lines changed

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@ elf = []
2222
pe = []
2323

2424
[dependencies]
25-
vm-memory = "0.13.0"
25+
vm-memory = "0.13.1"
2626

2727
[dev-dependencies]
2828
criterion = { version = "0.5.1", features = ["html_reports"] }
29-
vm-memory = { version = "0.13.0", features = ["backend-mmap"] }
29+
vm-memory = { version = "0.13.1", features = ["backend-mmap"] }
3030

3131
[[bench]]
3232
name = "main"

src/loader/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ use std::io::{Read, Seek};
2424

2525
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
2626
use vm_memory::ByteValued;
27-
use vm_memory::{Address, Bytes, GuestAddress, GuestMemory, GuestUsize};
27+
use vm_memory::{Address, Bytes, GuestAddress, GuestMemory, GuestUsize, ReadVolatile};
2828

2929
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
3030
pub use crate::loader_gen::bootparam;
@@ -176,7 +176,7 @@ pub trait KernelLoader {
176176
highmem_start_address: Option<GuestAddress>,
177177
) -> Result<KernelLoaderResult>
178178
where
179-
F: Read + Seek;
179+
F: Read + ReadVolatile + Seek;
180180
}
181181

182182
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]

src/loader/x86_64/bzimage/bzimage

6.71 MB
Binary file not shown.

src/loader/x86_64/bzimage/mod.rs

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,9 @@
1212
#![cfg(all(feature = "bzimage", any(target_arch = "x86", target_arch = "x86_64")))]
1313

1414
use std::fmt;
15-
use std::io::{Read, Seek, SeekFrom};
16-
use std::mem;
15+
use std::io::{Seek, SeekFrom};
1716

18-
use vm_memory::{Address, ByteValued, Bytes, GuestAddress, GuestMemory, GuestUsize};
17+
use vm_memory::{Address, ByteValued, GuestAddress, GuestMemory, GuestUsize, ReadVolatile};
1918

2019
use super::super::{
2120
bootparam, Error as KernelLoaderError, KernelLoader, KernelLoaderResult, Result,
@@ -108,7 +107,7 @@ impl KernelLoader for BzImage {
108107
highmem_start_address: Option<GuestAddress>,
109108
) -> Result<KernelLoaderResult>
110109
where
111-
F: Read + Seek,
110+
F: ReadVolatile + Seek,
112111
{
113112
let mut kernel_size = kernel_image
114113
.seek(SeekFrom::End(0))
@@ -118,9 +117,8 @@ impl KernelLoader for BzImage {
118117
.map_err(|_| Error::SeekBzImageHeader)?;
119118

120119
let mut boot_header = bootparam::setup_header::default();
121-
boot_header
122-
.as_bytes()
123-
.read_from(0, kernel_image, mem::size_of::<bootparam::setup_header>())
120+
kernel_image
121+
.read_volatile(&mut boot_header.as_bytes())
124122
.map_err(|_| Error::ReadBzImageHeader)?;
125123

126124
// If the `HdrS` magic number is not found at offset 0x202, the boot protocol version is
@@ -172,7 +170,7 @@ impl KernelLoader for BzImage {
172170
.seek(SeekFrom::Start(setup_size as u64))
173171
.map_err(|_| Error::SeekBzImageCompressedKernel)?;
174172
guest_mem
175-
.read_exact_from(mem_offset, kernel_image, kernel_size)
173+
.read_exact_volatile_from(mem_offset, kernel_image, kernel_size)
176174
.map_err(|_| Error::ReadBzImageCompressedKernel)?;
177175

178176
loader_result.kernel_end = mem_offset

src/loader/x86_64/elf/mod.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use std::io::{Read, Seek, SeekFrom};
1717
use std::mem;
1818
use std::result;
1919

20-
use vm_memory::{Address, ByteValued, Bytes, GuestAddress, GuestMemory, GuestUsize};
20+
use vm_memory::{Address, ByteValued, GuestAddress, GuestMemory, GuestUsize, ReadVolatile};
2121

2222
use crate::loader::{Error as KernelLoaderError, KernelLoader, KernelLoaderResult, Result};
2323
use crate::loader_gen::elf;
@@ -205,7 +205,7 @@ impl KernelLoader for Elf {
205205
highmem_start_address: Option<GuestAddress>,
206206
) -> Result<KernelLoaderResult>
207207
where
208-
F: Read + Seek,
208+
F: Read + ReadVolatile + Seek,
209209
{
210210
kernel_image.rewind().map_err(|_| Error::SeekElfStart)?;
211211

@@ -281,7 +281,7 @@ impl KernelLoader for Elf {
281281
};
282282

283283
guest_mem
284-
.read_exact_from(mem_offset, kernel_image, phdr.p_filesz as usize)
284+
.read_exact_volatile_from(mem_offset, kernel_image, phdr.p_filesz as usize)
285285
.map_err(|_| Error::ReadKernelImage)?;
286286

287287
let kernel_end = mem_offset
@@ -309,7 +309,7 @@ const PVH_NOTE_STR_SZ: usize = 4;
309309
/// are found in the note header.
310310
fn parse_elf_note<F>(phdr: &elf::Elf64_Phdr, kernel_image: &mut F) -> Result<PvhBootCapability>
311311
where
312-
F: Read + Seek,
312+
F: Read + ReadVolatile + Seek,
313313
{
314314
// Type of note header that encodes a 32-bit entry point address to boot a guest kernel using
315315
// the PVH boot protocol.

0 commit comments

Comments
 (0)