1#ifndef MUSHLIB_SYSCALL_H
2#define MUSHLIB_SYSCALL_H
8#define call_system(interruption, args_num, arguments...) {\
9 asm volatile ("pusha");\
10 u_dword* args = extract_dword_args(args_num, ## arguments);\
11 for (int i = args_num - 1; i >= 0; i--) asm volatile ("push %0" :: "r"(args[i]));\
18 "pop %%ebp" :: "i"(interruption)\
20 for (int i = args_num - 1; i >= 0; i--) asm volatile ("pop %eax");\
21 asm volatile ("popa");\
24#define call_system_ret(interruption, ret_value, args_num, arguments...) {\
25 asm volatile ("pusha");\
26 u_dword* args = extract_dword_args(args_num, ## arguments);\
27 for (int i = args_num - 1; i >= 0; i--) asm volatile ("push %0" :: "r"(args[i]));\
34 "pop %%ebp" :: "i"(interruption)\
36 for (int i = args_num - 1; i >= 0; i--) asm volatile ("pop %0" : "=r"(ret_value));\
37 asm volatile ("popa");\
42#define system_get_arg(stack_base, arg_num, ret_val)\
43 asm volatile ("mov (%1), %0" : "=r" (ret_val) : "r" (stack_base + 4 + arg_num * sizeof(u_dword)));
45#define system_push(stack_base, value) {\
46 u_dword position = stack_base + 4;\
47 asm volatile ("mov %1, (%0)" :: "r" (position), "r" (value));\