diff options
| author | Kimplul <kimi.h.kuparinen@gmail.com> | 2022-01-07 17:33:55 +0200 |
|---|---|---|
| committer | Kimplul <kimi.h.kuparinen@gmail.com> | 2022-01-07 17:33:55 +0200 |
| commit | ebe6fe5d44d58fcb1b9d0ac52fa98a0a3ff309a7 (patch) | |
| tree | 1273c7815d6790e746f6e7ecfcd464e5cab39f2e /common/proc.c | |
| parent | be78fcb0acc665d4db8edb9cda53f6863d27dd85 (diff) | |
| download | kmi-ebe6fe5d44d58fcb1b9d0ac52fa98a0a3ff309a7.tar.gz kmi-ebe6fe5d44d58fcb1b9d0ac52fa98a0a3ff309a7.zip | |
Steps towards better status/debugging control
Diffstat (limited to 'common/proc.c')
| -rw-r--r-- | common/proc.c | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/common/proc.c b/common/proc.c index c272727..13d3750 100644 --- a/common/proc.c +++ b/common/proc.c @@ -1,8 +1,8 @@ -#include <apos/conf.h> #include <apos/elf.h> +#include <apos/proc.h> +#include <apos/conf.h> #include <apos/string.h> #include <apos/initrd.h> -#include <apos/proc.h> #include <arch/arch.h> /* TODO: add error checking */ @@ -10,11 +10,11 @@ static vm_t setup_call_stack(struct tcb *t, size_t bytes) { pm_t offset = 0; size_t pages = __pages(bytes); - uint8_t flags = VM_V | VM_R | VM_W | VM_U; + 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_vmem(t->b_r, offset, PROC_STACK_TOP - BASE_PAGE_SIZE * i, flags, BASE_PAGE); + map_vpage(t->b_r, offset, PROC_STACK_TOP - BASE_PAGE_SIZE * i, flags, BASE_PAGE); } return PROC_STACK_TOP - BASE_PAGE_SIZE * pages; @@ -25,9 +25,13 @@ 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); } -void init_proc(void *fdt, struct vm_branch *b) +stat_t init_proc(void *fdt, struct vm_branch *b) { + /* todo: cleanup or something */ struct tcb *t = (struct tcb *)alloc_page(BASE_PAGE, 0); + if(!t) + return ERR_OOMEM; + memset(t, 0, sizeof(struct tcb)); t->b_r = b; t->pid = 0; @@ -39,13 +43,20 @@ void init_proc(void *fdt, struct vm_branch *b) /* the binary gets to choose first what memory regions it requires */ t->entry = load_elf(t, get_init_base(fdt)); + if(!t->entry) + return ERR_ADDR; t->proc_stack = setup_proc_stack(t, __proc_stack_size); + if(!t->proc_stack) + return ERR_ADDR; + t->call_stack = setup_call_stack(t, __call_stack_size); + if(!t->call_stack) + return ERR_ADDR; flush_tlb(); /* TODO: move fdt into process space */ - jump_to_userspace(t, 1, 0); + return jump_to_userspace(t, 1, 0); } |
