From 42a2bdaecaee627247689b3f4ff2828fe3c8dc97 Mon Sep 17 00:00:00 2001 From: Jon Santmyer Date: Thu, 11 Sep 2025 14:37:04 -0400 Subject: load init from ELF executable --- arch/x86_64/tasking/tcb.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 arch/x86_64/tasking/tcb.c (limited to 'arch/x86_64/tasking') diff --git a/arch/x86_64/tasking/tcb.c b/arch/x86_64/tasking/tcb.c new file mode 100644 index 0000000..9877455 --- /dev/null +++ b/arch/x86_64/tasking/tcb.c @@ -0,0 +1,35 @@ +#include "arch/x86_64/tcb.h" +#include "arch/x86_64/processor.h" +#include "arch/x86_64/page.h" +#include "device/processor.h" +#include "object.h" +#include "init.h" +#include "string.h" + +#define INIT_TCB_BYTES (0x1000 + KERNEL_STACK_MINSIZE) +uint8_t _init_tcb_bytes[INIT_TCB_BYTES]; +tcb_t *_init_tcb = (tcb_t*)&_init_tcb_bytes; + +void +tcb_init(void *task_main) +{ + memset(_init_tcb, 0, INIT_TCB_BYTES); + _init_tcb->size = INIT_TCB_BYTES; + size_t kstack_bytes = (size_t)(INIT_TCB_BYTES - sizeof(tcb_t)); + + _init_tcb->ksp = (uintptr_t)_init_tcb->kstack + kstack_bytes - sizeof(intmax_t); + _init_tcb->pml4 = ko_entry_data(&_initDirectory.entries[INIT_OBJECT_PAGEMAP]); + + _initDirectory.entries[INIT_OBJECT_TCB] = (objdir_entry_t) { + .type = KO_TCB, + .data = vptr_tophys_koff((uintptr_t)_init_tcb) + }; + + ((processor_t*)processor_current())->tcb = _init_tcb; + + __asm__ volatile("\ + movq %0, %%rsp; \ + movq $0, %%rbp; \ + jmpq %1":: + "r"(_init_tcb->ksp), "r"(task_main)); +} -- cgit v1.2.1