From 12fec5506403849c1e85ac5098bd9df1274b1cb9 Mon Sep 17 00:00:00 2001 From: Sebastien Boeuf Date: Thu, 16 Apr 2020 14:11:37 +0200 Subject: [PATCH] vm-virtio: Add helpers to update queue indexes In anticipation for adding snapshot/restore support to virtio devices, this commit introduces two new helpers updating the available and used indexes of a queue, relying on the guest memory. Signed-off-by: Sebastien Boeuf --- vm-virtio/src/queue.rs | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/vm-virtio/src/queue.rs b/vm-virtio/src/queue.rs index 91f21ffba..845019a13 100644 --- a/vm-virtio/src/queue.rs +++ b/vm-virtio/src/queue.rs @@ -648,6 +648,46 @@ impl Queue { pub fn go_to_previous_position(&mut self) { self.next_avail -= Wrapping(1); } + + /// Get latest index from available ring. + pub fn update_avail_index_from_memory(&mut self, mem: &GuestMemoryMmap) { + let index_addr = match mem.checked_offset(self.avail_ring, 2) { + Some(ret) => ret, + None => { + error!("Invalid offset 0x{:x}", self.avail_ring.raw_value() + 2); + return; + } + }; + let next_avail: u16 = match mem.read_obj::(index_addr) { + Ok(ret) => ret, + Err(e) => { + error!("Couldn't read `idx` field from memory: {}", e); + return; + } + }; + + self.next_avail = Wrapping(next_avail); + } + + /// Get latest index from used ring. + pub fn update_used_index_from_memory(&mut self, mem: &GuestMemoryMmap) { + let index_addr = match mem.checked_offset(self.used_ring, 2) { + Some(ret) => ret, + None => { + error!("Invalid offset 0x{:x}", self.used_ring.raw_value() + 2); + return; + } + }; + let next_used: u16 = match mem.read_obj::(index_addr) { + Ok(ret) => ret, + Err(e) => { + error!("Couldn't read `idx` field from memory: {}", e); + return; + } + }; + + self.next_used = Wrapping(next_used); + } } #[cfg(test)]