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