summary refs log tree commit diff
path: root/devices/src/virtio/controller.rs
diff options
context:
space:
mode:
Diffstat (limited to 'devices/src/virtio/controller.rs')
-rw-r--r--devices/src/virtio/controller.rs22
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);
+            }
+        }
+    }
 }