From 413a840d0b9b786b15af693d285a705f117aa2af Mon Sep 17 00:00:00 2001 From: Viresh Kumar Date: Fri, 29 Apr 2022 12:57:14 +0530 Subject: [PATCH 1/2] gpio: Fix get_config() get_config() must return only the relevant part of the config, as requested by the caller, instead of returning entire config structure. Signed-off-by: Viresh Kumar --- gpio/src/gpio.rs | 6 ++++-- gpio/src/vhu_gpio.rs | 29 ++++++++++++++++++----------- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/gpio/src/gpio.rs b/gpio/src/gpio.rs index 0a6f3ca..f14bfb3 100644 --- a/gpio/src/gpio.rs +++ b/gpio/src/gpio.rs @@ -14,7 +14,7 @@ use libgpiod::{ RequestConfig, }; use thiserror::Error as ThisError; -use vm_memory::{Le16, Le32}; +use vm_memory::{ByteValued, Le16, Le32}; type Result = std::result::Result; @@ -79,7 +79,7 @@ const VIRTIO_GPIO_IRQ_TYPE_ALL: u16 = VIRTIO_GPIO_IRQ_TYPE_EDGE_BOTH | VIRTIO_GPIO_IRQ_TYPE_LEVEL_LOW; /// Virtio GPIO Configuration -#[derive(Clone, Debug, PartialEq)] +#[derive(Copy, Clone, Debug, Default, PartialEq)] #[repr(C)] pub(crate) struct VirtioGpioConfig { pub(crate) ngpio: Le16, @@ -87,6 +87,8 @@ pub(crate) struct VirtioGpioConfig { pub(crate) gpio_names_size: Le32, } +unsafe impl ByteValued for VirtioGpioConfig {} + /// Trait that represents an GPIO Device. /// /// This trait is introduced for development purposes only, and should not diff --git a/gpio/src/vhu_gpio.rs b/gpio/src/vhu_gpio.rs index 5f82def..67774f5 100644 --- a/gpio/src/vhu_gpio.rs +++ b/gpio/src/vhu_gpio.rs @@ -27,7 +27,7 @@ use vm_memory::{ use vmm_sys_util::epoll::EventSet; use vmm_sys_util::eventfd::{EventFd, EFD_NONBLOCK}; -use crate::gpio::{GpioController, GpioDevice, VirtioGpioConfig, VIRTIO_GPIO_IRQ_TYPE_NONE}; +use crate::gpio::{GpioController, GpioDevice, VIRTIO_GPIO_IRQ_TYPE_NONE}; /// Possible values of the status field const VIRTIO_GPIO_STATUS_OK: u8 = 0x0; @@ -394,11 +394,15 @@ impl VhostUserBackendMut VhostUserProtocolFeatures::MQ | VhostUserProtocolFeatures::CONFIG } - fn get_config(&self, _offset: u32, _size: u32) -> Vec { + fn get_config(&self, offset: u32, size: u32) -> Vec { unsafe { from_raw_parts( - self.controller.get_config() as *const _ as *const _, - size_of::(), + self.controller + .get_config() + .as_slice() + .as_ptr() + .offset(offset as isize) as *const _ as *const _, + size as usize, ) .to_vec() } @@ -1110,13 +1114,16 @@ mod tests { gpio_names_size: From::from(names_size as u32), }; - assert_eq!(backend.get_config(0, 0), unsafe { - from_raw_parts( - &config as *const _ as *const _, - size_of::(), - ) - .to_vec() - }); + assert_eq!( + backend.get_config(0, size_of::() as u32), + unsafe { + from_raw_parts( + &config as *const _ as *const _, + size_of::(), + ) + .to_vec() + } + ); let mem = GuestMemoryAtomic::new( GuestMemoryMmap::<()>::from_ranges(&[(GuestAddress(0), 0x1000)]).unwrap(), From 9e0ec79cdccc117305243f26cc064c717206f226 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 May 2022 04:08:36 +0000 Subject: [PATCH 2/2] build(deps): bump syn from 1.0.91 to 1.0.92 Bumps [syn](https://github.com/dtolnay/syn) from 1.0.91 to 1.0.92. - [Release notes](https://github.com/dtolnay/syn/releases) - [Commits](https://github.com/dtolnay/syn/compare/1.0.91...1.0.92) --- updated-dependencies: - dependency-name: syn dependency-type: indirect update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0484ade..85f151e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -352,9 +352,9 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "syn" -version = "1.0.91" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b683b2b825c8eef438b77c36a06dc262294da3d5a5813fac20da149241dcd44d" +checksum = "7ff7c592601f11445996a06f8ad0c27f094a58857c2f89e97974ab9235b92c52" dependencies = [ "proc-macro2", "quote",