fix: root: load_root_server: load offset

This commit is contained in:
Paul Pan 2024-06-15 18:00:02 +08:00
parent bf6297c5ac
commit e50105e797

View File

@ -12,7 +12,7 @@ use utils::{addr::*, bin::prev_power_of_two};
const ROOT_CNODE_SIZE: usize = 128;
static mut ROOT_CNODE: Lazy<[CapEntry; ROOT_CNODE_SIZE]> =
Lazy::new(|| core::array::from_fn(|i| CapEntry::new(NullCap::mint())));
Lazy::new(|| core::array::from_fn(|_| CapEntry::new(NullCap::mint())));
pub fn setup_root_server(fdt: &Fdt) {
// Root Server is using statically allocated ROOT_CNODE
@ -216,9 +216,13 @@ fn create_objects(cnode_obj: &mut CNodeObject, end_idx: usize) {
}
fn load_root_server(cnode_obj: &mut CNodeObject, end_idx: usize, fdt: &Fdt) -> usize {
let table: Table<Level0> = TableCap::try_from(&cnode_obj[CNodeSlot::VSpaceCap as usize])
.unwrap()
.as_object_mut();
let mut table = {
let root = &cnode_obj[CNodeSlot::VSpaceCap as usize];
let root_vaddr = TableCap::try_from(root).unwrap().as_object::<Level0>().vaddr();
// use unsafe to workaround borrow checker
unsafe { Table::new(root_vaddr) }
};
let mut rootfs = unsafe {
let chosen = fdt.find_node("/chosen").expect("/chosen is required");
@ -255,7 +259,6 @@ fn load_root_server(cnode_obj: &mut CNodeObject, end_idx: usize, fdt: &Fdt) -> u
})
.expect("init: root server not found");
let root_start = VirtAddr::from(root_entry.data().as_ptr());
let root_elf = ElfBytes::<AnyEndian>::minimal_parse(root_entry.data()).expect("init: invalid root server");
let mut nxt_slot = end_idx;
@ -272,7 +275,6 @@ fn load_root_server(cnode_obj: &mut CNodeObject, end_idx: usize, fdt: &Fdt) -> u
phdr.p_vaddr + phdr.p_memsz
);
let seg_start = root_start + phdr.p_offset as usize;
let seg_addr = VirtAddr::from(phdr.p_vaddr);
// Currently, we only support loading segments that are aligned to PAGE_SIZE
@ -286,6 +288,7 @@ fn load_root_server(cnode_obj: &mut CNodeObject, end_idx: usize, fdt: &Fdt) -> u
dest.fill(0);
} else {
let len = min(phdr.p_filesz as usize - offset, dest.len());
let offset = phdr.p_offset as usize + offset;
let src = &root_entry.data()[offset..offset + len];
dest[..len].copy_from_slice(src);
dest[len..].fill(0);
@ -313,10 +316,6 @@ fn load_root_server(cnode_obj: &mut CNodeObject, end_idx: usize, fdt: &Fdt) -> u
copy(cur, mem);
// map frame to vspace
let root = &cnode_obj[CNodeSlot::VSpaceCap as usize];
let root_vaddr = TableCap::try_from(root).unwrap().as_object::<Level0>().vaddr();
let mut root = unsafe { Table::new(root_vaddr) }; // use unsafe to workaround borrow checker
let vaddr = seg_addr + cur;
let paddr = unsafe { mmap_virt_to_phys(VirtAddr::from(mem as *const _ as *const u8)) };
let attr = {
@ -348,7 +347,7 @@ fn load_root_server(cnode_obj: &mut CNodeObject, end_idx: usize, fdt: &Fdt) -> u
unsafe { mmap_virt_to_phys(table.vaddr()) }
};
map_range(alloc_page, &mut root, vaddr, paddr, block_size, attr);
map_range(alloc_page, &mut table, vaddr, paddr, block_size, attr);
// update pointer
cur += block_size;