/*******************************************************************************/
/* COS2000 - Compatible Operating System - LGPL v3 - Hordé Nicolas             */
/*                                                                             */

#define sysexit() asm volatile ("sysexit"::);


#define syscall0(syscall) ({ \
	u32 _v; \
	asm volatile (\
	"mov %%esp,%%ecx;\
	mov $1f,%%edx;\
	sysenter;\
	1:" : "=a" (_v) : "a" (syscall): "ecx","edx","memory"); \
	_v; \
})

#define syscall1(syscall,arg1) ({ \
	u32 _v; \
	asm volatile (\
	"mov %%esp,%%ecx;\
	mov $1f,%%edx;\
	sysenter;\
	1:" : "=a" (_v) : "a" (syscall), "b" (arg1) : "ecx","edx","memory"); \
	_v; \
})

#define syscall2(syscall,arg1,arg2) ({ \
	u32 _v; \
	asm volatile (\
	"mov %%esp,%%ecx;\
	mov $1f,%%edx;\
	sysenter;\
	1:" : "=a" (_v) : "a" (syscall), "b" (arg1), "S" (arg2) : "ecx","edx","memory"); \
	_v; \
})

#define syscall3(syscall,arg1,arg2,arg3) ({ \
	u32 _v; \
	asm volatile (\
	"mov %%esp,%%ecx;\
	mov $1f,%%edx;\
	sysenter;\
	1:" : "=a" (_v) : "a" (syscall), "b" (arg1), "S" (arg2), "D" (arg3)  : "ecx","edx","memory"); \
	_v; \
})

/* Vers 6 arguments maximum */
void    initsyscall(void);
__attribute__ ((noreturn)) void sysenter_handler(regs *dump);

