mirror of
https://github.com/panpaul/tiny_os
synced 2024-09-20 09:45:19 +08:00
fix: root: load_root_server: load offset
This commit is contained in:
parent
bf6297c5ac
commit
e50105e797
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user