First Inferno imports
[akaros.git] / kern / include / ns.h
1 //INFERNO
2 #pragma src "/usr/inferno/lib9"
3 #pragma lib     "libc.a"
4
5 #define VERSION9P       "9P2000"
6
7 #define MAXWELEM        16
8
9 typedef
10 struct  Fcall
11 {
12         uchar   type;
13         u32int  fid;
14         ushort  tag;
15         /* union { */
16                 /* struct { */
17                         u32int  msize;          /* Tversion, Rversion */
18                         char    *version;       /* Tversion, Rversion */
19                 /* }; */
20                 /* struct { */
21                         ushort  oldtag;         /* Tflush */
22                 /* }; */
23                 /* struct { */
24                         char    *ename;         /* Rerror */
25                 /* }; */
26                 /* struct { */
27                         Qid     qid;            /* Rattach, Ropen, Rcreate */
28                         u32int  iounit;         /* Ropen, Rcreate */
29                 /* }; */
30                 /* struct { */
31                         Qid     aqid;           /* Rauth */
32                 /* }; */
33                 /* struct { */
34                         u32int  afid;           /* Tauth, Tattach */
35                         char    *uname;         /* Tauth, Tattach */
36                         char    *aname;         /* Tauth, Tattach */
37                 /* }; */
38                 /* struct { */
39                         u32int  perm;           /* Tcreate */ 
40                         char    *name;          /* Tcreate */
41                         uchar   mode;           /* Tcreate, Topen */
42                 /* }; */
43                 /* struct { */
44                         u32int  newfid;         /* Twalk */
45                         ushort  nwname;         /* Twalk */
46                         char    *wname[MAXWELEM];       /* Twalk */
47                 /* }; */
48                 /* struct { */
49                         ushort  nwqid;          /* Rwalk */
50                         Qid     wqid[MAXWELEM];         /* Rwalk */
51                 /* }; */
52                 /* struct { */
53                         vlong   offset;         /* Tread, Twrite */
54                         u32int  count;          /* Tread, Twrite, Rread */
55                         char    *data;          /* Twrite, Rread */
56                 /* }; */
57                 /* struct { */
58                         ushort  nstat;          /* Twstat, Rstat */
59                         uchar   *stat;          /* Twstat, Rstat */
60                 /* }; */
61         /* }; */
62 } Fcall;
63
64
65 #define GBIT8(p)        ((p)[0])
66 #define GBIT16(p)       ((p)[0]|((p)[1]<<8))
67 #define GBIT32(p)       ((u32int)((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24)))
68 #define GBIT64(p)       ((u32int)((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24)) |\
69                                 ((vlong)((p)[4]|((p)[5]<<8)|((p)[6]<<16)|((p)[7]<<24)) << 32))
70
71 #define PBIT8(p,v)      (p)[0]=(v)
72 #define PBIT16(p,v)     (p)[0]=(v);(p)[1]=(v)>>8
73 #define PBIT32(p,v)     (p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24
74 #define PBIT64(p,v)     (p)[0]=(v);(p)[1]=(v)>>8;(p)[2]=(v)>>16;(p)[3]=(v)>>24;\
75                         (p)[4]=(v)>>32;(p)[5]=(v)>>40;(p)[6]=(v)>>48;(p)[7]=(v)>>56
76
77 #define BIT8SZ          1
78 #define BIT16SZ         2
79 #define BIT32SZ         4
80 #define BIT64SZ         8
81 #define QIDSZ   (BIT8SZ+BIT32SZ+BIT64SZ)
82
83 /* STATFIXLEN includes leading 16-bit count */
84 /* The count, however, excludes itself; total size is BIT16SZ+count */
85 #define STATFIXLEN      (BIT16SZ+QIDSZ+5*BIT16SZ+4*BIT32SZ+1*BIT64SZ)   /* amount of fixed length data in a stat buffer */
86
87 #define NOTAG           (ushort)~0U     /* Dummy tag */
88 #define NOFID           (u32int)~0U     /* Dummy fid */
89 #define IOHDRSZ         24      /* ample room for Twrite/Rread header (iounit) */
90
91 enum
92 {
93         Tversion =      100,
94         Rversion,
95         Tauth = 102,
96         Rauth,
97         Tattach =       104,
98         Rattach,
99         Terror =        106,    /* illegal */
100         Rerror,
101         Tflush =        108,
102         Rflush,
103         Twalk =         110,
104         Rwalk,
105         Topen =         112,
106         Ropen,
107         Tcreate =       114,
108         Rcreate,
109         Tread =         116,
110         Rread,
111         Twrite =        118,
112         Rwrite,
113         Tclunk =        120,
114         Rclunk,
115         Tremove =       122,
116         Rremove,
117         Tstat =         124,
118         Rstat,
119         Twstat =        126,
120         Rwstat,
121         Tmax,
122 };
123
124 uint    convM2S(uchar*, uint, Fcall*);
125 uint    convS2M(Fcall*, uchar*, uint);
126 uint    sizeS2M(Fcall*);
127
128 int     statcheck(uchar *abuf, uint nbuf);
129 uint    convM2D(uchar*, uint, Dir*, char*);
130 uint    convD2M(Dir*, uchar*, uint);
131 uint    sizeD2M(Dir*);
132
133 int     fcallfmt(Fmt*);
134 int     dirfmt(Fmt*);
135 int     dirmodefmt(Fmt*);
136
137 int     read9pmsg(int, void*, uint);
138
139 #pragma varargck        type    "F"     Fcall*
140 #pragma varargck        type    "M"     ulong
141 #pragma varargck        type    "D"     Dir*
142
143 typedef struct Alarms   Alarms;
144 typedef struct Block    Block;
145 typedef struct Bkpt Bkpt;
146 typedef struct BkptCond BkptCond;
147 typedef struct Chan     Chan;
148 typedef struct Cmdbuf   Cmdbuf;
149 typedef struct Cmdtab   Cmdtab;
150 typedef struct Cname    Cname;
151 typedef struct Crypt    Crypt;
152 typedef struct Dev      Dev;
153 typedef struct DevConf  DevConf;
154 typedef struct Dirtab   Dirtab;
155 typedef struct Edf      Edf;
156 typedef struct Egrp     Egrp;
157 typedef struct Evalue   Evalue;
158 typedef struct Fgrp     Fgrp;
159 typedef struct List     List;
160 typedef struct Log      Log;
161 typedef struct Logflag  Logflag;
162 typedef struct Mntcache Mntcache;
163 typedef struct Mntparam Mntparam;
164 typedef struct Mount    Mount;
165 typedef struct Mntrpc   Mntrpc;
166 typedef struct Mntwalk  Mntwalk;
167 typedef struct Mnt      Mnt;
168 typedef struct Mhead    Mhead;
169 typedef struct Osenv    Osenv;
170 typedef struct Pgrp     Pgrp;
171 typedef struct Proc     Proc;
172 typedef struct QLock    QLock;
173 typedef struct Queue    Queue;
174 typedef struct Ref      Ref;
175 typedef struct Rendez   Rendez;
176 typedef struct Rept     Rept;
177 typedef struct Rootdata Rootdata;
178 typedef struct RWlock   RWlock;
179 typedef struct Signerkey Signerkey;
180 typedef struct Skeyset  Skeyset;
181 typedef struct Talarm   Talarm;
182 typedef struct Timer    Timer;
183 typedef struct Timers   Timers;
184 typedef struct Uart     Uart;
185 typedef struct Walkqid  Walkqid;
186 typedef int    Devgen(Chan*, char*, Dirtab*, int, int, Dir*);
187
188 #pragma incomplete DevConf
189 #pragma incomplete Edf
190 #pragma incomplete Mntcache
191 #pragma incomplete Mntrpc
192 #pragma incomplete Queue
193 #pragma incomplete Timers
194
195 #include "fcall.h"
196 #include <pool.h>
197
198 struct Ref
199 {
200         Lock    l;
201         long    ref;
202 };
203
204 struct Rendez
205 {
206         Lock;
207         Proc    *p;
208 };
209
210 struct Rept
211 {
212         Lock    l;
213         Rendez  r;
214         void    *o;
215         int     t;
216         int     (*active)(void*);
217         int     (*ck)(void*, int);
218         void    (*f)(void*);    /* called with VM acquire()'d */
219 };
220
221 struct Osenv
222 {
223         char    *syserrstr;     /* last error from a system call, errbuf0 or 1 */
224         char    *errstr;        /* reason we're unwinding the error stack, errbuf1 or 0 */
225         char    errbuf0[ERRMAX];
226         char    errbuf1[ERRMAX];
227         Pgrp*   pgrp;           /* Ref to namespace, working dir and root */
228         Fgrp*   fgrp;           /* Ref to file descriptors */
229         Egrp*   egrp;   /* Environment vars */
230         Skeyset*        sigs;           /* Signed module keys */
231         Rendez* rend;           /* Synchro point */
232         Queue*  waitq;          /* Info about dead children */
233         Queue*  childq;         /* Info about children for debuggers */
234         void*   debug;          /* Debugging master */
235         int     uid;            /* Numeric user id for system */
236         int     gid;            /* Numeric group id for system */
237         char*   user;           /* Inferno user name */
238         FPenv   fpu;            /* Floating point thread state */
239 };
240
241 enum
242 {
243         Nopin = -1
244 };
245
246 struct QLock
247 {
248         Lock    use;                    /* to access Qlock structure */
249         Proc    *head;                  /* next process waiting for object */
250         Proc    *tail;                  /* last process waiting for object */
251         int     locked;                 /* flag */
252 };
253
254 struct RWlock
255 {
256         Lock;                           /* Lock modify lock */
257         QLock   x;                      /* Mutual exclusion lock */
258         QLock   k;                      /* Lock for waiting writers */
259         int     readers;                /* Count of readers in lock */
260 };
261
262 struct Talarm
263 {
264         Lock;
265         Proc*   list;
266 };
267
268 struct Alarms
269 {
270         QLock;
271         Proc*   head;
272 };
273
274 struct Rootdata
275 {
276         int     dotdot;
277         void    *ptr;
278         int     size;
279         int     *sizep;
280 };
281
282 /*
283  * Access types in namec & channel flags
284  */
285 enum
286 {
287         Aaccess,                        /* as in stat, wstat */
288         Abind,                  /* for left-hand-side of bind */
289         Atodir,                         /* as in chdir */
290         Aopen,                          /* for i/o */
291         Amount,                         /* to be mounted or mounted upon */
292         Acreate,                        /* is to be created */
293         Aremove,                        /* will be removed by caller */
294
295         COPEN   = 0x0001,               /* for i/o */
296         CMSG    = 0x0002,               /* the message channel for a mount */
297         CCEXEC  = 0x0008,               /* close on exec */
298         CFREE   = 0x0010,               /* not in use */
299         CRCLOSE = 0x0020,               /* remove on close */
300         CCACHE  = 0x0080,               /* client cache */
301 };
302
303 enum
304 {
305         BINTR           =       (1<<0),
306         BFREE           =       (1<<1),
307         Bipck   =       (1<<2),         /* ip checksum */
308         Budpck  =       (1<<3),         /* udp checksum */
309         Btcpck  =       (1<<4),         /* tcp checksum */
310         Bpktck  =       (1<<5),         /* packet checksum */
311 };
312
313 struct Block
314 {
315         Block*  next;
316         Block*  list;
317         uchar*  rp;                     /* first unconsumed byte */
318         uchar*  wp;                     /* first empty byte */
319         uchar*  lim;                    /* 1 past the end of the buffer */
320         uchar*  base;                   /* start of the buffer */
321         void    (*free)(Block*);
322         ushort  flag;
323         ushort  checksum;               /* IP checksum of complete packet (minus media header) */
324 };
325 #define BLEN(s) ((s)->wp - (s)->rp)
326 #define BALLOC(s) ((s)->lim - (s)->base)
327
328 struct Chan
329 {
330         Lock;
331         Ref;
332         Chan*   next;                   /* allocation */
333         Chan*   link;
334         vlong   offset;                 /* in file */
335         ushort  type;
336         ulong   dev;
337         ushort  mode;                   /* read/write */
338         ushort  flag;
339         Qid     qid;
340         int     fid;                    /* for devmnt */
341         ulong   iounit; /* chunk size for i/o; 0==default */
342         Mhead*  umh;                    /* mount point that derived Chan; used in unionread */
343         Chan*   umc;                    /* channel in union; held for union read */
344         QLock   umqlock;                /* serialize unionreads */
345         int     uri;                    /* union read index */
346         int     dri;                    /* devdirread index */
347         ulong   mountid;
348         Mntcache *mcp;                  /* Mount cache pointer */
349         Mnt             *mux;           /* Mnt for clients using me for messages */
350         union {
351                 void*   aux;
352                 char    tag[4];         /* for iproute */
353         };
354         Chan*   mchan;                  /* channel to mounted server */
355         Qid     mqid;                   /* qid of root of mount point */
356         Cname   *name;
357 };
358
359 struct Cname
360 {
361         Ref;
362         int     alen;                   /* allocated length */
363         int     len;                    /* strlen(s) */
364         char    *s;
365 };
366
367 struct Dev
368 {
369         int     dc;
370         char*   name;
371
372         void    (*reset)(void);
373         void    (*init)(void);
374         void    (*shutdown)(void);
375         Chan*   (*attach)(char*);
376         Walkqid*        (*walk)(Chan*, Chan*, char**, int);
377         int     (*stat)(Chan*, uchar*, int);
378         Chan*   (*open)(Chan*, int);
379         void    (*create)(Chan*, char*, int, ulong);
380         void    (*close)(Chan*);
381         long    (*read)(Chan*, void*, long, vlong);
382         Block*  (*bread)(Chan*, long, ulong);
383         long    (*write)(Chan*, void*, long, vlong);
384         long    (*bwrite)(Chan*, Block*, ulong);
385         void    (*remove)(Chan*);
386         int     (*wstat)(Chan*, uchar*, int);
387         void    (*power)(int);  /* power mgt: power(1) → on, power (0) → off */
388         int     (*config)(int, char*, DevConf*);
389 };
390
391 struct Dirtab
392 {
393         char    name[KNAMELEN];
394         Qid     qid;
395         vlong   length;
396         long    perm;
397 };
398
399 struct Walkqid
400 {
401         Chan    *clone;
402         int     nqid;
403         Qid     qid[1];
404 };
405
406 enum
407 {
408         NSMAX   =       1000,
409         NSLOG   =       7,
410         NSCACHE =       (1<<NSLOG),
411 };
412
413 struct Mntwalk                          /* state for /proc/#/ns */
414 {
415         int             cddone;
416         ulong   id;
417         Mhead*  mh;
418         Mount*  cm;
419 };
420
421 struct Mount
422 {
423         ulong   mountid;
424         Mount*  next;
425         Mhead*  head;
426         Mount*  copy;
427         Mount*  order;
428         Chan*   to;                     /* channel replacing channel */
429         int     mflag;
430         char    *spec;
431 };
432
433 struct Mhead
434 {
435         Ref;
436         RWlock  lock;
437         Chan*   from;                   /* channel mounted upon */
438         Mount*  mount;                  /* what's mounted upon it */
439         Mhead*  hash;                   /* Hash chain */
440 };
441
442 struct Mnt
443 {
444         Lock;
445         /* references are counted using c->ref; channels on this mount point incref(c->mchan) == Mnt.c */
446         Chan    *c;             /* Channel to file service */
447         Proc    *rip;           /* Reader in progress */
448         Mntrpc  *queue;         /* Queue of pending requests on this channel */
449         ulong   id;             /* Multiplexer id for channel check */
450         Mnt     *list;          /* Free list */
451         int     flags;          /* cache */
452         int     msize;          /* data + IOHDRSZ */
453         char    *version;                       /* 9P version */
454         Queue   *q;             /* input queue */
455 };
456
457 enum
458 {
459         RENDLOG =       5,
460         RENDHASH =      1<<RENDLOG,             /* Hash to lookup rendezvous tags */
461         MNTLOG  =       5,
462         MNTHASH =       1<<MNTLOG,              /* Hash to walk mount table */
463         DELTAFD=                20,             /* allocation quantum for process file descriptors */
464         MAXNFD =                4000,           /* max per process file descriptors */
465         MAXKEY =                8,      /* keys for signed modules */
466 };
467 #define MOUNTH(p,qid)   ((p)->mnthash[(qid).path&((1<<MNTLOG)-1)])
468
469 struct Mntparam {
470         Chan*   chan;
471         Chan*   authchan;
472         char*   spec;
473         int     flags;
474 };
475
476 struct Pgrp
477 {
478         Ref;                            /* also used as a lock when mounting */
479         ulong   pgrpid;
480         QLock   debug;                  /* single access via devproc.c */
481         RWlock  ns;                     /* Namespace n read/one write lock */
482         QLock   nsh;
483         Mhead*  mnthash[MNTHASH];
484         int     progmode;
485         Chan*   dot;
486         Chan*   slash;
487         int     nodevs;
488         int     pin;
489 };
490
491 struct Fgrp
492 {
493         Lock;
494         Ref;
495         Chan**  fd;
496         int     nfd;                    /* number of fd slots */
497         int     maxfd;                  /* highest fd in use */
498         int     minfd;                  /* lower bound on free fd */
499 };
500
501 struct Evalue
502 {
503         char    *var;
504         char    *val;
505         int     len;
506         Qid     qid;
507         Evalue  *next;
508 };
509
510 struct Egrp
511 {
512         Ref;
513         QLock;
514         Evalue  *entries;
515         ulong   path;   /* qid.path of next Evalue to be allocated */
516         ulong   vers;   /* of Egrp */
517 };
518
519 struct Signerkey
520 {
521         Ref;
522         char*   owner;
523         ushort  footprint;
524         ulong   expires;
525         void*   alg;
526         void*   pk;
527         void    (*pkfree)(void*);
528 };
529
530 struct Skeyset
531 {
532         Ref;
533         QLock;
534         ulong   flags;
535         char*   devs;
536         int     nkey;
537         Signerkey       *keys[MAXKEY];
538 };
539
540 /*
541  * fasttick timer interrupts
542  */
543 enum {
544         /* Mode */
545         Trelative,      /* timer programmed in ns from now */
546         Tabsolute,      /* timer programmed in ns since epoch */
547         Tperiodic,      /* periodic timer, period in ns */
548 };
549
550 struct Timer
551 {
552         /* Public interface */
553         int     tmode;          /* See above */
554         vlong   tns;            /* meaning defined by mode */
555         void    (*tf)(Ureg*, Timer*);
556         void    *ta;
557         /* Internal */
558         Lock;
559         Timers  *tt;            /* Timers queue this timer runs on */
560         vlong   twhen;          /* ns represented in fastticks */
561         Timer   *tnext;
562 };
563
564 enum
565 {
566         Dead = 0,               /* Process states */
567         Moribund,
568         Ready,
569         Scheding,
570         Running,
571         Queueing,
572         Wakeme,
573         Broken,
574         Stopped,
575         Rendezvous,
576         Waitrelease,
577
578         Proc_stopme = 1,        /* devproc requests */
579         Proc_exitme,
580         Proc_traceme,
581         Proc_exitbig,
582
583         NERR            = 30,
584
585         Unknown         = 0,
586         IdleGC,
587         Interp,
588         BusyGC,
589
590         PriLock         = 0,    /* Holding Spin lock */
591         PriEdf, /* active edf processes */
592         PriRelease,     /* released edf processes */
593         PriRealtime,            /* Video telephony */
594         PriHicodec,             /* MPEG codec */
595         PriLocodec,             /* Audio codec */
596         PriHi,                  /* Important task */
597         PriNormal,
598         PriLo,
599         PriBackground,
600         PriExtra,       /* edf processes we don't care about */
601         Nrq
602 };
603
604 struct Proc
605 {
606         Label           sched;          /* known to l.s */
607         char*           kstack;         /* known to l.s */
608         Mach*           mach;           /* machine running this proc */
609         char            text[KNAMELEN];
610         Proc*           rnext;          /* next process in run queue */
611         Proc*           qnext;          /* next process on queue for a QLock */
612         QLock*          qlock;          /* addrof qlock being queued for DEBUG */
613         int             state;
614         int             type;
615         void*           prog;           /* Dummy Prog for interp release */
616         void*           iprog;
617         Osenv*          env;
618         Osenv           defenv;
619         int             swipend;        /* software interrupt pending for Prog */
620         Lock            sysio;          /* note handler lock */
621         char*           psstate;        /* What /proc/#/status reports */
622         ulong           pid;
623         int             fpstate;
624         int             procctl;        /* Control for /proc debugging */
625         ulong           pc;             /* DEBUG only */
626         Lock    rlock;  /* sync between sleep/swiproc for r */
627         Rendez*         r;              /* rendezvous point slept on */
628         Rendez          sleep;          /* place for syssleep/debug */
629         int             killed;         /* by swiproc */
630         int             kp;             /* true if a kernel process */
631         ulong           alarm;          /* Time of call */
632         int             pri;            /* scheduler priority */
633         ulong           twhen;
634         Rendez*         trend;
635         Proc*           tlink;
636         int             (*tfn)(void*);
637         void            (*kpfun)(void*);
638         void*           arg;
639         FPU             fpsave;
640         int             scallnr;
641         int             nerrlab;
642         Label           errlab[NERR];
643         char    genbuf[128];    /* buffer used e.g. for last name element from namec */
644         Mach*           mp;             /* machine this process last ran on */
645         Mach*           wired;
646         ulong           movetime;       /* next time process should switch processors */
647         ulong           delaysched;
648         int                     preempted;      /* process yielding in interrupt */
649         ulong           qpc;            /* last call that blocked in qlock */
650         void*           dbgreg;         /* User registers for devproc */
651         int             dbgstop;                /* don't run this kproc */
652         Edf*    edf;    /* if non-null, real-time proc, edf contains scheduling params */
653 };
654
655 enum
656 {
657         /* kproc flags */
658         KPDUPPG         = (1<<0),
659         KPDUPFDG        = (1<<1),
660         KPDUPENVG       = (1<<2),
661         KPDUP = KPDUPPG | KPDUPFDG | KPDUPENVG
662 };
663
664 enum {
665         BrkSched,
666         BrkNoSched,
667 };
668
669 struct BkptCond
670 {
671         uchar op;
672         ulong val;
673         BkptCond *next;
674 };
675
676 struct Bkpt
677 {
678         int id;
679         ulong addr;
680         BkptCond *conditions;
681         Instr instr;
682         void (*handler)(Bkpt*);
683         void *aux;
684         Bkpt *next;
685         Bkpt *link;
686 };
687
688 enum
689 {
690         PRINTSIZE =     256,
691         NUMSIZE =       12,             /* size of formatted number */
692         MB =            (1024*1024),
693         READSTR =       1000,           /* temporary buffer size for device reads */
694 };
695
696 extern  Conf    conf;
697 extern  char*   conffile;
698 extern  int     consoleprint;
699 extern  Dev*    devtab[];
700 extern  char*   eve;
701 extern  int     hwcurs;
702 extern  FPU     initfp;
703 extern  Queue   *kbdq;
704 extern  Queue   *kscanq;
705 extern  Ref     noteidalloc;
706 extern  Queue   *printq;
707 extern  uint    qiomaxatomic;
708 extern  char*   statename[];
709 extern  char*   sysname;
710 extern  Talarm  talarm;
711
712 /*
713  *  action log
714  */
715 struct Log {
716         Lock;
717         int     opens;
718         char*   buf;
719         char    *end;
720         char    *rptr;
721         int     len;
722         int     nlog;
723         int     minread;
724
725         int     logmask;        /* mask of things to debug */
726
727         QLock   readq;
728         Rendez  readr;
729 };
730
731 struct Logflag {
732         char*   name;
733         int     mask;
734 };
735
736 struct Cmdbuf
737 {
738         char    *buf;
739         char    **f;
740         int     nf;
741 };
742
743 struct Cmdtab
744 {
745         int     index;  /* used by client to switch on result */
746         char    *cmd;   /* command name */
747         int     narg;   /* expected #args; 0 ==> variadic */
748 };
749
750 enum
751 {
752         MAXPOOL         = 8,
753 };
754
755 extern Pool*    mainmem;
756 extern Pool*    heapmem;
757 extern Pool*    imagmem;
758
759 /* queue state bits,  Qmsg, Qcoalesce, and Qkick can be set in qopen */
760 enum
761 {
762         /* Queue.state */
763         Qstarve         = (1<<0),       /* consumer starved */
764         Qmsg            = (1<<1),       /* message stream */
765         Qclosed         = (1<<2),       /* queue has been closed/hungup */
766         Qflow           = (1<<3),       /* producer flow controlled */
767         Qcoalesce       = (1<<4),       /* coallesce packets on read */
768         Qkick           = (1<<5),       /* always call the kick routine after qwrite */
769 };
770
771 #define DEVDOTDOT -1
772
773 #pragma varargck        argpos  print   1
774 #pragma varargck        argpos  snprint 3
775 #pragma varargck        argpos  seprint 3
776 #pragma varargck        argpos  sprint  2
777 #pragma varargck        argpos  fprint  2
778 #pragma varargck        argpos  iprint  1
779 #pragma varargck        argpos  panic   1
780 #pragma varargck        argpos  kwerrstr        1
781 #pragma varargck        argpos  kprint  1
782
783 #pragma varargck        type    "lld"   vlong
784 #pragma varargck        type    "llx"   vlong
785 #pragma varargck        type    "lld"   uvlong
786 #pragma varargck        type    "llx"   uvlong
787 #pragma varargck        type    "lx"    void*
788 #pragma varargck        type    "ld"    long
789 #pragma varargck        type    "lx"    long
790 #pragma varargck        type    "ld"    ulong
791 #pragma varargck        type    "lx"    ulong
792 #pragma varargck        type    "d"     int
793 #pragma varargck        type    "x"     int
794 #pragma varargck        type    "c"     int
795 #pragma varargck        type    "C"     int
796 #pragma varargck        type    "d"     uint
797 #pragma varargck        type    "x"     uint
798 #pragma varargck        type    "c"     uint
799 #pragma varargck        type    "C"     uint
800 #pragma varargck        type    "f"     double
801 #pragma varargck        type    "e"     double
802 #pragma varargck        type    "g"     double
803 #pragma varargck        type    "s"     char*
804 #pragma varargck        type    "S"     Rune*
805 #pragma varargck        type    "r"     void
806 #pragma varargck        type    "%"     void
807 #pragma varargck        type    "I"     uchar*
808 #pragma varargck        type    "V"     uchar*
809 #pragma varargck        type    "E"     uchar*
810 #pragma varargck        type    "M"     uchar*
811 #pragma varargck        type    "p"     void*
812 #pragma varargck        type    "q"     char*