diff options
-rw-r--r-- | src/include/kernel/ppcarch.H | 33 | ||||
-rw-r--r-- | src/kernel/cpumgr.C | 7 | ||||
-rw-r--r-- | src/kernel/taskmgr.C | 7 | ||||
-rw-r--r-- | src/sys/init/init_main.C | 2 |
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(); |