MushOS  0.1
A UNIX-like OS prototype, written from scratch
Loading...
Searching...
No Matches
syscall.h
1#ifndef MUSHLIB_SYSCALL_H
2#define MUSHLIB_SYSCALL_H
3
4#include "generic.h"
5#include "vararg.h"
6
7
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]));\
12 unalloc(args);\
13 asm volatile (\
14 "push %%ebp\n"\
15 "mov %%esp, %%ebp\n"\
16 "int %0\n"\
17 "mov %%ebp, %%esp\n"\
18 "pop %%ebp" :: "i"(interruption)\
19 );\
20 for (int i = args_num - 1; i >= 0; i--) asm volatile ("pop %eax");\
21 asm volatile ("popa");\
22}
23
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]));\
28 unalloc(args);\
29 asm volatile (\
30 "push %%ebp\n"\
31 "mov %%esp, %%ebp\n"\
32 "int %0\n"\
33 "mov %%ebp, %%esp\n"\
34 "pop %%ebp" :: "i"(interruption)\
35 );\
36 for (int i = args_num - 1; i >= 0; i--) asm volatile ("pop %0" : "=r"(ret_value));\
37 asm volatile ("popa");\
38}
39
40
41
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)));
44
45#define system_push(stack_base, value) {\
46 u_dword position = stack_base + 4;\
47 asm volatile ("mov %1, (%0)" :: "r" (position), "r" (value));\
48}
49
50#endif // MUSHLIB_SYSCALL_H