stdlibc: \!perror()
[meinos.git] / kernel2 / syscall.c
blob847e6eabc0ffd855d6f9a26590882a13b3ed677d
1 /*
2 meinOS - A unix-like x86 microkernel operating system
3 Copyright (C) 2008 Janosch Gräf <janosch.graef@gmx.net>
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #include <sys/types.h>
20 #include <stdint.h>
21 #include <string.h>
22 #include <syscall.h>
23 #include <procm.h>
24 #include <signal.h>
25 #include <debug.h>
26 #include <interrupt.h>
27 #include <dyncall.h>
29 /**
30 * Initializes Syscall Management
31 * @return 0=Success; -1=Failure
33 int syscall_init() {
34 memset(&syscalls,0,SYSCALL_MAXNUM*sizeof(struct syscall));
35 return 0;
38 /**
39 * Syscall handler
40 * @param params Pointer to parameter list
42 void syscall_handler(uint32_t *stack) {
43 proc_t *proc_call = proc_current;
44 int res = -1;
45 interrupt_save_stack(stack,NULL);
46 int cmd = ((int*)*interrupt_curregs.esp)[0];
47 int *params = ((void**)*interrupt_curregs.esp)[1];
49 if (cmd<=SYSCALL_MAXNUM) {
50 if (syscalls[cmd].func!=NULL) res = dyn_call(syscalls[cmd].func,params,syscalls[cmd].numparams);
51 else kill(proc_current,SIGSYS);
54 if (proc_current==proc_call) *interrupt_curregs.eax = res;
57 /**
58 * Registers a syscall
59 * @param cmd Syscall number
60 * @param func Pointer to function
61 * @param numparams Number of parameters
62 * @return 0=Success; -1=Failure
64 int syscall_create(int cmd,void *func,int numparams) {
65 if (cmd>SYSCALL_MAXNUM || syscalls[cmd].func!=NULL) return -1;
66 syscalls[cmd].func = func;
67 syscalls[cmd].numparams = numparams;
68 return 0;
71 /**
72 * Unregisters a syscall
73 * @param cmd Syscall number
75 void syscall_destroy(int cmd) {
76 if (cmd<SYSCALL_MAXNUM) syscalls[cmd].func = NULL;