diff options
Diffstat (limited to 'devices/src/virtio/controller.rs')
-rw-r--r-- | devices/src/virtio/controller.rs | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/devices/src/virtio/controller.rs b/devices/src/virtio/controller.rs index 7a5ab71..33dbdd4 100644 --- a/devices/src/virtio/controller.rs +++ b/devices/src/virtio/controller.rs @@ -36,7 +36,10 @@ use std::thread; use super::resource_bridge::*; use super::{Interrupt, InterruptProxyEvent, Queue, VirtioDevice, TYPE_WL, VIRTIO_F_VERSION_1}; -use crate::MemoryParams; +use crate::{ + pci::{PciAddress, PciBarConfiguration}, + MemoryParams, +}; use vm_control::{MaybeOwnedFd, VmMemoryControlRequestSocket}; use msg_socket::{MsgOnSocket, MsgReceiver, MsgSocket}; @@ -74,6 +77,8 @@ pub enum MsgOnSocketRequest { pub enum BincodeRequest { ReadConfig { offset: u64, len: usize }, WriteConfig { offset: u64, data: Vec<u8> }, + + GetDeviceBars(PciAddress), } pub type Request = poly_msg_socket::Value<MsgOnSocketRequest, BincodeRequest>; @@ -99,6 +104,8 @@ pub enum MsgOnSocketResponse { #[derive(Debug, Deserialize, Serialize)] pub enum BincodeResponse { ReadConfig(Vec<u8>), + + GetDeviceBars(Vec<PciBarConfiguration>), } pub type Response = poly_msg_socket::Value<MsgOnSocketResponse, BincodeResponse>; @@ -386,4 +393,17 @@ impl VirtioDevice for Controller { } } } + + fn get_device_bars(&mut self, address: PciAddress) -> Vec<PciBarConfiguration> { + if let Err(e) = self.socket.send(BincodeRequest::GetDeviceBars(address)) { + panic!("failed to send GetDeviceBars: {}", e); + } + + match self.socket.recv_bincode() { + Ok(BincodeResponse::GetDeviceBars(bars)) => bars, + response => { + panic!("bad response to GetDeviceBars: {:?}", response); + } + } + } } |