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