plan 9 kernel history: overview | file list | diff list

1991/0428/ss/dat.h (diff list | history)

1991/0427/sys/src/9/ss/dat.h:1,141991/0428/sys/src/9/ss/dat.h:1,4 (short | long | prev | next)
1990/1223    
typedef struct Alarm	Alarm; 
typedef struct Block	Block; 
typedef struct Blist	Blist; 
typedef struct Chan	Chan; 
typedef struct Conf	Conf; 
typedef struct Dev	Dev; 
typedef struct Dirtab	Dirtab; 
typedef struct Env	Env; 
typedef struct Envp	Envp; 
typedef struct Envval	Envval; 
1990/1231    
typedef struct Etherpkt	Etherpkt; 
1990/1223    
typedef struct FFrame	FFrame; 
typedef struct FPsave	FPsave; 
typedef struct KMap	KMap; 
1991/0427/sys/src/9/ss/dat.h:15,561991/0428/sys/src/9/ss/dat.h:5,31
1990/1231    
typedef struct Lance	Lance; 
typedef struct Lancemem	Lancemem; 
1990/1223    
typedef struct Label	Label; 
typedef struct List	List; 
typedef struct Lock	Lock; 
typedef struct MMU	MMU; 
typedef struct MMUCache	MMUCache; 
typedef struct Mach	Mach; 
typedef struct Mount	Mount; 
typedef struct Mtab	Mtab; 
1990/1231    
typedef struct Noconv	Noconv; 
typedef struct Nohdr	Nohdr; 
typedef struct Noifc	Noifc; 
1990/1223    
typedef struct Note	Note; 
1990/1231    
typedef struct Nomsg	Nomsg; 
typedef struct Nocall	Nocall; 
1990/1223    
typedef struct Orig	Orig; 
typedef struct PTE	PTE; 
typedef struct Page	Page; 
typedef struct Pgrp	Pgrp; 
typedef struct Proc	Proc; 
typedef struct Qinfo	Qinfo; 
typedef struct QLock	QLock; 
typedef struct Queue	Queue; 
typedef struct Ref	Ref; 
typedef struct Rendez	Rendez; 
typedef struct Seg	Seg; 
typedef struct Service	Service; 
typedef struct Stream	Stream; 
typedef struct Ureg	Ureg; 
typedef struct User	User; 
 
typedef int Devgen(Chan*, Dirtab*, int, int, Dir*); 
 
struct List 
{ 
	void	*next; 
}; 
1991/0428    
#define	MACHP(n)	(n==0? &mach0 : *(Mach**)0) 
1990/1223    
 
1991/0428    
extern	Mach	mach0; 
extern  void	(*kprofp)(ulong); 
 
/* 
 *  parameters for sysproc.c 
 */ 
#define AOUT_MAGIC	K_MAGIC 
 
/* 
 *  machine dependent definitions used by ../port/dat.h 
 */ 
 
1990/1223    
struct Lock 
{ 
1990/1226    
	ulong	key; 
1991/0427/sys/src/9/ss/dat.h:57,761991/0428/sys/src/9/ss/dat.h:32,37
1990/1223    
	ulong	pc; 
}; 
 
struct Ref 
{ 
	Lock; 
	int	ref; 
}; 
                 
struct QLock 
{ 
	Proc	*head;			/* next process waiting for object */ 
	Proc	*tail;			/* last process waiting for object */ 
	Lock	use;			/* to use object */ 
	Lock	queue;			/* to access list */ 
}; 
                 
struct Label 
{ 
	ulong	sp; 
1991/0427/sys/src/9/ss/dat.h:77,1221991/0428/sys/src/9/ss/dat.h:38,53
1990/1223    
	ulong	pc; 
}; 
 
struct Alarm 
1991/0428    
/* 
 * floating point registers 
 */ 
enum 
1990/1223    
{ 
	List; 
	Lock; 
	int	busy; 
	long	dt;		/* may underflow in clock(); must be signed */ 
	void	(*f)(void*); 
	void	*arg; 
1991/0428    
	FPinit, 
	FPactive, 
	FPinactive, 
1990/1223    
}; 
 
#define	CHDIR	0x80000000L 
#define	CHAPPEND 0x40000000L 
#define	CHEXCL	0x20000000L 
struct Chan 
{ 
1991/0413    
	QLock	rdl; 
	QLock	wrl; 
1990/1223    
	Ref; 
	union{ 
		Chan	*next;		/* allocation */ 
		ulong	offset;		/* in file */ 
	}; 
	ushort	type; 
	ushort	dev; 
	ushort	mode;			/* read/write */ 
	ushort	flag; 
	Qid	qid; 
	Mount	*mnt;			/* mount point that derived Chan */ 
	ulong	mountid; 
	int	fid;			/* for devmnt */ 
	union { 
		Stream	*stream;	/* for stream channels */ 
		void	*aux; 
		Qid	pgrpid;		/* for #p/notepg */ 
1991/0427    
		int	mntindex;	/* for devmnt */ 
1990/1223    
	}; 
	Chan	*mchan;			/* channel to mounted server */ 
	Qid	mqid;			/* qid of root of mount point */ 
}; 
                 
struct	FPsave 
{ 
1991/01151    
	long	fsr; 
1991/0427/sys/src/9/ss/dat.h:164,2091991/0428/sys/src/9/ss/dat.h:95,105
1990/1223    
	int	copymode;	/* 0 is copy on write, 1 is copy on reference */ 
}; 
 
struct Dev 
{ 
	void	 (*reset)(void); 
	void	 (*init)(void); 
	Chan	*(*attach)(char*); 
	Chan	*(*clone)(Chan*, Chan*); 
	int	 (*walk)(Chan*, char*); 
	void	 (*stat)(Chan*, char*); 
	Chan	*(*open)(Chan*, int); 
	void	 (*create)(Chan*, char*, int, ulong); 
	void	 (*close)(Chan*); 
1991/0411    
	long	 (*read)(Chan*, void*, long, ulong); 
	long	 (*write)(Chan*, void*, long, ulong ); 
1990/1223    
	void	 (*remove)(Chan*); 
	void	 (*wstat)(Chan*, char*); 
}; 
1991/0428    
#include "../port/portdat.h" 
1990/1223    
 
struct Dirtab 
{ 
	char	name[NAMELEN]; 
	Qid	qid; 
	long	length; 
	long	perm; 
}; 
                 
struct Env 
{ 
	Lock; 
	Envval	*val; 
	char	name[NAMELEN]; 
	Env	*next;			/* in chain of Envs for a pgrp */ 
	int	pgref;			/* # pgrps pointing here */ 
}; 
                 
struct Envp 
{ 
	Env	*env; 
	int	chref;			/* # chans from pgrp pointing here */ 
}; 
                 
1991/0428    
/* 
 *  machine dependent definitions not used by ../port/dat.h 
 */ 
1990/1223    
struct KMap 
{ 
	KMap	*next; 
1991/0427/sys/src/9/ss/dat.h:239,3851991/0428/sys/src/9/ss/dat.h:135,140
1990/1223    
	int	stack[1]; 
}; 
 
struct Mount 
{ 
	Ref;				/* also used as a lock when playing lists */ 
	short	term;			/* terminates list */ 
	ulong	mountid; 
	Mount	*next; 
	Chan	*c;			/* channel replacing underlying channel */ 
}; 
                 
struct Mtab 
{ 
	Chan	*c;			/* channel mounted upon */ 
	Mount	*mnt;			/* what's mounted upon it */ 
}; 
                 
enum{ 
	NUser,				/* note provided externally */ 
	NExit,				/* process should exit */ 
	NDebug,				/* process should hang */ 
}; 
                 
struct Note 
{ 
	char	msg[ERRLEN]; 
	int	flag;			/* whether system posted it */ 
}; 
                 
struct Orig 
{ 
	Lock; 
	Orig	*next;			/* for allocation */ 
	ushort	nproc;			/* processes using it */ 
	ushort	npage;			/* sum of refs of pages in it */ 
	ushort	flag; 
	ulong	va;			/* va of 0th pte */ 
	ulong	npte;			/* #pte's in list */ 
	PTE	*pte; 
	Chan	*chan;			/* channel deriving segment (if open) */ 
	ushort	type;			/* of channel (which could be non-open) */ 
	Qid	qid; 
	Chan	*mchan; 
	Qid	mqid; 
	ulong	minca;			/* base of region in chan */ 
	ulong	maxca;			/* end of region in chan */ 
}; 
                 
struct Page 
{ 
	Orig	*o;			/* origin of segment owning page */ 
	ulong	va;			/* virtual address */ 
	ulong	pa;			/* physical address */ 
	ushort	ref; 
	Page	*next; 
	Page	*prev; 
}; 
                 
struct Pgrp 
{ 
	Ref;				/* also used as a lock when mounting */ 
	Pgrp	*next; 
	int	index;			/* index in pgrp table */ 
	ulong	pgrpid; 
	char	user[NAMELEN]; 
	int	nmtab;			/* highest active mount table entry, +1 */ 
	int	nenv;			/* highest active env table entry, +1 */ 
1991/0212    
	QLock	debug;			/* single access via devproc.c */ 
1990/1223    
	Mtab	*mtab; 
	Envp	*etab; 
}; 
                 
struct PTE 
{ 
	Proc	*proc;			/* process owning this PTE (0 in Orig) */ 
	PTE	*nextmod;		/* next at this va */ 
	PTE	*nextva;		/* next in this proc at higher va */ 
	Page	*page; 
}; 
                 
struct Rendez 
{ 
	Lock; 
	Proc	*p; 
}; 
                 
struct Seg 
{ 
	Proc	*proc;			/* process owning this segment */ 
	Orig	*o;			/* root list of pte's */ 
	ulong	minva;			/* va of 0th pte (not necessarily Seg->o->va) */ 
	ulong	maxva;			/* va of last pte */ 
	PTE	*mod;			/* list of modified pte's */ 
	ulong	pad[3]; /**/ 
}; 
                 
struct Proc 
{ 
	Label	sched; 
	Mach	*mach;			/* machine running this proc */ 
	char	text[NAMELEN]; 
	Proc	*rnext;			/* next process in run queue */ 
	Proc	*qnext;			/* next process on queue for a QLock */ 
	int	state; 
	int	spin;			/* spinning instead of unscheduled */ 
	Page	*upage;			/* BUG: should be unlinked from page list */ 
	Seg	seg[NSEG]; 
	ulong	bssend;			/* initial top of bss seg */ 
	ulong	pid; 
	int	nchild; 
	QLock	wait;			/* exiting children to be waited for */ 
1991/0109    
	Waitmsg	waitmsg;		/* this is large but must be addressable */ 
1990/1223    
	Proc	*child; 
	Proc	*parent; 
	Pgrp	*pgrp; 
	ulong	parentpid; 
	ulong	time[6];		/* User, Sys, Real; child U, S, R */ 
	short	exiting; 
	short	insyscall; 
	int	fpstate; 
	Lock	debug;			/* to access debugging elements of User */ 
	Rendez	*r;			/* rendezvous point slept on */ 
	Rendez	sleep;			/* place for tsleep and syssleep */ 
	int	wokeup;			/* whether sleep was interrupted */ 
	ulong	pc;			/* DEBUG only */ 
	int	kp;			/* true if a kernel process */ 
1990/1226    
	int	pidonmach[MAXMACH];	/* TLB pid on each mmu */ 
1991/0112    
	int	nmmuseg;		/* number of segments active in mmu */ 
1990/1223    
}; 
                 
struct MMU 
{ 
	ulong	va; 
	ulong	pa; 
}; 
                 
#define NMMU 16 
struct MMUCache 
{ 
	ulong	next; 
	MMU	mmu[NMMU]; 
}; 
                 
#define	NERR	15 
#define	NNOTE	5 
#define	NFD	100 
1991/0427/sys/src/9/ss/dat.h:403,5461991/0428/sys/src/9/ss/dat.h:158,167
1990/1223    
	short	nnote; 
	short	notified;		/* sysnoted is due */ 
	int	(*notify)(void*, char*); 
	MMUCache mc; 
	void	*ureg; 
}; 
 
/* 
 *  operations available to a queue 
 */ 
struct Qinfo 
{ 
	void (*iput)(Queue*, Block*);	/* input routine */ 
	void (*oput)(Queue*, Block*);	/* output routine */ 
	void (*open)(Queue*, Stream*); 
	void (*close)(Queue*); 
	char *name; 
	void (*reset)(void);		/* initialization */ 
	Qinfo *next; 
}; 
                 
/* 
 *  We reference lance buffers via descriptors kept in host memory 
 */ 
struct Block 
{ 
	Block	*next; 
	uchar	*rptr;		/* first unconsumed byte */ 
	uchar	*wptr;		/* first empty byte */ 
	uchar	*lim;		/* 1 past the end of the buffer */ 
	uchar	*base;		/* start of the buffer */ 
	uchar	flags; 
	uchar	type; 
}; 
                 
/* flag bits */ 
#define S_DELIM 0x80 
#define S_CLASS 0x07 
                 
/* type values */ 
#define M_DATA 0 
#define M_CTL 1 
#define M_HANGUP 2 
                 
/* 
 *  a list of blocks 
 */ 
struct Blist { 
	Lock; 
	Block	*first;		/* first data block */ 
	Block	*last;		/* last data block */ 
	long	len;		/* length of list in bytes */ 
	int	nb;		/* number of blocks in list */ 
}; 
                 
/* 
 *  a queue of blocks 
 */ 
struct Queue { 
	Blist; 
	int	flag; 
	Qinfo	*info;		/* line discipline definition */ 
	Queue	*other;		/* opposite direction, same line discipline */ 
	Queue	*next;		/* next queue in the stream */ 
	void	(*put)(Queue*, Block*); 
	QLock	rlock;		/* mutex for processes sleeping at r */ 
	Rendez	r;		/* standard place to wait for flow control */ 
	Rendez	*rp;		/* where flow control wakeups go to */ 
	void	*ptr;		/* private info for the queue */ 
}; 
#define QHUNGUP	0x1	/* flag bit meaning the stream has been hung up */ 
#define QINUSE	0x2 
#define QHIWAT	0x4	/* queue has gone past the high water mark */	 
#define QDEBUG	0x8 
                 
/* 
 *  a stream head 
 */ 
struct Stream { 
	QLock;			/* structure lock */ 
	short	inuse;		/* number of processes in stream */ 
	short	opens;		/* number of processes with stream open */ 
	ushort	hread;		/* number of reads after hangup */ 
	ushort	type;		/* correlation with Chan */ 
	ushort	dev;		/* ... */ 
	ushort	id;		/* ... */ 
	QLock	rdlock;		/* read lock */ 
	Queue	*procq;		/* write queue at process end */ 
	Queue	*devq;		/* read queue at device end */ 
1991/0411    
	Block	*err;		/* error message from down stream */ 
1990/1223    
}; 
#define	RD(q)		((q)->other < (q) ? (q->other) : q) 
#define	WR(q)		((q)->other > (q) ? (q->other) : q) 
#define GLOBAL(a)	(((ulong)(a)) & 0x80000000) 
#define STREAMTYPE(x)	((x)&0x1f) 
#define STREAMID(x)	(((x)&~CHDIR)>>5) 
#define STREAMQID(i,t)	(((i)<<5)|(t)) 
#define PUTNEXT(q,b)	(*(q)->next->put)((q)->next, b) 
#define BLEN(b)		((b)->wptr - (b)->rptr) 
#define QFULL(q)	((q)->flag & QHIWAT) 
#define FLOWCTL(q)	{ if(QFULL(q->next)) flowctl(q); } 
                 
/* 
 *  stream file qid's & high water mark 
 */ 
enum { 
	Shighqid = STREAMQID(1,0) - 1, 
	Sdataqid = Shighqid, 
	Sctlqid = Sdataqid-1, 
	Slowqid = Sctlqid, 
	Streamhi= (9*1024),	/* byte count high water mark */ 
	Streambhi= 32,		/* block count high water mark */ 
}; 
                 
1990/1231    
/* 
 *  Ethernet packet buffers. 
 */ 
struct Etherpkt { 
	uchar d[6]; 
	uchar s[6]; 
	uchar type[2]; 
	uchar data[1500]; 
	uchar crc[4]; 
}; 
1991/0407    
#define	ETHERMINTU	60	/* minimum transmit size */ 
#define	ETHERMAXTU	1514	/* maximum transmit size */ 
#define ETHERHDRSIZE	14	/* size of an ethernet header */ 
1990/1231    
                 
1990/1223    
#define NSTUB 32 
struct Service 
{ 
	Ref; 
	Service *next; 
	QLock	alock; 
	int	die; 
	Chan	*inc; 
	Chan	*outc; 
	char	name[NAMELEN]; 
}; 
                 
1991/0109    
/* 
 *  LANCE CSR3 (bus control bits) 
 */ 
#define BSWP	0x4 
1991/0427/sys/src/9/ss/dat.h:571,6761991/0428/sys/src/9/ss/dat.h:192,198
1990/1231    
	Etherpkt *ltp;		/* transmit buffers (lance address) */ 
}; 
1990/1223    
 
#define	PRINTSIZE	256 
                 
1990/1226    
extern register Mach	*m;		/* R6 */ 
extern register User	*u;		/* R5 */ 
1990/1223    
 
/* 
 * Process states 
 */ 
enum 
{ 
	Dead = 0, 
	Moribund, 
	Zombie, 
	Ready, 
	Scheding, 
	Running, 
	Queueing, 
	MMUing, 
	Exiting, 
	Inwait, 
	Wakeme, 
	Broken, 
}; 
extern	char	*statename[]; 
                 
/* 
 * Chan flags 
 */ 
#define	COPEN	1	/* for i/o */ 
#define	CMOUNT	2	/* is result of a mount/bind */ 
#define	CCREATE	4	/* permits creation if CMOUNT */ 
#define	CCEXEC	8	/* close on exec */ 
#define	CFREE	16	/* not in use */ 
                 
/* 
 * Proc.time 
 */ 
enum 
{ 
	TUser, 
	TSys, 
	TReal, 
	TCUser, 
	TCSys, 
	TCReal, 
}; 
                 
/* 
 * floating point registers 
 */ 
enum 
{ 
	FPinit, 
	FPactive, 
1991/01151    
	FPinactive, 
1990/1223    
}; 
                 
/* 
 * Memory management 
 */ 
#define	SSEG	0 
#define	TSEG	1 
#define	DSEG	2 
#define	BSEG	3 
#define	ESEG	4	/* used by exec to build new stack */ 
                 
#define	OWRPERM	0x01	/* write permission */ 
#define	OPURE	0x02	/* original data mustn't be written */ 
#define	OCACHED	0x04	/* cached; don't discard on exit */ 
                 
/* 
 * Access types in namec 
 */ 
enum 
{ 
	Aaccess,	/* as in access, stat */ 
	Atodir,		/* as in chdir */ 
	Aopen,		/* for i/o */ 
	Amount,		/* to be mounted upon */ 
	Acreate,	/* file is to be created */ 
}; 
                 
#define	NUMSIZE	12		/* size of formatted number */ 
                 
#define	MACHP(n)	(n==0? &mach0 : *(Mach**)0) 
                 
extern	Conf	conf; 
extern	ulong	initcode[]; 
extern	Dev	devtab[]; 
extern	char	devchar[]; 
extern	FPsave	initfp; 
extern	Mach	mach0; 
extern	char	user[NAMELEN]; 
extern	char	*errstrtab[]; 
1991/0110    
extern	uchar	*intrreg; 
1990/1223    
                 
extern  void	(*kprofp)(ulong); 
                 
/* 
 *  parameters for sysproc.c 
 */ 
1990/1226    
#define AOUT_MAGIC	K_MAGIC 
1990/1223    
#define ENTRYOFFSET	0 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)