aboutsummaryrefslogtreecommitdiff
path: root/common/proc.c
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2021-12-29 23:23:36 +0200
committerKimplul <kimi.h.kuparinen@gmail.com>2021-12-29 23:53:06 +0200
commit4f4d9fdc89c27aa3346467a24b621954f4564d3b (patch)
treec4ba4fb583a43b8fb27730b4cdb9b4b1395da91c /common/proc.c
parent4e5595a089c815febd7a0d42ab62940bf13f73ac (diff)
downloadkmi-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.c42
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);
}