summaryrefslogtreecommitdiffstats
path: root/src/kernel
diff options
context:
space:
mode:
authorPatrick Williams <iawillia@us.ibm.com>2010-06-07 15:38:09 -0500
committerPatrick Williams <iawillia@us.ibm.com>2010-06-07 15:38:09 -0500
commitaa1db69f1de27bba8ee5e128f717557780f21e0d (patch)
tree2c6ad4cdeb366f2d5153a38c6ba078af3f347cef /src/kernel
parent546a015f74fab0c4e359cf97f289ff26d6481844 (diff)
downloadtalos-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.C43
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();
+ }
+};
OpenPOWER on IntegriCloud