summaryrefslogtreecommitdiffstats
path: root/src/kernel
diff options
context:
space:
mode:
authorPatrick Williams <iawillia@us.ibm.com>2010-06-07 11:32:45 -0500
committerPatrick Williams <iawillia@us.ibm.com>2010-06-07 11:32:45 -0500
commit6db79851d2f8664216d85ba73246699d8aae94a7 (patch)
tree4fbdb939af7fd48d72d728064259525095f80bfc /src/kernel
parentb64188ed609f06ec8b476768f009153472237012 (diff)
downloadblackbird-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/makefile2
-rw-r--r--src/kernel/scheduler.C35
-rw-r--r--src/kernel/syscall.C9
-rw-r--r--src/kernel/taskmgr.C7
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)
{
}
OpenPOWER on IntegriCloud