Reorganized the directory structure, placing newlib under user/parlib.
[akaros.git] / user / parlib / src / syscall.c
1 // System call stubs.
2 #ifdef __DEPUTY__
3 #pragma nodeputy
4 #endif
5
6 #include <arch/x86.h>
7 #include <ros/syscall.h>
8 #include <lib.h>
9
10 // TODO: modify to take only four parameters
11 static uint32_t
12 syscall_sysenter(int num, uint32_t a1, uint32_t a2, uint32_t a3, uint32_t a4, uint32_t a5)
13 {
14         uint32_t ret;
15     asm volatile(
16             //"pushl %%ecx\n\t"
17             //"pushl %%edx\n\t"
18             "pushl %%ebp\n\t"
19                         "pushl %%esi\n\t"
20             "movl %%esp, %%ebp\n\t"
21             "leal after_sysenter, %%esi\n\t"
22             "sysenter\n\t"
23             "after_sysenter:\n\t"
24                         "popl %%esi\n\t"
25             "popl %%ebp\n\t"
26             //"popl %%edx\n\t"
27             //"popl %%ecx"
28             :"=a" (ret)
29             : "a" (num),
30                 "d" (a1),
31                 "c" (a2),
32                 "b" (a3),
33                 "D" (a4)
34         : "cc", "memory", "%esp");
35         return ret;
36 }
37
38 static inline uint32_t syscall_trap(int num, uint32_t a1, uint32_t a2, 
39                                     uint32_t a3, uint32_t a4, uint32_t a5)
40 {
41         uint32_t ret;
42
43         // Generic system call: pass system call number in AX,
44         // up to five parameters in DX, CX, BX, DI, SI.
45         // Interrupt kernel with T_SYSCALL.
46         //
47         // The "volatile" tells the assembler not to optimize
48         // this instruction away just because we don't use the
49         // return value.
50         //
51         // The last clause tells the assembler that this can
52         // potentially change the condition codes and arbitrary
53         // memory locations.
54
55         asm volatile("int %1\n"
56                 : "=a" (ret)
57                 : "i" (T_SYSCALL),
58                   "a" (num),
59                   "d" (a1),
60                   "c" (a2),
61                   "b" (a3),
62                   "D" (a4),
63                   "S" (a5)
64                 : "cc", "memory");
65
66         return ret;
67 }
68
69 static inline uint32_t syscall(int num, uint32_t a1, uint32_t a2, uint32_t a3,
70                                uint32_t a4, uint32_t a5)
71 {
72         #ifndef SYSCALL_TRAP
73                 return syscall_sysenter(num, a1, a2, a3, a4, a5);
74         #else
75                 return syscall_trap(num, a1, a2, a3, a4, a5);
76         #endif
77 }
78
79 int sys_env_destroy(envid_t envid)
80 {
81         return syscall(SYS_env_destroy, envid, 0, 0, 0, 0);
82 }
83
84 envid_t sys_getenvid(void)
85 {
86          return syscall(SYS_getenvid, 0, 0, 0, 0, 0);
87 }
88
89 uint32_t sys_getcpuid(void)
90 {
91          return syscall(SYS_getcpuid, 0, 0, 0, 0, 0);
92 }
93
94 //Write a buffer over the serial port
95 error_t sys_serial_write(void* buf, uint16_t len) 
96 {
97         return -1;
98 }
99
100 //Read a buffer over the serial port
101 uint16_t sys_serial_read(void* buf, uint16_t len) 
102 {
103         return 0;
104 }