mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 02:17:35 +00:00
Fix some bugs in execve() and make sh use it for process launching.
Interrupting children of sh now always works with ^C :^)
This commit is contained in:
parent
202bdb553c
commit
20fb1fc377
4 changed files with 24 additions and 24 deletions
|
@ -152,8 +152,6 @@ auto MemoryManager::ensurePTE(PageDirectory* page_directory, LinearAddress laddr
|
|||
laddr.get(),
|
||||
page_table);
|
||||
#endif
|
||||
if (page_table.get() == 0x71d000)
|
||||
ASSERT(page_directory == m_kernel_page_directory);
|
||||
page_directory->physical_addresses[page_directory_index] = page_table;
|
||||
pde.setPageTableBase(page_table.get());
|
||||
pde.setUserAllowed(true);
|
||||
|
|
|
@ -346,8 +346,7 @@ int Process::sys$execve(const char* filename, const char** argv, const char** en
|
|||
new_page_directory = reinterpret_cast<PageDirectory*>(kmalloc_page_aligned(sizeof(PageDirectory)));
|
||||
MM.populate_page_directory(*new_page_directory);
|
||||
m_page_directory = new_page_directory;
|
||||
|
||||
ProcessPagingScope pagingScope(*this);
|
||||
MM.enter_process_paging_scope(*this);
|
||||
space.hookableAlloc = [&] (const String& name, size_t size) {
|
||||
if (!size)
|
||||
return (void*)nullptr;
|
||||
|
@ -357,11 +356,12 @@ int Process::sys$execve(const char* filename, const char** argv, const char** en
|
|||
};
|
||||
bool success = space.loadELF(move(elfData));
|
||||
if (!success) {
|
||||
MM.release_page_directory(*new_page_directory);
|
||||
m_page_directory = old_page_directory;
|
||||
MM.enter_process_paging_scope(*this);
|
||||
MM.release_page_directory(*new_page_directory);
|
||||
m_regions = move(old_regions);
|
||||
m_subregions = move(old_subregions);
|
||||
kprintf("Failure loading ELF %s\n", path.characters());
|
||||
kprintf("sys$execve: Failure loading %s\n", path.characters());
|
||||
return -ENOEXEC;
|
||||
}
|
||||
|
||||
|
@ -378,8 +378,9 @@ int Process::sys$execve(const char* filename, const char** argv, const char** en
|
|||
|
||||
entry_eip = (dword)space.symbolPtr("_start");
|
||||
if (!entry_eip) {
|
||||
MM.release_page_directory(*new_page_directory);
|
||||
m_page_directory = old_page_directory;
|
||||
MM.enter_process_paging_scope(*this);
|
||||
MM.release_page_directory(*new_page_directory);
|
||||
m_regions = move(old_regions);
|
||||
m_subregions = move(old_subregions);
|
||||
return -ENOEXEC;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue