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