#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)); }