diff options
author | Zach Reizner <zachr@google.com> | 2019-05-30 18:31:02 -0700 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2019-06-04 20:29:25 +0000 |
commit | 127453d7eccdb6a903d0855fabb8f0935be90882 (patch) | |
tree | 65bd9f0b4c6b2a98c60bb2580949a93209c0f639 /x86_64 | |
parent | 6a0bfb037a109030b69feb9dec4a546548636940 (diff) | |
download | crosvm-127453d7eccdb6a903d0855fabb8f0935be90882.tar crosvm-127453d7eccdb6a903d0855fabb8f0935be90882.tar.gz crosvm-127453d7eccdb6a903d0855fabb8f0935be90882.tar.bz2 crosvm-127453d7eccdb6a903d0855fabb8f0935be90882.tar.lz crosvm-127453d7eccdb6a903d0855fabb8f0935be90882.tar.xz crosvm-127453d7eccdb6a903d0855fabb8f0935be90882.tar.zst crosvm-127453d7eccdb6a903d0855fabb8f0935be90882.zip |
eliminate mut from non-mut references
This manifested itself in a couple places that were turning shared memory buffers into slices for the purposes of passing these slices to `Read` and `Write` trait methods. However, this required the removal of the methods that took `Read` and `Write` instances. This was a convenient interface but impossible to implement safely because making slices from raw pointers without enforcing safety guarantees causes undefined behaviour in Rust. It turns out lots of code in crosvm was using these interfaces indirectly, which explains why this CL touches so much. TEST=crosvm run BUG=chromium:938767 Change-Id: I4ff40c98da6ed08a4a42f4c31f0717f81b1c5863 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1636685 Reviewed-by: Zach Reizner <zachr@chromium.org> Tested-by: Zach Reizner <zachr@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Commit-Queue: Zach Reizner <zachr@chromium.org>
Diffstat (limited to 'x86_64')
-rw-r--r-- | x86_64/src/bzimage.rs | 3 | ||||
-rw-r--r-- | x86_64/src/lib.rs | 6 | ||||
-rw-r--r-- | x86_64/src/mptable.rs | 28 |
3 files changed, 15 insertions, 22 deletions
diff --git a/x86_64/src/bzimage.rs b/x86_64/src/bzimage.rs index 16a7338..d43d405 100644 --- a/x86_64/src/bzimage.rs +++ b/x86_64/src/bzimage.rs @@ -7,6 +7,7 @@ use std::fmt::{self, Display}; use std::io::{Read, Seek, SeekFrom}; +use std::os::unix::io::AsRawFd; use sys_util::{GuestAddress, GuestMemory}; @@ -57,7 +58,7 @@ pub fn load_bzimage<F>( kernel_image: &mut F, ) -> Result<(boot_params, u64)> where - F: Read + Seek, + F: Read + Seek + AsRawFd, { let mut params: boot_params = Default::default(); kernel_image diff --git a/x86_64/src/lib.rs b/x86_64/src/lib.rs index 837dac4..3fe8d69 100644 --- a/x86_64/src/lib.rs +++ b/x86_64/src/lib.rs @@ -441,11 +441,11 @@ impl X8664arch { /// /// * `mem` - The memory to be used by the guest. /// * `kernel_image` - the File object for the specified kernel. - fn load_kernel(mem: &GuestMemory, mut kernel_image: &mut File) -> Result<(boot_params, u64)> { + fn load_kernel(mem: &GuestMemory, kernel_image: &mut File) -> Result<(boot_params, u64)> { let elf_result = - kernel_loader::load_kernel(mem, GuestAddress(KERNEL_START_OFFSET), &mut kernel_image); + kernel_loader::load_kernel(mem, GuestAddress(KERNEL_START_OFFSET), kernel_image); if elf_result == Err(kernel_loader::Error::InvalidElfMagicNumber) { - bzimage::load_bzimage(mem, GuestAddress(KERNEL_START_OFFSET), &mut kernel_image) + bzimage::load_bzimage(mem, GuestAddress(KERNEL_START_OFFSET), kernel_image) .map_err(Error::LoadBzImage) } else { let kernel_end = elf_result.map_err(Error::LoadKernel)?; diff --git a/x86_64/src/mptable.rs b/x86_64/src/mptable.rs index c2def2f..8b754bd 100644 --- a/x86_64/src/mptable.rs +++ b/x86_64/src/mptable.rs @@ -3,13 +3,13 @@ // found in the LICENSE file. use std::fmt::{self, Display}; -use std::io; use std::mem; use std::result; use std::slice; use libc::c_char; +use data_model::VolatileMemory; use devices::PciInterruptPin; use sys_util::{GuestAddress, GuestMemory}; @@ -135,8 +135,9 @@ pub fn setup_mptable( return Err(Error::AddressOverflow); } - mem.read_to_memory(base_mp, &mut io::repeat(0), mp_size) - .map_err(|_| Error::Clear)?; + mem.get_slice(base_mp.0, mp_size as u64) + .map_err(|_| Error::Clear)? + .write_bytes(0); { let size = mem::size_of::<mpf_intel>(); @@ -400,23 +401,14 @@ mod tests { let mpc_offset = GuestAddress(mpf_intel.physptr as u64); let mpc_table: mpc_table = mem.read_obj_from_addr(mpc_offset).unwrap(); - struct Sum(u8); - impl io::Write for Sum { - fn write(&mut self, buf: &[u8]) -> io::Result<usize> { - for v in buf.iter() { - self.0 = self.0.wrapping_add(*v); - } - Ok(buf.len()) - } - fn flush(&mut self) -> io::Result<()> { - Ok(()) - } + let mut buf = vec![0; mpc_table.length as usize]; + mem.read_at_addr(&mut buf[..], mpc_offset).unwrap(); + let mut sum: u8 = 0; + for &v in &buf { + sum = sum.wrapping_add(v); } - let mut sum = Sum(0); - mem.write_from_memory(mpc_offset, &mut sum, mpc_table.length as usize) - .unwrap(); - assert_eq!(sum.0, 0); + assert_eq!(sum, 0); } #[test] |