1use axhal::paging::{MappingFlags, PageSize, PageTable};
2use memory_addr::{PhysAddr, VirtAddr};
3
4use super::Backend;
5
6impl Backend {
7 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()) .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()) .is_ok()
46 }
47}