diff --git a/sched/runqueue.c b/sched/runqueue.c index d3060d8..a4635fb 100644 --- a/sched/runqueue.c +++ b/sched/runqueue.c @@ -1,4 +1,8 @@ #include #include -DEFINE_PERCPU_VAR(runqueue_t, rq); +void runqueue_init(runqueue_t *rq) +{ + memset(rq, 0x00, sizeof *rq); + rq->rq_lock = SPIN_LOCK_INIT; +} diff --git a/sched/sched.c b/sched/sched.c index 5103c23..e6dcb8b 100644 --- a/sched/sched.c +++ b/sched/sched.c @@ -1,5 +1,6 @@ #include #include +#include #include extern kern_status_t setup_kernel_task(void); @@ -24,7 +25,12 @@ kern_status_t sched_init(void) if (status != KERN_OK) { return status; } - + + cpu_data_t *this_cpu = get_this_cpu(); + runqueue_init(&this_cpu->c_rq); + this_cpu->c_current_task = kernel_task(); + put_cpu(this_cpu); + printk("sched: initialised"); return status; } diff --git a/sched/task.c b/sched/task.c index 0c513fb..1bcd960 100644 --- a/sched/task.c +++ b/sched/task.c @@ -1,6 +1,7 @@ #include #include #include +#include #include static object_type_t task_type = { @@ -8,7 +9,7 @@ static object_type_t task_type = { .ob_size = sizeof(task_t), }; -static task_t *kernel_task; +static task_t *__kernel_task; static spin_lock_t task_list_lock; static btree_t task_list; @@ -16,18 +17,23 @@ static btree_t task_list; BTREE_DEFINE_SIMPLE_GET(task_t, unsigned int, t_tasklist, t_id, task_list_get) BTREE_DEFINE_SIMPLE_INSERT(task_t, t_tasklist, t_id, task_list_insert) +task_t *kernel_task(void) +{ + return __kernel_task; +} + kern_status_t setup_kernel_task(void) { - kernel_task = task_alloc(); - if (!kernel_task) { + __kernel_task = task_alloc(); + if (!__kernel_task) { return KERN_NO_MEMORY; } - kernel_task->t_id = 0; - kernel_task->t_pmap = get_kernel_pmap(); - kernel_task->t_state = TASK_RUNNING; + __kernel_task->t_id = 0; + __kernel_task->t_pmap = get_kernel_pmap(); + __kernel_task->t_state = TASK_RUNNING; - snprintf(kernel_task->t_name, sizeof kernel_task->t_name, "kernel_task"); + snprintf(__kernel_task->t_name, sizeof __kernel_task->t_name, "kernel_task"); thread_t *kernel_thread = thread_alloc(); kernel_thread->tr_id = 0; @@ -35,12 +41,12 @@ kern_status_t setup_kernel_task(void) kernel_thread->tr_state = THREAD_READY; unsigned long flags; - task_lock_irqsave(kernel_task, &flags); - queue_push_back(&kernel_task->t_threads, &kernel_thread->tr_threads); - task_unlock_irqrestore(kernel_task, flags); + task_lock_irqsave(__kernel_task, &flags); + queue_push_back(&__kernel_task->t_threads, &kernel_thread->tr_threads); + task_unlock_irqrestore(__kernel_task, flags); spin_lock_irqsave(&task_list_lock, &flags); - task_list_insert(&task_list, kernel_task); + task_list_insert(&task_list, __kernel_task); spin_unlock_irqrestore(&task_list_lock, flags); return KERN_OK; @@ -57,7 +63,7 @@ task_t *task_alloc(void) if (!task_obj) { return NULL; } - + task_t *t = object_data(task_obj); memset(t, 0x00, sizeof *t); return t;