qio: Rename qnoblock -> qdropoverflow
[akaros.git] / kern / include / ns.h
1 // INFERNO
2
3 #ifndef ROS_KERN_NS_H
4 #define ROS_KERN_NS_H
5
6 #include <err.h>
7 #include <rendez.h>
8 #include <rwlock.h>
9 #include <linker_func.h>
10
11 /*
12  * functions (possibly) linked in, complete, from libc.
13  */
14 enum {
15         UTFmax = 4,                                     /* maximum bytes per rune */
16         Runesync = 0x80,        /* cannot represent part of a UTF sequence (<) */
17         Runeself = 0x80,        /* rune and UTF sequences are the same (<) */
18         Runeerror = 0xFFFD,     /* decoding error in UTF */
19         Runemax = 0x10FFFF,     /* 21-bit rune */
20         Runemask = 0x1FFFFF,    /* bits used by runes (see grep) */
21         NUMSIZE32 = 9,  /* max size of formatted 32 bit number */
22         NUMSIZE64 = 20, /* max size of formatted 64 bit number */
23 };
24
25 /*
26  * math
27  */
28 extern int isNaN(double);
29 extern int isInf(double, int);
30 extern double floor(double);
31 extern double frexp(double, int *);
32 extern double pow10(int);
33
34 /*
35  * one-of-a-kind
36  */
37 extern char *cleanname(char *unused_char_p_t);
38 //extern    uint32_t    getcallerpc(void*);
39 static inline uint32_t getcallerpc(void *v)
40 {
41         return 0;
42 }
43
44 extern char etext[];
45 extern char edata[];
46 extern char end[];
47 extern int getfields(char *unused_char_p_t, char **unused_char_pp_t,
48                                          int unused_int, int, char *);
49 extern int tokenize(char *unused_char_p_t, char **unused_char_pp_t, int);
50 extern int dec64(uint8_t * unused_uint8_p_t, int unused_int,
51                                  char *unused_char_p_t, int);
52 extern void qsort(void *, long, long, int (*)(void *, void *));
53
54 extern int toupper(int);
55 extern char *netmkaddr(char *unused_char_p_t, char *, char *);
56 extern int myetheraddr(uint8_t * unused_uint8_p_t, char *unused_char_p_t);
57 extern int parseether(uint8_t * unused_uint8_p_t, char *unused_char_p_t);
58
59 /*
60  * network dialling
61  */
62 #define NETPATHLEN      40
63
64 /*
65  * Syscall data structures
66  */
67 #define MORDER  0x0003  /* mask for bits defining order of mounting */
68 #define MREPL   0x0000  /* mount replaces object */
69 #define MBEFORE 0x0001  /* mount goes before others in union directory */
70 #define MAFTER  0x0002  /* mount goes after others in union directory */
71 #define MCREATE 0x0004  /* permit creation in mounted directory */
72 #define MCACHE  0x0010  /* cache some data */
73 #define MMASK   0x0017  /* all bits on */
74
75 #define NCONT   0       /* continue after note */
76 #define NDFLT   1       /* terminate after note */
77 #define NSAVE   2       /* clear note but hold state */
78 #define NRSTR   3       /* restore saved state */
79
80 #define STATMAX 65535U  /* max length of machine-independent stat structure */
81 #define ERRMAX                  128     /* max length of error string */
82 #define KNAMELEN                28      /* max length of name held in kernel */
83
84 /* bits in Qid.type */
85 #define QTDIR           0x80    /* type bit for directories */
86 #define QTAPPEND        0x40    /* type bit for append only files */
87 #define QTEXCL          0x20    /* type bit for exclusive use files */
88 #define QTMOUNT         0x10    /* type bit for mounted channel */
89 #define QTAUTH          0x08    /* type bit for authentication file */
90 #define QTFILE          0x01    /* plain file */
91
92 /* bits in Dir.mode */
93 #define DMDIR           0x80000000      /* mode bit for directories */
94 #define DMAPPEND        0x40000000      /* mode bit for append only files */
95 #define DMEXCL          0x20000000      /* mode bit for exclusive use files */
96 #define DMMOUNT         0x10000000      /* mode bit for mounted channel */
97 #define DMSYMLINK       0x02000000      /* symlink -- from 9p2000.u */
98 #define DMREAD          0x4     /* mode bit for read permission */
99 #define DMWRITE         0x2     /* mode bit for write permission */
100 #define DMEXEC          0x1     /* mode bit for execute permission */
101
102 struct qid {
103         uint64_t path;
104         uint32_t vers;
105         uint8_t type;
106 };
107
108 struct dir {
109         /* system-modified data */
110         uint16_t type;                          /* server type */
111         unsigned int dev;                       /* server subtype */
112         /* file data */
113         struct qid qid;                         /* unique id from server */
114         uint32_t mode;                          /* permissions */
115         uint32_t atime;                         /* last read time */
116         uint32_t mtime;                         /* last write time */
117         int64_t length;                         /* file length: see <u.h> */
118         char *name;                                     /* last element of path */
119         char *uid;                                      /* owner name */
120         char *gid;                                      /* group name */
121         char *muid;                                     /* last modifier name */
122 };
123
124 struct waitmsg {
125         int pid;                                        /* of loved one */
126         uint32_t time[3];                       /* of loved one and descendants */
127         char msg[ERRMAX];                       /* actually variable-size in user mode */
128 };
129
130 #define VERSION9P       "9P2000"
131
132 #define MAXWELEM        16
133
134 typedef
135         struct fcall {
136         uint8_t type;
137         uint32_t fid;
138         uint16_t tag;
139         /* union { */
140         /* struct { */
141         uint32_t msize;                         /* Tversion, Rversion */
142         char *version;                          /* Tversion, Rversion */
143         /* }; */
144         /* struct { */
145         uint16_t oldtag;                        /* Tflush */
146         /* }; */
147         /* struct { */
148         char *ename;                            /* Rerror */
149         /* }; */
150         /* struct { */
151         struct qid qid;                         /* Rattach, Ropen, Rcreate */
152         uint32_t iounit;                        /* Ropen, Rcreate */
153         /* }; */
154         /* struct { */
155         struct qid aqid;                        /* Rauth */
156         /* }; */
157         /* struct { */
158         uint32_t afid;                          /* Tauth, Tattach */
159         char *uname;                            /* Tauth, Tattach */
160         char *aname;                            /* Tauth, Tattach */
161         /* }; */
162         /* struct { */
163         uint32_t perm;                          /* Tcreate */
164         char *name;                                     /* Tcreate */
165         uint8_t mode;                           /* Tcreate, Topen */
166         /* }; */
167         /* struct { */
168         uint32_t newfid;                        /* Twalk */
169         uint16_t nwname;                        /* Twalk */
170         char *wname[MAXWELEM];          /* Twalk */
171         /* }; */
172         /* struct { */
173         uint16_t nwqid;                         /* Rwalk */
174         struct qid wqid[MAXWELEM];      /* Rwalk */
175         /* }; */
176         /* struct { */
177         int64_t offset;                         /* Tread, Twrite */
178         uint32_t count;                         /* Tread, Twrite, Rread */
179         char *data;                                     /* Twrite, Rread */
180         /* }; */
181         /* struct { */
182         uint16_t nstat;                         /* Twstat, Rstat */
183         uint8_t *stat;                          /* Twstat, Rstat */
184         /* }; */
185         /* }; */
186 } fcall;
187
188 #define GBIT8(p)        ((p)[0])
189 #define GBIT16(p)       ((p)[0]|((p)[1]<<8))
190 #define GBIT32(p)       ((uint32_t)((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24)))
191 #define GBIT64(p)       ((uint32_t)((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24)) |\
192                                 ((int64_t)((p)[4]|((p)[5]<<8)|((p)[6]<<16)|((p)[7]<<24)) << 32))
193
194 #define PBIT8(p,v)      (p)[0]=(v)
195 #define PBIT16(p,v)     (p)[0]=(v);(p)[1]=(v)>>8
196 #define PBIT32(p,v)     (p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24
197 #define PBIT64(p,v)     (p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24;\
198                         (p)[4]=(v)>>32;(p)[5]=(v)>>40;(p)[6]=(v)>>48;(p)[7]=(v)>>56
199
200 #define BIT8SZ          1
201 #define BIT16SZ         2
202 #define BIT32SZ         4
203 #define BIT64SZ         8
204 #define QIDSZ   (BIT8SZ+BIT32SZ+BIT64SZ)
205
206 /* STATFIXLEN includes leading 16-bit count */
207 /* The count, however, excludes itself; total size is BIT16SZ+count */
208 #define STATFIXLEN      (BIT16SZ+QIDSZ+5*BIT16SZ+4*BIT32SZ+1*BIT64SZ)   /* amount of fixed length data in a stat buffer */
209
210 #define NOTAG           (uint16_t)~0U   /* Dummy tag */
211 #define NOFID           (uint32_t)~0U   /* Dummy fid */
212 #define IOHDRSZ         24      /* ample room for Twrite/Rread header (iounit) */
213
214 enum {
215         Tversion = 100,
216         Rversion,
217         Tauth = 102,
218         Rauth,
219         Tattach = 104,
220         Rattach,
221         Terror = 106,   /* illegal */
222         Rerror,
223         Tflush = 108,
224         Rflush,
225         Twalk = 110,
226         Rwalk,
227         Topen = 112,
228         Ropen,
229         Tcreate = 114,
230         Rcreate,
231         Tread = 116,
232         Rread,
233         Twrite = 118,
234         Rwrite,
235         Tclunk = 120,
236         Rclunk,
237         Tremove = 122,
238         Rremove,
239         Tstat = 124,
240         Rstat,
241         Twstat = 126,
242         Rwstat,
243         Tmax,
244 };
245
246 void init_empty_dir(struct dir *d);
247 unsigned int convM2S(uint8_t * unused_uint8_p_t, unsigned int unused_int,
248                                          struct fcall *);
249 unsigned int convS2M(struct fcall *, uint8_t * unused_uint8_p_t, unsigned int);
250 unsigned int sizeS2M(struct fcall *);
251
252 unsigned int convM2kdirent(uint8_t * buf, unsigned int nbuf, struct kdirent *kd,
253                                                    char *strs);
254 unsigned int convM2kstat(uint8_t * buf, unsigned int nbuf, struct kstat *ks);
255
256 int statcheck(uint8_t * abuf, unsigned int nbuf);
257 unsigned int convM2D(uint8_t * unused_uint8_p_t, unsigned int unused_int,
258                                          struct dir *, char *unused_char_p_t);
259 unsigned int convD2M(struct dir *, uint8_t * unused_uint8_p_t, unsigned int);
260 unsigned int sizeD2M(struct dir *);
261
262 int read9pmsg(int unused_int, void *, unsigned int);
263
264 struct ref {
265         spinlock_t l;
266         long ref;
267 };
268
269 struct rept {
270         spinlock_t l;
271         struct rendez r;
272         void *o;
273         int t;
274         int (*active) (void *);
275         int (*ck) (void *, int);
276         void (*f) (void *);                     /* called with VM acquire()'d */
277 };
278
279 enum {
280         Nopin = -1
281 };
282
283 struct talarm {
284         spinlock_t lock;
285         struct proc *list;
286 };
287
288 struct alarms {
289         qlock_t qlock;
290         struct proc *head;
291 };
292
293 /*
294  * Access types in namec & channel flags
295  */
296 enum {
297         Aaccess,                                        /* as in stat, wstat */
298         Abind,                                          /* for left-hand-side of bind */
299         Atodir,                                         /* as in chdir */
300         Aopen,                                          /* for i/o */
301         Amount,                                         /* to be mounted or mounted upon */
302         Acreate,                                        /* is to be created */
303         Aremove,                                        /* will be removed by caller */
304         Acreatechan,                                    /* return a chan for a create request. for sysrename. */
305
306         COPEN = 0x0001,                         /* for i/o */
307         CMSG = 0x0002,  /* the message channel for a mount */
308         CCEXEC = 0x0008,        /* close on exec */
309         CFREE = 0x0010, /* not in use */
310         CRCLOSE = 0x0020,       /* remove on close */
311         CCACHE = 0x0080,        /* client cache */
312         /* file/chan status flags, affected by setfl and reported in getfl */
313         CAPPEND = 0x0100,       /* append on write */
314 };
315
316 #define NS_IPCK_SHIFT  2
317 #define NS_UDPCK_SHIFT 3
318 #define NS_TCPCK_SHIFT 4
319 #define NS_PKTCK_SHIFT 5
320 #define NS_TSO_SHIFT 6
321 #define NS_SHIFT_MAX 6
322
323 enum {
324         BINTR = (1 << 0),
325         BFREE = (1 << 1),
326         Bipck = (1 << NS_IPCK_SHIFT),   /* ip checksum */
327         Budpck = (1 << NS_UDPCK_SHIFT), /* udp checksum */
328         Btcpck = (1 << NS_TCPCK_SHIFT), /* tcp checksum */
329         Bpktck = (1 << NS_PKTCK_SHIFT), /* packet checksum */
330         Btso = (1 << NS_TSO_SHIFT),     /* TSO */
331 };
332 #define BCKSUM_FLAGS (Bipck|Budpck|Btcpck|Bpktck|Btso)
333
334 struct extra_bdata {
335         uintptr_t base;
336         /* using u32s for packing reasons.  this means no extras > 4GB */
337         uint32_t off;
338         uint32_t len;
339 };
340
341 struct block {
342         struct block *next;
343         struct block *list;
344         uint8_t *rp;                            /* first unconsumed byte */
345         uint8_t *wp;                            /* first empty byte */
346         uint8_t *lim;                           /* 1 past the end of the buffer */
347         uint8_t *base;                          /* start of the buffer */
348         void (*free) (struct block *);
349         uint16_t flag;
350         uint16_t checksum;                      /* IP checksum of complete packet (minus media header) */
351         uint16_t checksum_start;                /* off from start of block to start csum */
352         uint16_t checksum_offset;               /* off from checksum_start to store csum */
353         uint16_t mss;               /* TCP MSS for TSO */
354         /* might want something to track the next free extra_data slot */
355         size_t extra_len;
356         unsigned int nr_extra_bufs;
357         struct extra_bdata *extra_data;
358 };
359 #define BLEN(s) ((s)->wp - (s)->rp + (s)->extra_len)
360 #define BHLEN(s) ((s)->wp - (s)->rp)
361 #define BALLOC(s) ((s)->lim - (s)->base + (s)->extra_len)
362
363 struct chan {
364         spinlock_t lock;
365         struct kref ref;
366         struct chan *next;                      /* allocation */
367         struct chan *link;
368         int64_t offset;                         /* in file */
369         int type;
370         uint32_t dev;
371         uint16_t mode;                          /* read/write */
372         uint16_t flag;
373         struct qid qid;
374         int fid;                                        /* for devmnt */
375         uint32_t iounit;                        /* chunk size for i/o; 0==default */
376         struct mhead *umh;                      /* mount point that derived Chan; used in unionread */
377         struct chan *umc;                       /* channel in union; held for union read */
378         qlock_t umqlock;                        /* serialize unionreads */
379         int uri;                                        /* union read index */
380         int dri;                                        /* devdirread index */
381         uint32_t mountid;
382         struct mntcache *mcp;           /* Mount cache pointer */
383         struct mnt *mux;                        /* Mnt for clients using me for messages */
384         union {
385                 void *aux;
386                 char tag[4];                    /* for iproute */
387         };
388         /* mountpoint, as discovered during walk.
389          * Used for rename at present.
390          */
391         struct chan *mountpoint;
392         struct chan *mchan;                     /* channel to mounted server */
393         struct qid mqid;                        /* qid of root of mount point */
394         struct cname *name;
395         /* hack for dir reads to try to get them right. */
396         int ateof;
397         void *buf;
398         int bufused;
399 };
400
401 struct cname {
402         struct kref ref;
403         int alen;                                       /* allocated length */
404         int len;                                        /* strlen(s) */
405         char *s;
406 };
407
408 struct dev {
409         int dc;
410         char *name;
411
412         void (*reset) (void);
413         void (*init) (void);
414         void (*shutdown) (void);
415         struct chan *(*attach) (char *muxattach);
416         struct walkqid *(*walk) (struct chan *, struct chan *, char **name, int);
417         int (*stat) (struct chan *, uint8_t *, int);
418         struct chan *(*open) (struct chan *, int);
419         void (*create) (struct chan *, char *, int, uint32_t);
420         void (*close) (struct chan *);
421         long (*read) (struct chan *, void *, long, int64_t);
422         struct block *(*bread) (struct chan *, long, uint32_t);
423         long (*write) (struct chan *, void *, long, int64_t);
424         long (*bwrite) (struct chan *, struct block *, uint32_t);
425         void (*remove) (struct chan *);
426         int (*wstat) (struct chan *, uint8_t * unused_uint8_p_t, int);
427         void (*power) (int);            /* power mgt: power(1) → on, power (0) → off */
428 //  int (*config)( int unused_int, char *unused_char_p_t, DevConf*);
429         char *(*chaninfo) (struct chan *, char *, size_t);
430         /* we need to be aligned, we think to 64 bytes, for the linker tables. */
431 } __attribute__ ((aligned(64)));
432
433 struct dirtab {
434         char name[KNAMELEN];
435         struct qid qid;
436         int64_t length;
437         long perm;
438 };
439
440 struct walkqid {
441         struct chan *clone;
442         int nqid;
443         struct qid qid[1];
444 };
445
446 enum {
447         NSMAX = 1000,
448         NSLOG = 7,
449         NSCACHE = (1 << NSLOG),
450 };
451
452 struct mntwalk {                                /* state for /proc/#/ns */
453         int cddone;
454         uint32_t id;
455         struct mhead *mh;
456         struct mount *cm;
457 };
458
459 struct mount {
460         uint32_t mountid;
461         struct mount *next;
462         struct mhead *head;
463         struct mount *copy;
464         struct mount *order;
465         struct chan *to;                        /* channel replacing channel */
466         int mflag;
467         char *spec;
468 };
469
470 struct mhead {
471         struct kref ref;
472         struct rwlock lock;
473         struct chan *from;                      /* channel mounted upon */
474         struct mount *mount;            /* what's mounted upon it */
475         struct mhead *hash;                     /* Hash chain */
476 };
477
478 struct mnt {
479         spinlock_t lock;
480         /* references are counted using c->ref; channels on this mount point incref(c->mchan) == Mnt.c */
481         struct chan *c;                         /* Channel to file service */
482         struct proc *rip;                       /* Reader in progress */
483         struct mntrpc *queue;           /* Queue of pending requests on this channel */
484         uint32_t id;                            /* Multiplexer id for channel check */
485         struct mnt *list;                       /* Free list */
486         int flags;                                      /* cache */
487         int msize;                                      /* data + IOHDRSZ */
488         char *version;                          /* 9P version */
489         struct queue *q;                        /* input queue */
490 };
491
492 enum {
493         RENDLOG = 5,
494         RENDHASH = 1 << RENDLOG,        /* Hash to lookup rendezvous tags */
495         MNTLOG = 5,
496         MNTHASH = 1 << MNTLOG,  /* Hash to walk mount table */
497         DELTAFD = 20,   /* allocation quantum for process file descriptors */
498         MAXNFD = 4000,  /* max per process file descriptors */
499         MAXKEY = 8,     /* keys for signed modules */
500 };
501 #define MOUNTH(p,qid)   ((p)->mnthash[(qid).path&((1<<MNTLOG)-1)])
502
503 struct mntparam {
504         struct chan *chan;
505         struct chan *authchan;
506         char *spec;
507         int flags;
508 };
509
510 struct pgrp {
511         struct kref ref;                        /* also used as a lock when mounting */
512         uint32_t pgrpid;
513         qlock_t debug;                          /* single access via devproc.c */
514         struct rwlock ns;                       /* Namespace n read/one write lock */
515         qlock_t nsh;
516         struct mhead *mnthash[MNTHASH];
517         int progmode;
518         struct chan *dot;
519         struct chan *slash;
520         int nodevs;
521         int pin;
522 };
523
524 struct fgrp {
525         spinlock_t lock;
526         struct kref ref;
527         struct chan **fd;
528         int nfd;                                        /* number of fd slots */
529         int maxfd;                                      /* highest fd in use */
530         int minfd;                                      /* lower bound on free fd */
531         int closed;
532 };
533
534 struct evalue {
535         char *var;
536         char *val;
537         int len;
538         struct qid qid;
539         struct evalue *next;
540 };
541
542 struct egrp {
543         struct kref ref;
544         qlock_t qlock;
545         struct evalue *entries;
546         uint32_t path;                          /* qid.path of next Evalue to be allocated */
547         uint32_t vers;                          /* of Egrp */
548 };
549
550 struct signerkey {
551         struct kref ref;
552         char *owner;
553         uint16_t footprint;
554         uint32_t expires;
555         void *alg;
556         void *pk;
557         void (*pkfree) (void *);
558 };
559
560 struct skeyset {
561         struct kref ref;
562         qlock_t qlock;
563         uint32_t flags;
564         char *devs;
565         int nkey;
566         struct signerkey *keys[MAXKEY];
567 };
568
569 /*
570  * fasttick timer interrupts
571  */
572 enum {
573         /* Mode */
574         Trelative,                                      /* timer programmed in ns from now */
575         Tabsolute,                                      /* timer programmed in ns since epoch */
576         Tperiodic,                                      /* periodic timer, period in ns */
577 };
578
579 enum {
580         PRINTSIZE = 256,
581         NUMSIZE = 12,   /* size of formatted number */
582         MB = (1024 * 1024),
583         READSTR = 2000, /* temporary buffer size for device reads */
584 };
585
586 extern struct dev devtab[];
587 extern struct dev __devtabend[];
588
589 struct cmdbuf {
590         char *buf;
591         char **f;
592         int nf;
593 };
594
595 struct cmdtab {
596         int index;                                      /* used by client to switch on result */
597         char *cmd;                                      /* command name */
598         int narg;                                       /* expected #args; 0 ==> variadic */
599 };
600
601 /* queue state bits,  Qmsg, Qcoalesce, and Qkick can be set in qopen */
602 enum {
603         /* Queue.state */
604         Qstarve = (1 << 0),                     /* consumer starved */
605         Qmsg = (1 << 1),        /* message stream */
606         Qclosed = (1 << 2),     /* queue has been closed/hungup */
607         Qflow = (1 << 3),       /* producer flow controlled */
608         Qcoalesce = (1 << 4),   /* coallesce packets on read */
609         Qkick = (1 << 5),       /* always call the kick routine after qwrite */
610 };
611
612 #define DEVDOTDOT -1
613
614 typedef int Devgen(struct chan *, char *unused_char_p_t, struct dirtab *,
615                                    int unused_int, int, struct dir *);
616
617 /* inferno portfns.h. Not all these are needed. */
618 // INFERNO
619 #define         FPinit() fpinit()       /* remove this if math lib is linked */
620 void FPrestore(void *);
621 void FPsave(void *);
622 struct cname *addelem(struct cname *, char *unused_char_p_t);
623 void addprog(struct proc *);
624 void addrootfile(char *unused_char_p_t, uint8_t * unused_uint8_p_t, uint32_t);
625 struct block *adjustblock(struct block *, int);
626 struct block *allocb(int);
627 void block_add_extd(struct block *b, unsigned int nr_bufs, int mem_flags);
628 int anyhigher(void);
629 int anyready(void);
630 void _assert(char *unused_char_p_t);
631 struct block *bl2mem(uint8_t * unused_uint8_p_t, struct block *, int);
632 int blocklen(struct block *);
633 char *channame(struct chan *);
634 void cclose(struct chan *);
635 void chan_incref(struct chan *);
636 void chandevinit(void);
637 void chandevreset(void);
638 void chandevshutdown(void);
639 struct dir *chandirstat(struct chan *);
640 void chanfree(struct chan *);
641 void chanrec(struct mnt *);
642 void checkalarms(void);
643 void checkb(struct block *, char *unused_char_p_t);
644 void cinit(void);
645 struct chan *cclone(struct chan *);
646 void cclose(struct chan *);
647 void closeegrp(struct egrp *);
648 void closefgrp(struct fgrp *);
649 void closemount(struct mount *);
650 void closepgrp(struct pgrp *);
651 void closesigs(struct skeyset *);
652 void cmderror(struct cmdbuf *, char *unused_char_p_t);
653 void debugcmd(struct cmdbuf *cb);
654 struct mhead *newmhead(struct chan *from);
655 int cmount(struct chan *, struct chan *, int unused_int, char *unused_char_p_t);
656 void cnameclose(struct cname *);
657 struct block *concatblock(struct block *);
658 struct block *linearizeblock(struct block *b);
659 void confinit(void);
660 void copen(struct chan *);
661 struct block *copyblock(struct block *, int);
662 int cread(struct chan *, uint8_t * unused_uint8_p_t, int unused_int, int64_t);
663 struct chan *cunique(struct chan *);
664 struct chan *createdir(struct chan *, struct mhead *);
665 void cunmount(struct chan *, struct chan *);
666 void cupdate(struct chan *, uint8_t * unused_uint8_p_t, int unused_int,
667                          int64_t);
668 void cursorenable(void);
669 void cursordisable(void);
670 int cursoron(int);
671 void cursoroff(int);
672 void cwrite(struct chan *, uint8_t * unused_uint8_p_t, int unused_int, int64_t);
673 struct chan *devattach(int unused_int, char *unused_char_p_t);
674 struct block *devbread(struct chan *, long, uint32_t);
675 long devbwrite(struct chan *, struct block *, uint32_t);
676 struct chan *devclone(struct chan *);
677 void devcreate(struct chan *, char *name, int mode, uint32_t perm);
678 void devdir(struct chan *, struct qid, char *, int64_t, char *, long,
679                         struct dir *);
680 long devdirread(struct chan *, char *, long, struct dirtab *, int, Devgen *);
681 Devgen devgen;
682 void devinit(void);
683 int devno(int unused_int, int);
684 void devpower(int);
685 struct dev *devbyname(char *unused_char_p_t);
686 struct chan *devopen(struct chan *, int unused_int,
687                                          struct dirtab *, int unused_int2, Devgen *);
688 void devpermcheck(char *unused_char_p_t, uint32_t, int);
689 void devremove(struct chan *);
690 void devreset(void);
691 void devshutdown(void);
692 int devstat(struct chan *, uint8_t * unused_uint8_p_t, int unused_int,
693                         struct dirtab *, int unused_int2, Devgen *);
694 struct walkqid *devwalk(struct chan *,
695                                                 struct chan *, char **unused_char_pp_t, int unused_int,
696                                                 struct dirtab *, int unused_intw, Devgen *);
697 int devwstat(struct chan *, uint8_t * unused_uint8_p_t, int);
698 char *devchaninfo(struct chan *chan, char *ret, size_t ret_l);
699 void disinit(void *);
700 void disfault(void *, char *unused_char_p_t);
701 int domount(struct chan **, struct mhead **);
702 void drawactive(int);
703 void drawcmap(void);
704 void dumpstack(void);
705 struct fgrp *dupfgrp(struct proc *, struct fgrp *);
706 void egrpcpy(struct egrp *, struct egrp *);
707 int emptystr(char *unused_char_p_t);
708 int eqchan(struct chan *, struct chan *, int);
709 int eqqid(struct qid, struct qid);
710
711 void errstr(char *unused_char_p_t, int);
712 void excinit(void);
713 void exit(int);
714 void reboot(void);
715 void halt(void);
716 int export(int unused_int, char *unused_char_p_t, int);
717 uint64_t fastticks(uint64_t *);
718 uint64_t fastticks2ns(uint64_t);
719 void fdclose(struct fgrp *, int);
720 struct chan *fdtochan(struct fgrp *, int unused_int, int, int, int);
721 int findmount(struct chan **, struct mhead **, int unused_int, int, struct qid);
722 void free(void *);
723 void freeb(struct block *);
724 void freeblist(struct block *);
725 void freeskey(struct signerkey *);
726 void getcolor(uint32_t, uint32_t *, uint32_t *, uint32_t *);
727 uint32_t getmalloctag(void *);
728 uint32_t getrealloctag(void *);
729 void hnputl(void *, uint32_t);
730 void hnputs(void *, uint16_t);
731 struct block *iallocb(int);
732 void iallocsummary(void);
733 void printblock(struct block *b);
734 void ilock(spinlock_t *);
735 int iprint(char *unused_char_p_t, ...);
736 void isdir(struct chan *);
737 int islo(void);
738 void iunlock(spinlock_t *);
739 void ixsummary(void);
740 void kbdclock(void);
741 int kbdcr2nl(struct queue *, int);
742 int kbdputc(struct queue *, int);
743 void kbdrepeat(int);
744 void kproc(char *unused_char_p_t, void (*)(void *), void *, int);
745 int fgrpclose(struct fgrp *, int);
746 void kprocchild(struct proc *, void (*)(void *), void *);
747 void (*kproftick) (uint32_t);
748 void ksetenv(char *unused_char_p_t, char *, int);
749 //void      kstrncpy( char *unused_char_p_t, char*, int unused_int, sizeof(char*, char*));
750 void kstrdup(char **unused_char_pp_t, char *unused_char_p_t);
751
752 struct cmdtab *lookupcmd(struct cmdbuf *, struct cmdtab *, int);
753 struct block *mem2bl(uint8_t * unused_uint8_p_t, int);
754 int memusehigh(void);
755 void microdelay(int);
756 uint64_t mk64fract(uint64_t, uint64_t);
757 void mkqid(struct qid *, int64_t, uint32_t, int);
758 void modinit(void);
759 struct chan *mntauth(struct chan *, char *unused_char_p_t);
760 long mntversion(struct chan *, char *unused_char_p_t, int unused_int, int);
761 void mountfree(struct mount *);
762 void mousetrack(int unused_int, int, int, int);
763 uint64_t ms2fastticks(uint32_t);
764 void mul64fract(uint64_t *, uint64_t, uint64_t);
765 void muxclose(struct mnt *);
766 struct chan *namec(char *unused_char_p_t, int unused_int, int, uint32_t);
767 struct chan *newchan(void);
768 struct egrp *newegrp(void);
769 struct fgrp *newfgrp(void);
770 struct mount *newmount(struct mhead *, struct chan *, int unused_int,
771                                            char *unused_char_p_t);
772 struct pgrp *newpgrp(void);
773 struct proc *newproc(void);
774 char *nextelem(char *unused_char_p_t, char *);
775
776 struct cname *newcname(char *unused_char_p_t);
777 void notkilled(void);
778 int nrand(int);
779 uint64_t ns2fastticks(uint64_t);
780 int okaddr(uint32_t, uint32_t, int);
781 int openmode(uint32_t);
782 struct block *packblock(struct block *);
783 struct block *padblock(struct block *, int);
784
785 struct cmdbuf *parsecmd(char *unused_char_p_t, int);
786
787 void pgrpcpy(struct pgrp *, struct pgrp *);
788
789 int progfdprint(struct chan *, int unused_int, int, char *unused_char_p_t,
790                                 int i);
791 int pullblock(struct block **, int);
792 struct block *pullupblock(struct block *, int);
793 struct block *pullupqueue(struct queue *, int);
794 void putmhead(struct mhead *);
795 void putstrn(char *unused_char_p_t, int);
796 void qaddlist(struct queue *, struct block *);
797 struct block *qbread(struct queue *, int);
798 long qbwrite(struct queue *, struct block *);
799 long qibwrite(struct queue *q, struct block *b);
800 struct queue *qbypass(void (*)(void *, struct block *), void *);
801 int qcanread(struct queue *);
802 void qclose(struct queue *);
803 int qconsume(struct queue *, void *, int);
804 struct block *qcopy(struct queue *, int unused_int, uint32_t);
805 struct block *qclone(struct queue *q, int header_len, int len,
806                      uint32_t offset);
807 struct block *blist_clone(struct block *blist, int header_len, int len,
808                           uint32_t offset);
809 int qdiscard(struct queue *, int);
810 void qflush(struct queue *);
811 void qfree(struct queue *);
812 int qfull(struct queue *);
813 struct block *qget(struct queue *);
814 void qhangup(struct queue *, char *unused_char_p_t);
815 int qisclosed(struct queue *);
816 int qiwrite(struct queue *, void *, int);
817 int qlen(struct queue *);
818 void qdropoverflow(struct queue *, bool);
819 struct queue *qopen(int unused_int, int, void (*)(void *), void *);
820 int qpass(struct queue *, struct block *);
821 int qpassnolim(struct queue *, struct block *);
822 int qproduce(struct queue *, void *, int);
823 void qputback(struct queue *, struct block *);
824 long qread(struct queue *, void *, int);
825 struct block *qremove(struct queue *);
826 void qreopen(struct queue *);
827 void qsetlimit(struct queue *, int);
828 int qwindow(struct queue *);
829 int qwrite(struct queue *, void *, int);
830 void randominit(void);
831 uint32_t randomread(void *, uint32_t);
832 void *realloc(void *, uint32_t);
833 int readmem(unsigned long offset, char *buf, unsigned long n,
834                         void *mem, size_t mem_len);
835 int readnum(unsigned long off, char *buf, unsigned long n, unsigned long val,
836                         size_t size);
837 int readstr(unsigned long offset, char *buf, unsigned long n, char *str);
838 int readnum_int64_t(uint32_t, char *unused_char_p_t, uint32_t, int64_t, int);
839 void ready(struct proc *);
840 void renameproguser(char *unused_char_p_t, char *);
841 void renameuser(char *unused_char_p_t, char *);
842 void resrcwait(char *unused_char_p_t);
843 struct proc *runproc(void);
844 long seconds(void);
845 void (*serwrite) (char *unused_char_p_t, int);
846 int setcolor(uint32_t, uint32_t, uint32_t, uint32_t);
847
848 void setmalloctag(void *, uint32_t);
849 int setpri(int);
850 void setrealloctag(void *, uint32_t);
851 char *skipslash(char *unused_char_p_t);
852 void *smalloc(uint32_t);
853 int splhi(void);
854 int spllo(void);
855 void splx(int);
856 void splxpc(int);
857 void swiproc(struct proc *, int);
858 uint32_t _tas(uint32_t *);
859 uint32_t tk2ms(uint32_t);
860 #define         TK2MS(x) ((x)*(1000/HZ))
861 uint64_t tod2fastticks(int64_t);
862 int64_t todget(int64_t *);
863 void todfix(void);
864 void todsetfreq(int64_t);
865 void todinit(void);
866 void todset(int64_t, int64_t, int);
867 int tready(void *);
868 struct block *trimblock(struct block *, int unused_int, int);
869 int uartgetc(void);
870 void uartputc(int);
871 void uartputs(char *unused_char_p_t, int);
872 long unionread(struct chan *, void *, long);
873 void unlock(spinlock_t *);
874 void userinit(void);
875 uint32_t userpc(void);
876 void validname(char *, int);
877 void validwstatname(char *);
878 int walk(struct chan **, char **unused_char_pp_t, int unused_int, int, int *);
879 void *xalloc(uint32_t);
880 void *xallocz(uint32_t, int);
881 void xfree(void *);
882 void xhole(uint32_t, uint32_t);
883 void xinit(void);
884 int xmerge(void *, void *);
885 void *xspanalloc(uint32_t, int unused_int, uint32_t);
886 void xsummary(void);
887
888 void validaddr(void *, uint32_t, int);
889 void *vmemchr(void *, int unused_int, int);
890 void hnputv(void *, int64_t);
891 void hnputl(void *, uint32_t);
892 void hnputs(void *, uint16_t);
893 int64_t nhgetv(void *);
894 uint32_t nhgetl(void *);
895 uint16_t nhgets(void *);
896
897 /* error messages, from inferno emu error.h */
898 extern char Enoerror[];                 /* no error */
899 extern char Emount[];                   /* inconsistent mount */
900 extern char Eunmount[];                 /* not mounted */
901 extern char Eunion[];                   /* not in union */
902 extern char Emountrpc[];                /* mount rpc error */
903 extern char Eshutdown[];                /* mounted device shut down */
904 extern char Eowner[];                   /* not owner */
905 extern char Eunknown[];                 /* unknown user or group id */
906 extern char Enocreate[];                /* mounted directory forbids creation */
907 extern char Enonexist[];                /* file does not exist */
908 extern char Eexist[];                   /* file already exists */
909 extern char Ebadsharp[];                /* unknown device in # filename */
910 extern char Enotdir[];                  /* not a directory */
911 extern char Eisdir[];                   /* file is a directory */
912 extern char Ebadchar[];                 /* bad character in file name */
913 extern char Efilename[];                /* file name syntax */
914 extern char Eperm[];                    /* permission denied */
915 extern char Ebadusefd[];                /* inappropriate use of fd */
916 extern char Ebadarg[];                  /* bad arg in system call */
917 extern char Einuse[];                   /* device or object already in use */
918 extern char Eio[];                              /* i/o error */
919 extern char Etoobig[];                  /* read or write too large */
920 extern char Etoosmall[];                /* read or write too small */
921 extern char Enetaddr[];                 /* bad network address */
922 extern char Emsgsize[];                 /* message is too big for protocol */
923 extern char Enetbusy[];                 /* network device is busy or allocated */
924 extern char Enoproto[];                 /* network protocol not supported */
925 extern char Enoport[];                  /* network port not available */
926 extern char Enoifc[];                   /* bad interface or no free interface slots */
927 extern char Enolisten[];                /* not announced */
928 extern char Ehungup[];                  /* i/o on hungup channel */
929 extern char Ebadctl[];                  /* bad process or channel control request */
930 extern char Enodev[];                   /* no free devices */
931 extern char Enoenv[];                   /* no free environment resources */
932 extern char Ethread[];                  /* thread exited */
933 extern char Enochild[];                 /* no living children */
934 extern char Eioload[];                  /* i/o error in demand load */
935 extern char Enovmem[];                  /* out of memory: virtual memory */
936 extern char Ebadld[];                   /* illegal line discipline */
937 extern char Ebadfd[];                   /* fd out of range or not open */
938 extern char Eisstream[];                /* seek on a stream */
939 extern char Ebadexec[];                 /* exec header invalid */
940 extern char Etimedout[];                /* connection timed out */
941 extern char Econrefused[];              /* connection refused */
942 extern char Econinuse[];                /* connection in use */
943 extern char Enetunreach[];              /* network unreachable */
944 extern char Eintr[];                    /* interrupted */
945 extern char Enomem[];                   /* out of memory: kernel */
946 extern char Esfnotcached[];             /* subfont not cached */
947 extern char Esoverlap[];                /* segments overlap */
948 extern char Emouseset[];                /* mouse type already set */
949 extern char Eshort[];                   /* i/o count too small */
950 extern char Enobitstore[];              /* out of screen memory */
951 extern char Egreg[];                    /* jim'll fix it */
952 extern char Ebadspec[];                 /* bad attach specifier */
953 extern char Estopped[];                 /* thread must be stopped */
954 extern char Enoattach[];                /* mount/attach disallowed */
955 extern char Eshortstat[];               /* stat buffer too small */
956 extern char Enegoff[];                  /* negative i/o offset */
957 extern char Ebadstat[];                 /* malformed stat buffer */
958 extern char Ecmdargs[];                 /* wrong #args in control message */
959 extern char Enofd[];                    /* no free file descriptors */
960 extern char Enoctl[];                   /* unknown control request */
961 extern char Eprocdied[];                /* process died */
962
963 char *get_cur_genbuf(void);
964
965 /* hack for now. */
966 #define NOW     tsc2msec(read_tsc())
967 #define seconds() tsc2sec(read_tsc())
968 #define milliseconds() tsc2msec(read_tsc())
969
970 /* kern/drivers/dev/tab.c */
971 void devtabinit();
972 void devtabreset();
973
974 /* kern/src/ns/parse.c */
975 struct cmdbuf *parsecmd(char *p, int n);
976 void cmderror(struct cmdbuf *cb, char *s);
977 struct cmdtab *lookupcmd(struct cmdbuf *cb, struct cmdtab *ctab, int nctab);
978
979 /* kern/src/ns/sysfile.c */
980 int newfd(struct chan *c, bool oflags);
981 struct chan *fdtochan(struct fgrp *f, int fd, int mode, int chkmnt, int iref);
982 long kchanio(void *vc, void *buf, int n, int mode);
983 int openmode(uint32_t o);
984 void fdclose(struct fgrp *f, int fd);
985 int syschdir(char *path);
986 int grpclose(struct fgrp *f, int fd);
987 int sysclose(int fd);
988 int syscreate(char *path, int mode, uint32_t perm);
989 int sysdup(int old, int new);
990 int sys_dup_to(struct proc *from_proc, unsigned int from_fd,
991                struct proc *to_proc, unsigned int to_fd);
992 int sysfstat(int fd, uint8_t*, int n);
993 int sysfstatakaros(int fd, struct kstat *);
994 char *sysfd2path(int fd);
995 int sysfauth(int fd, char *aname);
996 int sysfversion(int fd, unsigned int msize, char *vers, unsigned int arglen);
997 int syspipe(int fd[2]);
998 int sysfwstat(int fd, uint8_t * buf, int n);
999 long bindmount(struct chan *c, char *old, int flag, char *spec);
1000 int sysbind(char *new, char *old, int flags);
1001 int sysmount(int fd, int afd, char *old, int flags, char *spec);
1002 int sysunmount(char *old, char *new);
1003 int sysopen(char *path, int mode);
1004 long unionread(struct chan *c, void *va, long n);
1005 void read_exactly_n(struct chan *c, void *vp, long n);
1006 long sysread(int fd, void *va, long n);
1007 long syspread(int fd, void *va, long n, int64_t off);
1008 int sysremove(char *path);
1009 int64_t sysseek(int fd, int64_t off, int whence);
1010 void validstat(uint8_t * s, int n, int slashok);
1011 int sysstat(char *path, uint8_t*, int n);
1012 int sysstatakaros(char *path, struct kstat *);
1013 long syswrite(int fd, void *va, long n);
1014 long syspwrite(int fd, void *va, long n, int64_t off);
1015 int syswstat(char *path, uint8_t * buf, int n);
1016 struct dir *chandirstat(struct chan *c);
1017 struct dir *sysdirstat(char *name);
1018 struct dir *sysdirfstat(int fd);
1019 int sysdirwstat(char *name, struct dir *dir);
1020 int sysdirfwstat(int fd, struct dir *dir);
1021 long sysdirread(int fd, struct kdirent **d);
1022 int sysiounit(int fd);
1023 void close_9ns_files(struct proc *p, bool only_cloexec);
1024 void print_chaninfo(struct chan *ch);
1025 void print_9ns_files(struct proc *p);
1026 int plan9setup(struct proc *new_proc, struct proc *parent, int flags);
1027 int iseve(void);
1028 int fd_getfl(int fd);
1029 int fd_setfl(int fd, int flags);
1030
1031 /* kern/drivers/dev/srv.c */
1032 char *srvname(struct chan *c);
1033
1034 /* kern/src/eipconv.c. Put them here or face real include hell. */
1035 void printqid(void (*putch) (int, void **), void **putdat, struct qid *q);
1036 void printcname(void (*putch) (int, void **), void **putdat, struct cname *c);
1037 void printchan(void (*putch) (int, void **), void **putdat, struct chan *c);
1038
1039 static inline int abs(int a)
1040 {
1041         if (a < 0)
1042                 return -a;
1043         return a;
1044 }
1045
1046 extern char *eve;
1047 extern unsigned int qiomaxatomic;
1048
1049 /* special sections */
1050 #define __devtab  __attribute__((__section__(".devtab")))
1051
1052 #endif /* ROS_KERN_NS_H */