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 | |
parent | 546a015f74fab0c4e359cf97f289ff26d6481844 (diff) | |
download | talos-hostboot-aa1db69f1de27bba8ee5e128f717557780f21e0d.tar.gz talos-hostboot-aa1db69f1de27bba8ee5e128f717557780f21e0d.zip |
Add syscall interfaces and task_yield
-rw-r--r-- | src/include/kernel/syscalls.H | 13 | ||||
-rw-r--r-- | src/include/sys/syscall.h | 25 | ||||
-rw-r--r-- | src/kernel/syscall.C | 43 | ||||
-rw-r--r-- | src/lib/makefile | 2 | ||||
-rw-r--r-- | src/lib/syscall_stub.S | 21 | ||||
-rw-r--r-- | src/sys/init/init_main.C | 7 |
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++); + } } |