roxy_loader/
elf_loader.rs1use 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}