diff --git a/src/include/kernel/elf.h b/src/include/kernel/elf.h index 44a274d6..1c61240a 100644 --- a/src/include/kernel/elf.h +++ b/src/include/kernel/elf.h @@ -84,10 +84,9 @@ typedef struct{ uint64_t alignment; } elf_ph64; -// loads an elf executable from file, setting target thread with appropriate -// values for it +// loads an elf executable from file // also sets up the stack for said executable -int elf_load(thread_t* thread, vnode_t* node, char** argv, char** env); +int elf_load(thread_t* thread, vnode_t* node, char** argv, char** env, void** entry, void** stack); #endif diff --git a/src/sys/sched/elf.c b/src/sys/sched/elf.c index 93c8d888..9c373260 100644 --- a/src/sys/sched/elf.c +++ b/src/sys/sched/elf.c @@ -159,7 +159,7 @@ static void* stacksetup(char** argv, char** env, auxv64_list auxv){ } -int elf_load(thread_t* thread, vnode_t* node, char** argv, char** env){ +int elf_load(thread_t* thread, vnode_t* node, char** argv, char** env, void** stack, void** entry){ elf_header64 header; elf_ph64 phbuff; @@ -262,9 +262,12 @@ int elf_load(thread_t* thread, vnode_t* node, char** argv, char** env){ } - void* stack = stacksetup(argv, env, auxv); + *stack = stacksetup(argv, env, auxv); + + if(!(*stack)) + return ENOMEM; - arch_regs_setupuser(thread->regs, (void*)header.entry, stack, true); + *entry = (void*)header.entry; return 0;