diff options
author | Patrick Williams <iawillia@us.ibm.com> | 2010-06-07 14:41:20 -0500 |
---|---|---|
committer | Patrick Williams <iawillia@us.ibm.com> | 2010-06-07 14:41:20 -0500 |
commit | 546a015f74fab0c4e359cf97f289ff26d6481844 (patch) | |
tree | bd2643a5d512af932090fb09748aea8aa8f61521 /src/kernel | |
parent | cd86583d084a4227dbf6a7cca2934eaad2b060d1 (diff) | |
download | talos-hostboot-546a015f74fab0c4e359cf97f289ff26d6481844.tar.gz talos-hostboot-546a015f74fab0c4e359cf97f289ff26d6481844.zip |
Create init process, fix scheduler bugs.
Diffstat (limited to 'src/kernel')
-rw-r--r-- | src/kernel/cpumgr.C | 2 | ||||
-rw-r--r-- | src/kernel/kernel.C | 17 | ||||
-rw-r--r-- | src/kernel/scheduler.C | 6 | ||||
-rw-r--r-- | src/kernel/taskmgr.C | 2 |
4 files changed, 22 insertions, 5 deletions
diff --git a/src/kernel/cpumgr.C b/src/kernel/cpumgr.C index 6855bfc1e..d43b28ca8 100644 --- a/src/kernel/cpumgr.C +++ b/src/kernel/cpumgr.C @@ -45,7 +45,7 @@ void CpuManager::startCPU(ssize_t i) // Initialize CPU. cpu->cpu = i; - cpu->scheduler = new Scheduler(); + cpu->scheduler = new Scheduler(cpu); cpu->kernel_stack = (void*) (((uint64_t)PageManager::allocatePage(4)) + 16320); diff --git a/src/kernel/kernel.C b/src/kernel/kernel.C index 148ffe0bf..b071d9999 100644 --- a/src/kernel/kernel.C +++ b/src/kernel/kernel.C @@ -4,10 +4,15 @@ #include <kernel/heapmgr.H> #include <kernel/cpumgr.H> #include <util/singleton.H> +#include <kernel/cpu.H> +#include <kernel/task.H> +#include <kernel/scheduler.H> +#include <kernel/taskmgr.H> #include <stdlib.h> extern "C" void kernel_dispatch_task(); +extern void init_main(void* unused); class Kernel { @@ -15,6 +20,7 @@ class Kernel void cppBootstrap(); void memBootstrap(); void cpuBootstrap(); + void inittaskBootstrap(); protected: Kernel() {}; @@ -29,8 +35,9 @@ int main() kernel.memBootstrap(); kernel.cpuBootstrap(); - kernel_dispatch_task(); + kernel.inittaskBootstrap(); + kernel_dispatch_task(); // no return. while(1); return 0; } @@ -59,3 +66,11 @@ void Kernel::cpuBootstrap() CpuManager::init(); } +void Kernel::inittaskBootstrap() +{ + task_t * t = TaskManager::createTask(&init_main, NULL); + t->cpu = CpuManager::getCurrentCPU(); + TaskManager::setCurrentTask(t); + +} + diff --git a/src/kernel/scheduler.C b/src/kernel/scheduler.C index 1df91b9eb..b96dd7c7b 100644 --- a/src/kernel/scheduler.C +++ b/src/kernel/scheduler.C @@ -5,7 +5,9 @@ void Scheduler::addTask(task_t* t) { if (iv_idleTask != t) + { iv_taskList[iv_direction ? 0 : 1].push(t); + } } void Scheduler::returnRunnable() @@ -22,7 +24,7 @@ void Scheduler::setNextRunnable() if (NULL == t) { - iv_taskList[direction ? 0 : 1].pop(); + t = iv_taskList[direction ? 0 : 1].pop(); __sync_bool_compare_and_swap(&iv_direction, direction, !direction); } @@ -30,6 +32,6 @@ void Scheduler::setNextRunnable() { t = iv_idleTask; } - + TaskManager::setCurrentTask(t); } diff --git a/src/kernel/taskmgr.C b/src/kernel/taskmgr.C index 5917abfeb..fabb70cde 100644 --- a/src/kernel/taskmgr.C +++ b/src/kernel/taskmgr.C @@ -3,7 +3,7 @@ #include <kernel/task.H> #include <kernel/pagemgr.H> -void TaskManager::idleTaskLoop() +void TaskManager::idleTaskLoop(void* unused) { while(1) { |