2018-09-28 20:35:51 +02:00
|
|
|
/*******************************************************************************/
|
|
|
|
/* COS2000 - Compatible Operating System - LGPL v3 - Hordé Nicolas */
|
|
|
|
/* */
|
2018-12-04 00:05:55 +01:00
|
|
|
|
|
|
|
#define sysexit \
|
|
|
|
asm volatile ("sysexit"::"c");
|
|
|
|
|
|
|
|
|
|
|
|
static inline long syscall(long syscall) {
|
|
|
|
long ret;
|
|
|
|
asm volatile (
|
2018-12-04 21:57:44 +01:00
|
|
|
"pushl %%ecx;\
|
|
|
|
pushl %%edx;\
|
|
|
|
mov %%esp,%%ecx;\
|
2018-12-04 00:05:55 +01:00
|
|
|
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 (
|
2018-12-04 21:57:44 +01:00
|
|
|
"pushl %%ecx;\
|
|
|
|
pushl %%edx;\
|
|
|
|
mov %%esp,%%ecx;\
|
2018-12-04 00:05:55 +01:00
|
|
|
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 (
|
2018-12-04 21:57:44 +01:00
|
|
|
"pushl %%ecx;\
|
|
|
|
pushl %%edx;\
|
|
|
|
mov %%esp,%%ecx;\
|
2018-12-04 00:05:55 +01:00
|
|
|
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 (
|
2018-12-04 21:57:44 +01:00
|
|
|
"pushl %%ecx;\
|
|
|
|
pushl %%edx;\
|
|
|
|
mov %%esp,%%ecx;\
|
2018-12-04 00:05:55 +01:00
|
|
|
mov $1f,%%edx;\
|
|
|
|
sysenter;\
|
|
|
|
1:" : "=a" (ret) : "a" (syscall), "b" (arg1), "S" (arg2), "D" (arg3) : "ecx","edx","memory");
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
2018-12-04 21:57:44 +01:00
|
|
|
/* Vers 6 arguments maximum */
|
2018-09-18 14:29:35 +02:00
|
|
|
void initsyscall(void);
|
|
|
|
void sysenter_handler(void);
|