Skip to main content

roxy_loader/
elf_loader.rs

1use core::ptr::copy_nonoverlapping;
2
3use elfloader::{ElfLoader, ElfLoaderErr};
4
5use crate::allocation_info::AllocationInfo;
6
7pub struct RoxyElfLoader;
8
9impl ElfLoader for RoxyElfLoader {
10    fn allocate(
11        &mut self,
12        load_headers: elfloader::LoadableHeaders,
13    ) -> Result<(), elfloader::ElfLoaderErr> {
14        for header in load_headers {
15            let allocation = AllocationInfo::from_region(header.virtual_addr(), header.mem_size());
16            allocation
17                .alloc_zeroed()
18                .expect("Failed to allocate page for kernel elf");
19        }
20
21        Ok(())
22    }
23
24    fn load(
25        &mut self,
26        _flags: elfloader::Flags,
27        base: elfloader::VAddr,
28        region: &[u8],
29    ) -> Result<(), ElfLoaderErr> {
30        unsafe {
31            copy_nonoverlapping(region.as_ptr(), base as *mut u8, region.len());
32        }
33
34        Ok(())
35    }
36
37    fn relocate(&mut self, _entry: elfloader::RelocationEntry) -> Result<(), ElfLoaderErr> {
38        panic!("Relocate is not supported.")
39    }
40}