You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

25 lines
828 B

use core::slice;
use fixedvec::FixedVec;
use xmas_elf::program::{ProgramHeader64, Type};
global_asm!(include_str!("boot.S"));
pub fn map_kernel(kernel_start: u64, segments: &FixedVec<ProgramHeader64>) {
for segment in segments {
if segment.get_type() != Ok(Type::Load) {
continue;
}
let virt_addr = segment.virtual_addr;
let offset = segment.offset;
let file_size = segment.file_size as usize;
let mem_size = segment.mem_size as usize;
unsafe {
let target = slice::from_raw_parts_mut(virt_addr as *mut u8, mem_size);
let source = slice::from_raw_parts((kernel_start + offset) as *const u8, file_size);
target.copy_from_slice(source);
target[file_size..].iter_mut().for_each(|x| *x = 0);
}
}
}