diff options
author | Patrick Williams <iawillia@us.ibm.com> | 2012-05-16 12:51:22 -0500 |
---|---|---|
committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2012-07-16 19:05:48 -0500 |
commit | 3bba9a3ff18b6991bba4247898f4c26fa944a676 (patch) | |
tree | da3462c53eaf0670670b37f094c17444f1ce5c4c /src/kernel/timemgr.C | |
parent | 2aa5e0afac73384aaabe1fe1529898601be1155f (diff) | |
download | talos-hostboot-3bba9a3ff18b6991bba4247898f4c26fa944a676.tar.gz talos-hostboot-3bba9a3ff18b6991bba4247898f4c26fa944a676.zip |
Support for core_activate via IPI.
RTC: 37009
Change-Id: I56669805c86d9659a20ad7c26e5e9860c7a248c7
Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/1087
Tested-by: Jenkins Server
Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
Diffstat (limited to 'src/kernel/timemgr.C')
-rw-r--r-- | src/kernel/timemgr.C | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/src/kernel/timemgr.C b/src/kernel/timemgr.C index b6be8cb90..36d89ee30 100644 --- a/src/kernel/timemgr.C +++ b/src/kernel/timemgr.C @@ -24,6 +24,7 @@ #include <kernel/scheduler.H> #include <util/singleton.H> #include <kernel/task.H> +#include <kernel/cpumgr.H> uint64_t TimeManager::iv_timebaseFreq = 0xFFFFFFFF; @@ -37,6 +38,16 @@ void TimeManager::_init() iv_timebaseFreq = 512000000ULL; } +void TimeManager::init_cpu(cpu_t* cpu) +{ + Singleton<TimeManager>::instance()._init_cpu(cpu); +} + +void TimeManager::_init_cpu(cpu_t* cpu) +{ + cpu->delay_list = new delaylist_t; +} + uint64_t TimeManager::convertSecToTicks(uint64_t i_sec, uint64_t i_nsec) { // This code will handle times almost up to a year without overflowing a @@ -68,13 +79,13 @@ void TimeManager::_delayTask(task_t* t, uint64_t i_sec, uint64_t i_nsec) _TimeManager_Delay_t* node = new _TimeManager_Delay_t(); node->key = this->getCurrentTimeBase() + - this->convertSecToTicks(i_sec, i_nsec); + this->convertSecToTicks(i_sec, i_nsec); node->task = t; t->state = TASK_STATE_BLOCK_SLEEP; t->state_info = (void*)node->key; - iv_taskList[getPIR()].insert(node); + _get_delaylist()->insert(node); } void TimeManager::checkReleaseTasks(Scheduler* s) @@ -87,9 +98,14 @@ void TimeManager::_checkReleaseTasks(Scheduler* s) uint64_t l_currentTime = getCurrentTimeBase(); _TimeManager_Delay_t* node = NULL; - while(NULL != (node = iv_taskList[getPIR()].remove_if(l_currentTime))) + while(NULL != (node = _get_delaylist()->remove_if(l_currentTime))) { - s->addTask(node->task); - delete node; + s->addTask(node->task); + delete node; } } + +inline TimeManager::delaylist_t* TimeManager::_get_delaylist() +{ + return static_cast<delaylist_t*>(CpuManager::getCurrentCPU()->delay_list); +} |