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;
|
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;
|
||||||
|
Loading…
Reference in New Issue
Block a user