1*8ccd4a63SDavid du Colombier #define KNAMELEN 28 /* max length of name held in kernel */ 2*8ccd4a63SDavid du Colombier #define DOMLEN 64 3*8ccd4a63SDavid du Colombier 4*8ccd4a63SDavid du Colombier #define BLOCKALIGN 8 5*8ccd4a63SDavid du Colombier 6*8ccd4a63SDavid du Colombier typedef struct Alarms Alarms; 7*8ccd4a63SDavid du Colombier typedef struct Block Block; 8*8ccd4a63SDavid du Colombier typedef struct CSN CSN; 9*8ccd4a63SDavid du Colombier typedef struct Chan Chan; 10*8ccd4a63SDavid du Colombier typedef struct Cmdbuf Cmdbuf; 11*8ccd4a63SDavid du Colombier typedef struct Cmdtab Cmdtab; 12*8ccd4a63SDavid du Colombier typedef struct Cname Cname; 13*8ccd4a63SDavid du Colombier typedef struct Conf Conf; 14*8ccd4a63SDavid du Colombier typedef struct Dev Dev; 15*8ccd4a63SDavid du Colombier typedef struct Dirtab Dirtab; 16*8ccd4a63SDavid du Colombier typedef struct Edfinterface Edfinterface; 17*8ccd4a63SDavid du Colombier typedef struct Egrp Egrp; 18*8ccd4a63SDavid du Colombier typedef struct Evalue Evalue; 19*8ccd4a63SDavid du Colombier typedef struct Fgrp Fgrp; 20*8ccd4a63SDavid du Colombier typedef struct FPsave FPsave; 21*8ccd4a63SDavid du Colombier typedef struct DevConf DevConf; 22*8ccd4a63SDavid du Colombier typedef struct Label Label; 23*8ccd4a63SDavid du Colombier typedef struct List List; 24*8ccd4a63SDavid du Colombier typedef struct Log Log; 25*8ccd4a63SDavid du Colombier typedef struct Logflag Logflag; 26*8ccd4a63SDavid du Colombier typedef struct Mntcache Mntcache; 27*8ccd4a63SDavid du Colombier typedef struct Mount Mount; 28*8ccd4a63SDavid du Colombier typedef struct Mntrpc Mntrpc; 29*8ccd4a63SDavid du Colombier typedef struct Mntwalk Mntwalk; 30*8ccd4a63SDavid du Colombier typedef struct Mnt Mnt; 31*8ccd4a63SDavid du Colombier typedef struct Mhead Mhead; 32*8ccd4a63SDavid du Colombier typedef struct Note Note; 33*8ccd4a63SDavid du Colombier typedef struct Page Page; 34*8ccd4a63SDavid du Colombier typedef struct Palloc Palloc; 35*8ccd4a63SDavid du Colombier typedef struct Perf Perf; 36*8ccd4a63SDavid du Colombier typedef struct Pgrps Pgrps; 37*8ccd4a63SDavid du Colombier typedef struct PhysUart PhysUart; 38*8ccd4a63SDavid du Colombier typedef struct Pgrp Pgrp; 39*8ccd4a63SDavid du Colombier typedef struct Physseg Physseg; 40*8ccd4a63SDavid du Colombier typedef struct Proc Proc; 41*8ccd4a63SDavid du Colombier typedef struct Pte Pte; 42*8ccd4a63SDavid du Colombier typedef struct Pthash Pthash; 43*8ccd4a63SDavid du Colombier typedef struct Queue Queue; 44*8ccd4a63SDavid du Colombier typedef struct Ref Ref; 45*8ccd4a63SDavid du Colombier typedef struct Rendez Rendez; 46*8ccd4a63SDavid du Colombier typedef struct Rgrp Rgrp; 47*8ccd4a63SDavid du Colombier typedef struct RWlock RWlock; 48*8ccd4a63SDavid du Colombier typedef struct Schedq Schedq; 49*8ccd4a63SDavid du Colombier typedef struct Segment Segment; 50*8ccd4a63SDavid du Colombier typedef struct Session Session; 51*8ccd4a63SDavid du Colombier typedef struct Task Task; 52*8ccd4a63SDavid du Colombier typedef struct Talarm Talarm; 53*8ccd4a63SDavid du Colombier typedef struct Timer Timer; 54*8ccd4a63SDavid du Colombier typedef struct Uart Uart; 55*8ccd4a63SDavid du Colombier typedef struct Ureg Ureg; 56*8ccd4a63SDavid du Colombier typedef struct Waitq Waitq; 57*8ccd4a63SDavid du Colombier typedef struct Walkqid Walkqid; 58*8ccd4a63SDavid du Colombier typedef int Devgen(Chan*, char*, Dirtab*, int, int, Dir*); 59*8ccd4a63SDavid du Colombier 60*8ccd4a63SDavid du Colombier #include "fcall.h" 61*8ccd4a63SDavid du Colombier 62*8ccd4a63SDavid du Colombier enum 63*8ccd4a63SDavid du Colombier { 64*8ccd4a63SDavid du Colombier SnarfSize = 64*1024, 65*8ccd4a63SDavid du Colombier }; 66*8ccd4a63SDavid du Colombier 67*8ccd4a63SDavid du Colombier struct Conf 68*8ccd4a63SDavid du Colombier { 69*8ccd4a63SDavid du Colombier ulong nmach; /* processors */ 70*8ccd4a63SDavid du Colombier ulong nproc; /* processes */ 71*8ccd4a63SDavid du Colombier ulong monitor; /* has monitor? */ 72*8ccd4a63SDavid du Colombier ulong npage0; /* total physical pages of memory */ 73*8ccd4a63SDavid du Colombier ulong npage1; /* total physical pages of memory */ 74*8ccd4a63SDavid du Colombier ulong npage; /* total physical pages of memory */ 75*8ccd4a63SDavid du Colombier ulong upages; /* user page pool */ 76*8ccd4a63SDavid du Colombier ulong nimage; /* number of page cache image headers */ 77*8ccd4a63SDavid du Colombier ulong nswap; /* number of swap pages */ 78*8ccd4a63SDavid du Colombier int nswppo; /* max # of pageouts per segment pass */ 79*8ccd4a63SDavid du Colombier ulong base0; /* base of bank 0 */ 80*8ccd4a63SDavid du Colombier ulong base1; /* base of bank 1 */ 81*8ccd4a63SDavid du Colombier ulong copymode; /* 0 is copy on write, 1 is copy on reference */ 82*8ccd4a63SDavid du Colombier ulong ialloc; /* max interrupt time allocation in bytes */ 83*8ccd4a63SDavid du Colombier ulong pipeqsize; /* size in bytes of pipe queues */ 84*8ccd4a63SDavid du Colombier int nuart; /* number of uart devices */ 85*8ccd4a63SDavid du Colombier }; 86*8ccd4a63SDavid du Colombier 87*8ccd4a63SDavid du Colombier struct Label 88*8ccd4a63SDavid du Colombier { 89*8ccd4a63SDavid du Colombier jmp_buf buf; 90*8ccd4a63SDavid du Colombier }; 91*8ccd4a63SDavid du Colombier 92*8ccd4a63SDavid du Colombier struct Ref 93*8ccd4a63SDavid du Colombier { 94*8ccd4a63SDavid du Colombier Lock lk; 95*8ccd4a63SDavid du Colombier long ref; 96*8ccd4a63SDavid du Colombier }; 97*8ccd4a63SDavid du Colombier 98*8ccd4a63SDavid du Colombier struct Rendez 99*8ccd4a63SDavid du Colombier { 100*8ccd4a63SDavid du Colombier Lock lk; 101*8ccd4a63SDavid du Colombier Proc *p; 102*8ccd4a63SDavid du Colombier }; 103*8ccd4a63SDavid du Colombier 104*8ccd4a63SDavid du Colombier struct RWlock /* changed from kernel */ 105*8ccd4a63SDavid du Colombier { 106*8ccd4a63SDavid du Colombier int readers; 107*8ccd4a63SDavid du Colombier Lock lk; 108*8ccd4a63SDavid du Colombier QLock x; 109*8ccd4a63SDavid du Colombier QLock k; 110*8ccd4a63SDavid du Colombier }; 111*8ccd4a63SDavid du Colombier 112*8ccd4a63SDavid du Colombier struct Talarm 113*8ccd4a63SDavid du Colombier { 114*8ccd4a63SDavid du Colombier Lock lk; 115*8ccd4a63SDavid du Colombier Proc *list; 116*8ccd4a63SDavid du Colombier }; 117*8ccd4a63SDavid du Colombier 118*8ccd4a63SDavid du Colombier struct Alarms 119*8ccd4a63SDavid du Colombier { 120*8ccd4a63SDavid du Colombier QLock lk; 121*8ccd4a63SDavid du Colombier Proc *head; 122*8ccd4a63SDavid du Colombier }; 123*8ccd4a63SDavid du Colombier 124*8ccd4a63SDavid du Colombier /* 125*8ccd4a63SDavid du Colombier * Access types in namec & channel flags 126*8ccd4a63SDavid du Colombier */ 127*8ccd4a63SDavid du Colombier enum 128*8ccd4a63SDavid du Colombier { 129*8ccd4a63SDavid du Colombier Aaccess, /* as in stat, wstat */ 130*8ccd4a63SDavid du Colombier Abind, /* for left-hand-side of bind */ 131*8ccd4a63SDavid du Colombier Atodir, /* as in chdir */ 132*8ccd4a63SDavid du Colombier Aopen, /* for i/o */ 133*8ccd4a63SDavid du Colombier Amount, /* to be mounted or mounted upon */ 134*8ccd4a63SDavid du Colombier Acreate, /* is to be created */ 135*8ccd4a63SDavid du Colombier Aremove, /* will be removed by caller */ 136*8ccd4a63SDavid du Colombier 137*8ccd4a63SDavid du Colombier COPEN = 0x0001, /* for i/o */ 138*8ccd4a63SDavid du Colombier CMSG = 0x0002, /* the message channel for a mount */ 139*8ccd4a63SDavid du Colombier /* CCREATE = 0x0004, permits creation if c->mnt */ 140*8ccd4a63SDavid du Colombier CCEXEC = 0x0008, /* close on exec */ 141*8ccd4a63SDavid du Colombier CFREE = 0x0010, /* not in use */ 142*8ccd4a63SDavid du Colombier CRCLOSE = 0x0020, /* remove on close */ 143*8ccd4a63SDavid du Colombier CCACHE = 0x0080, /* client cache */ 144*8ccd4a63SDavid du Colombier }; 145*8ccd4a63SDavid du Colombier 146*8ccd4a63SDavid du Colombier /* flag values */ 147*8ccd4a63SDavid du Colombier enum 148*8ccd4a63SDavid du Colombier { 149*8ccd4a63SDavid du Colombier BINTR = (1<<0), 150*8ccd4a63SDavid du Colombier BFREE = (1<<1), 151*8ccd4a63SDavid du Colombier Bipck = (1<<2), /* ip checksum */ 152*8ccd4a63SDavid du Colombier Budpck = (1<<3), /* udp checksum */ 153*8ccd4a63SDavid du Colombier Btcpck = (1<<4), /* tcp checksum */ 154*8ccd4a63SDavid du Colombier Bpktck = (1<<5), /* packet checksum */ 155*8ccd4a63SDavid du Colombier }; 156*8ccd4a63SDavid du Colombier 157*8ccd4a63SDavid du Colombier struct Block 158*8ccd4a63SDavid du Colombier { 159*8ccd4a63SDavid du Colombier Block* next; 160*8ccd4a63SDavid du Colombier Block* list; 161*8ccd4a63SDavid du Colombier uchar* rp; /* first unconsumed byte */ 162*8ccd4a63SDavid du Colombier uchar* wp; /* first empty byte */ 163*8ccd4a63SDavid du Colombier uchar* lim; /* 1 past the end of the buffer */ 164*8ccd4a63SDavid du Colombier uchar* base; /* start of the buffer */ 165*8ccd4a63SDavid du Colombier void (*free)(Block*); 166*8ccd4a63SDavid du Colombier ushort flag; 167*8ccd4a63SDavid du Colombier ushort checksum; /* IP checksum of complete packet (minus media header) */ 168*8ccd4a63SDavid du Colombier }; 169*8ccd4a63SDavid du Colombier #define BLEN(s) ((s)->wp - (s)->rp) 170*8ccd4a63SDavid du Colombier #define BALLOC(s) ((s)->lim - (s)->base) 171*8ccd4a63SDavid du Colombier 172*8ccd4a63SDavid du Colombier struct Chan 173*8ccd4a63SDavid du Colombier { 174*8ccd4a63SDavid du Colombier Ref ref; 175*8ccd4a63SDavid du Colombier Chan* next; /* allocation */ 176*8ccd4a63SDavid du Colombier Chan* link; 177*8ccd4a63SDavid du Colombier vlong offset; /* in file */ 178*8ccd4a63SDavid du Colombier ushort type; 179*8ccd4a63SDavid du Colombier ulong dev; 180*8ccd4a63SDavid du Colombier ushort mode; /* read/write */ 181*8ccd4a63SDavid du Colombier ushort flag; 182*8ccd4a63SDavid du Colombier Qid qid; 183*8ccd4a63SDavid du Colombier int fid; /* for devmnt */ 184*8ccd4a63SDavid du Colombier ulong iounit; /* chunk size for i/o; 0==default */ 185*8ccd4a63SDavid du Colombier Mhead* umh; /* mount point that derived Chan; used in unionread */ 186*8ccd4a63SDavid du Colombier Chan* umc; /* channel in union; held for union read */ 187*8ccd4a63SDavid du Colombier QLock umqlock; /* serialize unionreads */ 188*8ccd4a63SDavid du Colombier int uri; /* union read index */ 189*8ccd4a63SDavid du Colombier int dri; /* devdirread index */ 190*8ccd4a63SDavid du Colombier ulong mountid; 191*8ccd4a63SDavid du Colombier Mntcache *mcp; /* Mount cache pointer */ 192*8ccd4a63SDavid du Colombier Mnt *mux; /* Mnt for clients using me for messages */ 193*8ccd4a63SDavid du Colombier void* aux; 194*8ccd4a63SDavid du Colombier Qid pgrpid; /* for #p/notepg */ 195*8ccd4a63SDavid du Colombier ulong mid; /* for ns in devproc */ 196*8ccd4a63SDavid du Colombier Chan* mchan; /* channel to mounted server */ 197*8ccd4a63SDavid du Colombier Qid mqid; /* qid of root of mount point */ 198*8ccd4a63SDavid du Colombier Session*session; 199*8ccd4a63SDavid du Colombier Cname *name; 200*8ccd4a63SDavid du Colombier }; 201*8ccd4a63SDavid du Colombier 202*8ccd4a63SDavid du Colombier struct Cname 203*8ccd4a63SDavid du Colombier { 204*8ccd4a63SDavid du Colombier Ref ref; 205*8ccd4a63SDavid du Colombier int alen; /* allocated length */ 206*8ccd4a63SDavid du Colombier int len; /* strlen(s) */ 207*8ccd4a63SDavid du Colombier char *s; 208*8ccd4a63SDavid du Colombier }; 209*8ccd4a63SDavid du Colombier 210*8ccd4a63SDavid du Colombier struct Dev 211*8ccd4a63SDavid du Colombier { 212*8ccd4a63SDavid du Colombier int dc; 213*8ccd4a63SDavid du Colombier char* name; 214*8ccd4a63SDavid du Colombier 215*8ccd4a63SDavid du Colombier void (*reset)(void); 216*8ccd4a63SDavid du Colombier void (*init)(void); 217*8ccd4a63SDavid du Colombier void (*shutdown)(void); 218*8ccd4a63SDavid du Colombier Chan* (*attach)(char*); 219*8ccd4a63SDavid du Colombier Walkqid* (*walk)(Chan*, Chan*, char**, int); 220*8ccd4a63SDavid du Colombier int (*stat)(Chan*, uchar*, int); 221*8ccd4a63SDavid du Colombier Chan* (*open)(Chan*, int); 222*8ccd4a63SDavid du Colombier void (*create)(Chan*, char*, int, ulong); 223*8ccd4a63SDavid du Colombier void (*close)(Chan*); 224*8ccd4a63SDavid du Colombier long (*read)(Chan*, void*, long, vlong); 225*8ccd4a63SDavid du Colombier Block* (*bread)(Chan*, long, ulong); 226*8ccd4a63SDavid du Colombier long (*write)(Chan*, void*, long, vlong); 227*8ccd4a63SDavid du Colombier long (*bwrite)(Chan*, Block*, ulong); 228*8ccd4a63SDavid du Colombier void (*remove)(Chan*); 229*8ccd4a63SDavid du Colombier int (*wstat)(Chan*, uchar*, int); 230*8ccd4a63SDavid du Colombier void (*power)(int); /* power mgt: power(1) => on, power (0) => off */ 231*8ccd4a63SDavid du Colombier int (*config)(int, char*, DevConf*); // returns nil on error 232*8ccd4a63SDavid du Colombier }; 233*8ccd4a63SDavid du Colombier 234*8ccd4a63SDavid du Colombier struct Dirtab 235*8ccd4a63SDavid du Colombier { 236*8ccd4a63SDavid du Colombier char name[KNAMELEN]; 237*8ccd4a63SDavid du Colombier Qid qid; 238*8ccd4a63SDavid du Colombier vlong length; 239*8ccd4a63SDavid du Colombier long perm; 240*8ccd4a63SDavid du Colombier }; 241*8ccd4a63SDavid du Colombier 242*8ccd4a63SDavid du Colombier struct Walkqid 243*8ccd4a63SDavid du Colombier { 244*8ccd4a63SDavid du Colombier Chan *clone; 245*8ccd4a63SDavid du Colombier int nqid; 246*8ccd4a63SDavid du Colombier Qid qid[1]; 247*8ccd4a63SDavid du Colombier }; 248*8ccd4a63SDavid du Colombier 249*8ccd4a63SDavid du Colombier enum 250*8ccd4a63SDavid du Colombier { 251*8ccd4a63SDavid du Colombier NSMAX = 1000, 252*8ccd4a63SDavid du Colombier NSLOG = 7, 253*8ccd4a63SDavid du Colombier NSCACHE = (1<<NSLOG), 254*8ccd4a63SDavid du Colombier }; 255*8ccd4a63SDavid du Colombier 256*8ccd4a63SDavid du Colombier struct Mntwalk /* state for /proc/#/ns */ 257*8ccd4a63SDavid du Colombier { 258*8ccd4a63SDavid du Colombier int cddone; 259*8ccd4a63SDavid du Colombier ulong id; 260*8ccd4a63SDavid du Colombier Mhead* mh; 261*8ccd4a63SDavid du Colombier Mount* cm; 262*8ccd4a63SDavid du Colombier }; 263*8ccd4a63SDavid du Colombier 264*8ccd4a63SDavid du Colombier struct Mount 265*8ccd4a63SDavid du Colombier { 266*8ccd4a63SDavid du Colombier ulong mountid; 267*8ccd4a63SDavid du Colombier Mount* next; 268*8ccd4a63SDavid du Colombier Mhead* head; 269*8ccd4a63SDavid du Colombier Mount* copy; 270*8ccd4a63SDavid du Colombier Mount* order; 271*8ccd4a63SDavid du Colombier Chan* to; /* channel replacing channel */ 272*8ccd4a63SDavid du Colombier int mflag; 273*8ccd4a63SDavid du Colombier char *spec; 274*8ccd4a63SDavid du Colombier }; 275*8ccd4a63SDavid du Colombier 276*8ccd4a63SDavid du Colombier struct Mhead 277*8ccd4a63SDavid du Colombier { 278*8ccd4a63SDavid du Colombier Ref ref; 279*8ccd4a63SDavid du Colombier RWlock lock; 280*8ccd4a63SDavid du Colombier Chan* from; /* channel mounted upon */ 281*8ccd4a63SDavid du Colombier Mount* mount; /* what's mounted upon it */ 282*8ccd4a63SDavid du Colombier Mhead* hash; /* Hash chain */ 283*8ccd4a63SDavid du Colombier }; 284*8ccd4a63SDavid du Colombier 285*8ccd4a63SDavid du Colombier struct Mnt 286*8ccd4a63SDavid du Colombier { 287*8ccd4a63SDavid du Colombier Lock lk; 288*8ccd4a63SDavid du Colombier /* references are counted using c->ref; channels on this mount point incref(c->mchan) == Mnt.c */ 289*8ccd4a63SDavid du Colombier Chan *c; /* Channel to file service */ 290*8ccd4a63SDavid du Colombier Proc *rip; /* Reader in progress */ 291*8ccd4a63SDavid du Colombier Mntrpc *queue; /* Queue of pending requests on this channel */ 292*8ccd4a63SDavid du Colombier ulong id; /* Multiplexer id for channel check */ 293*8ccd4a63SDavid du Colombier Mnt *list; /* Free list */ 294*8ccd4a63SDavid du Colombier int flags; /* cache */ 295*8ccd4a63SDavid du Colombier int msize; /* data + IOHDRSZ */ 296*8ccd4a63SDavid du Colombier char *version; /* 9P version */ 297*8ccd4a63SDavid du Colombier Queue *q; /* input queue */ 298*8ccd4a63SDavid du Colombier }; 299*8ccd4a63SDavid du Colombier 300*8ccd4a63SDavid du Colombier enum 301*8ccd4a63SDavid du Colombier { 302*8ccd4a63SDavid du Colombier NUser, /* note provided externally */ 303*8ccd4a63SDavid du Colombier NExit, /* deliver note quietly */ 304*8ccd4a63SDavid du Colombier NDebug, /* print debug message */ 305*8ccd4a63SDavid du Colombier }; 306*8ccd4a63SDavid du Colombier 307*8ccd4a63SDavid du Colombier struct Note 308*8ccd4a63SDavid du Colombier { 309*8ccd4a63SDavid du Colombier char msg[ERRMAX]; 310*8ccd4a63SDavid du Colombier int flag; /* whether system posted it */ 311*8ccd4a63SDavid du Colombier }; 312*8ccd4a63SDavid du Colombier 313*8ccd4a63SDavid du Colombier enum 314*8ccd4a63SDavid du Colombier { 315*8ccd4a63SDavid du Colombier RENDLOG = 5, 316*8ccd4a63SDavid du Colombier RENDHASH = 1<<RENDLOG, /* Hash to lookup rendezvous tags */ 317*8ccd4a63SDavid du Colombier MNTLOG = 5, 318*8ccd4a63SDavid du Colombier MNTHASH = 1<<MNTLOG, /* Hash to walk mount table */ 319*8ccd4a63SDavid du Colombier NFD = 100, /* per process file descriptors */ 320*8ccd4a63SDavid du Colombier PGHLOG = 9, 321*8ccd4a63SDavid du Colombier PGHSIZE = 1<<PGHLOG, /* Page hash for image lookup */ 322*8ccd4a63SDavid du Colombier }; 323*8ccd4a63SDavid du Colombier #define REND(p,s) ((p)->rendhash[(s)&((1<<RENDLOG)-1)]) 324*8ccd4a63SDavid du Colombier #define MOUNTH(p,qid) ((p)->mnthash[(qid).path&((1<<MNTLOG)-1)]) 325*8ccd4a63SDavid du Colombier 326*8ccd4a63SDavid du Colombier struct Pgrp 327*8ccd4a63SDavid du Colombier { 328*8ccd4a63SDavid du Colombier Ref ref; /* also used as a lock when mounting */ 329*8ccd4a63SDavid du Colombier int noattach; 330*8ccd4a63SDavid du Colombier ulong pgrpid; 331*8ccd4a63SDavid du Colombier QLock debug; /* single access via devproc.c */ 332*8ccd4a63SDavid du Colombier RWlock ns; /* Namespace n read/one write lock */ 333*8ccd4a63SDavid du Colombier Mhead *mnthash[MNTHASH]; 334*8ccd4a63SDavid du Colombier }; 335*8ccd4a63SDavid du Colombier 336*8ccd4a63SDavid du Colombier struct Rgrp 337*8ccd4a63SDavid du Colombier { 338*8ccd4a63SDavid du Colombier Ref ref; 339*8ccd4a63SDavid du Colombier Proc *rendhash[RENDHASH]; /* Rendezvous tag hash */ 340*8ccd4a63SDavid du Colombier }; 341*8ccd4a63SDavid du Colombier 342*8ccd4a63SDavid du Colombier struct Egrp 343*8ccd4a63SDavid du Colombier { 344*8ccd4a63SDavid du Colombier Ref ref; 345*8ccd4a63SDavid du Colombier RWlock lk; 346*8ccd4a63SDavid du Colombier Evalue **ent; 347*8ccd4a63SDavid du Colombier int nent; 348*8ccd4a63SDavid du Colombier int ment; 349*8ccd4a63SDavid du Colombier ulong path; /* qid.path of next Evalue to be allocated */ 350*8ccd4a63SDavid du Colombier ulong vers; /* of Egrp */ 351*8ccd4a63SDavid du Colombier }; 352*8ccd4a63SDavid du Colombier 353*8ccd4a63SDavid du Colombier struct Evalue 354*8ccd4a63SDavid du Colombier { 355*8ccd4a63SDavid du Colombier char *name; 356*8ccd4a63SDavid du Colombier char *value; 357*8ccd4a63SDavid du Colombier int len; 358*8ccd4a63SDavid du Colombier Evalue *link; 359*8ccd4a63SDavid du Colombier Qid qid; 360*8ccd4a63SDavid du Colombier }; 361*8ccd4a63SDavid du Colombier 362*8ccd4a63SDavid du Colombier struct Fgrp 363*8ccd4a63SDavid du Colombier { 364*8ccd4a63SDavid du Colombier Ref ref; 365*8ccd4a63SDavid du Colombier Chan **fd; 366*8ccd4a63SDavid du Colombier int nfd; /* number allocated */ 367*8ccd4a63SDavid du Colombier int maxfd; /* highest fd in use */ 368*8ccd4a63SDavid du Colombier int exceed; /* debugging */ 369*8ccd4a63SDavid du Colombier }; 370*8ccd4a63SDavid du Colombier 371*8ccd4a63SDavid du Colombier enum 372*8ccd4a63SDavid du Colombier { 373*8ccd4a63SDavid du Colombier DELTAFD = 20, /* incremental increase in Fgrp.fd's */ 374*8ccd4a63SDavid du Colombier NERR = 20 375*8ccd4a63SDavid du Colombier }; 376*8ccd4a63SDavid du Colombier 377*8ccd4a63SDavid du Colombier typedef uvlong Ticks; 378*8ccd4a63SDavid du Colombier 379*8ccd4a63SDavid du Colombier enum 380*8ccd4a63SDavid du Colombier { 381*8ccd4a63SDavid du Colombier Running, 382*8ccd4a63SDavid du Colombier Rendezvous, 383*8ccd4a63SDavid du Colombier Wakeme, 384*8ccd4a63SDavid du Colombier }; 385*8ccd4a63SDavid du Colombier 386*8ccd4a63SDavid du Colombier struct Proc 387*8ccd4a63SDavid du Colombier { 388*8ccd4a63SDavid du Colombier uint state; 389*8ccd4a63SDavid du Colombier uint mach; 390*8ccd4a63SDavid du Colombier 391*8ccd4a63SDavid du Colombier ulong pid; 392*8ccd4a63SDavid du Colombier ulong parentpid; 393*8ccd4a63SDavid du Colombier 394*8ccd4a63SDavid du Colombier Pgrp *pgrp; /* Process group for namespace */ 395*8ccd4a63SDavid du Colombier Fgrp *fgrp; /* File descriptor group */ 396*8ccd4a63SDavid du Colombier Rgrp *rgrp; 397*8ccd4a63SDavid du Colombier 398*8ccd4a63SDavid du Colombier Lock rlock; /* sync sleep/wakeup with postnote */ 399*8ccd4a63SDavid du Colombier Rendez *r; /* rendezvous point slept on */ 400*8ccd4a63SDavid du Colombier Rendez sleep; /* place for syssleep/debug */ 401*8ccd4a63SDavid du Colombier int notepending; /* note issued but not acted on */ 402*8ccd4a63SDavid du Colombier int kp; /* true if a kernel process */ 403*8ccd4a63SDavid du Colombier 404*8ccd4a63SDavid du Colombier ulong rendtag; /* Tag for rendezvous */ 405*8ccd4a63SDavid du Colombier ulong rendval; /* Value for rendezvous */ 406*8ccd4a63SDavid du Colombier Proc *rendhash; /* Hash list for tag values */ 407*8ccd4a63SDavid du Colombier 408*8ccd4a63SDavid du Colombier int nerrlab; 409*8ccd4a63SDavid du Colombier Label errlab[NERR]; 410*8ccd4a63SDavid du Colombier char user[KNAMELEN]; 411*8ccd4a63SDavid du Colombier char *syserrstr; /* last error from a system call, errbuf0 or 1 */ 412*8ccd4a63SDavid du Colombier char *errstr; /* reason we're unwinding the error stack, errbuf1 or 0 */ 413*8ccd4a63SDavid du Colombier char errbuf0[ERRMAX]; 414*8ccd4a63SDavid du Colombier char errbuf1[ERRMAX]; 415*8ccd4a63SDavid du Colombier char genbuf[128]; /* buffer used e.g. for last name element from namec */ 416*8ccd4a63SDavid du Colombier char text[KNAMELEN]; 417*8ccd4a63SDavid du Colombier 418*8ccd4a63SDavid du Colombier Chan *slash; 419*8ccd4a63SDavid du Colombier Chan *dot; 420*8ccd4a63SDavid du Colombier 421*8ccd4a63SDavid du Colombier Proc *qnext; 422*8ccd4a63SDavid du Colombier 423*8ccd4a63SDavid du Colombier void (*fn)(void*); 424*8ccd4a63SDavid du Colombier void *arg; 425*8ccd4a63SDavid du Colombier 426*8ccd4a63SDavid du Colombier char oproc[1024]; /* reserved for os */ 427*8ccd4a63SDavid du Colombier 428*8ccd4a63SDavid du Colombier }; 429*8ccd4a63SDavid du Colombier 430*8ccd4a63SDavid du Colombier enum 431*8ccd4a63SDavid du Colombier { 432*8ccd4a63SDavid du Colombier PRINTSIZE = 256, 433*8ccd4a63SDavid du Colombier MAXCRYPT = 127, 434*8ccd4a63SDavid du Colombier NUMSIZE = 12, /* size of formatted number */ 435*8ccd4a63SDavid du Colombier MB = (1024*1024), 436*8ccd4a63SDavid du Colombier READSTR = 1000, /* temporary buffer size for device reads */ 437*8ccd4a63SDavid du Colombier }; 438*8ccd4a63SDavid du Colombier 439*8ccd4a63SDavid du Colombier extern char* conffile; 440*8ccd4a63SDavid du Colombier extern int cpuserver; 441*8ccd4a63SDavid du Colombier extern Dev* devtab[]; 442*8ccd4a63SDavid du Colombier extern char *eve; 443*8ccd4a63SDavid du Colombier extern char hostdomain[]; 444*8ccd4a63SDavid du Colombier extern uchar initcode[]; 445*8ccd4a63SDavid du Colombier extern Queue* kbdq; 446*8ccd4a63SDavid du Colombier extern Queue* kprintoq; 447*8ccd4a63SDavid du Colombier extern Ref noteidalloc; 448*8ccd4a63SDavid du Colombier extern Palloc palloc; 449*8ccd4a63SDavid du Colombier extern Queue *serialoq; 450*8ccd4a63SDavid du Colombier extern char* statename[]; 451*8ccd4a63SDavid du Colombier extern int nsyscall; 452*8ccd4a63SDavid du Colombier extern char *sysname; 453*8ccd4a63SDavid du Colombier extern uint qiomaxatomic; 454*8ccd4a63SDavid du Colombier extern Conf conf; 455*8ccd4a63SDavid du Colombier enum 456*8ccd4a63SDavid du Colombier { 457*8ccd4a63SDavid du Colombier LRESPROF = 3, 458*8ccd4a63SDavid du Colombier }; 459*8ccd4a63SDavid du Colombier 460*8ccd4a63SDavid du Colombier /* 461*8ccd4a63SDavid du Colombier * action log 462*8ccd4a63SDavid du Colombier */ 463*8ccd4a63SDavid du Colombier struct Log { 464*8ccd4a63SDavid du Colombier Lock lk; 465*8ccd4a63SDavid du Colombier int opens; 466*8ccd4a63SDavid du Colombier char* buf; 467*8ccd4a63SDavid du Colombier char *end; 468*8ccd4a63SDavid du Colombier char *rptr; 469*8ccd4a63SDavid du Colombier int len; 470*8ccd4a63SDavid du Colombier int nlog; 471*8ccd4a63SDavid du Colombier int minread; 472*8ccd4a63SDavid du Colombier 473*8ccd4a63SDavid du Colombier int logmask; /* mask of things to debug */ 474*8ccd4a63SDavid du Colombier 475*8ccd4a63SDavid du Colombier QLock readq; 476*8ccd4a63SDavid du Colombier Rendez readr; 477*8ccd4a63SDavid du Colombier }; 478*8ccd4a63SDavid du Colombier 479*8ccd4a63SDavid du Colombier struct Logflag { 480*8ccd4a63SDavid du Colombier char* name; 481*8ccd4a63SDavid du Colombier int mask; 482*8ccd4a63SDavid du Colombier }; 483*8ccd4a63SDavid du Colombier 484*8ccd4a63SDavid du Colombier enum 485*8ccd4a63SDavid du Colombier { 486*8ccd4a63SDavid du Colombier NCMDFIELD = 128 487*8ccd4a63SDavid du Colombier }; 488*8ccd4a63SDavid du Colombier 489*8ccd4a63SDavid du Colombier struct Cmdbuf 490*8ccd4a63SDavid du Colombier { 491*8ccd4a63SDavid du Colombier char *buf; 492*8ccd4a63SDavid du Colombier char **f; 493*8ccd4a63SDavid du Colombier int nf; 494*8ccd4a63SDavid du Colombier }; 495*8ccd4a63SDavid du Colombier 496*8ccd4a63SDavid du Colombier struct Cmdtab 497*8ccd4a63SDavid du Colombier { 498*8ccd4a63SDavid du Colombier int index; /* used by client to switch on result */ 499*8ccd4a63SDavid du Colombier char *cmd; /* command name */ 500*8ccd4a63SDavid du Colombier int narg; /* expected #args; 0 ==> variadic */ 501*8ccd4a63SDavid du Colombier }; 502*8ccd4a63SDavid du Colombier 503*8ccd4a63SDavid du Colombier /* queue state bits, Qmsg, Qcoalesce, and Qkick can be set in qopen */ 504*8ccd4a63SDavid du Colombier enum 505*8ccd4a63SDavid du Colombier { 506*8ccd4a63SDavid du Colombier /* Queue.state */ 507*8ccd4a63SDavid du Colombier Qstarve = (1<<0), /* consumer starved */ 508*8ccd4a63SDavid du Colombier Qmsg = (1<<1), /* message stream */ 509*8ccd4a63SDavid du Colombier Qclosed = (1<<2), /* queue has been closed/hungup */ 510*8ccd4a63SDavid du Colombier Qflow = (1<<3), /* producer flow controlled */ 511*8ccd4a63SDavid du Colombier Qcoalesce = (1<<4), /* coallesce packets on read */ 512*8ccd4a63SDavid du Colombier Qkick = (1<<5), /* always call the kick routine after qwrite */ 513*8ccd4a63SDavid du Colombier }; 514*8ccd4a63SDavid du Colombier 515*8ccd4a63SDavid du Colombier #define DEVDOTDOT -1 516*8ccd4a63SDavid du Colombier 517*8ccd4a63SDavid du Colombier extern Proc *_getproc(void); 518*8ccd4a63SDavid du Colombier extern void _setproc(Proc*); 519*8ccd4a63SDavid du Colombier #define up (_getproc()) 520