Checkin of Andrews stuff needed to compile glibc
[akaros.git] / user / parlib / inc / newlib_backend.h
1 /* See COPYRIGHT for copyright information. */
2 /* Kevin Klues <klueska@cs.berkeley.edu>        */
3
4 #ifndef _NEWLIB_LIBC_WRAPPERS_H_
5 #define _NEWLIB_LIBC_WRAPPERS_H_
6
7 #include <errno.h>
8 #undef errno
9 extern int errno;
10 #include <sys/stat.h>
11
12
13
14 #define debug_in_out(...) //debug(__VA_ARGS__)  
15 #define debug_write_check(fmt, ...)  //debug(fmt, __VA_ARGS__)
16 uint32_t newcore(void);
17
18 typedef uint32_t syscall_id_t;
19
20 // ALL STRUCTS MUST BE PADDED TO THE SAME SIZE.
21 // Basically, to make IVY annotation possible with as few TC's as possible
22 // We do some ugly things with unions, which results in us needing this padding
23 typedef struct open_subheader {
24         syscall_id_t id;
25         uint32_t flags;
26         uint32_t mode;
27         uint32_t len;
28         char (CT(len) buf)[0];
29 } open_subheader_t;
30
31 typedef struct close_subheader {
32         syscall_id_t id;
33         uint32_t fd;
34         uint32_t FILL1;
35         uint32_t FILL2;
36 } close_subheader_t;
37
38 typedef struct read_subheader {
39         syscall_id_t id;
40         uint32_t fd;
41         uint32_t len;
42         uint32_t FILL1;
43 } read_subheader_t;
44
45 typedef struct write_subheader {
46         syscall_id_t id;
47         uint32_t fd;
48         uint32_t len;
49         uint32_t FILL1;
50         char (CT(len) buf)[0];
51 } write_subheader_t;
52
53 typedef struct lseek_subheader {
54         syscall_id_t id;
55         uint32_t fd;
56         uint32_t ptr;
57         uint32_t dir;
58 } lseek_subheader_t;
59
60 typedef struct isatty_subheader {
61         syscall_id_t id;
62         uint32_t fd;
63         uint32_t FILL1;
64         uint32_t FILL2;
65 } isatty_subheader_t;
66
67 typedef struct link_subheader {
68         syscall_id_t id;
69         uint32_t old_len;
70         uint32_t new_len;
71         uint32_t total_len;
72         char (CT(total_len) buf)[0];
73 } link_subheader_t;
74
75 typedef struct unlink_subheader {
76         syscall_id_t id;
77         uint32_t len;
78         uint32_t FILL1;
79         uint32_t FILL2;
80         char (CT(len) buf)[0];
81 } unlink_subheader_t;
82
83 typedef struct fstat_subheader {
84         syscall_id_t id;
85         uint32_t fd;
86         uint32_t FILL1;
87         uint32_t FILL2;
88 } fstat_subheader_t;
89
90 typedef struct stat_subheader {
91         syscall_id_t id;
92         uint32_t len;
93         uint32_t FILL1;
94         uint32_t FILL2;
95         char (CT(len) buf)[0];
96 } stat_subheader_t;
97
98 #define OPEN_ID         0
99 #define CLOSE_ID        1
100 #define READ_ID         2
101 #define WRITE_ID        3
102 #define LINK_ID         4
103 #define UNLINK_ID       5
104 #define LSEEK_ID        6
105 #define FSTAT_ID        7
106 #define ISATTY_ID       8
107 #define STAT_ID         9
108 #define NUM_CALLS       10
109
110 #if 0
111
112 zra: this sort of thing is more useful if the C code is receiving a message.
113
114 typedef struct backend_msg {
115         syscall_id_t id;
116         union {
117                 open_subheader_t open WHEN(id == OPEN_ID);
118                 close_subheader_t close WHEN(id == CLOSE_ID);
119                 read_subheader_t read WHEN(id == READ_ID);
120                 write_subheader_t write WHEN(id == WRITE_ID);
121                 lseek_subheader_t lseek WHEN(id == LSEEK_ID);
122                 isatty_subheader_t isatty WHEN(id == ISATTY_ID);
123                 link_subheader_t link WHEN(id == LINK_ID);
124                 unlink_subheader_t unlink WHEN(id == UNLINK_ID);
125                 fstat_subheader_t fstat WHEN(id == FSTAT_ID);
126                 stat_subheader_t stat WHEN(id == STAT_ID);      
127         };
128 } msg_t;
129 #endif
130
131 typedef struct response {
132         int32_t ret;
133         uint32_t err;
134         char (CT(ret) buf)[0];
135 } response_t;
136
137
138 // New errno we want to define if a channel error occurs
139 // Not yet fully implimented
140 #define ECHANNEL -999
141
142 // Value to send across the channel as a function return value in the event of server side termination
143 // Note yet fully implimented
144 #define CONNECTION_TERMINATED -2
145
146 // Macros for the read_from_channel function
147 #define PEEK    1
148 #define NO_PEEK 0
149
150
151 /* Read len bytes from the given channel to the buffer.
152  * If peek is NO_PEEK, will wait indefinitely until that much data is read.
153  * If peek is PEEK, if no data is available, will return immediately.
154  *              However once some data is available,
155  *                      will block until the entire amount is available.
156  */
157 int read_from_channel(char *CT(len) buf, int len, int peek);
158
159 int read_response_from_channel(response_t *CT(1) response);
160 int read_buffer_from_channel(char *CT(len) buf, int len);
161
162
163 /* send_message()
164  * Write the message defined in buffer out across the channel, and wait for a response.
165  * Caller is responsible for management of both the buffer passed in and the buffer ptr returned.
166  */
167 response_t *send_message(char *COUNT(len) msg, int len, syscall_id_t id);
168
169 /* write_to_channel()
170  * Send a message out over the channel, defined by msg, of length len
171  */
172 int write_to_channel(char *COUNT(len) msg, int len);
173
174 #endif //_NEWLIB_LIBC_WRAPPERS_H_
175