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