fix NoMMU entry point

toolchain_update
WangRunji 6 years ago
parent 18640b7537
commit 6921e9018d

@ -86,7 +86,7 @@ impl ContextImpl {
} }
// Make page table // Make page table
let mut memory_set = memory_set_from(&elf); let (mut memory_set, entry_addr) = memory_set_from(&elf);
// User stack // User stack
use crate::consts::{USER_STACK_OFFSET, USER_STACK_SIZE, USER32_STACK_OFFSET}; use crate::consts::{USER_STACK_OFFSET, USER_STACK_SIZE, USER32_STACK_OFFSET};
@ -108,7 +108,6 @@ impl ContextImpl {
trace!("{:#x?}", memory_set); trace!("{:#x?}", memory_set);
let entry_addr = elf.header.pt2.entry_point() as usize;
let kstack = KernelStack::new(); let kstack = KernelStack::new();
//set the user Memory pages in the memory set swappable //set the user Memory pages in the memory set swappable
@ -215,17 +214,12 @@ unsafe fn push_args_at_stack<'a, Iter>(args: Iter, stack_top: usize) -> usize
} }
/* /// Generate a MemorySet according to the ELF file.
* @param: /// Also return the real entry point address.
* elf: the source ELF file fn memory_set_from<'a>(elf: &'a ElfFile<'a>) -> (MemorySet, usize) {
* @brief:
* generate a memory set according to the elf file
* @retval:
* the new memory set
*/
fn memory_set_from<'a>(elf: &'a ElfFile<'a>) -> MemorySet {
debug!("come in to memory_set_from"); debug!("come in to memory_set_from");
let mut ms = MemorySet::new(); let mut ms = MemorySet::new();
let mut entry = None;
for ph in elf.program_iter() { for ph in elf.program_iter() {
if ph.get_type() != Ok(Type::Load) { if ph.get_type() != Ok(Type::Load) {
continue; continue;
@ -251,8 +245,13 @@ fn memory_set_from<'a>(elf: &'a ElfFile<'a>) -> MemorySet {
target[file_size..].iter_mut().for_each(|x| *x = 0); target[file_size..].iter_mut().for_each(|x| *x = 0);
}); });
} }
// Find real entry point
if ph.flags().is_execute() {
let origin_entry = elf.header.pt2.entry_point() as usize;
entry = Some(origin_entry - virt_addr + target.as_ptr() as usize);
}
} }
ms (ms, entry.unwrap())
} }
fn memory_attr_from(elf_flags: Flags) -> MemoryAttr { fn memory_attr_from(elf_flags: Flags) -> MemoryAttr {

Loading…
Cancel
Save