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; const ROOT_CNODE_SIZE: usize = 128;
static mut ROOT_CNODE: Lazy<[CapEntry; ROOT_CNODE_SIZE]> = 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) { pub fn setup_root_server(fdt: &Fdt) {
// Root Server is using statically allocated ROOT_CNODE // 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 { 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]) let mut table = {
.unwrap() let root = &cnode_obj[CNodeSlot::VSpaceCap as usize];
.as_object_mut(); 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 mut rootfs = unsafe {
let chosen = fdt.find_node("/chosen").expect("/chosen is required"); 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"); .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 root_elf = ElfBytes::<AnyEndian>::minimal_parse(root_entry.data()).expect("init: invalid root server");
let mut nxt_slot = end_idx; 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 phdr.p_vaddr + phdr.p_memsz
); );
let seg_start = root_start + phdr.p_offset as usize;
let seg_addr = VirtAddr::from(phdr.p_vaddr); let seg_addr = VirtAddr::from(phdr.p_vaddr);
// Currently, we only support loading segments that are aligned to PAGE_SIZE // 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); dest.fill(0);
} else { } else {
let len = min(phdr.p_filesz as usize - offset, dest.len()); 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]; let src = &root_entry.data()[offset..offset + len];
dest[..len].copy_from_slice(src); dest[..len].copy_from_slice(src);
dest[len..].fill(0); 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); copy(cur, mem);
// map frame to vspace // 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 vaddr = seg_addr + cur;
let paddr = unsafe { mmap_virt_to_phys(VirtAddr::from(mem as *const _ as *const u8)) }; let paddr = unsafe { mmap_virt_to_phys(VirtAddr::from(mem as *const _ as *const u8)) };
let attr = { 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()) } 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 // update pointer
cur += block_size; cur += block_size;