#include "tasking.h" #include "slab.h" #include "klib/rbtree.h" #include "arch/processor.h" rbtree_t s_tcbs; tcbid_t s_tcb_nextid = 0; slab_cache_t s_kstack_slab; void tasking_setup(void) { rbtree_new(&s_tcbs, tcb_t); slabcache_new(&s_kstack_slab, "kernel stack", KERNEL_STACKW); extern void kernel_stage2(void); tcb_t *init_tcb = tcb_new((void*)kernel_stage2, pd_current()); tcb_switch(init_tcb); } tcb_t* tcb_new(void *ip, page_directory_t *pd) { void *stack = slab_alloc(&s_kstack_slab); tcb_t *tcb = rbtree_reserve(&s_tcbs, s_tcb_nextid); *tcb = (tcb_t) { .id = s_tcb_nextid++, .stack = stack, .ksp = ((uintptr_t)stack) + (KERNEL_STACKW - 1), .pd = pd, .state = TCB_RUNNING }; tcb_prepare(tcb, ip); return tcb; } void tcb_kill(tcb_t *tcb, int code) { if(tcb->id == 0) kpanic("init thread killed!\n"); tcb->state = TCB_DEAD; tcb->exit_code = code; }