summaryrefslogtreecommitdiffstats
path: root/src/kernel/taskmgr.C
diff options
context:
space:
mode:
authorPatrick Williams <iawillia@us.ibm.com>2011-07-15 12:03:19 -0500
committerA. Patrick Williams III <iawillia@us.ibm.com>2011-07-18 12:04:40 -0500
commitbe301c4ea87c944bd1c51ca2c73ac719cec6b495 (patch)
tree529436aa13474e54badc7cd6690ae28f7eeda766 /src/kernel/taskmgr.C
parent62faccd737f97dd4c485770f59bacf1b44dcbc3b (diff)
downloadtalos-hostboot-be301c4ea87c944bd1c51ca2c73ac719cec6b495.tar.gz
talos-hostboot-be301c4ea87c944bd1c51ca2c73ac719cec6b495.zip
Add user-space stub for task entry.
This will prevent kernel space from needing to dereference user-space addresses for starting a task, which is safer and is easier for VMM. Change-Id: Icad3b832550cedbf291ed8b032840f4049fba18e Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/202 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/taskmgr.C')
-rw-r--r--src/kernel/taskmgr.C13
1 files changed, 7 insertions, 6 deletions
diff --git a/src/kernel/taskmgr.C b/src/kernel/taskmgr.C
index 0573bab7d..8073c0b48 100644
--- a/src/kernel/taskmgr.C
+++ b/src/kernel/taskmgr.C
@@ -8,6 +8,8 @@
#include <string.h>
#include <limits.h>
+extern "C" void userspace_task_entry();
+
void TaskManager::idleTaskLoop(void* unused)
{
while(1)
@@ -55,12 +57,11 @@ task_t* TaskManager::_createTask(TaskManager::task_fn_t t,
memset(task, '\0', sizeof(task_t));
task->tid = this->getNextTid();
-
- // Function pointer 't' is actually a TOC entry.
- // TOC[0] = function address
- // TOC[1] = TOC base -> r2
- task->context.nip = (void*) ((uint64_t*) t)[0];
- task->context.gprs[2] = ((uint64_t*)t)[1];
+
+ // Set NIP to be userspace_task_entry stub and GPR3 to be the
+ // function pointer for the desired task entry point.
+ task->context.nip = reinterpret_cast<void*>(&userspace_task_entry);
+ task->context.gprs[4] = reinterpret_cast<uint64_t>(t);
// Set up LR to be the entry point for task_end in case a task
// 'returns' from its entry point. By the Power ABI, the entry
OpenPOWER on IntegriCloud