forked from mit-pdos/xv6-public
-
Notifications
You must be signed in to change notification settings - Fork 14
/
defs.h
331 lines (282 loc) · 11.4 KB
/
defs.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
struct buf;
struct context;
struct file;
struct inode;
struct pipe;
struct proc;
struct rtcdate;
struct spinlock;
struct sleeplock;
struct stat;
struct superblock;
// bio.c
void binit(void);
struct buf* bread(uint, uint);
void brelse(struct buf*);
void bwrite(struct buf*);
// console.c
void consoleinit(void);
int cprintf(const char*, ...);
void consoleintr(int(*)(void));
void panic(char*) __attribute__((noreturn));
// exec.c
int exec(char*, char**);
// file.c
struct file* filealloc(void);
void fileclose(struct file*);
struct file* filedup(struct file*);
void fileinit(void);
int fileread(struct file*, char*, int n);
int filestat(struct file*, struct stat*);
int filewrite(struct file*, char*, int n);
int fileioctl(struct file*, int, void*);
// fs.c
void readsb(int dev, struct superblock *sb);
int dirlink(struct inode*, char*, uint);
struct inode* dirlookup(struct inode*, char*, uint*);
struct inode* ialloc(uint, short);
struct inode* idup(struct inode*);
void iinit(int dev);
void ilock(struct inode*);
void iput(struct inode*);
void iunlock(struct inode*);
void iunlockput(struct inode*);
void iupdate(struct inode*);
int namecmp(const char*, const char*);
struct inode* namei(char*);
struct inode* nameiparent(char*, char*);
int readi(struct inode*, char*, uint, uint);
void stati(struct inode*, struct stat*);
int writei(struct inode*, char*, uint, uint);
// ide.c
void ideinit(void);
void ideintr(void);
void iderw(struct buf*);
// ioapic.c
void ioapicenable(int irq, int cpu);
extern uchar ioapicid;
void ioapicinit(void);
// kalloc.c
char* kalloc(void);
void kfree(char*);
void kinit1(void*, void*);
void kinit2(void*, void*);
// kbd.c
void kbdintr(void);
// lapic.c
void cmostime(struct rtcdate *r);
int lapicid(void);
extern volatile uint* lapic;
void lapiceoi(void);
void lapicinit(void);
void lapicstartap(uchar, uint);
void microdelay(int);
// log.c
void initlog(int dev);
void log_write(struct buf*);
void begin_op();
void end_op();
// mp.c
extern int ismp;
void mpinit(void);
// picirq.c
void picenable(int);
void picinit(void);
// pipe.c
int pipealloc(struct file**, struct file**);
void pipeclose(struct pipe*, int);
int piperead(struct pipe*, char*, int);
int pipewrite(struct pipe*, char*, int);
//PAGEBREAK: 16
// proc.c
int cpuid(void);
void exit(void);
int fork(void);
int growproc(int);
int kill(int);
struct cpu* mycpu(void);
struct proc* myproc();
void pinit(void);
void procdump(void);
void scheduler(void) __attribute__((noreturn));
void sched(void);
void setproc(struct proc*);
void sleep(void*, struct spinlock*);
void userinit(void);
int wait(void);
void wakeup(void*);
void yield(void);
// swtch.S
void swtch(struct context**, struct context*);
// spinlock.c
void acquire(struct spinlock*);
void getcallerpcs(void*, uint*);
int holding(struct spinlock*);
void initlock(struct spinlock*, char*);
void release(struct spinlock*);
void pushcli(void);
void popcli(void);
// sleeplock.c
void acquiresleep(struct sleeplock*);
void releasesleep(struct sleeplock*);
int holdingsleep(struct sleeplock*);
void initsleeplock(struct sleeplock*, char*);
// string.c
int memcmp(const void*, const void*, uint);
void* memmove(void*, const void*, uint);
void* memcpy(void*, const void*, uint);
void* memset(void*, int, uint);
char* safestrcpy(char*, const char*, int);
int strlen(const char*);
int strncmp(const char*, const char*, uint);
char* strncpy(char*, const char*, int);
// syscall.c
int argint(int, int*);
int argptr(int, char**, int);
int argstr(int, char**);
int fetchint(uint, int*);
int fetchstr(uint, char**);
void syscall(void);
// sysfile.c
int argfd(int, int*, struct file**);
int fdalloc(struct file*);
// timer.c
void timerinit(void);
// trap.c
void idtinit(void);
extern uint ticks;
void tvinit(void);
extern struct spinlock tickslock;
// uart.c
void uartinit(void);
void uartintr(void);
void uartputc(int);
// vm.c
void seginit(void);
void kvmalloc(void);
pde_t* setupkvm(void);
char* uva2ka(pde_t*, char*);
int allocuvm(pde_t*, uint, uint);
int deallocuvm(pde_t*, uint, uint);
void freevm(pde_t*);
void inituvm(pde_t*, char*, uint);
int loaduvm(pde_t*, char*, struct inode*, uint, uint);
pde_t* copyuvm(pde_t*, uint);
void switchuvm(struct proc*);
void switchkvm(void);
int copyout(pde_t*, uint, void*, uint);
void clearpteu(pde_t *pgdir, char *uva);
// number of elements in fixed-size array
#define NELEM(x) (sizeof(x)/sizeof((x)[0]))
/* Additional definitions */
struct pci_func;
// pci.c
void pciinit(void);
void pci_func_enable(struct pci_func *f);
// printfmt.c
void vprintfmt(void (*)(int, void*), void*, const char*, va_list);
int snprintf(char *buf, int n, const char *fmt, ...);
// string.c
int strcmp(const char *p, const char *q);
int strnlen(const char *s, size_t size);
long strtol(const char *s, char **endptr, int base);
// assert
#define _str(x) #x
#define _tostr(x) _str(x)
#define _assert_occurs " [" __FILE__ ":" _tostr(__LINE__) "] "
#define assert(x) \
do { if (!(x)) panic("assertion failed" _assert_occurs #x); } while (0)
// variable length arguments
#define va_start(ap, last) __builtin_va_start(ap, last)
#define va_arg(ap, type) __builtin_va_arg(ap, type)
#define va_end(ap) __builtin_va_end(ap)
/* for Protocol Stack */
struct netdev;
struct netif;
struct queue_head;
struct queue_entry;
struct socket;
struct sockaddr;
// arp.c
int arp_resolve(struct netif *netif, const ip_addr_t *pa, uint8_t *ha, const void *data, size_t len);
int arp_init(void);
// common.c
void hexdump(void *data, size_t size);
uint16_t hton16(uint16_t h);
uint16_t ntoh16(uint16_t n);
uint32_t hton32(uint32_t h);
uint32_t ntoh32(uint32_t n);
uint16_t cksum16 (uint16_t *data, uint16_t size, uint32_t init);
struct queue_entry *queue_push(struct queue_head *queue, void *data, size_t size);
struct queue_entry *queue_pop(struct queue_head *queue);
time_t time(time_t *t);
unsigned long random(void);
// e1000.c
int e1000_init(struct pci_func *pcif);
void e1000intr(void);
// ethernet.c
int ethernet_addr_pton(const char *p, uint8_t *n);
char * ethernet_addr_ntop(const uint8_t *n, char *p, size_t size);
ssize_t ethernet_rx_helper(struct netdev *dev, uint8_t *frame, size_t flen, void (*cb)(struct netdev*, uint16_t, uint8_t*, size_t));
ssize_t ethernet_tx_helper(struct netdev *dev, uint16_t type, const uint8_t *payload, size_t plen, const void *dst, ssize_t (*cb)(struct netdev*, uint8_t*, size_t));
void ethernet_netdev_setup(struct netdev *dev);
// icmp.c
int icmp_tx(struct netif *netif, uint8_t type, uint8_t code, uint32_t values, uint8_t *data, size_t len, ip_addr_t *dst);
int icmp_init(void);
// ip.c
int ip_addr_pton(const char *p, ip_addr_t *n);
char * ip_addr_ntop(const ip_addr_t *n, char *p, size_t size);
struct netif * ip_netif_alloc(ip_addr_t unicast, ip_addr_t netmask, ip_addr_t gateway);
struct netif * ip_netif_register(struct netdev *dev, const char *addr, const char *netmask, const char *gateway);
int ip_netif_reconfigure(struct netif *netif, ip_addr_t unicast, ip_addr_t netmask, ip_addr_t gateway);
struct netif * ip_netif_by_addr(ip_addr_t *addr);
struct netif * ip_netif_by_peer(ip_addr_t *peer);
ssize_t ip_tx(struct netif *netif, uint8_t protocol, const uint8_t *buf, size_t len, const ip_addr_t *dst);
int ip_add_protocol(uint8_t type, void (*handler)(uint8_t *payload, size_t len, ip_addr_t *src, ip_addr_t *dst, struct netif *netif));
int ip_init(void);
// mt19937ar.c
void init_genrand(unsigned long s);
unsigned long genrand_int32(void);
// net.c
struct netdev * netdev_root(void);
struct netdev * netdev_alloc(void (*setup)(struct netdev *));
int netdev_register(struct netdev *dev);
struct netdev * netdev_by_index(int index);
struct netdev * netdev_by_name(const char *name);
void netdev_receive(struct netdev *dev, uint16_t type, uint8_t *packet, unsigned int plen);
int netdev_add_netif(struct netdev *dev, struct netif *netif);
struct netif * netdev_get_netif(struct netdev *dev, int family);
int netproto_register(unsigned short type, void (*handler)(uint8_t *packet, size_t plen, struct netdev *dev));
void netinit(void);
// tcp.c
int tcp_init(void);
int tcp_api_open(void);
int tcp_api_close(int soc);
int tcp_api_connect(int soc, struct sockaddr *addr, int addrlen);
int tcp_api_bind(int soc, struct sockaddr *addr, int addrlen);
int tcp_api_listen(int soc, int backlog);
int tcp_api_accept(int soc, struct sockaddr *addr, int *addrlen);
ssize_t tcp_api_recv(int soc, uint8_t *buf, size_t size);
ssize_t tcp_api_send(int soc, uint8_t *buf, size_t len);
// udp.c
int udp_init(void);
int udp_api_open(void);
int udp_api_close(int soc);
int udp_api_bind(int soc, struct sockaddr *addr, int addrlen);
ssize_t udp_api_recvfrom(int soc, uint8_t *buf, size_t size, struct sockaddr *addr, int *addrlen);
ssize_t udp_api_sendto(int soc, uint8_t *buf, size_t len, struct sockaddr *addr, int addrlen);
// socket.c
struct file * socketalloc(int domain, int type, int protocol);
void socketclose(struct socket*);
int socketconnect(struct socket*, struct sockaddr*, int);
int socketbind(struct socket*, struct sockaddr*, int);
int socketlisten(struct socket*, int);
struct file * socketaccept(struct socket*, struct sockaddr*, int*);
int socketread(struct socket*, char*, int);
int socketwrite(struct socket*, char*, int);
int socketrecvfrom(struct socket*, char*, int, struct sockaddr*, int*);
int socketsendto(struct socket*, char*, int, struct sockaddr*, int);
int socketioctl(struct socket*, int, void*);
#define sizeof_member(s, m) sizeof(((s *)NULL)->m)
#define array_tailof(x) (x + (sizeof(x) / sizeof(*x)))
#define array_offset(x, y) (((uintptr_t)y - (uintptr_t)x) / sizeof(*y))