use core::alloc::Layout;
use core::ptr;
pub trait MemMap {
#[must_use]
fn ptr(&self, paddr: usize, layout: Layout) -> *const u8;
}
impl<M: MemMap + ?Sized> MemMap for &M {
#[inline]
fn ptr(&self, paddr: usize, layout: Layout) -> *const u8 {
(**self).ptr(paddr, layout)
}
}
impl<M: MemMap + ?Sized> MemMap for &mut M {
#[inline]
fn ptr(&self, paddr: usize, layout: Layout) -> *const u8 {
(**self).ptr(paddr, layout)
}
}
#[derive(Default, Copy, Clone, Debug)]
pub struct IdentityMap;
impl MemMap for IdentityMap {
#[inline]
fn ptr(&self, paddr: usize, layout: Layout) -> *const u8 {
let ptr = ptr::with_exposed_provenance_mut(paddr);
if !ptr_is_aligned_to(ptr, layout.align()) {
return ptr::null();
}
ptr
}
}
#[inline]
#[must_use]
fn ptr_is_aligned_to<T>(ptr: *const T, align: usize) -> bool {
assert!(
align.is_power_of_two(),
"ptr_is_aligned_to: align is not a power-of-two"
);
ptr.addr() & (align - 1) == 0
}