diff options
author | Jakub Staron <jstaron@google.com> | 2019-05-28 17:38:07 -0700 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2019-10-01 22:48:38 +0000 |
commit | d9c4398a31b129a8e1eed10981d16351c2edcaf4 (patch) | |
tree | b570ca5a08a523de65f36c635a12adbded40b7a0 /devices/src/virtio/balloon.rs | |
parent | 719f2831ed394bf4f3fd777938261bda493b05fc (diff) | |
download | crosvm-d9c4398a31b129a8e1eed10981d16351c2edcaf4.tar crosvm-d9c4398a31b129a8e1eed10981d16351c2edcaf4.tar.gz crosvm-d9c4398a31b129a8e1eed10981d16351c2edcaf4.tar.bz2 crosvm-d9c4398a31b129a8e1eed10981d16351c2edcaf4.tar.lz crosvm-d9c4398a31b129a8e1eed10981d16351c2edcaf4.tar.xz crosvm-d9c4398a31b129a8e1eed10981d16351c2edcaf4.tar.zst crosvm-d9c4398a31b129a8e1eed10981d16351c2edcaf4.zip |
crosvm: Use Reader/Writer interfaces in various virtio devices.
Switching the devices to the new interface reduces code duplication and will ease fuzzing the devices as they now have a common input and output interface for descriptors. BUG=chromium:966258 TEST=vm.CrostiniStartEverything Change-Id: I823c04dfc24e017433f8e8ab167bbd5dfafd338b Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1647371 Reviewed-by: Stephen Barber <smbarber@chromium.org> Reviewed-by: Zach Reizner <zachr@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com> Commit-Queue: Daniel Verkamp <dverkamp@chromium.org>
Diffstat (limited to 'devices/src/virtio/balloon.rs')
-rw-r--r-- | devices/src/virtio/balloon.rs | 39 |
1 files changed, 22 insertions, 17 deletions
diff --git a/devices/src/virtio/balloon.rs b/devices/src/virtio/balloon.rs index 8109395..633b3fc 100644 --- a/devices/src/virtio/balloon.rs +++ b/devices/src/virtio/balloon.rs @@ -17,7 +17,7 @@ use sys_util::{ use vm_control::{BalloonControlCommand, BalloonControlResponseSocket}; use super::{ - copy_config, DescriptorChain, Queue, VirtioDevice, INTERRUPT_STATUS_CONFIG_CHANGED, + copy_config, Queue, Reader, VirtioDevice, INTERRUPT_STATUS_CONFIG_CHANGED, INTERRUPT_STATUS_USED_RING, TYPE_BALLOON, VIRTIO_F_VERSION_1, }; @@ -81,10 +81,6 @@ struct Worker { command_socket: BalloonControlResponseSocket, } -fn valid_inflate_desc(desc: &DescriptorChain) -> bool { - !desc.is_write_only() && desc.len % 4 == 0 -} - impl Worker { fn process_inflate_deflate(&mut self, inflate: bool) -> bool { let queue = if inflate { @@ -95,19 +91,28 @@ impl Worker { let mut needs_interrupt = false; while let Some(avail_desc) = queue.pop(&self.mem) { - if inflate && valid_inflate_desc(&avail_desc) { - let num_addrs = avail_desc.len / 4; - for i in 0..num_addrs as usize { - let addr = match avail_desc.addr.checked_add((i * 4) as u64) { - Some(a) => a, - None => break, - }; - let guest_input: u32 = match self.mem.read_obj_from_addr(addr) { - Ok(a) => a, - Err(_) => continue, + let index = avail_desc.index; + + if inflate { + let mut reader = Reader::new(&self.mem, avail_desc); + let data_length = reader.available_bytes(); + + if data_length % 4 != 0 { + error!("invalid inflate buffer size: {}", data_length); + continue; + } + + let num_addrs = data_length / 4; + for _ in 0..num_addrs as usize { + let guest_input = match reader.read_obj::<Le32>() { + Ok(a) => a.to_native(), + Err(err) => { + error!("error while reading unused pages: {}", err); + break; + } }; let guest_address = - GuestAddress((guest_input as u64) << VIRTIO_BALLOON_PFN_SHIFT); + GuestAddress((u64::from(guest_input)) << VIRTIO_BALLOON_PFN_SHIFT); if self .mem @@ -120,7 +125,7 @@ impl Worker { } } - queue.add_used(&self.mem, avail_desc.index, 0); + queue.add_used(&self.mem, index, 0); needs_interrupt = true; } |