diff options
author | Patrick Williams <iawillia@us.ibm.com> | 2011-07-27 22:26:15 -0500 |
---|---|---|
committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2011-07-29 15:12:26 -0500 |
commit | d91c2d0f5db929926584e0f47f27299eff9386e1 (patch) | |
tree | 13a32a2bda8a1e026ded3e473239a0fd824f8bbc /src | |
parent | a4ad138162e1c2b0e7ae008d38d91a0094393bd7 (diff) | |
download | talos-hostboot-d91c2d0f5db929926584e0f47f27299eff9386e1.tar.gz talos-hostboot-d91c2d0f5db929926584e0f47f27299eff9386e1.zip |
Add userspace syscalls for PVR.
Change-Id: I27d51e0e9f2396a4ddd45d98d6b1004a17c9db46
Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/219
Tested-by: Jenkins Server
Reviewed-by: Douglas R. Gilbert <dgilbert@us.ibm.com>
Reviewed-by: MATTHEW S. BARTH <msbarth@us.ibm.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/include/kernel/cpuid.H | 19 | ||||
-rw-r--r-- | src/include/kernel/syscalls.H | 9 | ||||
-rw-r--r-- | src/include/sys/misc.h | 32 | ||||
-rw-r--r-- | src/kernel/basesegment.C | 8 | ||||
-rw-r--r-- | src/kernel/cpuid.C | 8 | ||||
-rw-r--r-- | src/kernel/cpumgr.C | 10 | ||||
-rw-r--r-- | src/kernel/syscall.C | 42 | ||||
-rw-r--r-- | src/lib/syscall_misc.C | 11 |
8 files changed, 94 insertions, 45 deletions
diff --git a/src/include/kernel/cpuid.H b/src/include/kernel/cpuid.H index 75287a66e..f2ee02442 100644 --- a/src/include/kernel/cpuid.H +++ b/src/include/kernel/cpuid.H @@ -3,27 +3,10 @@ #include <stdint.h> #include <arch/ppc.H> +#include <sys/misc.h> namespace CpuID { - /** @enum ProcessorCoreType - * @brief Enumeration of the different supported processor cores. - */ - enum ProcessorCoreType - { - /** Base Power7 */ - POWER7, - /** Power7+ */ - POWER7_PLUS, - - /** Power8 "Salerno" (low-end) core */ - POWER8_SALERNO, - /** Power8 "Venice" (high-end) core */ - POWER8_VENICE, - - UNKNOWN, - }; - /** @fn getCpuType() * @brief Decode the processor type from the PVR register. * diff --git a/src/include/kernel/syscalls.H b/src/include/kernel/syscalls.H index 6473f12b6..5b5e31fc3 100644 --- a/src/include/kernel/syscalls.H +++ b/src/include/kernel/syscalls.H @@ -23,7 +23,7 @@ namespace Systemcalls TASK_START, /** task_end() */ TASK_END, - + /** msgq_create() */ MSGQ_CREATE, /** msgq_destroy() */ @@ -32,7 +32,7 @@ namespace Systemcalls MSGQ_REGISTER_ROOT, /** VFS internal */ MSGQ_RESOLVE_ROOT, - + /** msg_send() */ MSG_SEND, /** msg_sendrecv() */ @@ -59,6 +59,11 @@ namespace Systemcalls /** shutdown() */ MISC_SHUTDOWN, + /** cpu_core_type() */ + MISC_CPUCORETYPE, + /** cpu_dd_level() */ + MISC_CPUDDLEVEL, + SYSCALL_MAX }; diff --git a/src/include/sys/misc.h b/src/include/sys/misc.h index 8e963ad2e..ba0db0a24 100644 --- a/src/include/sys/misc.h +++ b/src/include/sys/misc.h @@ -14,6 +14,38 @@ extern "C" */ void shutdown(uint64_t i_status); +/** @enum ProcessorCoreType + * @brief Enumeration of the different supported processor cores. + */ +enum ProcessorCoreType +{ + /** Base Power7 */ + CORE_POWER7, + /** Power7+ */ + CORE_POWER7_PLUS, + + /** Power8 "Salerno" (low-end) core */ + CORE_POWER8_SALERNO, + /** Power8 "Venice" (high-end) core */ + CORE_POWER8_VENICE, + + CORE_UNKNOWN, +}; + +/** @fn cpu_core_type() + * @brief Determine the procesore core type. + * + * @return ProcessorCoreType - Value from enumeration for this core. + */ +ProcessorCoreType cpu_core_type(); + +/** @fn cpu_dd_level() + * @brief Determine the processor DD level. + * + * @return 1 byte DD level as <major nibble, minor nibble>. + */ +uint8_t cpu_dd_level(); + #ifdef __cplusplus } #endif diff --git a/src/kernel/basesegment.C b/src/kernel/basesegment.C index 467f8209c..b54784621 100644 --- a/src/kernel/basesegment.C +++ b/src/kernel/basesegment.C @@ -26,13 +26,13 @@ void BaseSegment::_init() uint64_t iv_baseBlockSize = 0; switch (CpuID::getCpuType()) { - case CpuID::POWER7: - case CpuID::POWER7_PLUS: - case CpuID::POWER8_VENICE: + case CORE_POWER7: + case CORE_POWER7_PLUS: + case CORE_POWER8_VENICE: iv_baseBlockSize = VmmManager::EIGHT_MEG; break; - case CpuID::POWER8_SALERNO: + case CORE_POWER8_SALERNO: default: iv_baseBlockSize = VmmManager::THREE_MEG; break; diff --git a/src/kernel/cpuid.C b/src/kernel/cpuid.C index a8d884bf2..78ce382e1 100644 --- a/src/kernel/cpuid.C +++ b/src/kernel/cpuid.C @@ -21,16 +21,16 @@ namespace CpuID switch(l_pvr & 0xFFFF0000) { case 0x003F0000: - return POWER7; + return CORE_POWER7; case 0x004A0000: - return POWER7_PLUS; + return CORE_POWER7_PLUS; case 0x004B0000: - return POWER8_VENICE; + return CORE_POWER8_VENICE; default: - return UNKNOWN; + return CORE_UNKNOWN; } } diff --git a/src/kernel/cpumgr.C b/src/kernel/cpumgr.C index 49dfb0919..715821c7e 100644 --- a/src/kernel/cpumgr.C +++ b/src/kernel/cpumgr.C @@ -39,17 +39,17 @@ void CpuManager::init() size_t threads = -1; switch (CpuID::getCpuType()) { - case CpuID::POWER7: - case CpuID::POWER7_PLUS: + case CORE_POWER7: + case CORE_POWER7_PLUS: threads = 4; break; - case CpuID::POWER8_VENICE: - case CpuID::POWER8_SALERNO: + case CORE_POWER8_VENICE: + case CORE_POWER8_SALERNO: threads = 8; break; - case CpuID::UNKNOWN: + case CORE_UNKNOWN: default: kassert(false); break; diff --git a/src/kernel/syscall.C b/src/kernel/syscall.C index bccccac03..5f80e0c19 100644 --- a/src/kernel/syscall.C +++ b/src/kernel/syscall.C @@ -9,13 +9,14 @@ #include <kernel/msg.H> #include <kernel/timemgr.H> #include <kernel/futexmgr.H> +#include <kernel/cpuid.H> extern "C" void kernel_execute_decrementer() { cpu_t* c = CpuManager::getCurrentCPU(); Scheduler* s = c->scheduler; - TimeManager::checkReleaseTasks(s); + TimeManager::checkReleaseTasks(s); s->returnRunnable(); if (CpuManager::isShutdownRequested()) @@ -60,6 +61,8 @@ namespace Systemcalls void FutexWait(task_t *t); void FutexWake(task_t *t); void Shutdown(task_t *t); + void CpuCoreType(task_t *t); + void CpuDDLevel(task_t *t); syscall syscalls[] = { @@ -86,6 +89,9 @@ namespace Systemcalls &FutexWake, &Shutdown, + + &CpuCoreType, + &CpuDDLevel, }; }; @@ -131,7 +137,7 @@ namespace Systemcalls void TaskStart(task_t* t) { - task_t* newTask = + task_t* newTask = TaskManager::createTask((TaskManager::task_fn_t)TASK_GETARG0(t), (void*)TASK_GETARG1(t)); newTask->cpu = t->cpu; @@ -144,7 +150,7 @@ namespace Systemcalls { // Make sure task pointers are updated before we delete this task. t->cpu->scheduler->setNextRunnable(); - + // TODO: Deal with join. // Clean up task memory. @@ -185,7 +191,7 @@ namespace Systemcalls m->__reserved__async = 0; // set to async msg. mq->lock.lock(); - + // Get waiting (server) task. task_t* waiter = mq->waiting.remove(); if (NULL == waiter) // None found, add to 'messages' queue. @@ -200,7 +206,7 @@ namespace Systemcalls TASK_SETRTN(waiter, (uint64_t) m); waiter->cpu->scheduler->addTask(waiter); } - + mq->lock.unlock(); TASK_SETRTN(t, 0); } @@ -210,7 +216,7 @@ namespace Systemcalls MessageQueue* mq = (MessageQueue*) TASK_GETARG0(t); msg_t* m = (msg_t*) TASK_GETARG1(t); m->__reserved__async = 1; // set to sync msg. - + mq->lock.lock(); MessagePending* mp = new MessagePending(); mp->key = m; @@ -222,7 +228,7 @@ namespace Systemcalls { mq->messages.insert(mp); // Choose next thread to execute, this one is delayed. - t->cpu->scheduler->setNextRunnable(); + t->cpu->scheduler->setNextRunnable(); } else // Context switch to waiter. { @@ -239,7 +245,7 @@ namespace Systemcalls { MessageQueue* mq = (MessageQueue*) TASK_GETARG0(t); msg_t* m = (msg_t*) TASK_GETARG1(t); - + mq->lock.lock(); MessagePending* mp = mq->responses.find(m); if (NULL != mp) @@ -248,13 +254,13 @@ namespace Systemcalls mq->responses.erase(mp); delete mp; - + waiter->cpu = t->cpu; TaskManager::setCurrentTask(waiter); TASK_SETRTN(waiter,0); TASK_SETRTN(t,0); - t->cpu->scheduler->addTask(t); + t->cpu->scheduler->addTask(t); } else { @@ -269,7 +275,7 @@ namespace Systemcalls mq->lock.lock(); MessagePending* mp = mq->messages.remove(); - + if (NULL == mp) { mq->waiting.insert(t); @@ -286,7 +292,7 @@ namespace Systemcalls } mq->lock.unlock(); } - + void MmioMap(task_t* t) { void* ra = (void*)TASK_GETARG0(t); @@ -356,4 +362,16 @@ namespace Systemcalls TASK_SETRTN(t, 0); } + /** Read CPU Core type using CpuID interfaces. */ + void CpuCoreType(task_t *t) + { + TASK_SETRTN(t, CpuID::getCpuType()); + } + + /** Read CPU DD level using CpuID interfaces. */ + void CpuDDLevel(task_t *t) + { + TASK_SETRTN(t, CpuID::getCpuDD()); + } + }; diff --git a/src/lib/syscall_misc.C b/src/lib/syscall_misc.C index 6a4ad1845..d1bccf8f1 100644 --- a/src/lib/syscall_misc.C +++ b/src/lib/syscall_misc.C @@ -8,3 +8,14 @@ void shutdown(uint64_t i_status) _syscall1(MISC_SHUTDOWN, reinterpret_cast<void*>(i_status)); } +ProcessorCoreType cpu_core_type() +{ + return static_cast<ProcessorCoreType>( + reinterpret_cast<uint64_t>(_syscall0(MISC_CPUCORETYPE))); +} + +uint8_t cpu_dd_level() +{ + return reinterpret_cast<uint64_t>(_syscall0(MISC_CPUDDLEVEL)); +} + |