9 #include <linker_func.h>
12 * functions (possibly) linked in, complete, from libc.
15 UTFmax = 4, /* maximum bytes per rune */
16 Runesync = 0x80, /* cannot represent part of a UTF sequence (<) */
17 Runeself = 0x80, /* rune and UTF sequences are the same (<) */
18 Runeerror = 0xFFFD, /* decoding error in UTF */
19 Runemax = 0x10FFFF, /* 21-bit rune */
20 Runemask = 0x1FFFFF, /* bits used by runes (see grep) */
21 NUMSIZE32 = 9, /* max size of formatted 32 bit number */
22 NUMSIZE64 = 20, /* max size of formatted 64 bit number */
28 extern int isNaN(double);
29 extern int isInf(double, int);
30 extern double floor(double);
31 extern double frexp(double, int *);
32 extern double pow10(int);
37 extern char *cleanname(char *unused_char_p_t);
38 //extern uint32_t getcallerpc(void*);
39 static inline uint32_t getcallerpc(void *v)
47 extern int getfields(char *unused_char_p_t, char **unused_char_pp_t,
48 int unused_int, int, char *);
49 extern int tokenize(char *unused_char_p_t, char **unused_char_pp_t, int);
50 extern int dec64(uint8_t * unused_uint8_p_t, int unused_int,
51 char *unused_char_p_t, int);
52 extern void qsort(void *, long, long, int (*)(void *, void *));
54 extern int toupper(int);
55 extern char *netmkaddr(char *unused_char_p_t, char *, char *);
56 extern int myetheraddr(uint8_t * unused_uint8_p_t, char *unused_char_p_t);
57 extern int parseether(uint8_t * unused_uint8_p_t, char *unused_char_p_t);
65 * Syscall data structures
67 #define MORDER 0x0003 /* mask for bits defining order of mounting */
68 #define MREPL 0x0000 /* mount replaces object */
69 #define MBEFORE 0x0001 /* mount goes before others in union directory */
70 #define MAFTER 0x0002 /* mount goes after others in union directory */
71 #define MCREATE 0x0004 /* permit creation in mounted directory */
72 #define MCACHE 0x0010 /* cache some data */
73 #define MMASK 0x0017 /* all bits on */
75 #define NCONT 0 /* continue after note */
76 #define NDFLT 1 /* terminate after note */
77 #define NSAVE 2 /* clear note but hold state */
78 #define NRSTR 3 /* restore saved state */
80 #define STATMAX 65535U /* max length of machine-independent stat structure */
81 #define ERRMAX 128 /* max length of error string */
82 #define KNAMELEN 28 /* max length of name held in kernel */
84 /* bits in Qid.type */
85 #define QTDIR 0x80 /* type bit for directories */
86 #define QTAPPEND 0x40 /* type bit for append only files */
87 #define QTEXCL 0x20 /* type bit for exclusive use files */
88 #define QTMOUNT 0x10 /* type bit for mounted channel */
89 #define QTAUTH 0x08 /* type bit for authentication file */
90 #define QTFILE 0x01 /* plain file */
92 /* bits in Dir.mode */
93 #define DMDIR 0x80000000 /* mode bit for directories */
94 #define DMAPPEND 0x40000000 /* mode bit for append only files */
95 #define DMEXCL 0x20000000 /* mode bit for exclusive use files */
96 #define DMMOUNT 0x10000000 /* mode bit for mounted channel */
97 #define DMSYMLINK 0x02000000 /* symlink -- from 9p2000.u */
98 #define DMREAD 0x4 /* mode bit for read permission */
99 #define DMWRITE 0x2 /* mode bit for write permission */
100 #define DMEXEC 0x1 /* mode bit for execute permission */
109 /* system-modified data */
110 uint16_t type; /* server type */
111 unsigned int dev; /* server subtype */
113 struct qid qid; /* unique id from server */
114 uint32_t mode; /* permissions */
115 uint32_t atime; /* last read time */
116 uint32_t mtime; /* last write time */
117 int64_t length; /* file length: see <u.h> */
118 char *name; /* last element of path */
119 char *uid; /* owner name */
120 char *gid; /* group name */
121 char *muid; /* last modifier name */
125 int pid; /* of loved one */
126 uint32_t time[3]; /* of loved one and descendants */
127 char msg[ERRMAX]; /* actually variable-size in user mode */
130 #define VERSION9P "9P2000"
141 uint32_t msize; /* Tversion, Rversion */
142 char *version; /* Tversion, Rversion */
145 uint16_t oldtag; /* Tflush */
148 char *ename; /* Rerror */
151 struct qid qid; /* Rattach, Ropen, Rcreate */
152 uint32_t iounit; /* Ropen, Rcreate */
155 struct qid aqid; /* Rauth */
158 uint32_t afid; /* Tauth, Tattach */
159 char *uname; /* Tauth, Tattach */
160 char *aname; /* Tauth, Tattach */
163 uint32_t perm; /* Tcreate */
164 char *name; /* Tcreate */
165 uint8_t mode; /* Tcreate, Topen */
168 uint32_t newfid; /* Twalk */
169 uint16_t nwname; /* Twalk */
170 char *wname[MAXWELEM]; /* Twalk */
173 uint16_t nwqid; /* Rwalk */
174 struct qid wqid[MAXWELEM]; /* Rwalk */
177 int64_t offset; /* Tread, Twrite */
178 uint32_t count; /* Tread, Twrite, Rread */
179 char *data; /* Twrite, Rread */
182 uint16_t nstat; /* Twstat, Rstat */
183 uint8_t *stat; /* Twstat, Rstat */
188 #define GBIT8(p) ((p)[0])
189 #define GBIT16(p) ((p)[0]|((p)[1]<<8))
190 #define GBIT32(p) ((uint32_t)((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24)))
191 #define GBIT64(p) ((uint32_t)((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24)) |\
192 ((int64_t)((p)[4]|((p)[5]<<8)|((p)[6]<<16)|((p)[7]<<24)) << 32))
194 #define PBIT8(p,v) (p)[0]=(v)
195 #define PBIT16(p,v) (p)[0]=(v);(p)[1]=(v)>>8
196 #define PBIT32(p,v) (p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24
197 #define PBIT64(p,v) (p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24;\
198 (p)[4]=(v)>>32;(p)[5]=(v)>>40;(p)[6]=(v)>>48;(p)[7]=(v)>>56
204 #define QIDSZ (BIT8SZ+BIT32SZ+BIT64SZ)
206 /* STATFIXLEN includes leading 16-bit count */
207 /* The count, however, excludes itself; total size is BIT16SZ+count */
208 #define STATFIXLEN (BIT16SZ+QIDSZ+5*BIT16SZ+4*BIT32SZ+1*BIT64SZ) /* amount of fixed length data in a stat buffer */
210 #define NOTAG (uint16_t)~0U /* Dummy tag */
211 #define NOFID (uint32_t)~0U /* Dummy fid */
212 #define IOHDRSZ 24 /* ample room for Twrite/Rread header (iounit) */
221 Terror = 106, /* illegal */
246 unsigned int convM2S(uint8_t * unused_uint8_p_t, unsigned int unused_int,
248 unsigned int convS2M(struct fcall *, uint8_t * unused_uint8_p_t, unsigned int);
249 unsigned int sizeS2M(struct fcall *);
251 unsigned int convM2kdirent(uint8_t * buf, unsigned int nbuf, struct kdirent *kd,
253 unsigned int convM2kstat(uint8_t * buf, unsigned int nbuf, struct kstat *ks);
255 int statcheck(uint8_t * abuf, unsigned int nbuf);
256 unsigned int convM2D(uint8_t * unused_uint8_p_t, unsigned int unused_int,
257 struct dir *, char *unused_char_p_t);
258 unsigned int convD2M(struct dir *, uint8_t * unused_uint8_p_t, unsigned int);
259 unsigned int sizeD2M(struct dir *);
261 int read9pmsg(int unused_int, void *, unsigned int);
273 int (*active) (void *);
274 int (*ck) (void *, int);
275 void (*f) (void *); /* called with VM acquire()'d */
293 * Access types in namec & channel flags
296 Aaccess, /* as in stat, wstat */
297 Abind, /* for left-hand-side of bind */
298 Atodir, /* as in chdir */
300 Amount, /* to be mounted or mounted upon */
301 Acreate, /* is to be created */
302 Aremove, /* will be removed by caller */
304 COPEN = 0x0001, /* for i/o */
305 CMSG = 0x0002, /* the message channel for a mount */
306 CCEXEC = 0x0008, /* close on exec */
307 CFREE = 0x0010, /* not in use */
308 CRCLOSE = 0x0020, /* remove on close */
309 CCACHE = 0x0080, /* client cache */
310 /* file/chan status flags, affected by setfl and reported in getfl */
311 CAPPEND = 0x0100, /* append on write */
314 #define NS_IPCK_SHIFT 2
315 #define NS_UDPCK_SHIFT 3
316 #define NS_TCPCK_SHIFT 4
317 #define NS_PKTCK_SHIFT 5
318 #define NS_TSO_SHIFT 6
319 #define NS_SHIFT_MAX 6
324 Bipck = (1 << NS_IPCK_SHIFT), /* ip checksum */
325 Budpck = (1 << NS_UDPCK_SHIFT), /* udp checksum */
326 Btcpck = (1 << NS_TCPCK_SHIFT), /* tcp checksum */
327 Bpktck = (1 << NS_PKTCK_SHIFT), /* packet checksum */
328 Btso = (1 << NS_TSO_SHIFT), /* TSO */
330 #define BCKSUM_FLAGS (Bipck|Budpck|Btcpck|Bpktck|Btso)
334 /* using u32s for packing reasons. this means no extras > 4GB */
342 uint8_t *rp; /* first unconsumed byte */
343 uint8_t *wp; /* first empty byte */
344 uint8_t *lim; /* 1 past the end of the buffer */
345 uint8_t *base; /* start of the buffer */
346 void (*free) (struct block *);
348 uint16_t checksum; /* IP checksum of complete packet (minus media header) */
349 uint16_t checksum_start; /* off from start of block to start csum */
350 uint16_t checksum_offset; /* off from checksum_start to store csum */
351 uint16_t mss; /* TCP MSS for TSO */
352 /* might want something to track the next free extra_data slot */
354 unsigned int nr_extra_bufs;
355 struct extra_bdata *extra_data;
357 #define BLEN(s) ((s)->wp - (s)->rp + (s)->extra_len)
358 #define BHLEN(s) ((s)->wp - (s)->rp)
359 #define BALLOC(s) ((s)->lim - (s)->base + (s)->extra_len)
364 struct chan *next; /* allocation */
366 int64_t offset; /* in file */
369 uint16_t mode; /* read/write */
372 int fid; /* for devmnt */
373 uint32_t iounit; /* chunk size for i/o; 0==default */
374 struct mhead *umh; /* mount point that derived Chan; used in unionread */
375 struct chan *umc; /* channel in union; held for union read */
376 qlock_t umqlock; /* serialize unionreads */
377 int uri; /* union read index */
378 int dri; /* devdirread index */
380 struct mntcache *mcp; /* Mount cache pointer */
381 struct mnt *mux; /* Mnt for clients using me for messages */
384 char tag[4]; /* for iproute */
386 struct chan *mchan; /* channel to mounted server */
387 struct qid mqid; /* qid of root of mount point */
389 /* hack for dir reads to try to get them right. */
397 int alen; /* allocated length */
398 int len; /* strlen(s) */
406 void (*reset) (void);
408 void (*shutdown) (void);
409 struct chan *(*attach) (char *muxattach);
410 struct walkqid *(*walk) (struct chan *, struct chan *, char **name, int);
411 int (*stat) (struct chan *, uint8_t *, int);
412 struct chan *(*open) (struct chan *, int);
413 void (*create) (struct chan *, char *, int, uint32_t);
414 void (*close) (struct chan *);
415 long (*read) (struct chan *, void *, long, int64_t);
416 struct block *(*bread) (struct chan *, long, uint32_t);
417 long (*write) (struct chan *, void *, long, int64_t);
418 long (*bwrite) (struct chan *, struct block *, uint32_t);
419 void (*remove) (struct chan *);
420 int (*wstat) (struct chan *, uint8_t * unused_uint8_p_t, int);
421 void (*power) (int); /* power mgt: power(1) → on, power (0) → off */
422 // int (*config)( int unused_int, char *unused_char_p_t, DevConf*);
423 char *(*chaninfo) (struct chan *, char *, size_t);
424 /* we need to be aligned, i think to 32 bytes, for the linker tables. */
425 } __attribute__ ((aligned(32)));
443 NSCACHE = (1 << NSLOG),
446 struct mntwalk { /* state for /proc/#/ns */
459 struct chan *to; /* channel replacing channel */
467 struct chan *from; /* channel mounted upon */
468 struct mount *mount; /* what's mounted upon it */
469 struct mhead *hash; /* Hash chain */
474 /* references are counted using c->ref; channels on this mount point incref(c->mchan) == Mnt.c */
475 struct chan *c; /* Channel to file service */
476 struct proc *rip; /* Reader in progress */
477 struct mntrpc *queue; /* Queue of pending requests on this channel */
478 uint32_t id; /* Multiplexer id for channel check */
479 struct mnt *list; /* Free list */
480 int flags; /* cache */
481 int msize; /* data + IOHDRSZ */
482 char *version; /* 9P version */
483 struct queue *q; /* input queue */
488 RENDHASH = 1 << RENDLOG, /* Hash to lookup rendezvous tags */
490 MNTHASH = 1 << MNTLOG, /* Hash to walk mount table */
491 DELTAFD = 20, /* allocation quantum for process file descriptors */
492 MAXNFD = 4000, /* max per process file descriptors */
493 MAXKEY = 8, /* keys for signed modules */
495 #define MOUNTH(p,qid) ((p)->mnthash[(qid).path&((1<<MNTLOG)-1)])
499 struct chan *authchan;
505 struct kref ref; /* also used as a lock when mounting */
507 qlock_t debug; /* single access via devproc.c */
508 struct rwlock ns; /* Namespace n read/one write lock */
510 struct mhead *mnthash[MNTHASH];
522 int nfd; /* number of fd slots */
523 int maxfd; /* highest fd in use */
524 int minfd; /* lower bound on free fd */
539 struct evalue *entries;
540 uint32_t path; /* qid.path of next Evalue to be allocated */
541 uint32_t vers; /* of Egrp */
551 void (*pkfree) (void *);
560 struct signerkey *keys[MAXKEY];
564 * fasttick timer interrupts
568 Trelative, /* timer programmed in ns from now */
569 Tabsolute, /* timer programmed in ns since epoch */
570 Tperiodic, /* periodic timer, period in ns */
575 NUMSIZE = 12, /* size of formatted number */
577 READSTR = 1000, /* temporary buffer size for device reads */
580 extern struct dev devtab[];
581 extern struct dev __devtabend[];
590 int index; /* used by client to switch on result */
591 char *cmd; /* command name */
592 int narg; /* expected #args; 0 ==> variadic */
595 /* queue state bits, Qmsg, Qcoalesce, and Qkick can be set in qopen */
598 Qstarve = (1 << 0), /* consumer starved */
599 Qmsg = (1 << 1), /* message stream */
600 Qclosed = (1 << 2), /* queue has been closed/hungup */
601 Qflow = (1 << 3), /* producer flow controlled */
602 Qcoalesce = (1 << 4), /* coallesce packets on read */
603 Qkick = (1 << 5), /* always call the kick routine after qwrite */
608 typedef int Devgen(struct chan *, char *unused_char_p_t, struct dirtab *,
609 int unused_int, int, struct dir *);
611 /* inferno portfns.h. Not all these are needed. */
613 #define FPinit() fpinit() /* remove this if math lib is linked */
614 void FPrestore(void *);
616 struct cname *addelem(struct cname *, char *unused_char_p_t);
617 void addprog(struct proc *);
618 void addrootfile(char *unused_char_p_t, uint8_t * unused_uint8_p_t, uint32_t);
619 struct block *adjustblock(struct block *, int);
620 struct block *allocb(int);
621 void block_add_extd(struct block *b, unsigned int nr_bufs, int mem_flags);
624 void _assert(char *unused_char_p_t);
625 struct block *bl2mem(uint8_t * unused_uint8_p_t, struct block *, int);
626 int blocklen(struct block *);
627 char *channame(struct chan *);
628 void cclose(struct chan *);
629 void chan_incref(struct chan *);
630 void chandevinit(void);
631 void chandevreset(void);
632 void chandevshutdown(void);
633 struct dir *chandirstat(struct chan *);
634 void chanfree(struct chan *);
635 void chanrec(struct mnt *);
636 void checkalarms(void);
637 void checkb(struct block *, char *unused_char_p_t);
639 struct chan *cclone(struct chan *);
640 void cclose(struct chan *);
641 void closeegrp(struct egrp *);
642 void closefgrp(struct fgrp *);
643 void closemount(struct mount *);
644 void closepgrp(struct pgrp *);
645 void closesigs(struct skeyset *);
646 void cmderror(struct cmdbuf *, char *unused_char_p_t);
647 struct mhead *newmhead(struct chan *from);
648 int cmount(struct chan *, struct chan *, int unused_int, char *unused_char_p_t);
649 void cnameclose(struct cname *);
650 struct block *concatblock(struct block *);
651 struct block *linearizeblock(struct block *b);
653 void copen(struct chan *);
654 struct block *copyblock(struct block *, int);
655 int cread(struct chan *, uint8_t * unused_uint8_p_t, int unused_int, int64_t);
656 struct chan *cunique(struct chan *);
657 struct chan *createdir(struct chan *, struct mhead *);
658 void cunmount(struct chan *, struct chan *);
659 void cupdate(struct chan *, uint8_t * unused_uint8_p_t, int unused_int,
661 void cursorenable(void);
662 void cursordisable(void);
665 void cwrite(struct chan *, uint8_t * unused_uint8_p_t, int unused_int, int64_t);
666 struct chan *devattach(int unused_int, char *unused_char_p_t);
667 struct block *devbread(struct chan *, long, uint32_t);
668 long devbwrite(struct chan *, struct block *, uint32_t);
669 struct chan *devclone(struct chan *);
670 void devcreate(struct chan *, char *name, int mode, uint32_t perm);
671 void devdir(struct chan *, struct qid, char *, int64_t, char *, long,
673 long devdirread(struct chan *, char *, long, struct dirtab *, int, Devgen *);
676 int devno(int unused_int, int);
678 struct dev *devbyname(char *unused_char_p_t);
679 struct chan *devopen(struct chan *, int unused_int,
680 struct dirtab *, int unused_int2, Devgen *);
681 void devpermcheck(char *unused_char_p_t, uint32_t, int);
682 void devremove(struct chan *);
684 void devshutdown(void);
685 int devstat(struct chan *, uint8_t * unused_uint8_p_t, int unused_int,
686 struct dirtab *, int unused_int2, Devgen *);
687 struct walkqid *devwalk(struct chan *,
688 struct chan *, char **unused_char_pp_t, int unused_int,
689 struct dirtab *, int unused_intw, Devgen *);
690 int devwstat(struct chan *, uint8_t * unused_uint8_p_t, int);
691 char *devchaninfo(struct chan *chan, char *ret, size_t ret_l);
692 void disinit(void *);
693 void disfault(void *, char *unused_char_p_t);
694 int domount(struct chan **, struct mhead **);
695 void drawactive(int);
697 void dumpstack(void);
698 struct fgrp *dupfgrp(struct proc *, struct fgrp *);
699 void egrpcpy(struct egrp *, struct egrp *);
700 int emptystr(char *unused_char_p_t);
701 int eqchan(struct chan *, struct chan *, int);
702 int eqqid(struct qid, struct qid);
704 void errstr(char *unused_char_p_t, int);
709 int export(int unused_int, char *unused_char_p_t, int);
710 uint64_t fastticks(uint64_t *);
711 uint64_t fastticks2ns(uint64_t);
712 void fdclose(struct fgrp *, int);
713 struct chan *fdtochan(struct fgrp *, int unused_int, int, int, int);
714 int findmount(struct chan **, struct mhead **, int unused_int, int, struct qid);
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 void hnputl(void *, uint32_t);
723 void hnputs(void *, uint16_t);
724 struct block *iallocb(int);
725 void iallocsummary(void);
726 void printblock(struct block *b);
727 void ilock(spinlock_t *);
728 int iprint(char *unused_char_p_t, ...);
729 void isdir(struct chan *);
731 void iunlock(spinlock_t *);
732 void ixsummary(void);
734 int kbdcr2nl(struct queue *, int);
735 int kbdputc(struct queue *, int);
737 void kproc(char *unused_char_p_t, void (*)(void *), void *, int);
738 int fgrpclose(struct fgrp *, int);
739 void kprocchild(struct proc *, void (*)(void *), void *);
740 void (*kproftick) (uint32_t);
741 void ksetenv(char *unused_char_p_t, char *, int);
742 //void kstrncpy( char *unused_char_p_t, char*, int unused_int, sizeof(char*, char*));
743 void kstrdup(char **unused_char_pp_t, char *unused_char_p_t);
745 struct cmdtab *lookupcmd(struct cmdbuf *, struct cmdtab *, int);
746 struct block *mem2bl(uint8_t * unused_uint8_p_t, int);
747 int memusehigh(void);
748 void microdelay(int);
749 uint64_t mk64fract(uint64_t, uint64_t);
750 void mkqid(struct qid *, int64_t, uint32_t, int);
752 struct chan *mntauth(struct chan *, char *unused_char_p_t);
753 long mntversion(struct chan *, char *unused_char_p_t, int unused_int, int);
754 void mountfree(struct mount *);
755 void mousetrack(int unused_int, int, int, int);
756 uint64_t ms2fastticks(uint32_t);
757 void mul64fract(uint64_t *, uint64_t, uint64_t);
758 void muxclose(struct mnt *);
759 struct chan *namec(char *unused_char_p_t, int unused_int, int, uint32_t);
760 struct chan *newchan(void);
761 struct egrp *newegrp(void);
762 struct fgrp *newfgrp(void);
763 struct mount *newmount(struct mhead *, struct chan *, int unused_int,
764 char *unused_char_p_t);
765 struct pgrp *newpgrp(void);
766 struct proc *newproc(void);
767 char *nextelem(char *unused_char_p_t, char *);
769 struct cname *newcname(char *unused_char_p_t);
770 void notkilled(void);
772 uint64_t ns2fastticks(uint64_t);
773 int okaddr(uint32_t, uint32_t, int);
774 int openmode(uint32_t);
775 struct block *packblock(struct block *);
776 struct block *padblock(struct block *, int);
778 struct cmdbuf *parsecmd(char *unused_char_p_t, int);
780 void pgrpcpy(struct pgrp *, struct pgrp *);
782 int progfdprint(struct chan *, int unused_int, int, char *unused_char_p_t,
784 int pullblock(struct block **, int);
785 struct block *pullupblock(struct block *, int);
786 struct block *pullupqueue(struct queue *, int);
787 void putmhead(struct mhead *);
788 void putstrn(char *unused_char_p_t, int);
789 void qaddlist(struct queue *, struct block *);
790 struct block *qbread(struct queue *, int);
791 long qbwrite(struct queue *, struct block *);
792 long qibwrite(struct queue *q, struct block *b);
793 struct queue *qbypass(void (*)(void *, struct block *), void *);
794 int qcanread(struct queue *);
795 void qclose(struct queue *);
796 int qconsume(struct queue *, void *, int);
797 struct block *qcopy(struct queue *, int unused_int, uint32_t);
798 struct block *qclone(struct queue *q, int header_len, int len,
800 struct block *blist_clone(struct block *blist, int header_len, int len,
802 int qdiscard(struct queue *, int);
803 void qflush(struct queue *);
804 void qfree(struct queue *);
805 int qfull(struct queue *);
806 struct block *qget(struct queue *);
807 void qhangup(struct queue *, char *unused_char_p_t);
808 int qisclosed(struct queue *);
809 int qiwrite(struct queue *, void *, int);
810 int qlen(struct queue *);
811 void qnoblock(struct queue *, int);
812 struct queue *qopen(int unused_int, int, void (*)(void *), void *);
813 int qpass(struct queue *, struct block *);
814 int qpassnolim(struct queue *, struct block *);
815 int qproduce(struct queue *, void *, int);
816 void qputback(struct queue *, struct block *);
817 long qread(struct queue *, void *, int);
818 struct block *qremove(struct queue *);
819 void qreopen(struct queue *);
820 void qsetlimit(struct queue *, int);
821 int qwindow(struct queue *);
822 int qwrite(struct queue *, void *, int);
823 void randominit(void);
824 uint32_t randomread(void *, uint32_t);
825 void *realloc(void *, uint32_t);
826 int readmem(unsigned long offset, char *buf, unsigned long n,
827 void *mem, size_t mem_len);
828 int readnum(unsigned long off, char *buf, unsigned long n, unsigned long val,
830 int readstr(unsigned long offset, char *buf, unsigned long n, char *str);
831 int readnum_int64_t(uint32_t, char *unused_char_p_t, uint32_t, int64_t, int);
832 void ready(struct proc *);
833 void renameproguser(char *unused_char_p_t, char *);
834 void renameuser(char *unused_char_p_t, char *);
835 void resrcwait(char *unused_char_p_t);
836 struct proc *runproc(void);
838 void (*serwrite) (char *unused_char_p_t, int);
839 int setcolor(uint32_t, uint32_t, uint32_t, uint32_t);
841 void setmalloctag(void *, uint32_t);
843 void setrealloctag(void *, uint32_t);
844 char *skipslash(char *unused_char_p_t);
845 void *smalloc(uint32_t);
850 void swiproc(struct proc *, int);
851 uint32_t _tas(uint32_t *);
852 uint32_t tk2ms(uint32_t);
853 #define TK2MS(x) ((x)*(1000/HZ))
854 uint64_t tod2fastticks(int64_t);
855 int64_t todget(int64_t *);
857 void todsetfreq(int64_t);
859 void todset(int64_t, int64_t, int);
861 struct block *trimblock(struct block *, int unused_int, int);
864 void uartputs(char *unused_char_p_t, int);
865 long unionread(struct chan *, void *, long);
866 void unlock(spinlock_t *);
868 uint32_t userpc(void);
869 void validname(char *unused_char_p_t, int);
870 void validstat(uint8_t * unused_uint8_p_t, int);
871 void validwstatname(char *unused_char_p_t);
872 int walk(struct chan **, char **unused_char_pp_t, int unused_int, int, int *);
873 void werrstr(char *unused_char_p_t, ...);
874 void *xalloc(uint32_t);
875 void *xallocz(uint32_t, int);
877 void xhole(uint32_t, uint32_t);
879 int xmerge(void *, void *);
880 void *xspanalloc(uint32_t, int unused_int, uint32_t);
883 void validaddr(void *, uint32_t, int);
884 void *vmemchr(void *, int unused_int, int);
885 void hnputv(void *, int64_t);
886 void hnputl(void *, uint32_t);
887 void hnputs(void *, uint16_t);
888 int64_t nhgetv(void *);
889 uint32_t nhgetl(void *);
890 uint16_t nhgets(void *);
892 /* error messages, from inferno emu error.h */
893 extern char Enoerror[]; /* no error */
894 extern char Emount[]; /* inconsistent mount */
895 extern char Eunmount[]; /* not mounted */
896 extern char Eunion[]; /* not in union */
897 extern char Emountrpc[]; /* mount rpc error */
898 extern char Eshutdown[]; /* mounted device shut down */
899 extern char Eowner[]; /* not owner */
900 extern char Eunknown[]; /* unknown user or group id */
901 extern char Enocreate[]; /* mounted directory forbids creation */
902 extern char Enonexist[]; /* file does not exist */
903 extern char Eexist[]; /* file already exists */
904 extern char Ebadsharp[]; /* unknown device in # filename */
905 extern char Enotdir[]; /* not a directory */
906 extern char Eisdir[]; /* file is a directory */
907 extern char Ebadchar[]; /* bad character in file name */
908 extern char Efilename[]; /* file name syntax */
909 extern char Eperm[]; /* permission denied */
910 extern char Ebadusefd[]; /* inappropriate use of fd */
911 extern char Ebadarg[]; /* bad arg in system call */
912 extern char Einuse[]; /* device or object already in use */
913 extern char Eio[]; /* i/o error */
914 extern char Etoobig[]; /* read or write too large */
915 extern char Etoosmall[]; /* read or write too small */
916 extern char Enetaddr[]; /* bad network address */
917 extern char Emsgsize[]; /* message is too big for protocol */
918 extern char Enetbusy[]; /* network device is busy or allocated */
919 extern char Enoproto[]; /* network protocol not supported */
920 extern char Enoport[]; /* network port not available */
921 extern char Enoifc[]; /* bad interface or no free interface slots */
922 extern char Enolisten[]; /* not announced */
923 extern char Ehungup[]; /* i/o on hungup channel */
924 extern char Ebadctl[]; /* bad process or channel control request */
925 extern char Enodev[]; /* no free devices */
926 extern char Enoenv[]; /* no free environment resources */
927 extern char Ethread[]; /* thread exited */
928 extern char Enochild[]; /* no living children */
929 extern char Eioload[]; /* i/o error in demand load */
930 extern char Enovmem[]; /* out of memory: virtual memory */
931 extern char Ebadld[]; /* illegal line discipline */
932 extern char Ebadfd[]; /* fd out of range or not open */
933 extern char Eisstream[]; /* seek on a stream */
934 extern char Ebadexec[]; /* exec header invalid */
935 extern char Etimedout[]; /* connection timed out */
936 extern char Econrefused[]; /* connection refused */
937 extern char Econinuse[]; /* connection in use */
938 extern char Enetunreach[]; /* network unreachable */
939 extern char Eintr[]; /* interrupted */
940 extern char Enomem[]; /* out of memory: kernel */
941 extern char Esfnotcached[]; /* subfont not cached */
942 extern char Esoverlap[]; /* segments overlap */
943 extern char Emouseset[]; /* mouse type already set */
944 extern char Eshort[]; /* i/o count too small */
945 extern char Enobitstore[]; /* out of screen memory */
946 extern char Egreg[]; /* jim'll fix it */
947 extern char Ebadspec[]; /* bad attach specifier */
948 extern char Estopped[]; /* thread must be stopped */
949 extern char Enoattach[]; /* mount/attach disallowed */
950 extern char Eshortstat[]; /* stat buffer too small */
951 extern char Enegoff[]; /* negative i/o offset */
952 extern char Ebadstat[]; /* malformed stat buffer */
953 extern char Ecmdargs[]; /* wrong #args in control message */
954 extern char Enofd[]; /* no free file descriptors */
955 extern char Enoctl[]; /* unknown control request */
956 extern char Eprocdied[]; /* process died */
958 char *get_cur_genbuf(void);
961 #define NOW tsc2msec(read_tsc())
962 #define seconds() tsc2sec(read_tsc())
963 #define milliseconds() tsc2msec(read_tsc())
965 /* kern/drivers/dev/tab.c */
969 /* kern/src/ns/parse.c */
970 struct cmdbuf *parsecmd(char *p, int n);
971 void cmderror(struct cmdbuf *cb, char *s);
972 struct cmdtab *lookupcmd(struct cmdbuf *cb, struct cmdtab *ctab, int nctab);
974 /* kern/src/ns/sysfile.c */
975 int newfd(struct chan *c);
976 struct chan *fdtochan(struct fgrp *f, int fd, int mode, int chkmnt, int iref);
977 long kchanio(void *vc, void *buf, int n, int mode);
978 int openmode(uint32_t o);
979 void fdclose(struct fgrp *f, int fd);
980 int syschdir(char *path);
981 int grpclose(struct fgrp *f, int fd);
982 int sysclose(int fd);
983 int syscreate(char *path, int mode, uint32_t perm);
984 int sysdup(int old, int new);
985 int sysfstat(int fd, uint8_t*, int n);
986 int sysfstatakaros(int fd, struct kstat *);
987 char *sysfd2path(int fd);
988 int sysfauth(int fd, char *aname);
989 int sysfversion(int fd, unsigned int msize, char *vers, unsigned int arglen);
990 int syspipe(int fd[2]);
991 int sysfwstat(int fd, uint8_t * buf, int n);
992 long bindmount(struct chan *c, char *old, int flag, char *spec);
993 int sysbind(char *new, char *old, int flags);
994 int sysmount(int fd, int afd, char *old, int flags, char *spec);
995 int sysunmount(char *old, char *new);
996 int sysopen(char *path, int mode);
997 long unionread(struct chan *c, void *va, long n);
998 long sysread(int fd, void *va, long n);
999 long syspread(int fd, void *va, long n, int64_t off);
1000 int sysremove(char *path);
1001 int64_t sysseek(int fd, int64_t off, int whence);
1002 void validstat(uint8_t * s, int n);
1003 int sysstat(char *path, uint8_t*, int n);
1004 int sysstatakaros(char *path, struct kstat *);
1005 long syswrite(int fd, void *va, long n);
1006 long syspwrite(int fd, void *va, long n, int64_t off);
1007 int syswstat(char *path, uint8_t * buf, int n);
1008 struct dir *chandirstat(struct chan *c);
1009 struct dir *sysdirstat(char *name);
1010 struct dir *sysdirfstat(int fd);
1011 int sysdirwstat(char *name, struct dir *dir);
1012 int sysdirfwstat(int fd, struct dir *dir);
1013 long sysdirread(int fd, struct kdirent **d);
1014 int sysiounit(int fd);
1015 void close_9ns_files(struct proc *p, bool only_cloexec);
1016 void print_chaninfo(struct chan *ch);
1017 void print_9ns_files(struct proc *p);
1018 int plan9setup(struct proc *new_proc, struct proc *parent, int flags);
1020 int fd_getfl(int fd);
1021 int fd_setfl(int fd, int flags);
1023 /* kern/drivers/dev/srv.c */
1024 char *srvname(struct chan *c);
1026 static inline int abs(int a)
1034 extern unsigned int qiomaxatomic;
1036 /* special sections */
1037 #define __devtab __attribute__((__section__(".devtab")))
1039 #endif /* ROS_KERN_NS_H */