diff options
Diffstat (limited to 'src/kernel/syscall/syscall.h')
-rw-r--r-- | src/kernel/syscall/syscall.h | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/kernel/syscall/syscall.h b/src/kernel/syscall/syscall.h new file mode 100644 index 0000000..d35c4e6 --- /dev/null +++ b/src/kernel/syscall/syscall.h @@ -0,0 +1,44 @@ +#ifndef MELVIX_SYSCALL_H +#define MELVIX_SYSCALL_H + +#include <kernel/interrupts/interrupts.h> + +void syscalls_install(); + +void syscall_handler(struct regs *r); + +#define DECL_SYSCALL0(fn) int syscall_##fn(); +#define DECL_SYSCALL1(fn, p1) int syscall_##fn(p1); +#define DECL_SYSCALL2(fn, p1, p2) int syscall_##fn(p1,p2); +#define DECL_SYSCALL3(fn, p1, p2, p3) int syscall_##fn(p1,p2,p3); +#define DECL_SYSCALL4(fn, p1, p2, p3, p4) int syscall_##fn(p1,p2,p3,p4); +#define DECL_SYSCALL5(fn, p1, p2, p3, p4, p5) int syscall_##fn(p1,p2,p3,p4,p5); + +#define DEFN_SYSCALL0(fn, num) \ +int syscall_##fn() { \ + int a; \ + asm volatile("int $0x80" : "=a" (a) : "0" (num)); \ + return a; \ +} + +#define DEFN_SYSCALL1(fn, num, P1) \ +int syscall_##fn(P1 p1) { \ + int a; \ + asm volatile("int $0x80" : "=a" (a) : "0" (num), "b" ((int)p1)); \ + return a; \ +} + +#define DEFN_SYSCALL2(fn, num, P1, P2) \ +int syscall_##fn(P1 p1, P2 p2) { \ + int a; \ + asm volatile("int $0x80" : "=a" (a) : "0" (num), "b" ((int)p1), "c" ((int)p2)); \ + return a; \ +} + +DECL_SYSCALL1(vesa_draw_string, const char *) + +DECL_SYSCALL1(vesa_draw_number, int) + +DECL_SYSCALL1(serial_write, const char *) + +#endif |