diff options
| author | Patrick Williams <iawillia@us.ibm.com> | 2011-10-03 16:12:51 -0500 |
|---|---|---|
| committer | A. Patrick Williams III <iawillia@us.ibm.com> | 2011-10-24 13:33:20 -0500 |
| commit | 4962a22309cd7e3586aa57817689b18d67ca71c7 (patch) | |
| tree | 2bfd610d6ed048f7d4a35717211eca06b15d1f69 /src/kernel/kernel.C | |
| parent | 21185b30cd99a00f01e15edba28402cdc00de1d1 (diff) | |
| download | talos-hostboot-4962a22309cd7e3586aa57817689b18d67ca71c7.tar.gz talos-hostboot-4962a22309cd7e3586aa57817689b18d67ca71c7.zip | |
Support task_wait / task_wait_tid syscalls:
- Add task_end2 syscall to allow pthread_exit-like retval.
- Add/maintain task states.
- Create task parent/child tracking tree.
- Add task_detach function.
- Implement wait syscalls.
Make task_exec caller the parent of spawned task:
Previously the task_exec call caused a message to the
VFS task, which called task_create and returned the tid
in response to the message. This causes the parent of
the spawned task to appear to be the VFS task.
Modify task_exec / VFS handling to instead return the
entry point address on the message and have task_exec call
task_create directly itself.
Change-Id: I6b6796f45875de37b1ab01e7596639b073820b95
Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/443
Tested-by: Jenkins Server
Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com>
Reviewed-by: Andrew J. Geissler <andrewg@us.ibm.com>
Diffstat (limited to 'src/kernel/kernel.C')
| -rw-r--r-- | src/kernel/kernel.C | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/src/kernel/kernel.C b/src/kernel/kernel.C index 46ca11342..557a1c81c 100644 --- a/src/kernel/kernel.C +++ b/src/kernel/kernel.C @@ -43,7 +43,7 @@ extern uint64_t kernel_other_thread_spinlock; class Kernel { public: - void cppBootstrap(); + void cppBootstrap(); void memBootstrap(); void cpuBootstrap(); void inittaskBootstrap(); @@ -56,19 +56,22 @@ extern "C" int main() { printk("Booting %s kernel...\n\n", "Hostboot"); - + + // Erase task-pointer so that TaskManager::getCurrentTask() returns NULL. + setSPRG3(NULL); + Kernel& kernel = Singleton<Kernel>::instance(); kernel.cppBootstrap(); - kernel.memBootstrap(); + kernel.memBootstrap(); kernel.cpuBootstrap(); kernel.inittaskBootstrap(); - + // Ready to let the other CPUs go. lwsync(); kernel_other_thread_spinlock = 1; - kernel_dispatch_task(); // no return. + kernel_dispatch_task(); // no return. while(1); return 0; } @@ -76,6 +79,9 @@ int main() extern "C" int smp_slave_main(cpu_t* cpu) { + // Erase task-pointer so that TaskManager::getCurrentTask() returns NULL. + setSPRG3(NULL); + CpuManager::init_slave_smp(cpu); VmmManager::init_slb(); cpu->scheduler->setNextRunnable(); |

