diff options
author | Daniel Verkamp <dverkamp@chromium.org> | 2019-08-09 14:25:03 -0700 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2019-08-16 07:20:21 +0000 |
commit | 58010b27310cc27df542294f81a19ea95feded5f (patch) | |
tree | b9dc4cc8203edc1b4c5b26bed7c9fc585acc076d /devices/src/virtio/gpu/mod.rs | |
parent | 35a9d838dbb92b89e8baef380a550b8d8a4b15ad (diff) | |
download | crosvm-58010b27310cc27df542294f81a19ea95feded5f.tar crosvm-58010b27310cc27df542294f81a19ea95feded5f.tar.gz crosvm-58010b27310cc27df542294f81a19ea95feded5f.tar.bz2 crosvm-58010b27310cc27df542294f81a19ea95feded5f.tar.lz crosvm-58010b27310cc27df542294f81a19ea95feded5f.tar.xz crosvm-58010b27310cc27df542294f81a19ea95feded5f.tar.zst crosvm-58010b27310cc27df542294f81a19ea95feded5f.zip |
devices: virtio: add copy_config() helper function
Add a new virtio configuration copying function to replace all of the slightly varying read_config() and write_config() implementations in our virtio devices. This replaces a lot of tricky bounds-checking code with a single central implementation, simplifying the devices to a single call to copy_config() in most cases. The balloon device is also changed to represent its config space as a DataInit struct to match most other devices and remove several unwrap() calls. BUG=None TEST=./build_test TEST=Boot vm_kernel+vm_rootfs in crosvm TEST=Start Crostini on nami Change-Id: Ia49bd6dbe609d17455b9562086bc0b24f327be3f Signed-off-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1749562 Reviewed-by: Dylan Reid <dgreid@chromium.org> Tested-by: kokoro <noreply+kokoro@google.com>
Diffstat (limited to 'devices/src/virtio/gpu/mod.rs')
-rw-r--r-- | devices/src/virtio/gpu/mod.rs | 19 |
1 files changed, 4 insertions, 15 deletions
diff --git a/devices/src/virtio/gpu/mod.rs b/devices/src/virtio/gpu/mod.rs index 2c09761..135732d 100644 --- a/devices/src/virtio/gpu/mod.rs +++ b/devices/src/virtio/gpu/mod.rs @@ -29,8 +29,8 @@ use gpu_display::*; use gpu_renderer::{Renderer, RendererFlags}; use super::{ - resource_bridge::*, AvailIter, Queue, VirtioDevice, INTERRUPT_STATUS_USED_RING, TYPE_GPU, - VIRTIO_F_VERSION_1, + copy_config, resource_bridge::*, AvailIter, Queue, VirtioDevice, INTERRUPT_STATUS_USED_RING, + TYPE_GPU, VIRTIO_F_VERSION_1, }; use self::backend::Backend; @@ -790,23 +790,12 @@ impl VirtioDevice for Gpu { } fn read_config(&self, offset: u64, data: &mut [u8]) { - let offset = offset as usize; - let len = data.len(); - let cfg = self.get_config(); - let cfg_slice = cfg.as_slice(); - if offset + len <= cfg_slice.len() { - data.copy_from_slice(&cfg_slice[offset..offset + len]); - } + copy_config(data, 0, self.get_config().as_slice(), offset); } fn write_config(&mut self, offset: u64, data: &[u8]) { - let offset = offset as usize; - let len = data.len(); let mut cfg = self.get_config(); - let cfg_slice = cfg.as_mut_slice(); - if offset + len <= cfg_slice.len() { - cfg_slice[offset..offset + len].copy_from_slice(data); - } + copy_config(cfg.as_mut_slice(), offset, data, 0); if (cfg.events_clear.to_native() & VIRTIO_GPU_EVENT_DISPLAY) != 0 { self.config_event = false; } |