First run at integrating LWIP into the tree (again)
[akaros.git] / user / parlib / src / syscall.c
1 // System call stubs.
2
3 #include <parlib.h>
4
5 error_t sys_proc_destroy(int pid, int exitcode)
6 {
7         return syscall(SYS_proc_destroy, pid, exitcode, 0, 0, 0);
8 }
9
10 void* sys_brk(void* addr)
11 {
12         return (void*)syscall(SYS_brk, (intreg_t)addr, 0, 0, 0, 0);
13 }
14
15 int sys_getpid(void)
16 {
17          return syscall(SYS_getpid, 0, 0, 0, 0, 0);
18 }
19
20 size_t sys_getcpuid(void)
21 {
22          return syscall(SYS_getcpuid, 0, 0, 0, 0, 0);
23 }
24
25 ssize_t sys_cputs(const uint8_t *s, size_t len)
26 {
27     return syscall(SYS_cputs, (intreg_t) s,  len, 0, 0, 0);
28 }
29
30 uint16_t sys_cgetc(void)
31 {
32     return syscall(SYS_cgetc, 0, 0, 0, 0, 0);
33 }
34
35 ssize_t sys_shared_page_alloc(void** addr, pid_t p2, 
36                               int p1_flags, int p2_flags
37                              ) 
38 {
39         return syscall(SYS_shared_page_alloc, (intreg_t)addr, 
40                        p2, p1_flags, p2_flags, 0);
41 }
42
43 ssize_t sys_shared_page_free(void* addr, pid_t p2) 
44 {
45         return syscall(SYS_shared_page_free, (intreg_t)addr, p2, 0,0,0);
46 }
47
48 //Write a buffer over the serial port
49 ssize_t sys_serial_write(void* buf, size_t len) 
50 {
51         return syscall(SYS_serial_write, (intreg_t)buf, len, 0, 0, 0);
52 }
53
54 //Read a buffer over the serial port
55 ssize_t sys_serial_read(void* buf, size_t len) 
56 {
57         return syscall(SYS_serial_read, (intreg_t)buf, len, 0, 0, 0);
58 }
59
60 //Run a binary loaded at the specificed address with the specified arguments
61 ssize_t sys_run_binary(void* binary_buf, size_t len,
62                        char arg[PROCINFO_MAX_ARGV_SIZE], size_t num_colors) 
63 {
64         return syscall(SYS_run_binary, (intreg_t)binary_buf, (intreg_t)len,
65                                        (intreg_t)arg,(intreg_t)num_colors,0);
66 }
67
68 //Write a buffer over ethernet
69 ssize_t sys_eth_write(void* buf, size_t len) 
70 {
71         if (len == 0)
72                 return 0;
73         
74         return syscall(SYS_eth_write, (intreg_t)buf, len, 0, 0, 0);
75 }
76
77 //Read a buffer via ethernet
78 ssize_t sys_eth_read(void* buf, size_t len) 
79 {
80         if (len == 0)
81                 return 0;
82                 
83         return syscall(SYS_eth_read, (intreg_t)buf, len, 0, 0, 0);
84 }
85
86 ssize_t sys_eth_get_mac_addr(void* buf) {
87         return syscall(SYS_eth_get_mac_addr, (intreg_t)buf, 0, 0, 0, 0);
88 }
89
90 /* Request resources from the kernel.  Flags in ros/resource.h. */
91 ssize_t sys_resource_req(int type, size_t amount, uint32_t flags)
92 {
93         return syscall(SYS_resource_req, type, amount, flags, 0, 0);
94 }
95
96 void sys_reboot()
97 {
98         syscall(SYS_reboot,0,0,0,0,0);
99 }
100
101 void sys_yield()
102 {
103         syscall(SYS_yield,0,0,0,0,0);
104 }
105
106 /* We need to do some hackery to pass 6 arguments.  Arg4 pts to the real arg4,
107  * arg5, and arg6.  Keep this in sync with kern/src/syscall.c.
108  * TODO: consider a syscall_multi that can take more args, and keep it in sync
109  * with the kernel.  Maybe wait til we fix sysenter to have 5 or 6 args. */
110 void *CT(length) sys_mmap(void *SNT addr, size_t length, int prot, int flags,
111                           int fd, size_t offset)
112 {
113         struct args {
114                 int _flags;
115                 int _fd;
116                 size_t _offset;
117         } extra_args;
118         extra_args._flags = flags;
119         extra_args._fd = fd;
120         extra_args._offset = offset;
121         // TODO: deputy bitches about this
122         return (void*CT(length))TC(syscall(SYS_mmap, (uint32_t)addr, length, prot,
123                               (int32_t)&extra_args, 0));
124 }
125