061ac212788f087ee674edc57e40d2f26041ad6e
[akaros.git] / syscall.c
1 // System call stubs.
2
3 #include <inc/syscall.h>
4 #include <inc/lib.h>
5
6 static inline uint32_t
7 syscall(int num, uint32_t a1, uint32_t a2, uint32_t a3, uint32_t a4, uint32_t a5)
8 {
9         uint32_t ret;
10
11         // Generic system call: pass system call number in AX,
12         // up to five parameters in DX, CX, BX, DI, SI.
13         // Interrupt kernel with T_SYSCALL.
14         //
15         // The "volatile" tells the assembler not to optimize
16         // this instruction away just because we don't use the
17         // return value.
18         // 
19         // The last clause tells the assembler that this can
20         // potentially change the condition codes and arbitrary
21         // memory locations.
22
23         asm volatile("int %1\n"
24                 : "=a" (ret)
25                 : "i" (T_SYSCALL),
26                   "a" (num),
27                   "d" (a1),
28                   "c" (a2),
29                   "b" (a3),
30                   "D" (a4),
31                   "S" (a5)
32                 : "cc", "memory");
33         
34         return ret;
35 }
36
37 void
38 sys_cputs(const char *s, size_t len)
39 {
40         syscall(SYS_cputs, (uint32_t) s, len, 0, 0, 0);
41 }
42
43 int
44 sys_cgetc(void)
45 {
46         return syscall(SYS_cgetc, 0, 0, 0, 0, 0);
47 }
48
49 int
50 sys_env_destroy(envid_t envid)
51 {
52         return syscall(SYS_env_destroy, envid, 0, 0, 0, 0);
53 }
54
55 envid_t
56 sys_getenvid(void)
57 {
58          return syscall(SYS_getenvid, 0, 0, 0, 0, 0);
59 }
60
61