axvirtio_common/
memory.rs1use ax_memory_addr::PhysAddr;
4use axaddrspace::GuestMemoryAccessor;
5use axvm_types::GuestPhysAddr;
6
7use crate::{VirtioError, VirtioResult};
8
9pub trait GuestMemory {
11 fn read(&mut self, guest_addr: GuestPhysAddr, data: &mut [u8]) -> VirtioResult<()>;
13
14 fn write(&mut self, guest_addr: GuestPhysAddr, data: &[u8]) -> VirtioResult<()>;
16}
17
18#[derive(Clone, Copy, Debug, Default)]
21pub struct NoGuestMemoryAccessor;
22
23impl GuestMemoryAccessor for NoGuestMemoryAccessor {
24 fn translate_and_get_limit(&self, _guest_addr: GuestPhysAddr) -> Option<(PhysAddr, usize)> {
25 None
26 }
27}
28
29pub struct AddressSpaceMemory<'a, T> {
32 accessor: &'a T,
33}
34
35impl<'a, T> AddressSpaceMemory<'a, T> {
36 pub const fn new(accessor: &'a T) -> Self {
38 Self { accessor }
39 }
40}
41
42impl<T: GuestMemoryAccessor> GuestMemory for AddressSpaceMemory<'_, T> {
43 fn read(&mut self, guest_addr: GuestPhysAddr, data: &mut [u8]) -> VirtioResult<()> {
44 self.accessor
45 .read_buffer(guest_addr, data)
46 .map_err(|_| VirtioError::InvalidAddress)
47 }
48
49 fn write(&mut self, guest_addr: GuestPhysAddr, data: &[u8]) -> VirtioResult<()> {
50 self.accessor
51 .write_buffer(guest_addr, data)
52 .map_err(|_| VirtioError::InvalidAddress)
53 }
54}