From 013e95f766b6e129b8194bf9520ae02568f0a470 Mon Sep 17 00:00:00 2001 From: keyboard-slayer Date: Fri, 22 Dec 2023 10:43:20 +0100 Subject: [PATCH] feat: almost posix-like entry point --- src/kernel/archs/x86_64/ctx.c | 4 ++-- src/kernel/core/manifest.json | 3 ++- src/kernel/core/pre-sched.c | 32 +++++++++++++++++++++++------ src/libs/entry/common/entry.c | 30 +++++++++++++++++++++++++++ src/libs/entry/common/manifest.json | 9 ++++++++ src/libs/entry/x86_64/entry.s | 8 ++++++++ src/libs/entry/x86_64/manifest.json | 13 ++++++++++++ src/libs/mem/manifest.json | 5 +++++ src/libs/mem/stack.c | 24 ++++++++++++++++++++++ src/libs/mem/stack.h | 23 +++++++++++++++++++++ src/srvs/procman/main.c | 19 ++++++++++------- src/srvs/procman/manifest.json | 1 + 12 files changed, 155 insertions(+), 16 deletions(-) create mode 100644 src/libs/entry/common/entry.c create mode 100644 src/libs/entry/common/manifest.json create mode 100644 src/libs/entry/x86_64/entry.s create mode 100644 src/libs/entry/x86_64/manifest.json create mode 100644 src/libs/mem/manifest.json create mode 100644 src/libs/mem/stack.c create mode 100644 src/libs/mem/stack.h diff --git a/src/kernel/archs/x86_64/ctx.c b/src/kernel/archs/x86_64/ctx.c index e291eda..775928f 100644 --- a/src/kernel/archs/x86_64/ctx.c +++ b/src/kernel/archs/x86_64/ctx.c @@ -39,8 +39,8 @@ Res hal_context_start(HalContext *self, uintptr_t ip, uintptr_t sp, SysArgs args self->regs.cs = (GDT_USER_CODE * 8) | 3; self->regs.ss = (GDT_USER_DATA * 8) | 3; - self->regs.rsp = sp + STACK_SIZE; - self->regs.rbp = sp; + self->regs.rsp = sp; + self->regs.rbp = 0; PmmObj kStackObj = pmm_alloc(align_up$(STACK_SIZE, PMM_PAGE_SIZE) / PMM_PAGE_SIZE); if (kStackObj.base == 0) diff --git a/src/kernel/core/manifest.json b/src/kernel/core/manifest.json index c2e0abd..4859cf7 100644 --- a/src/kernel/core/manifest.json +++ b/src/kernel/core/manifest.json @@ -8,7 +8,8 @@ "stdc-shim", "loader", "kmalloc", - "tinyvmem" + "tinyvmem", + "mem" ], "tools": { "cc": { diff --git a/src/kernel/core/pre-sched.c b/src/kernel/core/pre-sched.c index 083c0b1..866264b 100644 --- a/src/kernel/core/pre-sched.c +++ b/src/kernel/core/pre-sched.c @@ -2,11 +2,13 @@ #include #include #include -#include +#include #include #include #include +#include "x86_64/ctx.h" + #include "hal.h" #include "pmm.h" #include "pre-sched.h" @@ -24,6 +26,7 @@ static HalPage *sched_vspace; static HalContext *sched_ctx; static Vmem sched_vmem; +static Stack sched_stack; static HalContext *kernel_ctx; static bool need_switch = false; @@ -77,7 +80,7 @@ Res load_scheduler(void) sched_ctx = (HalContext *)try$(hal_context_create()); kernel_ctx = (HalContext *)try$(hal_context_create()); - PmmObj sched_stack_obj = pmm_alloc(align_up$(STACK_SIZE, PMM_PAGE_SIZE) / PMM_PAGE_SIZE); + PmmObj sched_stack_obj = pmm_alloc(align_up$(USER_STACK_SIZE, PMM_PAGE_SIZE) / PMM_PAGE_SIZE); if (sched_stack_obj.len == 0) { return err$(RES_NOMEM); @@ -97,10 +100,27 @@ Res load_scheduler(void) uintptr_t handover_addr = (uintptr_t)vmem_alloc(&sched_vmem, kib$(16), VM_INSTANTFIT); - try$(hal_space_map(sched_vspace, align_down$(handover_addr, PMM_PAGE_SIZE), align_down$((uintptr_t)handover_obj.base, PMM_PAGE_SIZE), - align_up$(builder.size, PMM_PAGE_SIZE), HAL_MEM_READ | HAL_MEM_USER)); - try$(hal_space_map(sched_vspace, USER_STACK_BASE, sched_stack_obj.base, STACK_SIZE, HAL_MEM_READ | HAL_MEM_WRITE | HAL_MEM_USER)); - hal_context_start(sched_ctx, hdr->e_entry, USER_STACK_BASE, (SysArgs){handover_addr, 0, 0, 0, 0, 0}); + Alloc kmalloc = kmalloc_acquire(); + sched_stack = stack_init(hal_mmap_l2h(sched_stack_obj.base), USER_STACK_SIZE); + uintptr_t *argc = (uintptr_t *)try$(kmalloc.calloc(1, sizeof(uintptr_t))); + *argc = 2; + + uintptr_t *argv = (uintptr_t *)try$(kmalloc.calloc(2, sizeof(uintptr_t))); + argv[0] = USER_STACK_TOP - stack_push(&sched_stack, "boot:///bin/procman\0", 20); + argv[1] = handover_addr; + + stack_push(&sched_stack, argv, 2 * sizeof(uintptr_t)); + stack_push(&sched_stack, (void *)argc, sizeof(uintptr_t)); + + kmalloc.free(argc); + kmalloc.free(argv); + + try$(hal_space_map(sched_vspace, align_down$(handover_addr, PMM_PAGE_SIZE), align_down$((uintptr_t)handover_obj.base, PMM_PAGE_SIZE), + align_up$(builder.size, PMM_PAGE_SIZE), HAL_MEM_READ | HAL_MEM_USER)); + + try$(hal_space_map(sched_vspace, USER_STACK_BASE, sched_stack_obj.base, USER_STACK_SIZE, HAL_MEM_READ | HAL_MEM_WRITE | HAL_MEM_USER)); + + hal_context_start(sched_ctx, hdr->e_entry, USER_STACK_TOP - sched_stack.off, (SysArgs){0, 0, 0, 0, 0, 0}); need_switch = true; return ok$(); diff --git a/src/libs/entry/common/entry.c b/src/libs/entry/common/entry.c new file mode 100644 index 0000000..e5e9055 --- /dev/null +++ b/src/libs/entry/common/entry.c @@ -0,0 +1,30 @@ +#include +#include +#include +#include + +[[gnu::weak]] Res main([[gnu::unused]] int argc, [[gnu::unused]] char **argv) +{ + return ok$(); +} + +static void parse_stack(uintptr_t *stack, int *argc, char ***argv) +{ + uintptr_t *sp = stack; + *argc = *sp++; + *argv = (char **)(sp); + sp += *argc; + sp++; +} + +int _entry(char *stack) +{ + int argc = 0; + char **argv = NULL; + + parse_stack((uintptr_t *)stack, &argc, &argv); + main(argc, argv); + + for (;;) + ; +} \ No newline at end of file diff --git a/src/libs/entry/common/manifest.json b/src/libs/entry/common/manifest.json new file mode 100644 index 0000000..1e1cea0 --- /dev/null +++ b/src/libs/entry/common/manifest.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://schemas.cute.engineering/stable/cutekit.manifest.component.v1", + "type": "lib", + "id": "entry", + "requires": [ + "entry-arch", + "stdc-shim" + ] +} \ No newline at end of file diff --git a/src/libs/entry/x86_64/entry.s b/src/libs/entry/x86_64/entry.s new file mode 100644 index 0000000..e5d0a2f --- /dev/null +++ b/src/libs/entry/x86_64/entry.s @@ -0,0 +1,8 @@ +.text + +.globl _start + +_start: + xor %rbp, %rbp + mov %rsp, %rdi + call _entry \ No newline at end of file diff --git a/src/libs/entry/x86_64/manifest.json b/src/libs/entry/x86_64/manifest.json new file mode 100644 index 0000000..a0b55cb --- /dev/null +++ b/src/libs/entry/x86_64/manifest.json @@ -0,0 +1,13 @@ +{ + "$schema": "https://schemas.cute.engineering/stable/cutekit.manifest.component.v1", + "type": "lib", + "id": "entry-x86_64", + "enableIf": { + "arch": [ + "x86_64" + ] + }, + "provides": [ + "entry-arch" + ] +} \ No newline at end of file diff --git a/src/libs/mem/manifest.json b/src/libs/mem/manifest.json new file mode 100644 index 0000000..c32d1d6 --- /dev/null +++ b/src/libs/mem/manifest.json @@ -0,0 +1,5 @@ +{ + "$schema": "https://schemas.cute.engineering/stable/cutekit.manifest.component.v1", + "type": "lib", + "id": "mem" +} \ No newline at end of file diff --git a/src/libs/mem/stack.c b/src/libs/mem/stack.c new file mode 100644 index 0000000..e2e79b8 --- /dev/null +++ b/src/libs/mem/stack.c @@ -0,0 +1,24 @@ +#include +#include + +#include "stack.h" + +Stack stack_init(uintptr_t base, size_t len) +{ + Stack stack = { + .base = base + len, + .len = len, + .off = 0, + }; + + return stack; +} + +size_t stack_push(Stack *self, void *data, size_t size) +{ + self->base -= size; + self->off += size; + + memcpy((void *)self->base, data, size); + return self->off; +} \ No newline at end of file diff --git a/src/libs/mem/stack.h b/src/libs/mem/stack.h new file mode 100644 index 0000000..eb8652e --- /dev/null +++ b/src/libs/mem/stack.h @@ -0,0 +1,23 @@ +#pragma once + +#include +#include +#include +#include + +typedef struct +{ + uintptr_t base; + size_t len; + size_t off; +} Stack; + +struct stack_push_param +{ + HalPage *vspace; + Vmem *vmem; +}; + +Stack stack_init(uintptr_t base, size_t len); + +size_t stack_push(Stack *self, void *data, size_t size); diff --git a/src/srvs/procman/main.c b/src/srvs/procman/main.c index 533a3f5..151e2d0 100644 --- a/src/srvs/procman/main.c +++ b/src/srvs/procman/main.c @@ -1,18 +1,23 @@ #include #include -#include -_Noreturn int _start(uintptr_t handover_addr) +Res main(int argc, char const *argv[]) { - HandoverPayload *handover = (HandoverPayload *)handover_addr; + if (argc == 1) + { + error$("no handover payload was provided"); + return err$(RES_INVAL); + } + + HandoverPayload *handover = (HandoverPayload *)argv[1]; if (handover->magic != HANDOVER_MAGIC) { error$("Invalid handover magic"); - for (;;); + return err$(RES_INVAL); } - log$("Hello, world!"); - for (;;) - ; + log$("Hello from procman!"); + + return ok$(); } \ No newline at end of file diff --git a/src/srvs/procman/manifest.json b/src/srvs/procman/manifest.json index 1d21171..7d8201c 100644 --- a/src/srvs/procman/manifest.json +++ b/src/srvs/procman/manifest.json @@ -3,6 +3,7 @@ "type": "exe", "id": "procman", "requires": [ + "entry", "dbg" ], "enableIf": {