summaryrefslogblamecommitdiffstats
path: root/task/tasking.c
blob: ee57a1382bd45d48a747fc20f3172d814bf847a6 (plain) (tree)












































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