xref: /plan9/sys/src/cmd/unix/drawterm/kern/dat.h (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
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