aboutsummaryrefslogtreecommitdiff
path: root/common/proc.c
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2022-05-24 23:28:37 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2022-05-24 23:28:37 +0300
commit018624dd5b1692b88f7b2e85652ea7b898043b6d (patch)
tree0aa018640dc6bd5ebca7120df95dca4269be61d6 /common/proc.c
parent4123ec776d3769728e1e12379887da34c12ee8f8 (diff)
downloadkmi-018624dd5b1692b88f7b2e85652ea7b898043b6d.tar.gz
kmi-018624dd5b1692b88f7b2e85652ea7b898043b6d.zip
make process loading more generic
Diffstat (limited to 'common/proc.c')
-rw-r--r--common/proc.c58
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);
}