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