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.rs21
1 files changed, 20 insertions, 1 deletions
diff --git a/devices/src/virtio/controller.rs b/devices/src/virtio/controller.rs
index 374d11c..4a770cc 100644
--- a/devices/src/virtio/controller.rs
+++ b/devices/src/virtio/controller.rs
@@ -70,6 +70,7 @@ pub enum MsgOnSocketRequest {
 
 #[derive(Debug, Serialize, Deserialize)]
 pub enum BincodeRequest {
+    ReadConfig { offset: u64, len: usize },
     WriteConfig { offset: u64, data: Vec<u8> },
 }
 
@@ -93,7 +94,9 @@ pub enum MsgOnSocketResponse {
 }
 
 #[derive(Debug, Deserialize, Serialize)]
-pub struct BincodeResponse;
+pub enum BincodeResponse {
+    ReadConfig(Vec<u8>),
+}
 
 pub type Response = poly_msg_socket::Value<MsgOnSocketResponse, BincodeResponse>;
 
@@ -291,6 +294,22 @@ impl VirtioDevice for Controller {
         }
     }
 
+    fn read_config(&self, offset: u64, data: &mut [u8]) {
+        let len = data.len();
+
+        if let Err(e) = self.socket.send(BincodeRequest::ReadConfig { offset, len }) {
+            error!("failed to send ReadConfig: {}", e);
+            return;
+        }
+
+        match self.socket.recv_bincode() {
+            Ok(BincodeResponse::ReadConfig(response)) => {
+                data.copy_from_slice(&response[..len]); // TODO: test no panic
+            }
+            response => error!("bad response to ReadConfig: {:?}", response),
+        }
+    }
+
     fn write_config(&mut self, offset: u64, data: &[u8]) {
         if let Err(e) = self.socket.send(BincodeRequest::WriteConfig {
             offset,