use crate::{
Result,
memory::{RegionAccess, VmAddr, VmOffset},
os::{MapFlags, ProtFlags},
segment::ElfSegments,
};
use alloc::vec::Vec;
#[derive(Debug)]
pub(crate) struct FileMapInfo {
pub(crate) start: usize,
pub(crate) filesz: usize,
pub(crate) offset: usize,
}
#[derive(Clone, Copy, Debug)]
pub(crate) struct MemoryProtection {
addr: VmAddr,
len: usize,
page_size: usize,
prot: ProtFlags,
}
impl MemoryProtection {
#[inline]
pub(crate) const fn new(addr: VmAddr, len: usize, page_size: usize, prot: ProtFlags) -> Self {
Self {
addr,
len,
page_size,
prot,
}
}
#[inline]
pub(crate) fn apply<R: RegionAccess>(&self, segments: &ElfSegments<R>) -> Result<()> {
let start = self.addr.rounddown(self.page_size);
let end = (self.addr + VmOffset::new(self.len)).roundup(self.page_size);
let len = end
.checked_offset_from(start)
.expect("protection range end precedes its start")
.get();
segments.mprotect(start, len, self.prot)
}
}
pub(crate) struct ElfSegment {
pub(crate) offset: VmOffset,
pub(crate) prot: ProtFlags,
pub(crate) flags: MapFlags,
pub(crate) len: usize,
pub(crate) page_size: usize,
pub(crate) zero_size: usize,
pub(crate) content_size: usize,
pub(crate) map_info: Vec<FileMapInfo>,
pub(crate) need_copy: bool,
pub(crate) from_relocatable: bool,
}