summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPatrick Williams <iawillia@us.ibm.com>2011-07-27 22:26:15 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2011-07-29 15:12:26 -0500
commitd91c2d0f5db929926584e0f47f27299eff9386e1 (patch)
tree13a32a2bda8a1e026ded3e473239a0fd824f8bbc /src
parenta4ad138162e1c2b0e7ae008d38d91a0094393bd7 (diff)
downloadtalos-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.H19
-rw-r--r--src/include/kernel/syscalls.H9
-rw-r--r--src/include/sys/misc.h32
-rw-r--r--src/kernel/basesegment.C8
-rw-r--r--src/kernel/cpuid.C8
-rw-r--r--src/kernel/cpumgr.C10
-rw-r--r--src/kernel/syscall.C42
-rw-r--r--src/lib/syscall_misc.C11
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));
+}
+
OpenPOWER on IntegriCloud