xref: /plan9-contrib/sys/src/9/vt4/dat.h (revision 77dd0a987f922b1125641a8757e16b54f2cf323f)
1*d6dfd9efSDavid du Colombier typedef struct Conf	Conf;
2*d6dfd9efSDavid du Colombier typedef struct Confmem	Confmem;
3*d6dfd9efSDavid du Colombier typedef struct ISAConf	ISAConf;
4*d6dfd9efSDavid du Colombier typedef struct Label	Label;
5*d6dfd9efSDavid du Colombier typedef struct Lock	Lock;
6*d6dfd9efSDavid du Colombier typedef struct Mach	Mach;
7*d6dfd9efSDavid du Colombier typedef u32int Mreg;				/* Msr - bloody UART */
8*d6dfd9efSDavid du Colombier typedef struct Page	Page;
9*d6dfd9efSDavid du Colombier typedef struct FPsave	FPsave;
10*d6dfd9efSDavid du Colombier typedef struct PMMU	PMMU;
11*d6dfd9efSDavid du Colombier typedef struct Proc	Proc;
12*d6dfd9efSDavid du Colombier typedef struct Softtlb	Softtlb;
13*d6dfd9efSDavid du Colombier typedef struct Sys	Sys;
14*d6dfd9efSDavid du Colombier typedef uvlong		Tval;
15*d6dfd9efSDavid du Colombier typedef struct Ureg	Ureg;
16*d6dfd9efSDavid du Colombier 
17*d6dfd9efSDavid du Colombier #pragma incomplete Ureg
18*d6dfd9efSDavid du Colombier 
19*d6dfd9efSDavid du Colombier #define MAXSYSARG	5	/* for mount(fd, mpt, flag, arg, srv) */
20*d6dfd9efSDavid du Colombier 
21*d6dfd9efSDavid du Colombier /*
22*d6dfd9efSDavid du Colombier  *  parameters for sysproc.c
23*d6dfd9efSDavid du Colombier  */
24*d6dfd9efSDavid du Colombier #define AOUT_MAGIC	Q_MAGIC
25*d6dfd9efSDavid du Colombier 
26*d6dfd9efSDavid du Colombier /*
27*d6dfd9efSDavid du Colombier  * intc bits, as of 18 aug 2009.
28*d6dfd9efSDavid du Colombier  * specific to rae's virtex4 design
29*d6dfd9efSDavid du Colombier  * vanilla design defines Intuarttx.
30*d6dfd9efSDavid du Colombier  */
31*d6dfd9efSDavid du Colombier enum {
32*d6dfd9efSDavid du Colombier 	Bitllfifo,
33*d6dfd9efSDavid du Colombier 	Bittemac,
34*d6dfd9efSDavid du Colombier 	Bitdma,
35*d6dfd9efSDavid du Colombier 	Bitdma2,
36*d6dfd9efSDavid du Colombier 	Bituart,
37*d6dfd9efSDavid du Colombier 	Bitmiiphy,
38*d6dfd9efSDavid du Colombier 	Bitqtmmacfail,			/* qtm only */
39*d6dfd9efSDavid du Colombier 	Bitqtmdraminit,			/* qtm only */
40*d6dfd9efSDavid du Colombier 
41*d6dfd9efSDavid du Colombier 	Intllfifo=1<<Bitllfifo,		/* local-link FIFO */
42*d6dfd9efSDavid du Colombier 	Inttemac= 1<<Bittemac,
43*d6dfd9efSDavid du Colombier 	Intdma	= 1<<Bitdma,
44*d6dfd9efSDavid du Colombier 	Intdma2	= 1<<Bitdma2,
45*d6dfd9efSDavid du Colombier 	Intuart = 1<<Bituart,
46*d6dfd9efSDavid du Colombier 	Intmiiphy = 1<<Bitmiiphy,
47*d6dfd9efSDavid du Colombier 	Intqtmmacfail= 1<<Bitqtmmacfail,
48*d6dfd9efSDavid du Colombier 	Intqtmdraminit= 1<<Bitqtmdraminit,
49*d6dfd9efSDavid du Colombier 
50*d6dfd9efSDavid du Colombier 	/* led bits */
51*d6dfd9efSDavid du Colombier 	Ledtrap = 1<<0,		/* states: processing a trap */
52*d6dfd9efSDavid du Colombier 	Ledkern = 1<<1,		/* running a kernel proc */
53*d6dfd9efSDavid du Colombier 	Leduser = 1<<2,		/* running a user proc */
54*d6dfd9efSDavid du Colombier 	Ledidle = 1<<3,		/* idling */
55*d6dfd9efSDavid du Colombier 	Ledpanic = 1<<4,	/* panicing */
56*d6dfd9efSDavid du Colombier 	Ledpulse = 1<<5,	/* flags: still alive */
57*d6dfd9efSDavid du Colombier 	Ledethinwait = 1<<6,	/* ethernet i/o waits */
58*d6dfd9efSDavid du Colombier 	Ledethoutwait = 1<<7,
59*d6dfd9efSDavid du Colombier };
60*d6dfd9efSDavid du Colombier 
61*d6dfd9efSDavid du Colombier #define LEDKERN
62*d6dfd9efSDavid du Colombier 
63*d6dfd9efSDavid du Colombier /*
64*d6dfd9efSDavid du Colombier  *  machine dependent definitions used by ../port/dat.h
65*d6dfd9efSDavid du Colombier  */
66*d6dfd9efSDavid du Colombier 
67*d6dfd9efSDavid du Colombier struct Lock
68*d6dfd9efSDavid du Colombier {
69*d6dfd9efSDavid du Colombier 	ulong	key;
70*d6dfd9efSDavid du Colombier 	ulong	sr;
71*d6dfd9efSDavid du Colombier 	ulong	pc;
72*d6dfd9efSDavid du Colombier 	Proc	*p;
73*d6dfd9efSDavid du Colombier 	Mach	*m;
74*d6dfd9efSDavid du Colombier 	ushort	isilock;
75*d6dfd9efSDavid du Colombier 	ulong	magic;
76*d6dfd9efSDavid du Colombier };
77*d6dfd9efSDavid du Colombier 
78*d6dfd9efSDavid du Colombier struct Label
79*d6dfd9efSDavid du Colombier {
80*d6dfd9efSDavid du Colombier 	ulong	sp;
81*d6dfd9efSDavid du Colombier 	ulong	pc;
82*d6dfd9efSDavid du Colombier };
83*d6dfd9efSDavid du Colombier 
84*d6dfd9efSDavid du Colombier /*
85*d6dfd9efSDavid du Colombier  * emulated floating point
86*d6dfd9efSDavid du Colombier  */
87*d6dfd9efSDavid du Colombier struct FPsave
88*d6dfd9efSDavid du Colombier {
89*d6dfd9efSDavid du Colombier 	union {
90*d6dfd9efSDavid du Colombier 		double	fpscrd;
91*d6dfd9efSDavid du Colombier 		struct {
92*d6dfd9efSDavid du Colombier 			ulong	pad;
93*d6dfd9efSDavid du Colombier 			ulong	fpscr;
94*d6dfd9efSDavid du Colombier 		};
95*d6dfd9efSDavid du Colombier 	};
96*d6dfd9efSDavid du Colombier 	int	fpistate;
97*d6dfd9efSDavid du Colombier 	ulong	emreg[32][3];
98*d6dfd9efSDavid du Colombier };
99*d6dfd9efSDavid du Colombier 
100*d6dfd9efSDavid du Colombier /*
101*d6dfd9efSDavid du Colombier  * FPsave.status
102*d6dfd9efSDavid du Colombier  */
103*d6dfd9efSDavid du Colombier enum
104*d6dfd9efSDavid du Colombier {
105*d6dfd9efSDavid du Colombier 	FPinit,
106*d6dfd9efSDavid du Colombier 	FPactive,
107*d6dfd9efSDavid du Colombier 	FPinactive,
108*d6dfd9efSDavid du Colombier 
109*d6dfd9efSDavid du Colombier 	/* bit or'd with the state */
110*d6dfd9efSDavid du Colombier 	FPillegal= 0x100,
111*d6dfd9efSDavid du Colombier };
112*d6dfd9efSDavid du Colombier 
113*d6dfd9efSDavid du Colombier struct Confmem
114*d6dfd9efSDavid du Colombier {
115*d6dfd9efSDavid du Colombier 	ulong	base;
116*d6dfd9efSDavid du Colombier 	ulong	npage;
117*d6dfd9efSDavid du Colombier 	ulong	kbase;
118*d6dfd9efSDavid du Colombier 	ulong	klimit;
119*d6dfd9efSDavid du Colombier };
120*d6dfd9efSDavid du Colombier 
121*d6dfd9efSDavid du Colombier struct Conf
122*d6dfd9efSDavid du Colombier {
123*d6dfd9efSDavid du Colombier 	ulong	nmach;		/* processors */
124*d6dfd9efSDavid du Colombier 	ulong	nproc;		/* processes */
125*d6dfd9efSDavid du Colombier 	Confmem	mem[4];
126*d6dfd9efSDavid du Colombier 	ulong	npage;		/* total physical pages of memory */
127*d6dfd9efSDavid du Colombier 	ulong	upages;		/* user page pool */
128*d6dfd9efSDavid du Colombier 	ulong	nimage;		/* number of page cache image headers */
129*d6dfd9efSDavid du Colombier 	ulong	nswap;		/* number of swap pages */
130*d6dfd9efSDavid du Colombier 	int	nswppo;		/* max # of pageouts per segment pass */
131*d6dfd9efSDavid du Colombier 	ulong	copymode;	/* 0 is copy on write, 1 is copy on reference */
132*d6dfd9efSDavid du Colombier 	int	monitor;		/* has display? */
133*d6dfd9efSDavid du Colombier 	ulong	ialloc;		/* bytes available for interrupt time allocation */
134*d6dfd9efSDavid du Colombier 	ulong	pipeqsize;	/* size in bytes of pipe queues */
135*d6dfd9efSDavid du Colombier };
136*d6dfd9efSDavid du Colombier 
137*d6dfd9efSDavid du Colombier /*
138*d6dfd9efSDavid du Colombier  *  mmu goo in the Proc structure
139*d6dfd9efSDavid du Colombier  */
140*d6dfd9efSDavid du Colombier #define NCOLOR 1
141*d6dfd9efSDavid du Colombier struct PMMU
142*d6dfd9efSDavid du Colombier {
143*d6dfd9efSDavid du Colombier 	int	mmupid;
144*d6dfd9efSDavid du Colombier };
145*d6dfd9efSDavid du Colombier 
146*d6dfd9efSDavid du Colombier /* debugging */
147*d6dfd9efSDavid du Colombier #define TRIGGER()	*(int *)(PHYSSRAM + 0xf0) = 0
148*d6dfd9efSDavid du Colombier 
149*d6dfd9efSDavid du Colombier #include "../port/portdat.h"
150*d6dfd9efSDavid du Colombier 
151*d6dfd9efSDavid du Colombier /*
152*d6dfd9efSDavid du Colombier  *  machine dependent definitions not used by ../port/dat.h
153*d6dfd9efSDavid du Colombier  */
154*d6dfd9efSDavid du Colombier /*
155*d6dfd9efSDavid du Colombier  * Fake kmap
156*d6dfd9efSDavid du Colombier  */
157*d6dfd9efSDavid du Colombier typedef	void		KMap;
158*d6dfd9efSDavid du Colombier #define	VA(k)		PTR2UINT(k)
159*d6dfd9efSDavid du Colombier #define	kmap(p)		(KMap*)((p)->pa|KZERO)
160*d6dfd9efSDavid du Colombier #define	kmapinval()
161*d6dfd9efSDavid du Colombier #define	kunmap(k)
162*d6dfd9efSDavid du Colombier 
163*d6dfd9efSDavid du Colombier struct Mach
164*d6dfd9efSDavid du Colombier {
165*d6dfd9efSDavid du Colombier 	/* OFFSETS OF THE FOLLOWING KNOWN BY l.s */
166*d6dfd9efSDavid du Colombier 	int	machno;			/* physical id of processor [0*4] */
167*d6dfd9efSDavid du Colombier 	ulong	splpc;			/* pc that called splhi() [1*4] */
168*d6dfd9efSDavid du Colombier 	Proc	*proc;			/* current process on this processor [2*4] */
169*d6dfd9efSDavid du Colombier 	uintptr	pstlb;	/* physical address of Mach.stlb [3*4] */
170*d6dfd9efSDavid du Colombier 	int	utlbhi;		/* lowest tlb index in use by kernel [4*4] */
171*d6dfd9efSDavid du Colombier 	int	utlbnext;		/* next tlb entry to use for user (round robin) [5*4] */
172*d6dfd9efSDavid du Colombier 	int	tlbfault;		/* number of tlb i/d misses [6*4] */
173*d6dfd9efSDavid du Colombier 
174*d6dfd9efSDavid du Colombier 	/* ordering from here on irrelevant */
175*d6dfd9efSDavid du Colombier 
176*d6dfd9efSDavid du Colombier 	ulong	ticks;			/* of the clock since boot time */
177*d6dfd9efSDavid du Colombier 	Label	sched;			/* scheduler wakeup */
178*d6dfd9efSDavid du Colombier 	Lock	alarmlock;		/* access to alarm list */
179*d6dfd9efSDavid du Colombier 	void	*alarm;			/* alarms bound to this clock */
180*d6dfd9efSDavid du Colombier 	int	inclockintr;
181*d6dfd9efSDavid du Colombier 
182*d6dfd9efSDavid du Colombier 	Proc*	readied;		/* for runproc */
183*d6dfd9efSDavid du Colombier 	ulong	schedticks;	/* next forced context switch */
184*d6dfd9efSDavid du Colombier 
185*d6dfd9efSDavid du Colombier 	Mach	*me;		/* debugging: should be my own address */
186*d6dfd9efSDavid du Colombier 
187*d6dfd9efSDavid du Colombier 	long	oscclk;	/* oscillator frequency (MHz) */
188*d6dfd9efSDavid du Colombier 	long	cpuhz;	/* general system clock (cycles) */
189*d6dfd9efSDavid du Colombier 	long	clockgen;	/* clock generator frequency (cycles) */
190*d6dfd9efSDavid du Colombier 	long	vcohz;
191*d6dfd9efSDavid du Colombier 	long	pllhz;
192*d6dfd9efSDavid du Colombier 	long	plbhz;
193*d6dfd9efSDavid du Colombier 	long	opbhz;
194*d6dfd9efSDavid du Colombier 	long	epbhz;
195*d6dfd9efSDavid du Colombier 	long	pcihz;
196*d6dfd9efSDavid du Colombier 	int	cputype;
197*d6dfd9efSDavid du Colombier 	ulong	delayloop;
198*d6dfd9efSDavid du Colombier 	uvlong	cyclefreq;	/* frequency of user readable cycle clock */
199*d6dfd9efSDavid du Colombier 
200*d6dfd9efSDavid du Colombier 	Mach	*me2;		/* debugging: should be my own address */
201*d6dfd9efSDavid du Colombier 
202*d6dfd9efSDavid du Colombier 	uvlong	fastclock;
203*d6dfd9efSDavid du Colombier 	Perf	perf;			/* performance counters */
204*d6dfd9efSDavid du Colombier 
205*d6dfd9efSDavid du Colombier 	int	tlbpurge;		/* ... */
206*d6dfd9efSDavid du Colombier 	int	pfault;
207*d6dfd9efSDavid du Colombier 	int	cs;
208*d6dfd9efSDavid du Colombier 	int	syscall;
209*d6dfd9efSDavid du Colombier 	int	load;
210*d6dfd9efSDavid du Colombier 	int	intr;
211*d6dfd9efSDavid du Colombier 	int	flushmmu;		/* make current proc flush its mmu state */
212*d6dfd9efSDavid du Colombier 	int	ilockdepth;
213*d6dfd9efSDavid du Colombier 
214*d6dfd9efSDavid du Colombier 	int	lastpid;		/* last TLB pid allocated on this machine */
215*d6dfd9efSDavid du Colombier 	QLock	stlblock;	/* prevent context switch during tlb update */
216*d6dfd9efSDavid du Colombier 	Softtlb*	stlb;		/* software tlb cache (see also pstlb above) */
217*d6dfd9efSDavid du Colombier 	Proc*	pidproc[NTLBPID];	/* which proc owns a given pid */
218*d6dfd9efSDavid du Colombier 
219*d6dfd9efSDavid du Colombier 	ulong	spuriousintr;
220*d6dfd9efSDavid du Colombier 	int	lastintr;
221*d6dfd9efSDavid du Colombier 
222*d6dfd9efSDavid du Colombier 	ulong	magic;		/* debugging; also check for stack overflow */
223*d6dfd9efSDavid du Colombier 
224*d6dfd9efSDavid du Colombier 	/* MUST BE LAST */
225*d6dfd9efSDavid du Colombier 	int	stack[1];
226*d6dfd9efSDavid du Colombier };
227*d6dfd9efSDavid du Colombier 
228*d6dfd9efSDavid du Colombier struct Softtlb {
229*d6dfd9efSDavid du Colombier 	u32int	hi;	/* tlb hi, except that low order 10 bits have (pid[8]<<2) */
230*d6dfd9efSDavid du Colombier 	u32int		lo;
231*d6dfd9efSDavid du Colombier };
232*d6dfd9efSDavid du Colombier 
233*d6dfd9efSDavid du Colombier struct
234*d6dfd9efSDavid du Colombier {
235*d6dfd9efSDavid du Colombier 	Lock;
236*d6dfd9efSDavid du Colombier 	short	machs;
237*d6dfd9efSDavid du Colombier 	short	exiting;
238*d6dfd9efSDavid du Colombier 	short	ispanic;
239*d6dfd9efSDavid du Colombier 	int	thunderbirdsarego; /* lets the added processors continue to schedinit */
240*d6dfd9efSDavid du Colombier }active;
241*d6dfd9efSDavid du Colombier 
242*d6dfd9efSDavid du Colombier /*
243*d6dfd9efSDavid du Colombier  *  a parsed plan9.ini line
244*d6dfd9efSDavid du Colombier  */
245*d6dfd9efSDavid du Colombier #define NISAOPT		8
246*d6dfd9efSDavid du Colombier 
247*d6dfd9efSDavid du Colombier struct ISAConf {
248*d6dfd9efSDavid du Colombier 	char		*type;
249*d6dfd9efSDavid du Colombier 	ulong	port;
250*d6dfd9efSDavid du Colombier 	int	irq;
251*d6dfd9efSDavid du Colombier 	ulong	dma;
252*d6dfd9efSDavid du Colombier 	ulong	mem;
253*d6dfd9efSDavid du Colombier 	ulong	size;
254*d6dfd9efSDavid du Colombier 	ulong	freq;
255*d6dfd9efSDavid du Colombier 
256*d6dfd9efSDavid du Colombier 	int	nopt;
257*d6dfd9efSDavid du Colombier 	char	*opt[NISAOPT];
258*d6dfd9efSDavid du Colombier };
259*d6dfd9efSDavid du Colombier 
260*d6dfd9efSDavid du Colombier #define	MACHP(n)	((Mach *)((int)&mach0 + (n)*BY2PG))
261*d6dfd9efSDavid du Colombier extern Mach		mach0;
262*d6dfd9efSDavid du Colombier 
263*d6dfd9efSDavid du Colombier extern register Mach	*m;
264*d6dfd9efSDavid du Colombier extern register Proc	*up;
265*d6dfd9efSDavid du Colombier 
266*d6dfd9efSDavid du Colombier /*
267*d6dfd9efSDavid du Colombier  * Horrid. But the alternative is 'defined'.
268*d6dfd9efSDavid du Colombier  */
269*d6dfd9efSDavid du Colombier #ifdef _DBGC_
270*d6dfd9efSDavid du Colombier #define DBGFLG		(dbgflg[_DBGC_])
271*d6dfd9efSDavid du Colombier #else
272*d6dfd9efSDavid du Colombier #define DBGFLG		(0)
273*d6dfd9efSDavid du Colombier #endif /* _DBGC_ */
274*d6dfd9efSDavid du Colombier 
275*d6dfd9efSDavid du Colombier // #define DBG(...)	if(DBGFLG) dbgprint(__VA_ARGS__)
276*d6dfd9efSDavid du Colombier 
277*d6dfd9efSDavid du Colombier typedef struct {
278*d6dfd9efSDavid du Colombier 	ulong	lasttm;		/* last mutation start in seconds */
279*d6dfd9efSDavid du Colombier 	ulong	startticks;
280*d6dfd9efSDavid du Colombier 	ulong	lastticks;
281*d6dfd9efSDavid du Colombier 	ulong	count;
282*d6dfd9efSDavid du Colombier 	ulong	totticks;
283*d6dfd9efSDavid du Colombier 
284*d6dfd9efSDavid du Colombier 	ulong	period;		/* in seconds */
285*d6dfd9efSDavid du Colombier } Mutstats;
286*d6dfd9efSDavid du Colombier extern Mutstats mutstats;
287*d6dfd9efSDavid du Colombier 
288*d6dfd9efSDavid du Colombier char	dbgflg[256];
289*d6dfd9efSDavid du Colombier ulong	intrs1sec;			/* count interrupts in this second */
290*d6dfd9efSDavid du Colombier uintptr	memsz;
291*d6dfd9efSDavid du Colombier int	okprint;
292*d6dfd9efSDavid du Colombier int	securemem;
293*d6dfd9efSDavid du Colombier int	vflag;
294*d6dfd9efSDavid du Colombier 
295*d6dfd9efSDavid du Colombier #define dbgprint	print		/* for now */
296