18ccd4a63SDavid du Colombier #define KNAMELEN 28 /* max length of name held in kernel */ 28ccd4a63SDavid du Colombier #define DOMLEN 64 38ccd4a63SDavid du Colombier 48ccd4a63SDavid du Colombier #define BLOCKALIGN 8 58ccd4a63SDavid du Colombier 68ccd4a63SDavid du Colombier typedef struct Alarms Alarms; 78ccd4a63SDavid du Colombier typedef struct Block Block; 88ccd4a63SDavid du Colombier typedef struct CSN CSN; 98ccd4a63SDavid du Colombier typedef struct Chan Chan; 108ccd4a63SDavid du Colombier typedef struct Cmdbuf Cmdbuf; 118ccd4a63SDavid du Colombier typedef struct Cmdtab Cmdtab; 128ccd4a63SDavid du Colombier typedef struct Cname Cname; 138ccd4a63SDavid du Colombier typedef struct Conf Conf; 148ccd4a63SDavid du Colombier typedef struct Dev Dev; 158ccd4a63SDavid du Colombier typedef struct Dirtab Dirtab; 168ccd4a63SDavid du Colombier typedef struct Edfinterface Edfinterface; 178ccd4a63SDavid du Colombier typedef struct Egrp Egrp; 188ccd4a63SDavid du Colombier typedef struct Evalue Evalue; 198ccd4a63SDavid du Colombier typedef struct Fgrp Fgrp; 208ccd4a63SDavid du Colombier typedef struct FPsave FPsave; 218ccd4a63SDavid du Colombier typedef struct DevConf DevConf; 228ccd4a63SDavid du Colombier typedef struct Label Label; 238ccd4a63SDavid du Colombier typedef struct List List; 248ccd4a63SDavid du Colombier typedef struct Log Log; 258ccd4a63SDavid du Colombier typedef struct Logflag Logflag; 268ccd4a63SDavid du Colombier typedef struct Mntcache Mntcache; 278ccd4a63SDavid du Colombier typedef struct Mount Mount; 288ccd4a63SDavid du Colombier typedef struct Mntrpc Mntrpc; 298ccd4a63SDavid du Colombier typedef struct Mntwalk Mntwalk; 308ccd4a63SDavid du Colombier typedef struct Mnt Mnt; 318ccd4a63SDavid du Colombier typedef struct Mhead Mhead; 328ccd4a63SDavid du Colombier typedef struct Note Note; 338ccd4a63SDavid du Colombier typedef struct Page Page; 348ccd4a63SDavid du Colombier typedef struct Palloc Palloc; 358ccd4a63SDavid du Colombier typedef struct Perf Perf; 368ccd4a63SDavid du Colombier typedef struct Pgrps Pgrps; 378ccd4a63SDavid du Colombier typedef struct PhysUart PhysUart; 388ccd4a63SDavid du Colombier typedef struct Pgrp Pgrp; 398ccd4a63SDavid du Colombier typedef struct Physseg Physseg; 408ccd4a63SDavid du Colombier typedef struct Proc Proc; 418ccd4a63SDavid du Colombier typedef struct Pte Pte; 428ccd4a63SDavid du Colombier typedef struct Pthash Pthash; 438ccd4a63SDavid du Colombier typedef struct Queue Queue; 448ccd4a63SDavid du Colombier typedef struct Ref Ref; 458ccd4a63SDavid du Colombier typedef struct Rendez Rendez; 468ccd4a63SDavid du Colombier typedef struct Rgrp Rgrp; 478ccd4a63SDavid du Colombier typedef struct RWlock RWlock; 488ccd4a63SDavid du Colombier typedef struct Schedq Schedq; 498ccd4a63SDavid du Colombier typedef struct Segment Segment; 508ccd4a63SDavid du Colombier typedef struct Session Session; 518ccd4a63SDavid du Colombier typedef struct Task Task; 528ccd4a63SDavid du Colombier typedef struct Talarm Talarm; 538ccd4a63SDavid du Colombier typedef struct Timer Timer; 548ccd4a63SDavid du Colombier typedef struct Uart Uart; 558ccd4a63SDavid du Colombier typedef struct Ureg Ureg; 568ccd4a63SDavid du Colombier typedef struct Waitq Waitq; 578ccd4a63SDavid du Colombier typedef struct Walkqid Walkqid; 588ccd4a63SDavid du Colombier typedef int Devgen(Chan*, char*, Dirtab*, int, int, Dir*); 598ccd4a63SDavid du Colombier 608ccd4a63SDavid du Colombier #include "fcall.h" 618ccd4a63SDavid du Colombier 628ccd4a63SDavid du Colombier enum 638ccd4a63SDavid du Colombier { 648ccd4a63SDavid du Colombier SnarfSize = 64*1024, 658ccd4a63SDavid du Colombier }; 668ccd4a63SDavid du Colombier 678ccd4a63SDavid du Colombier struct Conf 688ccd4a63SDavid du Colombier { 698ccd4a63SDavid du Colombier ulong nmach; /* processors */ 708ccd4a63SDavid du Colombier ulong nproc; /* processes */ 718ccd4a63SDavid du Colombier ulong monitor; /* has monitor? */ 728ccd4a63SDavid du Colombier ulong npage0; /* total physical pages of memory */ 738ccd4a63SDavid du Colombier ulong npage1; /* total physical pages of memory */ 748ccd4a63SDavid du Colombier ulong npage; /* total physical pages of memory */ 758ccd4a63SDavid du Colombier ulong upages; /* user page pool */ 768ccd4a63SDavid du Colombier ulong nimage; /* number of page cache image headers */ 778ccd4a63SDavid du Colombier ulong nswap; /* number of swap pages */ 788ccd4a63SDavid du Colombier int nswppo; /* max # of pageouts per segment pass */ 798ccd4a63SDavid du Colombier ulong base0; /* base of bank 0 */ 808ccd4a63SDavid du Colombier ulong base1; /* base of bank 1 */ 818ccd4a63SDavid du Colombier ulong copymode; /* 0 is copy on write, 1 is copy on reference */ 828ccd4a63SDavid du Colombier ulong ialloc; /* max interrupt time allocation in bytes */ 838ccd4a63SDavid du Colombier ulong pipeqsize; /* size in bytes of pipe queues */ 848ccd4a63SDavid du Colombier int nuart; /* number of uart devices */ 858ccd4a63SDavid du Colombier }; 868ccd4a63SDavid du Colombier 878ccd4a63SDavid du Colombier struct Label 888ccd4a63SDavid du Colombier { 898ccd4a63SDavid du Colombier jmp_buf buf; 908ccd4a63SDavid du Colombier }; 918ccd4a63SDavid du Colombier 928ccd4a63SDavid du Colombier struct Ref 938ccd4a63SDavid du Colombier { 948ccd4a63SDavid du Colombier Lock lk; 958ccd4a63SDavid du Colombier long ref; 968ccd4a63SDavid du Colombier }; 978ccd4a63SDavid du Colombier 988ccd4a63SDavid du Colombier struct Rendez 998ccd4a63SDavid du Colombier { 1008ccd4a63SDavid du Colombier Lock lk; 1018ccd4a63SDavid du Colombier Proc *p; 1028ccd4a63SDavid du Colombier }; 1038ccd4a63SDavid du Colombier 1048ccd4a63SDavid du Colombier struct RWlock /* changed from kernel */ 1058ccd4a63SDavid du Colombier { 1068ccd4a63SDavid du Colombier int readers; 1078ccd4a63SDavid du Colombier Lock lk; 1088ccd4a63SDavid du Colombier QLock x; 1098ccd4a63SDavid du Colombier QLock k; 1108ccd4a63SDavid du Colombier }; 1118ccd4a63SDavid du Colombier 1128ccd4a63SDavid du Colombier struct Talarm 1138ccd4a63SDavid du Colombier { 1148ccd4a63SDavid du Colombier Lock lk; 1158ccd4a63SDavid du Colombier Proc *list; 1168ccd4a63SDavid du Colombier }; 1178ccd4a63SDavid du Colombier 1188ccd4a63SDavid du Colombier struct Alarms 1198ccd4a63SDavid du Colombier { 1208ccd4a63SDavid du Colombier QLock lk; 1218ccd4a63SDavid du Colombier Proc *head; 1228ccd4a63SDavid du Colombier }; 1238ccd4a63SDavid du Colombier 1248ccd4a63SDavid du Colombier /* 1258ccd4a63SDavid du Colombier * Access types in namec & channel flags 1268ccd4a63SDavid du Colombier */ 1278ccd4a63SDavid du Colombier enum 1288ccd4a63SDavid du Colombier { 1298ccd4a63SDavid du Colombier Aaccess, /* as in stat, wstat */ 1308ccd4a63SDavid du Colombier Abind, /* for left-hand-side of bind */ 1318ccd4a63SDavid du Colombier Atodir, /* as in chdir */ 1328ccd4a63SDavid du Colombier Aopen, /* for i/o */ 1338ccd4a63SDavid du Colombier Amount, /* to be mounted or mounted upon */ 1348ccd4a63SDavid du Colombier Acreate, /* is to be created */ 1358ccd4a63SDavid du Colombier Aremove, /* will be removed by caller */ 1368ccd4a63SDavid du Colombier 1378ccd4a63SDavid du Colombier COPEN = 0x0001, /* for i/o */ 1388ccd4a63SDavid du Colombier CMSG = 0x0002, /* the message channel for a mount */ 1398ccd4a63SDavid du Colombier /* CCREATE = 0x0004, permits creation if c->mnt */ 1408ccd4a63SDavid du Colombier CCEXEC = 0x0008, /* close on exec */ 1418ccd4a63SDavid du Colombier CFREE = 0x0010, /* not in use */ 1428ccd4a63SDavid du Colombier CRCLOSE = 0x0020, /* remove on close */ 1438ccd4a63SDavid du Colombier CCACHE = 0x0080, /* client cache */ 1448ccd4a63SDavid du Colombier }; 1458ccd4a63SDavid du Colombier 1468ccd4a63SDavid du Colombier /* flag values */ 1478ccd4a63SDavid du Colombier enum 1488ccd4a63SDavid du Colombier { 1498ccd4a63SDavid du Colombier BINTR = (1<<0), 1508ccd4a63SDavid du Colombier BFREE = (1<<1), 1518ccd4a63SDavid du Colombier Bipck = (1<<2), /* ip checksum */ 1528ccd4a63SDavid du Colombier Budpck = (1<<3), /* udp checksum */ 1538ccd4a63SDavid du Colombier Btcpck = (1<<4), /* tcp checksum */ 1548ccd4a63SDavid du Colombier Bpktck = (1<<5), /* packet checksum */ 1558ccd4a63SDavid du Colombier }; 1568ccd4a63SDavid du Colombier 1578ccd4a63SDavid du Colombier struct Block 1588ccd4a63SDavid du Colombier { 1598ccd4a63SDavid du Colombier Block* next; 1608ccd4a63SDavid du Colombier Block* list; 1618ccd4a63SDavid du Colombier uchar* rp; /* first unconsumed byte */ 1628ccd4a63SDavid du Colombier uchar* wp; /* first empty byte */ 1638ccd4a63SDavid du Colombier uchar* lim; /* 1 past the end of the buffer */ 1648ccd4a63SDavid du Colombier uchar* base; /* start of the buffer */ 1658ccd4a63SDavid du Colombier void (*free)(Block*); 1668ccd4a63SDavid du Colombier ushort flag; 1678ccd4a63SDavid du Colombier ushort checksum; /* IP checksum of complete packet (minus media header) */ 1688ccd4a63SDavid du Colombier }; 1698ccd4a63SDavid du Colombier #define BLEN(s) ((s)->wp - (s)->rp) 1708ccd4a63SDavid du Colombier #define BALLOC(s) ((s)->lim - (s)->base) 1718ccd4a63SDavid du Colombier 1728ccd4a63SDavid du Colombier struct Chan 1738ccd4a63SDavid du Colombier { 1748ccd4a63SDavid du Colombier Ref ref; 1758ccd4a63SDavid du Colombier Chan* next; /* allocation */ 1768ccd4a63SDavid du Colombier Chan* link; 1778ccd4a63SDavid du Colombier vlong offset; /* in file */ 1788ccd4a63SDavid du Colombier ushort type; 1798ccd4a63SDavid du Colombier ulong dev; 1808ccd4a63SDavid du Colombier ushort mode; /* read/write */ 1818ccd4a63SDavid du Colombier ushort flag; 1828ccd4a63SDavid du Colombier Qid qid; 1838ccd4a63SDavid du Colombier int fid; /* for devmnt */ 1848ccd4a63SDavid du Colombier ulong iounit; /* chunk size for i/o; 0==default */ 1858ccd4a63SDavid du Colombier Mhead* umh; /* mount point that derived Chan; used in unionread */ 1868ccd4a63SDavid du Colombier Chan* umc; /* channel in union; held for union read */ 1878ccd4a63SDavid du Colombier QLock umqlock; /* serialize unionreads */ 1888ccd4a63SDavid du Colombier int uri; /* union read index */ 1898ccd4a63SDavid du Colombier int dri; /* devdirread index */ 1908ccd4a63SDavid du Colombier ulong mountid; 1918ccd4a63SDavid du Colombier Mntcache *mcp; /* Mount cache pointer */ 1928ccd4a63SDavid du Colombier Mnt *mux; /* Mnt for clients using me for messages */ 1938ccd4a63SDavid du Colombier void* aux; 1948ccd4a63SDavid du Colombier Qid pgrpid; /* for #p/notepg */ 1958ccd4a63SDavid du Colombier ulong mid; /* for ns in devproc */ 1968ccd4a63SDavid du Colombier Chan* mchan; /* channel to mounted server */ 1978ccd4a63SDavid du Colombier Qid mqid; /* qid of root of mount point */ 1988ccd4a63SDavid du Colombier Session*session; 1998ccd4a63SDavid du Colombier Cname *name; 2008ccd4a63SDavid du Colombier }; 2018ccd4a63SDavid du Colombier 2028ccd4a63SDavid du Colombier struct Cname 2038ccd4a63SDavid du Colombier { 2048ccd4a63SDavid du Colombier Ref ref; 2058ccd4a63SDavid du Colombier int alen; /* allocated length */ 2068ccd4a63SDavid du Colombier int len; /* strlen(s) */ 2078ccd4a63SDavid du Colombier char *s; 2088ccd4a63SDavid du Colombier }; 2098ccd4a63SDavid du Colombier 2108ccd4a63SDavid du Colombier struct Dev 2118ccd4a63SDavid du Colombier { 2128ccd4a63SDavid du Colombier int dc; 2138ccd4a63SDavid du Colombier char* name; 2148ccd4a63SDavid du Colombier 2158ccd4a63SDavid du Colombier void (*reset)(void); 2168ccd4a63SDavid du Colombier void (*init)(void); 2178ccd4a63SDavid du Colombier void (*shutdown)(void); 2188ccd4a63SDavid du Colombier Chan* (*attach)(char*); 2198ccd4a63SDavid du Colombier Walkqid* (*walk)(Chan*, Chan*, char**, int); 2208ccd4a63SDavid du Colombier int (*stat)(Chan*, uchar*, int); 2218ccd4a63SDavid du Colombier Chan* (*open)(Chan*, int); 2228ccd4a63SDavid du Colombier void (*create)(Chan*, char*, int, ulong); 2238ccd4a63SDavid du Colombier void (*close)(Chan*); 2248ccd4a63SDavid du Colombier long (*read)(Chan*, void*, long, vlong); 2258ccd4a63SDavid du Colombier Block* (*bread)(Chan*, long, ulong); 2268ccd4a63SDavid du Colombier long (*write)(Chan*, void*, long, vlong); 2278ccd4a63SDavid du Colombier long (*bwrite)(Chan*, Block*, ulong); 2288ccd4a63SDavid du Colombier void (*remove)(Chan*); 2298ccd4a63SDavid du Colombier int (*wstat)(Chan*, uchar*, int); 2308ccd4a63SDavid du Colombier void (*power)(int); /* power mgt: power(1) => on, power (0) => off */ 2318ccd4a63SDavid du Colombier int (*config)(int, char*, DevConf*); // returns nil on error 2328ccd4a63SDavid du Colombier }; 2338ccd4a63SDavid du Colombier 2348ccd4a63SDavid du Colombier struct Dirtab 2358ccd4a63SDavid du Colombier { 2368ccd4a63SDavid du Colombier char name[KNAMELEN]; 2378ccd4a63SDavid du Colombier Qid qid; 2388ccd4a63SDavid du Colombier vlong length; 239*ec59a3ddSDavid du Colombier ulong perm; 2408ccd4a63SDavid du Colombier }; 2418ccd4a63SDavid du Colombier 2428ccd4a63SDavid du Colombier struct Walkqid 2438ccd4a63SDavid du Colombier { 2448ccd4a63SDavid du Colombier Chan *clone; 2458ccd4a63SDavid du Colombier int nqid; 2468ccd4a63SDavid du Colombier Qid qid[1]; 2478ccd4a63SDavid du Colombier }; 2488ccd4a63SDavid du Colombier 2498ccd4a63SDavid du Colombier enum 2508ccd4a63SDavid du Colombier { 2518ccd4a63SDavid du Colombier NSMAX = 1000, 2528ccd4a63SDavid du Colombier NSLOG = 7, 2538ccd4a63SDavid du Colombier NSCACHE = (1<<NSLOG), 2548ccd4a63SDavid du Colombier }; 2558ccd4a63SDavid du Colombier 2568ccd4a63SDavid du Colombier struct Mntwalk /* state for /proc/#/ns */ 2578ccd4a63SDavid du Colombier { 2588ccd4a63SDavid du Colombier int cddone; 2598ccd4a63SDavid du Colombier ulong id; 2608ccd4a63SDavid du Colombier Mhead* mh; 2618ccd4a63SDavid du Colombier Mount* cm; 2628ccd4a63SDavid du Colombier }; 2638ccd4a63SDavid du Colombier 2648ccd4a63SDavid du Colombier struct Mount 2658ccd4a63SDavid du Colombier { 2668ccd4a63SDavid du Colombier ulong mountid; 2678ccd4a63SDavid du Colombier Mount* next; 2688ccd4a63SDavid du Colombier Mhead* head; 2698ccd4a63SDavid du Colombier Mount* copy; 2708ccd4a63SDavid du Colombier Mount* order; 2718ccd4a63SDavid du Colombier Chan* to; /* channel replacing channel */ 2728ccd4a63SDavid du Colombier int mflag; 2738ccd4a63SDavid du Colombier char *spec; 2748ccd4a63SDavid du Colombier }; 2758ccd4a63SDavid du Colombier 2768ccd4a63SDavid du Colombier struct Mhead 2778ccd4a63SDavid du Colombier { 2788ccd4a63SDavid du Colombier Ref ref; 2798ccd4a63SDavid du Colombier RWlock lock; 2808ccd4a63SDavid du Colombier Chan* from; /* channel mounted upon */ 2818ccd4a63SDavid du Colombier Mount* mount; /* what's mounted upon it */ 2828ccd4a63SDavid du Colombier Mhead* hash; /* Hash chain */ 2838ccd4a63SDavid du Colombier }; 2848ccd4a63SDavid du Colombier 2858ccd4a63SDavid du Colombier struct Mnt 2868ccd4a63SDavid du Colombier { 2878ccd4a63SDavid du Colombier Lock lk; 2888ccd4a63SDavid du Colombier /* references are counted using c->ref; channels on this mount point incref(c->mchan) == Mnt.c */ 2898ccd4a63SDavid du Colombier Chan *c; /* Channel to file service */ 2908ccd4a63SDavid du Colombier Proc *rip; /* Reader in progress */ 2918ccd4a63SDavid du Colombier Mntrpc *queue; /* Queue of pending requests on this channel */ 2928ccd4a63SDavid du Colombier ulong id; /* Multiplexer id for channel check */ 2938ccd4a63SDavid du Colombier Mnt *list; /* Free list */ 2948ccd4a63SDavid du Colombier int flags; /* cache */ 2958ccd4a63SDavid du Colombier int msize; /* data + IOHDRSZ */ 2968ccd4a63SDavid du Colombier char *version; /* 9P version */ 2978ccd4a63SDavid du Colombier Queue *q; /* input queue */ 2988ccd4a63SDavid du Colombier }; 2998ccd4a63SDavid du Colombier 3008ccd4a63SDavid du Colombier enum 3018ccd4a63SDavid du Colombier { 3028ccd4a63SDavid du Colombier NUser, /* note provided externally */ 3038ccd4a63SDavid du Colombier NExit, /* deliver note quietly */ 3048ccd4a63SDavid du Colombier NDebug, /* print debug message */ 3058ccd4a63SDavid du Colombier }; 3068ccd4a63SDavid du Colombier 3078ccd4a63SDavid du Colombier struct Note 3088ccd4a63SDavid du Colombier { 3098ccd4a63SDavid du Colombier char msg[ERRMAX]; 3108ccd4a63SDavid du Colombier int flag; /* whether system posted it */ 3118ccd4a63SDavid du Colombier }; 3128ccd4a63SDavid du Colombier 3138ccd4a63SDavid du Colombier enum 3148ccd4a63SDavid du Colombier { 3158ccd4a63SDavid du Colombier RENDLOG = 5, 3168ccd4a63SDavid du Colombier RENDHASH = 1<<RENDLOG, /* Hash to lookup rendezvous tags */ 3178ccd4a63SDavid du Colombier MNTLOG = 5, 3188ccd4a63SDavid du Colombier MNTHASH = 1<<MNTLOG, /* Hash to walk mount table */ 3198ccd4a63SDavid du Colombier NFD = 100, /* per process file descriptors */ 3208ccd4a63SDavid du Colombier PGHLOG = 9, 3218ccd4a63SDavid du Colombier PGHSIZE = 1<<PGHLOG, /* Page hash for image lookup */ 3228ccd4a63SDavid du Colombier }; 3238ccd4a63SDavid du Colombier #define REND(p,s) ((p)->rendhash[(s)&((1<<RENDLOG)-1)]) 3248ccd4a63SDavid du Colombier #define MOUNTH(p,qid) ((p)->mnthash[(qid).path&((1<<MNTLOG)-1)]) 3258ccd4a63SDavid du Colombier 3268ccd4a63SDavid du Colombier struct Pgrp 3278ccd4a63SDavid du Colombier { 3288ccd4a63SDavid du Colombier Ref ref; /* also used as a lock when mounting */ 3298ccd4a63SDavid du Colombier int noattach; 3308ccd4a63SDavid du Colombier ulong pgrpid; 3318ccd4a63SDavid du Colombier QLock debug; /* single access via devproc.c */ 3328ccd4a63SDavid du Colombier RWlock ns; /* Namespace n read/one write lock */ 3338ccd4a63SDavid du Colombier Mhead *mnthash[MNTHASH]; 3348ccd4a63SDavid du Colombier }; 3358ccd4a63SDavid du Colombier 3368ccd4a63SDavid du Colombier struct Rgrp 3378ccd4a63SDavid du Colombier { 3388ccd4a63SDavid du Colombier Ref ref; 3398ccd4a63SDavid du Colombier Proc *rendhash[RENDHASH]; /* Rendezvous tag hash */ 3408ccd4a63SDavid du Colombier }; 3418ccd4a63SDavid du Colombier 3428ccd4a63SDavid du Colombier struct Egrp 3438ccd4a63SDavid du Colombier { 3448ccd4a63SDavid du Colombier Ref ref; 3458ccd4a63SDavid du Colombier RWlock lk; 3468ccd4a63SDavid du Colombier Evalue **ent; 3478ccd4a63SDavid du Colombier int nent; 3488ccd4a63SDavid du Colombier int ment; 3498ccd4a63SDavid du Colombier ulong path; /* qid.path of next Evalue to be allocated */ 3508ccd4a63SDavid du Colombier ulong vers; /* of Egrp */ 3518ccd4a63SDavid du Colombier }; 3528ccd4a63SDavid du Colombier 3538ccd4a63SDavid du Colombier struct Evalue 3548ccd4a63SDavid du Colombier { 3558ccd4a63SDavid du Colombier char *name; 3568ccd4a63SDavid du Colombier char *value; 3578ccd4a63SDavid du Colombier int len; 3588ccd4a63SDavid du Colombier Evalue *link; 3598ccd4a63SDavid du Colombier Qid qid; 3608ccd4a63SDavid du Colombier }; 3618ccd4a63SDavid du Colombier 3628ccd4a63SDavid du Colombier struct Fgrp 3638ccd4a63SDavid du Colombier { 3648ccd4a63SDavid du Colombier Ref ref; 3658ccd4a63SDavid du Colombier Chan **fd; 3668ccd4a63SDavid du Colombier int nfd; /* number allocated */ 3678ccd4a63SDavid du Colombier int maxfd; /* highest fd in use */ 3688ccd4a63SDavid du Colombier int exceed; /* debugging */ 3698ccd4a63SDavid du Colombier }; 3708ccd4a63SDavid du Colombier 3718ccd4a63SDavid du Colombier enum 3728ccd4a63SDavid du Colombier { 3738ccd4a63SDavid du Colombier DELTAFD = 20, /* incremental increase in Fgrp.fd's */ 3748ccd4a63SDavid du Colombier NERR = 20 3758ccd4a63SDavid du Colombier }; 3768ccd4a63SDavid du Colombier 3778ccd4a63SDavid du Colombier typedef uvlong Ticks; 3788ccd4a63SDavid du Colombier 3798ccd4a63SDavid du Colombier enum 3808ccd4a63SDavid du Colombier { 3818ccd4a63SDavid du Colombier Running, 3828ccd4a63SDavid du Colombier Rendezvous, 3838ccd4a63SDavid du Colombier Wakeme, 3848ccd4a63SDavid du Colombier }; 3858ccd4a63SDavid du Colombier 3868ccd4a63SDavid du Colombier struct Proc 3878ccd4a63SDavid du Colombier { 3888ccd4a63SDavid du Colombier uint state; 3898ccd4a63SDavid du Colombier uint mach; 3908ccd4a63SDavid du Colombier 3918ccd4a63SDavid du Colombier ulong pid; 3928ccd4a63SDavid du Colombier ulong parentpid; 3938ccd4a63SDavid du Colombier 3948ccd4a63SDavid du Colombier Pgrp *pgrp; /* Process group for namespace */ 3958ccd4a63SDavid du Colombier Fgrp *fgrp; /* File descriptor group */ 3968ccd4a63SDavid du Colombier Rgrp *rgrp; 3978ccd4a63SDavid du Colombier 3988ccd4a63SDavid du Colombier Lock rlock; /* sync sleep/wakeup with postnote */ 3998ccd4a63SDavid du Colombier Rendez *r; /* rendezvous point slept on */ 4008ccd4a63SDavid du Colombier Rendez sleep; /* place for syssleep/debug */ 4018ccd4a63SDavid du Colombier int notepending; /* note issued but not acted on */ 4028ccd4a63SDavid du Colombier int kp; /* true if a kernel process */ 4038ccd4a63SDavid du Colombier 404*ec59a3ddSDavid du Colombier void* rendtag; /* Tag for rendezvous */ 405*ec59a3ddSDavid du Colombier void* rendval; /* Value for rendezvous */ 4068ccd4a63SDavid du Colombier Proc *rendhash; /* Hash list for tag values */ 4078ccd4a63SDavid du Colombier 4088ccd4a63SDavid du Colombier int nerrlab; 4098ccd4a63SDavid du Colombier Label errlab[NERR]; 4108ccd4a63SDavid du Colombier char user[KNAMELEN]; 4118ccd4a63SDavid du Colombier char *syserrstr; /* last error from a system call, errbuf0 or 1 */ 4128ccd4a63SDavid du Colombier char *errstr; /* reason we're unwinding the error stack, errbuf1 or 0 */ 4138ccd4a63SDavid du Colombier char errbuf0[ERRMAX]; 4148ccd4a63SDavid du Colombier char errbuf1[ERRMAX]; 4158ccd4a63SDavid du Colombier char genbuf[128]; /* buffer used e.g. for last name element from namec */ 4168ccd4a63SDavid du Colombier char text[KNAMELEN]; 4178ccd4a63SDavid du Colombier 4188ccd4a63SDavid du Colombier Chan *slash; 4198ccd4a63SDavid du Colombier Chan *dot; 4208ccd4a63SDavid du Colombier 4218ccd4a63SDavid du Colombier Proc *qnext; 4228ccd4a63SDavid du Colombier 4238ccd4a63SDavid du Colombier void (*fn)(void*); 4248ccd4a63SDavid du Colombier void *arg; 4258ccd4a63SDavid du Colombier 4268ccd4a63SDavid du Colombier char oproc[1024]; /* reserved for os */ 4278ccd4a63SDavid du Colombier 4288ccd4a63SDavid du Colombier }; 4298ccd4a63SDavid du Colombier 4308ccd4a63SDavid du Colombier enum 4318ccd4a63SDavid du Colombier { 4328ccd4a63SDavid du Colombier PRINTSIZE = 256, 4338ccd4a63SDavid du Colombier MAXCRYPT = 127, 4348ccd4a63SDavid du Colombier NUMSIZE = 12, /* size of formatted number */ 4358ccd4a63SDavid du Colombier MB = (1024*1024), 4368ccd4a63SDavid du Colombier READSTR = 1000, /* temporary buffer size for device reads */ 4378ccd4a63SDavid du Colombier }; 4388ccd4a63SDavid du Colombier 4398ccd4a63SDavid du Colombier extern char* conffile; 4408ccd4a63SDavid du Colombier extern int cpuserver; 4418ccd4a63SDavid du Colombier extern Dev* devtab[]; 4428ccd4a63SDavid du Colombier extern char *eve; 4438ccd4a63SDavid du Colombier extern char hostdomain[]; 4448ccd4a63SDavid du Colombier extern uchar initcode[]; 4458ccd4a63SDavid du Colombier extern Queue* kbdq; 4468ccd4a63SDavid du Colombier extern Queue* kprintoq; 4478ccd4a63SDavid du Colombier extern Ref noteidalloc; 4488ccd4a63SDavid du Colombier extern Palloc palloc; 4498ccd4a63SDavid du Colombier extern Queue *serialoq; 4508ccd4a63SDavid du Colombier extern char* statename[]; 4518ccd4a63SDavid du Colombier extern int nsyscall; 4528ccd4a63SDavid du Colombier extern char *sysname; 4538ccd4a63SDavid du Colombier extern uint qiomaxatomic; 4548ccd4a63SDavid du Colombier extern Conf conf; 4558ccd4a63SDavid du Colombier enum 4568ccd4a63SDavid du Colombier { 4578ccd4a63SDavid du Colombier LRESPROF = 3, 4588ccd4a63SDavid du Colombier }; 4598ccd4a63SDavid du Colombier 4608ccd4a63SDavid du Colombier /* 4618ccd4a63SDavid du Colombier * action log 4628ccd4a63SDavid du Colombier */ 4638ccd4a63SDavid du Colombier struct Log { 4648ccd4a63SDavid du Colombier Lock lk; 4658ccd4a63SDavid du Colombier int opens; 4668ccd4a63SDavid du Colombier char* buf; 4678ccd4a63SDavid du Colombier char *end; 4688ccd4a63SDavid du Colombier char *rptr; 4698ccd4a63SDavid du Colombier int len; 4708ccd4a63SDavid du Colombier int nlog; 4718ccd4a63SDavid du Colombier int minread; 4728ccd4a63SDavid du Colombier 4738ccd4a63SDavid du Colombier int logmask; /* mask of things to debug */ 4748ccd4a63SDavid du Colombier 4758ccd4a63SDavid du Colombier QLock readq; 4768ccd4a63SDavid du Colombier Rendez readr; 4778ccd4a63SDavid du Colombier }; 4788ccd4a63SDavid du Colombier 4798ccd4a63SDavid du Colombier struct Logflag { 4808ccd4a63SDavid du Colombier char* name; 4818ccd4a63SDavid du Colombier int mask; 4828ccd4a63SDavid du Colombier }; 4838ccd4a63SDavid du Colombier 4848ccd4a63SDavid du Colombier enum 4858ccd4a63SDavid du Colombier { 4868ccd4a63SDavid du Colombier NCMDFIELD = 128 4878ccd4a63SDavid du Colombier }; 4888ccd4a63SDavid du Colombier 4898ccd4a63SDavid du Colombier struct Cmdbuf 4908ccd4a63SDavid du Colombier { 4918ccd4a63SDavid du Colombier char *buf; 4928ccd4a63SDavid du Colombier char **f; 4938ccd4a63SDavid du Colombier int nf; 4948ccd4a63SDavid du Colombier }; 4958ccd4a63SDavid du Colombier 4968ccd4a63SDavid du Colombier struct Cmdtab 4978ccd4a63SDavid du Colombier { 4988ccd4a63SDavid du Colombier int index; /* used by client to switch on result */ 4998ccd4a63SDavid du Colombier char *cmd; /* command name */ 5008ccd4a63SDavid du Colombier int narg; /* expected #args; 0 ==> variadic */ 5018ccd4a63SDavid du Colombier }; 5028ccd4a63SDavid du Colombier 5038ccd4a63SDavid du Colombier /* queue state bits, Qmsg, Qcoalesce, and Qkick can be set in qopen */ 5048ccd4a63SDavid du Colombier enum 5058ccd4a63SDavid du Colombier { 5068ccd4a63SDavid du Colombier /* Queue.state */ 5078ccd4a63SDavid du Colombier Qstarve = (1<<0), /* consumer starved */ 5088ccd4a63SDavid du Colombier Qmsg = (1<<1), /* message stream */ 5098ccd4a63SDavid du Colombier Qclosed = (1<<2), /* queue has been closed/hungup */ 5108ccd4a63SDavid du Colombier Qflow = (1<<3), /* producer flow controlled */ 5118ccd4a63SDavid du Colombier Qcoalesce = (1<<4), /* coallesce packets on read */ 5128ccd4a63SDavid du Colombier Qkick = (1<<5), /* always call the kick routine after qwrite */ 5138ccd4a63SDavid du Colombier }; 5148ccd4a63SDavid du Colombier 5158ccd4a63SDavid du Colombier #define DEVDOTDOT -1 5168ccd4a63SDavid du Colombier 5178ccd4a63SDavid du Colombier extern Proc *_getproc(void); 5188ccd4a63SDavid du Colombier extern void _setproc(Proc*); 5198ccd4a63SDavid du Colombier #define up (_getproc()) 520