diff options
| author | Kimplul <kimi.h.kuparinen@gmail.com> | 2022-05-24 23:28:37 +0300 |
|---|---|---|
| committer | Kimplul <kimi.h.kuparinen@gmail.com> | 2022-05-24 23:28:37 +0300 |
| commit | 018624dd5b1692b88f7b2e85652ea7b898043b6d (patch) | |
| tree | 0aa018640dc6bd5ebca7120df95dca4269be61d6 /common/proc.c | |
| parent | 4123ec776d3769728e1e12379887da34c12ee8f8 (diff) | |
| download | kmi-018624dd5b1692b88f7b2e85652ea7b898043b6d.tar.gz kmi-018624dd5b1692b88f7b2e85652ea7b898043b6d.zip | |
make process loading more generic
Diffstat (limited to 'common/proc.c')
| -rw-r--r-- | common/proc.c | 58 |
1 files changed, 15 insertions, 43 deletions
diff --git a/common/proc.c b/common/proc.c index f09e7c1..3f6da6d 100644 --- a/common/proc.c +++ b/common/proc.c @@ -9,62 +9,34 @@ #include <apos/string.h> #include <apos/initrd.h> #include <arch/arch.h> +#include <arch/proc.h> -/* TODO: add error checking */ -static vm_t __setup_call_stack(struct tcb *t, size_t bytes) +stat_t prepare_proc(struct tcb *t, vm_t bin, vm_t interp) { - pm_t offset = 0; - size_t pages = __pages(bytes); - vmflags_t flags = VM_V | VM_R | VM_W | VM_U; - for (size_t i = 1; i <= pages; ++i) { - offset = alloc_page(BASE_PAGE, offset); - map_vpage(t->b_r, offset, PROC_STACK_TOP - BASE_PAGE_SIZE * i, - flags, BASE_PAGE); - } + vm_t entry = load_elf(t, bin, interp); + if (!entry) + return ERR_INVAL; - return PROC_STACK_TOP - BASE_PAGE_SIZE * pages; + alloc_stacks(t); + prepare_thread(t); + set_return(entry); + return OK; } -static vm_t __setup_proc_stack(struct tcb *t, size_t bytes) -{ - return alloc_uvmem(t, bytes, VM_V | VM_R | VM_W | VM_U); -} - -stat_t init_proc(void *fdt, struct vmem *b) +stat_t init_proc(void *fdt) { init_tcbs(); /* TODO: cleanup or something */ - struct tcb *t = create_thread(NULL); + struct tcb *t = create_proc(NULL); if (!t) return ERR_OOMEM; - /* use existing branch */ - t->b_r = b; - init_uvmem(t, UVMEM_START, UVMEM_END); - - /* TODO: this stuff should be placed in __sys_exec */ - /* the binary gets to choose first what memory regions it requires */ - t->entry = load_elf(t, get_init_base(fdt), 0); - if (!t->entry) - return ERR_ADDR; - - t->proc_stack = __setup_proc_stack(t, __proc_stack_size); - if (!t->proc_stack) - return ERR_ADDR; - - t->proc_stack_top = t->proc_stack + __proc_stack_size; - - t->call_stack = __setup_call_stack(t, __call_stack_size); - if (!t->call_stack) - return ERR_ADDR; - t->call_stack_top = t->call_stack + __call_stack_size; - - flush_tlb(); - /* set current tcb */ use_tcb(t); + use_vmem(t->b_r); - /* TODO: move fdt into process space */ - return jump_to_userspace(t, 1, 0); + /* allocate stacks after ELF file to make sure nothing of importance + * clashes */ + return prepare_proc(t, get_init_base(fdt), 0); } |
