summaryrefslogtreecommitdiffstats
path: root/task/tasking.c
blob: ee57a1382bd45d48a747fc20f3172d814bf847a6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#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;
}