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