Browse Source

fix(elf): set up stack when loading elf files

greatbridf 2 years ago
parent
commit
3995b9ef2e
3 changed files with 12 additions and 4 deletions
  1. 0 4
      src/kernel/process.cpp
  2. 6 0
      src/kernel/syscall.cpp
  3. 6 0
      src/types/elf.cpp

+ 0 - 4
src/kernel/process.cpp

@@ -136,10 +136,6 @@ void NORETURN _kernel_init(void)
     interrupt_stack intrpt_stack {};
     interrupt_stack intrpt_stack {};
     intrpt_stack.eflags = 0x200; // STI
     intrpt_stack.eflags = 0x200; // STI
     types::elf::elf32_load("/mnt/INIT.ELF", &intrpt_stack, 0);
     types::elf::elf32_load("/mnt/INIT.ELF", &intrpt_stack, 0);
-    // map stack area
-    ret = mmap((void*)types::elf::ELF_STACK_TOP, types::elf::ELF_STACK_SIZE, fs::vfs_open("/dev/null")->ind, 0, 1, 0);
-    if (unlikely(ret != GB_OK))
-        syscall(0x03);
 
 
     asm_cli();
     asm_cli();
     current_process->attr.system = 0;
     current_process->attr.system = 0;

+ 6 - 0
src/kernel/syscall.cpp

@@ -69,6 +69,12 @@ void _syscall_exec(interrupt_stack* data)
     const char** argv = reinterpret_cast<const char**>(data->s_regs.esi);
     const char** argv = reinterpret_cast<const char**>(data->s_regs.esi);
     (void)argv;
     (void)argv;
 
 
+    // skip kernel heap
+    for (auto iter = ++current_process->mms.begin(); iter != current_process->mms.end();) {
+        k_unmap(iter.ptr());
+        iter = current_process->mms.erase(iter);
+    }
+
     types::elf::elf32_load(exec, data, current_process->attr.system);
     types::elf::elf32_load(exec, data, current_process->attr.system);
 }
 }
 
 

+ 6 - 0
src/types/elf.cpp

@@ -1,3 +1,4 @@
+#include <kernel/syscall.hpp>
 #include <types/elf.hpp>
 #include <types/elf.hpp>
 
 
 int types::elf::elf32_load(const char* exec, interrupt_stack* intrpt_stack, bool system)
 int types::elf::elf32_load(const char* exec, interrupt_stack* intrpt_stack, bool system)
@@ -52,6 +53,11 @@ int types::elf::elf32_load(const char* exec, interrupt_stack* intrpt_stack, bool
         ++phents;
         ++phents;
     }
     }
 
 
+    // map stack area
+    auto ret = mmap((void*)types::elf::ELF_STACK_TOP, types::elf::ELF_STACK_SIZE, fs::vfs_open("/dev/null")->ind, 0, 1, 0);
+    if (ret != GB_OK)
+        syscall(0x03);
+
     intrpt_stack->v_eip = (void*)hdr.entry;
     intrpt_stack->v_eip = (void*)hdr.entry;
     memset((void*)&intrpt_stack->s_regs, 0x00, sizeof(regs_32));
     memset((void*)&intrpt_stack->s_regs, 0x00, sizeof(regs_32));
     intrpt_stack->s_regs.esp = types::elf::ELF_STACK_BOTTOM;
     intrpt_stack->s_regs.esp = types::elf::ELF_STACK_BOTTOM;