summary refs log tree commit diff
path: root/devices/src/virtio/controller.rs
diff options
context:
space:
mode:
authorAlyssa Ross <hi@alyssa.is>2020-03-14 00:17:26 +0000
committerAlyssa Ross <hi@alyssa.is>2020-06-15 09:36:51 +0000
commitc895e48de84f2a6b6f5b21e8037abef50e365a51 (patch)
tree77756aab4f39d7d36dd7c2040e982467335d08fe /devices/src/virtio/controller.rs
parent4ccaa638e7e068e885ac2d9fedf7161ea8970514 (diff)
downloadcrosvm-c895e48de84f2a6b6f5b21e8037abef50e365a51.tar
crosvm-c895e48de84f2a6b6f5b21e8037abef50e365a51.tar.gz
crosvm-c895e48de84f2a6b6f5b21e8037abef50e365a51.tar.bz2
crosvm-c895e48de84f2a6b6f5b21e8037abef50e365a51.tar.lz
crosvm-c895e48de84f2a6b6f5b21e8037abef50e365a51.tar.xz
crosvm-c895e48de84f2a6b6f5b21e8037abef50e365a51.tar.zst
crosvm-c895e48de84f2a6b6f5b21e8037abef50e365a51.zip
get_device_bars
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);
+            }
+        }
+    }
 }