summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPatrick Williams <iawillia@us.ibm.com>2010-09-20 17:00:48 -0500
committerPatrick Williams <iawillia@us.ibm.com>2010-09-20 17:00:48 -0500
commit706838262ce47efeb8f983920a218460b81f2dc3 (patch)
treedb6e090416ff83ca5f83916f080927393c16cb3e /src
parent365cd29d695d853c8f4be97a9a97bfd37836bbe1 (diff)
downloadtalos-hostboot-706838262ce47efeb8f983920a218460b81f2dc3.tar.gz
talos-hostboot-706838262ce47efeb8f983920a218460b81f2dc3.zip
Add skeleton of timebase manager.
Diffstat (limited to 'src')
-rw-r--r--src/include/kernel/timemgr.H26
-rw-r--r--src/kernel/cpumgr.C7
-rw-r--r--src/kernel/kernel.C2
-rw-r--r--src/kernel/makefile2
-rw-r--r--src/kernel/scheduler.C3
-rw-r--r--src/kernel/syscall.C4
-rw-r--r--src/kernel/timemgr.C15
7 files changed, 49 insertions, 10 deletions
diff --git a/src/include/kernel/timemgr.H b/src/include/kernel/timemgr.H
new file mode 100644
index 000000000..58381263f
--- /dev/null
+++ b/src/include/kernel/timemgr.H
@@ -0,0 +1,26 @@
+#ifndef __KERNEL_TIMEMGR_H
+#define __KERNEL_TIMEMGR_H
+
+#include <kernel/types.h>
+
+class TimeManager
+{
+ public:
+ static void init();
+ static uint64_t getTimeSliceCount()
+ {
+ return iv_timeSlice;
+ };
+
+ protected:
+ TimeManager() {};
+ ~TimeManager() {};
+
+ private:
+ void _init();
+
+
+ static uint64_t iv_timeSlice;
+};
+
+#endif
diff --git a/src/kernel/cpumgr.C b/src/kernel/cpumgr.C
index bfb6b5af9..6d58b5b72 100644
--- a/src/kernel/cpumgr.C
+++ b/src/kernel/cpumgr.C
@@ -7,6 +7,7 @@
#include <kernel/console.H>
#include <util/singleton.H>
#include <kernel/ppcarch.H>
+#include <kernel/timemgr.H>
cpu_t* CpuManager::cv_cpus[CpuManager::MAXCPUS] = { NULL };
@@ -69,8 +70,7 @@ void CpuManager::startCPU(ssize_t i)
{
ppc_setSPRG3((uint64_t) cv_cpus[i]->idle_task);
- // TODO: Set up decrementer properly.
- register uint64_t decrementer = 0x0f000000;
+ register uint64_t decrementer = TimeManager::getTimeSliceCount();
asm volatile("mtdec %0" :: "r"(decrementer));
}
return;
@@ -80,8 +80,7 @@ void CpuManager::startSlaveCPU(cpu_t* cpu)
{
ppc_setSPRG3((uint64_t) cpu->idle_task);
- // TODO: Set up decrementer properly.
- register uint64_t decrementer = 0x0f000000;
+ register uint64_t decrementer = TimeManager::getTimeSliceCount();
asm volatile("mtdec %0" :: "r"(decrementer));
return;
diff --git a/src/kernel/kernel.C b/src/kernel/kernel.C
index 7b119d232..2148f10b1 100644
--- a/src/kernel/kernel.C
+++ b/src/kernel/kernel.C
@@ -9,6 +9,7 @@
#include <kernel/scheduler.H>
#include <kernel/taskmgr.H>
#include <kernel/vmmmgr.H>
+#include <kernel/timemgr.H>
#include <stdlib.h>
@@ -80,6 +81,7 @@ void Kernel::memBootstrap()
void Kernel::cpuBootstrap()
{
+ TimeManager::init();
CpuManager::init();
}
diff --git a/src/kernel/makefile b/src/kernel/makefile
index 5bcb4b43a..bb44a690f 100644
--- a/src/kernel/makefile
+++ b/src/kernel/makefile
@@ -2,7 +2,7 @@ ROOTPATH = ../..
OBJDIR = ${ROOTPATH}/obj/hbicore
OBJS = start.o kernel.o console.o pagemgr.o heapmgr.o taskmgr.o cpumgr.o
-OBJS += syscall.o scheduler.o spinlock.o exception.o vmmmgr.o
+OBJS += syscall.o scheduler.o spinlock.o exception.o vmmmgr.o timemgr.o
OBJECTS = $(addprefix ${OBJDIR}/, ${OBJS})
all: ${OBJECTS}
diff --git a/src/kernel/scheduler.C b/src/kernel/scheduler.C
index 36acd20b4..3aab660b3 100644
--- a/src/kernel/scheduler.C
+++ b/src/kernel/scheduler.C
@@ -4,6 +4,7 @@
#include <kernel/cpu.H>
#include <kernel/cpumgr.H>
#include <kernel/console.H>
+#include <kernel/timemgr.H>
void Scheduler::addTask(task_t* t)
{
@@ -26,7 +27,7 @@ void Scheduler::setNextRunnable()
{
t = CpuManager::getCurrentCPU()->idle_task;
// Set short decrementer.
- register uint64_t decrementer = 0x000f0000;
+ register uint64_t decrementer = TimeManager::getTimeSliceCount();
asm volatile("mtdec %0" :: "r"(decrementer));
}
diff --git a/src/kernel/syscall.C b/src/kernel/syscall.C
index 7ba14e9b8..3a6f128ed 100644
--- a/src/kernel/syscall.C
+++ b/src/kernel/syscall.C
@@ -15,10 +15,6 @@ void kernel_execute_decrementer()
Scheduler* s = CpuManager::getCurrentCPU()->scheduler;
s->returnRunnable();
s->setNextRunnable();
-
- // Resync decrementer.
- register uint64_t decrementer = 0x0f000000;
- asm volatile("mtdec %0" :: "r"(decrementer));
}
namespace Systemcalls
diff --git a/src/kernel/timemgr.C b/src/kernel/timemgr.C
new file mode 100644
index 000000000..73a920524
--- /dev/null
+++ b/src/kernel/timemgr.C
@@ -0,0 +1,15 @@
+#include <kernel/timemgr.H>
+#include <util/singleton.H>
+
+uint64_t TimeManager::iv_timeSlice = 0xFFFFFFFF;
+
+void TimeManager::init()
+{
+ Singleton<TimeManager>::instance()._init();
+}
+
+void TimeManager::_init()
+{
+ /* TB freq / Timeslice per Sec */
+ iv_timeSlice = 512000000 / 1000;
+}
OpenPOWER on IntegriCloud