summaryrefslogtreecommitdiffstats
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
parent546a015f74fab0c4e359cf97f289ff26d6481844 (diff)
downloadtalos-hostboot-aa1db69f1de27bba8ee5e128f717557780f21e0d.tar.gz
talos-hostboot-aa1db69f1de27bba8ee5e128f717557780f21e0d.zip
Add syscall interfaces and task_yield
-rw-r--r--src/include/kernel/syscalls.H13
-rw-r--r--src/include/sys/syscall.h25
-rw-r--r--src/kernel/syscall.C43
-rw-r--r--src/lib/makefile2
-rw-r--r--src/lib/syscall_stub.S21
-rw-r--r--src/sys/init/init_main.C7
6 files changed, 105 insertions, 6 deletions
diff --git a/src/include/kernel/syscalls.H b/src/include/kernel/syscalls.H
new file mode 100644
index 000000000..a7a0ef6b7
--- /dev/null
+++ b/src/include/kernel/syscalls.H
@@ -0,0 +1,13 @@
+#ifndef __KERNEL_SYSCALLS_H
+#define __KERNEL_SYSCALLS_H
+
+namespace Systemcalls
+{
+ enum SysCalls
+ {
+ TASK_YIELD = 0,
+
+ SYSCALL_MAX
+ };
+};
+#endif
diff --git a/src/include/sys/syscall.h b/src/include/sys/syscall.h
new file mode 100644
index 000000000..b418b5d15
--- /dev/null
+++ b/src/include/sys/syscall.h
@@ -0,0 +1,25 @@
+#ifndef __SYS_SYSCALL_H
+#define __SYS_SYSCALL_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <stdint.h>
+
+void* _syscall0(uint64_t);
+void* _syscall1(uint64_t, void*);
+void* _syscall2(uint64_t, void*, void*);
+void* _syscall3(uint64_t, void*, void*, void*);
+void* _syscall4(uint64_t, void*, void*, void*, void*);
+void* _syscall5(uint64_t, void*, void*, void*, void*, void*);
+void* _syscall6(uint64_t, void*, void*, void*, void*, void*, void*);
+void* _syscall7(uint64_t, void*, void*, void*, void*, void*, void*, void*);
+
+#ifdef __cplusplus
+}
+#endif
+
+#include <kernel/syscalls.H>
+#endif
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();
+ }
+};
diff --git a/src/lib/makefile b/src/lib/makefile
index b4e27e478..9ea27377e 100644
--- a/src/lib/makefile
+++ b/src/lib/makefile
@@ -1,7 +1,7 @@
OBJDIR = ../../obj
include ../../config.mk
-OBJS = string.o stdlib.o
+OBJS = string.o stdlib.o syscall_stub.o
OBJECTS = $(addprefix ${OBJDIR}/, ${OBJS})
all: ${OBJECTS}
diff --git a/src/lib/syscall_stub.S b/src/lib/syscall_stub.S
new file mode 100644
index 000000000..a3b83326e
--- /dev/null
+++ b/src/lib/syscall_stub.S
@@ -0,0 +1,21 @@
+.section .text
+
+.global _syscall0
+.global _syscall1
+.global _syscall2
+.global _syscall3
+.global _syscall4
+.global _syscall5
+.global _syscall6
+.global _syscall7
+
+_syscall0:
+_syscall1:
+_syscall2:
+_syscall3:
+_syscall4:
+_syscall5:
+_syscall6:
+_syscall7:
+ sc
+ blr
diff --git a/src/sys/init/init_main.C b/src/sys/init/init_main.C
index 99a7cfe0b..e2447bc3f 100644
--- a/src/sys/init/init_main.C
+++ b/src/sys/init/init_main.C
@@ -1,8 +1,13 @@
#include <kernel/console.H> // TODO : Remove this.
+#include <sys/syscall.h> // TODO : Remove this.
void init_main(void* unused)
{
printk("Starting init!\n");
- while(1);
+ while(1)
+ {
+ _syscall0(Systemcalls::TASK_YIELD);
+ for (volatile int i = 0 ; i < 100000; i++);
+ }
}
OpenPOWER on IntegriCloud