cos2000v2/include/syscall.h

80 lines
2.1 KiB
C
Raw Normal View History

/*******************************************************************************/
/* COS2000 - Compatible Operating System - LGPL v3 - Hordé Nicolas */
/* */
#define sysexit \
asm volatile ("sysexit"::"c");
static inline long syscall(long syscall) {
long ret;
asm volatile (
"mov %%esp,%%ecx;\
mov $1f,%%edx;\
sysenter;\
1:" : "=a" (ret) : "a" (syscall): "ecx","edx","memory");
return ret;
}
static inline long syscall1(long syscall, long arg1) {
long ret;
asm volatile (
"mov %%esp,%%ecx;\
mov $1f,%%edx;\
sysenter;\
1:" : "=a" (ret) : "a" (syscall), "b" (arg1) : "ecx","edx","memory");
return ret;
}
static inline long syscall2(long syscall, long arg1, long arg2) {
long ret;
asm volatile (
"mov %%esp,%%ecx;\
mov $1f,%%edx;\
sysenter;\
1:" : "=a" (ret) : "a" (syscall), "b" (arg1), "S" (arg2) : "ecx","edx","memory");
return ret;
}
static inline long syscall3(long syscall, long arg1, long arg2, long arg3) {
long ret;
asm volatile (
"mov %%esp,%%ecx;\
mov $1f,%%edx;\
sysenter;\
1:" : "=a" (ret) : "a" (syscall), "b" (arg1), "S" (arg2), "D" (arg3) : "ecx","edx","memory");
return ret;
}
/*static inline long syscall4(long syscall, long arg1, long arg2, long arg3, long arg4) {
long ret;
asm volatile ("mov %%esp,%%ecx;
"mov $1f,%%edx;
"sysenter;
1:" : "=a" (ret) : "a" (syscall), "b" (arg1), "c" (arg2),
"d" (arg3), "S" (arg4) : memory);
return ret;
}
static inline long syscall5(long syscall, long arg1, long arg2, long arg3, long arg4, long arg5) {
long ret;
asm volatile ("mov %%esp,%%ecx;
"mov $1f,%%edx;
"sysenter;
1:" : "=a" (ret) : "a" (syscall), "b" (arg1), "c" (arg2),
"d" (arg3), "S" (arg4), "D" (arg5) : memory);
return ret;
}
static inline long syscall6(long syscall, long arg1, long arg2, long arg3, long arg4, long arg5, long arg6) {
long ret;
asm volatile ("mov %%esp,%%ecx;
"mov $1f,%%edx;
"sysenter;
1:" : "=a" (ret) : "a" (syscall), "b" (arg1), "c" (arg2),
"d" (arg3), "S" (arg4), "D", (arg5), "d" (arg6) : memory);
return ret;
}*/
void initsyscall(void);
void sysenter_handler(void);