diff options
author | Patrick Williams <iawillia@us.ibm.com> | 2010-06-07 15:38:09 -0500 |
---|---|---|
committer | Patrick Williams <iawillia@us.ibm.com> | 2010-06-07 15:38:09 -0500 |
commit | aa1db69f1de27bba8ee5e128f717557780f21e0d (patch) | |
tree | 2c6ad4cdeb366f2d5153a38c6ba078af3f347cef /src/kernel | |
parent | 546a015f74fab0c4e359cf97f289ff26d6481844 (diff) | |
download | talos-hostboot-aa1db69f1de27bba8ee5e128f717557780f21e0d.tar.gz talos-hostboot-aa1db69f1de27bba8ee5e128f717557780f21e0d.zip |
Add syscall interfaces and task_yield
Diffstat (limited to 'src/kernel')
-rw-r--r-- | src/kernel/syscall.C | 43 |
1 files changed, 39 insertions, 4 deletions
diff --git a/src/kernel/syscall.C b/src/kernel/syscall.C index 0b591f575..9cabeebd3 100644 --- a/src/kernel/syscall.C +++ b/src/kernel/syscall.C @@ -1,13 +1,14 @@ -#include <kernel/console.H> #include <kernel/cpu.H> #include <kernel/cpumgr.H> #include <kernel/scheduler.H> +#include <kernel/taskmgr.H> +#include <kernel/task.H> +#include <kernel/syscalls.H> +#include <kernel/console.H> extern "C" void kernel_execute_decrementer() { - //printk("Decrementer.\n"); - Scheduler* s = CpuManager::getCurrentCPU()->scheduler; s->returnRunnable(); s->setNextRunnable(); @@ -17,8 +18,42 @@ void kernel_execute_decrementer() asm volatile("mtdec %0" :: "r"(decrementer)); } +namespace Systemcalls +{ + typedef void(*syscall)(task_t*); + void TaskYield(task_t*); + + syscall syscalls[] = + { + &TaskYield, + }; +}; + extern "C" void kernel_execute_systemcall() { - //printk("Syscall.\n"); + using namespace Systemcalls; + task_t* t = TaskManager::getCurrentTask(); + + uint64_t syscall = t->context.gprs[3]; + if (syscall > SYSCALL_MAX) + { + // TODO : kill task. + printk("Invalid syscall : %lld\n", syscall); + while(1); + } + else + { + syscalls[syscall](t); + } } + +namespace Systemcalls +{ + void TaskYield(task_t* t) + { + Scheduler* s = t->cpu->scheduler; + s->returnRunnable(); + s->setNextRunnable(); + } +}; |