summaryrefslogtreecommitdiffstats
path: root/src/kernel/cpumgr.C
diff options
context:
space:
mode:
authorPatrick Williams <iawillia@us.ibm.com>2010-07-07 17:24:25 -0500
committerPatrick Williams <iawillia@us.ibm.com>2010-07-07 17:24:25 -0500
commit2c2101232adf2b134cf408f05f00a21dc5b8b0f3 (patch)
treea9710129f768bce446b05cab9dac44c9846bb39b /src/kernel/cpumgr.C
parentce785ea353070d14462e3c3395bf89d47c896461 (diff)
downloadtalos-hostboot-2c2101232adf2b134cf408f05f00a21dc5b8b0f3.tar.gz
talos-hostboot-2c2101232adf2b134cf408f05f00a21dc5b8b0f3.zip
SMT support.
Diffstat (limited to 'src/kernel/cpumgr.C')
-rw-r--r--src/kernel/cpumgr.C58
1 files changed, 37 insertions, 21 deletions
diff --git a/src/kernel/cpumgr.C b/src/kernel/cpumgr.C
index a04d0e1fe..58fabdd8c 100644
--- a/src/kernel/cpumgr.C
+++ b/src/kernel/cpumgr.C
@@ -8,10 +8,12 @@
#include <util/singleton.H>
#include <kernel/ppcarch.H>
+cpu_t* CpuManager::cv_cpus[CpuManager::MAXCPUS] = { NULL };
+
CpuManager::CpuManager()
{
for (int i = 0; i < MAXCPUS; i++)
- iv_cpus[i] = NULL;
+ cv_cpus[i] = NULL;
}
cpu_t* CpuManager::getCurrentCPU()
@@ -22,7 +24,13 @@ cpu_t* CpuManager::getCurrentCPU()
void CpuManager::init()
{
- Singleton<CpuManager>::instance().startCPU();
+ for (int i = 0; i < KERNEL_MAX_SUPPORTED_CPUS; i++)
+ Singleton<CpuManager>::instance().startCPU(i);
+}
+
+void CpuManager::init_slave_smp(cpu_t* cpu)
+{
+ Singleton<CpuManager>::instance().startSlaveCPU(cpu);
}
void CpuManager::startCPU(ssize_t i)
@@ -30,48 +38,56 @@ void CpuManager::startCPU(ssize_t i)
bool currentCPU = false;
if (i < 0)
{
- // TODO: Determine position of this CPU, somehow.
- i = 0;
-
+ i = getCpuId();
+ currentCPU = true;
+ }
+ else if (getCpuId() == i)
+ {
currentCPU = true;
}
-
- printk("Starting CPU %d...", i);
// Initialize CPU structure.
- if (NULL == iv_cpus[i])
+ if (NULL == cv_cpus[i])
{
- cpu_t* cpu = iv_cpus[i] = new cpu_t;
+ printk("Starting CPU %d...", i);
+ cpu_t* cpu = cv_cpus[i] = new cpu_t;
// Initialize CPU.
cpu->cpu = i;
- cpu->scheduler = new Scheduler(cpu);
+ cpu->scheduler = &Singleton<Scheduler>::instance();
cpu->kernel_stack =
(void*) (((uint64_t)PageManager::allocatePage(4)) + 16320);
// Create idle task.
- task_t * idle_task = TaskManager::createIdleTask();
- idle_task->cpu = cpu;
+ cpu->idle_task = TaskManager::createIdleTask();
+ cpu->idle_task->cpu = cpu;
- // Add to scheduler.
- cpu->scheduler->setIdleTask(idle_task);
+ printk("done\n");
}
if (currentCPU)
{
- ppc_setSPRG3((uint64_t) iv_cpus[i]->scheduler->getIdleTask());
+ ppc_setSPRG3((uint64_t) cv_cpus[i]->idle_task);
// TODO: Set up decrementer properly.
register uint64_t decrementer = 0x0f000000;
asm volatile("mtdec %0" :: "r"(decrementer));
-
- }
- else
- {
- // TODO once we get to SMP.
}
+ return;
+}
+
+void CpuManager::startSlaveCPU(cpu_t* cpu)
+{
+ ppc_setSPRG3((uint64_t) cpu->idle_task);
- printk("done\n");
+ // TODO: Set up decrementer properly.
+ register uint64_t decrementer = 0x0f000000;
+ asm volatile("mtdec %0" :: "r"(decrementer));
return;
}
+
+uint64_t isCPU0()
+{
+ return (0 == getCpuId());
+}
OpenPOWER on IntegriCloud