diff options
author | Patrick Williams <iawillia@us.ibm.com> | 2010-09-20 17:00:48 -0500 |
---|---|---|
committer | Patrick Williams <iawillia@us.ibm.com> | 2010-09-20 17:00:48 -0500 |
commit | 706838262ce47efeb8f983920a218460b81f2dc3 (patch) | |
tree | db6e090416ff83ca5f83916f080927393c16cb3e /src | |
parent | 365cd29d695d853c8f4be97a9a97bfd37836bbe1 (diff) | |
download | talos-hostboot-706838262ce47efeb8f983920a218460b81f2dc3.tar.gz talos-hostboot-706838262ce47efeb8f983920a218460b81f2dc3.zip |
Add skeleton of timebase manager.
Diffstat (limited to 'src')
-rw-r--r-- | src/include/kernel/timemgr.H | 26 | ||||
-rw-r--r-- | src/kernel/cpumgr.C | 7 | ||||
-rw-r--r-- | src/kernel/kernel.C | 2 | ||||
-rw-r--r-- | src/kernel/makefile | 2 | ||||
-rw-r--r-- | src/kernel/scheduler.C | 3 | ||||
-rw-r--r-- | src/kernel/syscall.C | 4 | ||||
-rw-r--r-- | src/kernel/timemgr.C | 15 |
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; +} |