00001
00002
00003
00004
00005
00006
00007
00008 #include <const.h>
00009
00010 #include <arch/i386.h>
00011 #include <arch/mem.h>
00012
00013 #include <kernel/console.h>
00014 #include <kernel/keyboard.h>
00015 #include <kernel/kernel.h>
00016 #include <kernel/speaker.h>
00017 #include <kernel/task.h>
00018 #include <kernel/umalloc.h>
00019
00020 #include <kernel/syscall.h>
00021
00022
00023 #define SYS_CALL_NR ( sizeof(syscall_table)/sizeof(dword) )
00024
00025
00026 typedef struct syscall_t
00027 {
00028
00029 addr_t address;
00030
00031 addr_t paramcnt;
00032 } syscall_t;
00033
00034
00035 static syscall_t syscall_table[] = {
00036
00037 { (size_t)&auto_kill, 1 },
00038 { (size_t)&kgetchar, 0 },
00039 { (size_t)&kputchar, 1 },
00040 { (size_t)&keyb_read, 0 },
00041 { (size_t)&umalloc, 1 },
00042 { (size_t)&ufree, 1 },
00043 };
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060 void syscall_handler(dword *eax, dword *ebp)
00061 {
00062
00063 size_t (*p)() = (void *)syscall_table[*eax].address;
00064
00065 int paramcnt = syscall_table[*eax].paramcnt;
00066
00067 size_t *args = (size_t *)(*ebp);
00068
00069 register int i;
00070
00071
00072
00073 if ( *eax < SYS_CALL_NR )
00074 {
00075
00076 for( i=paramcnt; i; --i)
00077 __asm__ __volatile__ ("pushl %0" : : "r"(*(args+i-1)));
00078
00079
00080 *eax = (*p)();
00081
00082 __asm__ __volatile__ ("add %0, %%esp" : : "r"(paramcnt*sizeof(size_t)));
00083 }
00084 else
00085 {
00086
00087 kprintf("\n\rsyscall: %u", *eax);
00088 error("Invalid system call");
00089 }
00090 }