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