diff options
| author | Kimplul <kimi.h.kuparinen@gmail.com> | 2021-12-29 23:23:36 +0200 |
|---|---|---|
| committer | Kimplul <kimi.h.kuparinen@gmail.com> | 2021-12-29 23:53:06 +0200 |
| commit | 4f4d9fdc89c27aa3346467a24b621954f4564d3b (patch) | |
| tree | c4ba4fb583a43b8fb27730b4cdb9b4b1395da91c /common/proc.c | |
| parent | 4e5595a089c815febd7a0d42ab62940bf13f73ac (diff) | |
| download | kmi-4f4d9fdc89c27aa3346467a24b621954f4564d3b.tar.gz kmi-4f4d9fdc89c27aa3346467a24b621954f4564d3b.zip | |
Refactoring
+ Mainly just moving stuff out or arch/riscv/ that should be handled in
common/
+ Prepared separate process stack/call stack for server callbacks, rest
to be implemeted soon ish
Diffstat (limited to 'common/proc.c')
| -rw-r--r-- | common/proc.c | 42 |
1 files changed, 38 insertions, 4 deletions
diff --git a/common/proc.c b/common/proc.c index 5fdf413..ccd60bd 100644 --- a/common/proc.c +++ b/common/proc.c @@ -1,16 +1,50 @@ +#include <apos/conf.h> +#include <apos/elf.h> +#include <apos/string.h> +#include <apos/initrd.h> #include <apos/proc.h> /* TODO: add error checking */ -vm_t setup_call_stack(struct tcb *t, vm_t start, size_t bytes) +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; - for(size_t i = 0; i < pages; ++i) + for(size_t i = 1; i <= pages; ++i) { offset = alloc_page(BASE_PAGE, offset); - map_vmem(t->b_r, offset, start + BASE_PAGE_SIZE * i, flags, BASE_PAGE); + map_vmem(t->b_r, offset, PROC_STACK_TOP - BASE_PAGE_SIZE * i, flags, BASE_PAGE); } - return start; + return PROC_STACK_TOP - BASE_PAGE_SIZE * pages; +} + +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) +{ + struct tcb *t = (struct tcb *)alloc_page(BASE_PAGE, 0); + memset(t, 0, sizeof(struct tcb)); + t->b_r = b; + t->pid = 0; + t->tid = 0; + + threads_insert(t); + + sp_mem_init(&t->sp_r, UVMEM_START, UVMEM_END); + + /* the binary gets to choose first what memory regions it requires */ + t->entry = load_elf(t, get_init_base(fdt)); + + t->proc_stack = setup_proc_stack(t, __proc_stack_size); + t->call_stack = setup_call_stack(t, __call_stack_size); + + + flush_tlb(); + + /* TODO: move fdt into process space */ + jump_to_userspace(t, 1, 0); } |
