summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPatrick Williams <iawillia@us.ibm.com>2010-06-28 15:00:46 -0500
committerPatrick Williams <iawillia@us.ibm.com>2010-06-28 15:00:46 -0500
commit419ee15eddec34322a9d44a7b9099494fb2ff0c7 (patch)
tree79407a0c379194127fb4821bdd7904aa6ccb6573
parent493f4e35ab698fa90870e4317d00f26cb095bf4f (diff)
downloadtalos-hostboot-419ee15eddec34322a9d44a7b9099494fb2ff0c7.tar.gz
talos-hostboot-419ee15eddec34322a9d44a7b9099494fb2ff0c7.zip
Move SPRG3 manipulation to common ppc-arch file.
-rw-r--r--src/include/kernel/ppcarch.H33
-rw-r--r--src/kernel/cpumgr.C7
-rw-r--r--src/kernel/taskmgr.C7
-rw-r--r--src/sys/init/init_main.C2
4 files changed, 40 insertions, 9 deletions
diff --git a/src/include/kernel/ppcarch.H b/src/include/kernel/ppcarch.H
index f6b80ea6f..2b61f6200 100644
--- a/src/include/kernel/ppcarch.H
+++ b/src/include/kernel/ppcarch.H
@@ -11,4 +11,37 @@ inline uint64_t ppc_getSRR1()
return srr1;
}
+__attribute__((always_inline))
+inline uint64_t ppc_getPVR()
+{
+ register uint64_t pvr = 0;
+ asm volatile("mfspr %0, 287" : "=r" (pvr));
+ return pvr;
+}
+
+__attribute__((always_inline))
+inline uint64_t ppc_getPIR()
+{
+ register uint64_t pir = 0;
+ asm volatile("mfspr %0, 1023" : "=r" (pir));
+ return pir;
+}
+
+__attribute__((always_inline))
+inline uint64_t ppc_getSPRG3()
+{
+ register uint64_t sprg3 = 0;
+ asm volatile("mfsprg3 %0" : "=r" (sprg3));
+ return sprg3;
+}
+
+__attribute__((always_inline))
+inline void ppc_setSPRG3(uint64_t _sprg3)
+{
+ register uint64_t sprg3 = _sprg3;
+ asm volatile("mtsprg3 %0" : : "r" (sprg3));
+ return;
+}
+
+
#endif
diff --git a/src/kernel/cpumgr.C b/src/kernel/cpumgr.C
index d43b28ca8..a04d0e1fe 100644
--- a/src/kernel/cpumgr.C
+++ b/src/kernel/cpumgr.C
@@ -6,6 +6,7 @@
#include <kernel/pagemgr.H>
#include <kernel/console.H>
#include <util/singleton.H>
+#include <kernel/ppcarch.H>
CpuManager::CpuManager()
{
@@ -15,8 +16,7 @@ CpuManager::CpuManager()
cpu_t* CpuManager::getCurrentCPU()
{
- register task_t* current_task = NULL;
- asm volatile("mfsprg3 %0" : "=r" (current_task) );
+ register task_t* current_task = (task_t*) ppc_getSPRG3();
return current_task->cpu;
}
@@ -59,8 +59,7 @@ void CpuManager::startCPU(ssize_t i)
if (currentCPU)
{
- register task_t* idle_task = iv_cpus[i]->scheduler->getIdleTask();
- asm volatile("mtsprg3 %0" :: "r" (idle_task));
+ ppc_setSPRG3((uint64_t) iv_cpus[i]->scheduler->getIdleTask());
// TODO: Set up decrementer properly.
register uint64_t decrementer = 0x0f000000;
diff --git a/src/kernel/taskmgr.C b/src/kernel/taskmgr.C
index 35042c021..42826e61d 100644
--- a/src/kernel/taskmgr.C
+++ b/src/kernel/taskmgr.C
@@ -2,6 +2,7 @@
#include <kernel/taskmgr.H>
#include <kernel/task.H>
#include <kernel/pagemgr.H>
+#include <kernel/ppcarch.H>
void TaskManager::idleTaskLoop(void* unused)
{
@@ -12,15 +13,13 @@ void TaskManager::idleTaskLoop(void* unused)
task_t* TaskManager::getCurrentTask()
{
- register task_t* current_task = NULL;
- asm volatile("mfsprg3 %0" : "=r" (current_task) );
+ register task_t* current_task = (task_t*) ppc_getSPRG3();
return current_task;
}
void TaskManager::setCurrentTask(task_t* t)
{
- register task_t* _t = t;
- asm volatile("mtsprg3 %0" :: "r" (_t));
+ ppc_setSPRG3((uint64_t)t);
return;
}
diff --git a/src/sys/init/init_main.C b/src/sys/init/init_main.C
index a7bc68b55..f2b40d497 100644
--- a/src/sys/init/init_main.C
+++ b/src/sys/init/init_main.C
@@ -23,7 +23,7 @@ void init_main(void* unused)
printk("Bringing up VFS...");
task_create(&vfs_main, NULL);
task_yield(); // TODO... add a barrier to ensure VFS is fully up.
-
+
global_mutex = mutex_create();
msg_q_t msgq = msg_q_create();
OpenPOWER on IntegriCloud