axmm/backend/
linear.rs

1use axhal::paging::{MappingFlags, PageSize, PageTable};
2use memory_addr::{PhysAddr, VirtAddr};
3
4use super::Backend;
5
6impl Backend {
7    /// Creates a new linear mapping backend.
8    pub const fn new_linear(pa_va_offset: usize, align: PageSize) -> Self {
9        Self::Linear {
10            pa_va_offset,
11            align,
12        }
13    }
14
15    pub(crate) fn map_linear(
16        start: VirtAddr,
17        size: usize,
18        flags: MappingFlags,
19        pt: &mut PageTable,
20        pa_va_offset: usize,
21    ) -> bool {
22        let va_to_pa = |va: VirtAddr| PhysAddr::from(va.as_usize() - pa_va_offset);
23        debug!(
24            "map_linear: [{:#x}, {:#x}) -> [{:#x}, {:#x}) {:?}",
25            start,
26            start + size,
27            va_to_pa(start),
28            va_to_pa(start + size),
29            flags
30        );
31        pt.map_region(start, va_to_pa, size, flags, true, false)
32            .map(|tlb| tlb.ignore()) // TLB flush on map is unnecessary, as there are no outdated mappings.
33            .is_ok()
34    }
35
36    pub(crate) fn unmap_linear(
37        start: VirtAddr,
38        size: usize,
39        pt: &mut PageTable,
40        _pa_va_offset: usize,
41    ) -> bool {
42        debug!("unmap_linear: [{:#x}, {:#x})", start, start + size);
43        pt.unmap_region(start, size, true)
44            .map(|tlb| tlb.ignore()) // flush each page on unmap, do not flush the entire TLB.
45            .is_ok()
46    }
47}