summaryrefslogtreecommitdiff
path: root/arch/i386/boot/syscall.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/i386/boot/syscall.c')
-rw-r--r--arch/i386/boot/syscall.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/arch/i386/boot/syscall.c b/arch/i386/boot/syscall.c
new file mode 100644
index 0000000..fb613b3
--- /dev/null
+++ b/arch/i386/boot/syscall.c
@@ -0,0 +1,21 @@
+#include "syscall.h"
+#include <kernel/io.h>
+#include <stddef.h>
+
+void *(*syscall_handlers[30])(struct isr_frame *frame);
+
+void syscall_dispatch(struct isr_frame *frame) {
+ if (syscall_handlers[frame->eax] != NULL)
+ syscall_handlers[frame->eax](frame);
+ else
+ kprintf("Error: Invalid system call number: %d\n", frame->eax);
+ __asm__ volatile("cli;hlt");
+}
+
+void register_syscall(void *handler(struct isr_frame*), int num) {
+ syscall_handlers[num] = handler;
+}
+
+void print_hello(struct isr_frame *frame) {
+ kprintf("Hello syscall\n");
+}