diff options
| author | Patrick Williams <iawillia@us.ibm.com> | 2010-06-07 11:32:45 -0500 |
|---|---|---|
| committer | Patrick Williams <iawillia@us.ibm.com> | 2010-06-07 11:32:45 -0500 |
| commit | 6db79851d2f8664216d85ba73246699d8aae94a7 (patch) | |
| tree | 4fbdb939af7fd48d72d728064259525095f80bfc /src/kernel | |
| parent | b64188ed609f06ec8b476768f009153472237012 (diff) | |
| download | blackbird-hostboot-6db79851d2f8664216d85ba73246699d8aae94a7.tar.gz blackbird-hostboot-6db79851d2f8664216d85ba73246699d8aae94a7.zip | |
Add scheduler and calls from dispatch interrupt.
Diffstat (limited to 'src/kernel')
| -rw-r--r-- | src/kernel/makefile | 2 | ||||
| -rw-r--r-- | src/kernel/scheduler.C | 35 | ||||
| -rw-r--r-- | src/kernel/syscall.C | 9 | ||||
| -rw-r--r-- | src/kernel/taskmgr.C | 7 |
4 files changed, 51 insertions, 2 deletions
diff --git a/src/kernel/makefile b/src/kernel/makefile index d3a586e8d..c07ae815a 100644 --- a/src/kernel/makefile +++ b/src/kernel/makefile @@ -2,7 +2,7 @@ OBJDIR = ../../obj include ../../config.mk OBJS = start.o kernel.o console.o pagemgr.o heapmgr.o taskmgr.o cpumgr.o -OBJS += syscall.o +OBJS += syscall.o scheduler.o OBJECTS = $(addprefix ${OBJDIR}/, ${OBJS}) all: ${OBJECTS} diff --git a/src/kernel/scheduler.C b/src/kernel/scheduler.C new file mode 100644 index 000000000..1df91b9eb --- /dev/null +++ b/src/kernel/scheduler.C @@ -0,0 +1,35 @@ +#include <kernel/task.H> +#include <kernel/scheduler.H> +#include <kernel/taskmgr.H> + +void Scheduler::addTask(task_t* t) +{ + if (iv_idleTask != t) + iv_taskList[iv_direction ? 0 : 1].push(t); +} + +void Scheduler::returnRunnable() +{ + this->addTask(TaskManager::getCurrentTask()); +} + +void Scheduler::setNextRunnable() +{ + task_t* t = NULL; + + bool direction = iv_direction; + t = iv_taskList[direction ? 1 : 0].pop(); + + if (NULL == t) + { + iv_taskList[direction ? 0 : 1].pop(); + __sync_bool_compare_and_swap(&iv_direction, direction, !direction); + } + + if (NULL == t) + { + t = iv_idleTask; + } + + TaskManager::setCurrentTask(t); +} diff --git a/src/kernel/syscall.C b/src/kernel/syscall.C index d59ea1a03..0b591f575 100644 --- a/src/kernel/syscall.C +++ b/src/kernel/syscall.C @@ -1,10 +1,17 @@ #include <kernel/console.H> +#include <kernel/cpu.H> +#include <kernel/cpumgr.H> +#include <kernel/scheduler.H> extern "C" void kernel_execute_decrementer() { //printk("Decrementer.\n"); - + + Scheduler* s = CpuManager::getCurrentCPU()->scheduler; + s->returnRunnable(); + s->setNextRunnable(); + // Resync decrementer. register uint64_t decrementer = 0x0f000000; asm volatile("mtdec %0" :: "r"(decrementer)); diff --git a/src/kernel/taskmgr.C b/src/kernel/taskmgr.C index a3dcdf5f3..50b9a0848 100644 --- a/src/kernel/taskmgr.C +++ b/src/kernel/taskmgr.C @@ -17,6 +17,13 @@ task_t* TaskManager::getCurrentTask() return current_task; } +void TaskManager::setCurrentTask(task_t* t) +{ + register task_t* _t = t; + asm volatile("mtsprg3 %0" :: "r" (_t)); + return; +} + TaskManager::TaskManager() : iv_nextTid(0) { } |

