From ace65b453151845bc361f21f3e5b651c35f9f126 Mon Sep 17 00:00:00 2001 From: Jon Santmyer Date: Wed, 22 May 2024 13:00:41 -0400 Subject: massive refactor for mp and organization --- task/tasking.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 task/tasking.c (limited to 'task/tasking.c') diff --git a/task/tasking.c b/task/tasking.c new file mode 100644 index 0000000..ee57a13 --- /dev/null +++ b/task/tasking.c @@ -0,0 +1,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; +} -- cgit v1.2.1