summaryrefslogtreecommitdiffstats
path: root/src/kernel
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/kernel
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/kernel')
-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
4 files changed, 43 insertions, 25 deletions
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());
+ }
+
};
OpenPOWER on IntegriCloud