diff --git a/elf.rs b/elf.rs index b379bba605fbba658389d766f7d7307bb6766e61..10be116bea3607d0774171568ffb579e9be37cbf 100644 --- a/elf.rs +++ b/elf.rs @@ -13,7 +13,6 @@ use goblin::elf64::{header, program_header}; use arch::externs::{memcpy, memset}; use arch::paging::{entry, ActivePageTable, Page, VirtualAddress}; use arch::start::usermode; -use arch::x86::tlb; /// An ELF executable pub struct Elf<'a> { @@ -63,11 +62,9 @@ impl<'a> Elf<'a> { for page in Page::range_inclusive(start_page, end_page) { active_table.map(page, entry::NO_EXECUTE | entry::WRITABLE); } + active_table.flush_all(); unsafe { - // Update the page table - tlb::flush_all(); - // Copy file data memcpy(segment.p_vaddr as *mut u8, (self.data.as_ptr() as usize + segment.p_offset as usize) as *const u8, @@ -94,26 +91,20 @@ impl<'a> Elf<'a> { for page in Page::range_inclusive(start_page, end_page) { active_table.remap(page, flags); } - - unsafe { - // Update the page table - tlb::flush_all(); - } + active_table.flush_all(); } } - unsafe { - // Map stack - let start_page = Page::containing_address(VirtualAddress::new(0x80000000)); - let end_page = Page::containing_address(VirtualAddress::new(0x80000000 + 64*1024 - 1)); + // Map stack + let start_page = Page::containing_address(VirtualAddress::new(0x80000000)); + let end_page = Page::containing_address(VirtualAddress::new(0x80000000 + 64*1024 - 1)); - for page in Page::range_inclusive(start_page, end_page) { - active_table.map(page, entry::NO_EXECUTE | entry::WRITABLE | entry::USER_ACCESSIBLE); - } - - // Update the page table - tlb::flush_all(); + for page in Page::range_inclusive(start_page, end_page) { + active_table.map(page, entry::NO_EXECUTE | entry::WRITABLE | entry::USER_ACCESSIBLE); + } + active_table.flush_all(); + unsafe { // Clear stack memset(0x80000000 as *mut u8, 0, 64 * 1024); diff --git a/syscall/process.rs b/syscall/process.rs index d15c239494768fc1352bc6deb561a023fa9526f9..f357d36c35a0abb3053cad447a285ff53833a9c1 100644 --- a/syscall/process.rs +++ b/syscall/process.rs @@ -34,6 +34,7 @@ pub fn brk(address: usize) -> Result<usize> { if active_table.translate_page(page).is_none() { //println!("Not found - mapping"); active_table.map(page, entry::PRESENT | entry::WRITABLE | entry::NO_EXECUTE | entry::USER_ACCESSIBLE); + active_table.flush(page); } else { //println!("Found - skipping"); } @@ -49,6 +50,7 @@ pub fn brk(address: usize) -> Result<usize> { if active_table.translate_page(page).is_some() { //println!("Found - unmapping"); active_table.unmap(page); + active_table.flush(page); } else { //println!("Not found - skipping"); }