toaruos/kernel/include/syscall.h
2011-12-15 15:31:18 -06:00

90 lines
2.7 KiB
C

/* vim: tabstop=4 shiftwidth=4 noexpandtab
*/
#ifndef _SYSCALL_H
#define _SYSCALL_H
#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 $0x7F" : "=a" (a) : "0" (num)); \
return a; \
}
#define DEFN_SYSCALL1(fn, num, P1) \
int syscall_##fn(P1 p1) { \
int a; __asm__ __volatile__("int $0x7F" : "=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 $0x7F" : "=a" (a) : "0" (num), "b" ((int)p1), "c" ((int)p2)); \
return a; \
}
#define DEFN_SYSCALL3(fn, num, P1, P2, P3) \
int syscall_##fn(P1 p1, P2 p2, P3 p3) { \
int a; __asm__ __volatile__("int $0x7F" : "=a" (a) : "0" (num), "b" ((int)p1), "c" ((int)p2), "d" ((int)p3)); \
return a; \
}
#define DEFN_SYSCALL4(fn, num, P1, P2, P3, P4) \
int syscall_##fn(P1 p1, P2 p2, P3 p3, P4 p4) { \
int a; __asm__ __volatile__("int $0x7F" : "=a" (a) : "0" (num), "b" ((int)p1), "c" ((int)p2), "d" ((int)p3), "S" ((int)p4)); \
return a; \
}
#define DEFN_SYSCALL5(fn, num, P1, P2, P3, P4, P5) \
int syscall_##fn(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) { \
int a; __asm__ __volatile__("int $0x7F" : "=a" (a) : "0" (num), "b" ((int)p1), "c" ((int)p2), "d" ((int)p3), "S" ((int)p4), "D" ((int)p5)); \
return a; \
}
/* Core */
DECL_SYSCALL1(exit, int);
DECL_SYSCALL1(print, const char *);
/* Files */
DECL_SYSCALL1(close, int);
DECL_SYSCALL3(open, const char *, int, int);
DECL_SYSCALL3(read, int, char *, int);
DECL_SYSCALL3(write, int, char *, int);
DECL_SYSCALL2(fstat, int, void *);
DECL_SYSCALL1(isatty, int);
DECL_SYSCALL2(link, char *, char *);
DECL_SYSCALL1(unlink, char *);
DECL_SYSCALL3(lseek, int, int, int);
DECL_SYSCALL2(stat, const char *, void *);
/* Process Control */
DECL_SYSCALL0(getpid);
DECL_SYSCALL3(execve, char *, char **, char **);
DECL_SYSCALL0(fork);
DECL_SYSCALL2(kill, int, int);
DECL_SYSCALL1(wait, int);
/* Memory management */
DECL_SYSCALL1(sbrk, int);
DECL_SYSCALL2(gettimeofday, void *, void *);
DECL_SYSCALL0(getgraphicsaddress);
DECL_SYSCALL1(kbd_mode, int);
DECL_SYSCALL0(kbd_get);
DECL_SYSCALL3(lseek, int, int, int);
DECL_SYSCALL2(fstat, int, void *);
DECL_SYSCALL1(setgraphicsoffset, int);
#endif
/*
* vim:tabstop=4
* vim:noexpandtab
* vim:shiftwidth=4
*/