1use kernel_vmem::VirtualMemoryPageBits;
17use kernel_vmem::address_space::AddressSpaceMapRegionError;
18use kernel_vmem::addresses::{PhysicalAddress, VirtualAddress};
19use kernel_vmem::{AddressSpace, FrameAlloc, PhysMapper};
20
21pub struct Vmm<'m, M: PhysMapper, A: FrameAlloc> {
23 aspace: AddressSpace<'m, M>,
24 alloc: &'m mut A,
25}
26
27impl<'m, M: PhysMapper, A: FrameAlloc> Vmm<'m, M, A> {
28 pub unsafe fn from_current(mapper: &'m M, alloc: &'m mut A) -> Self {
32 let aspace = unsafe { AddressSpace::from_current(mapper) };
33 Self { aspace, alloc }
34 }
35
36 pub fn map_region(
39 &mut self,
40 va: VirtualAddress,
41 pa: PhysicalAddress,
42 len: u64,
43 nonleaf: VirtualMemoryPageBits,
44 leaf: VirtualMemoryPageBits,
45 ) -> Result<(), AddressSpaceMapRegionError> {
46 self.aspace
47 .map_region(self.alloc, va, pa, len, nonleaf, leaf)
48 }
49
50 pub fn unmap_region(&mut self, va: VirtualAddress, len: u64) {
51 self.aspace.unmap_region(va, len);
52 }
53
54 #[must_use]
55 pub fn query(&self, va: VirtualAddress) -> Option<PhysicalAddress> {
56 self.aspace.query(va)
57 }
58}