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