xref: /plan9-contrib/sys/src/9/loongson/dat.h (revision 77dd0a987f922b1125641a8757e16b54f2cf323f)
1*a81c3ea0SDavid du Colombier typedef struct Conf	Conf;
2*a81c3ea0SDavid du Colombier typedef struct Confmem	Confmem;
3*a81c3ea0SDavid du Colombier typedef struct FPsave	FPsave;
4*a81c3ea0SDavid du Colombier typedef struct ISAConf	ISAConf;
5*a81c3ea0SDavid du Colombier typedef struct KMap	KMap;
6*a81c3ea0SDavid du Colombier typedef struct Lance	Lance;
7*a81c3ea0SDavid du Colombier typedef struct Lancemem	Lancemem;
8*a81c3ea0SDavid du Colombier typedef struct Label	Label;
9*a81c3ea0SDavid du Colombier typedef struct Lock	Lock;
10*a81c3ea0SDavid du Colombier typedef struct Mach	Mach;
11*a81c3ea0SDavid du Colombier typedef struct MMU	MMU;
12*a81c3ea0SDavid du Colombier typedef struct Pcidev	Pcidev;
13*a81c3ea0SDavid du Colombier typedef struct PMMU	PMMU;
14*a81c3ea0SDavid du Colombier typedef struct Softtlb	Softtlb;
15*a81c3ea0SDavid du Colombier typedef struct Ureg	Ureg;
16*a81c3ea0SDavid du Colombier typedef struct Proc	Proc;
17*a81c3ea0SDavid du Colombier typedef uvlong		Tval;
18*a81c3ea0SDavid du Colombier 
19*a81c3ea0SDavid du Colombier #pragma incomplete Pcidev
20*a81c3ea0SDavid du Colombier 
21*a81c3ea0SDavid du Colombier #define MAXSYSARG	5	/* for mount(fd, afd, mpt, flag, arg) */
22*a81c3ea0SDavid du Colombier 
23*a81c3ea0SDavid du Colombier /*
24*a81c3ea0SDavid du Colombier  *  parameters for sysproc.c and rebootcmd.c
25*a81c3ea0SDavid du Colombier  */
26*a81c3ea0SDavid du Colombier #define AOUT_MAGIC	N_MAGIC || magic==P_MAGIC
27*a81c3ea0SDavid du Colombier /* r3k or r4k boot images */
28*a81c3ea0SDavid du Colombier #define BOOT_MAGIC	(0x160<<16) || magic == ((0x160<<16)|3)
29*a81c3ea0SDavid du Colombier 
30*a81c3ea0SDavid du Colombier /*
31*a81c3ea0SDavid du Colombier  *  machine dependent definitions used by ../port/dat.h
32*a81c3ea0SDavid du Colombier  */
33*a81c3ea0SDavid du Colombier 
34*a81c3ea0SDavid du Colombier struct Lock
35*a81c3ea0SDavid du Colombier {
36*a81c3ea0SDavid du Colombier 	ulong	key;			/* semaphore (non-zero = locked) */
37*a81c3ea0SDavid du Colombier 	ulong	sr;
38*a81c3ea0SDavid du Colombier 	ulong	pc;
39*a81c3ea0SDavid du Colombier 	Proc	*p;
40*a81c3ea0SDavid du Colombier 	Mach	*m;
41*a81c3ea0SDavid du Colombier 	ushort	isilock;
42*a81c3ea0SDavid du Colombier };
43*a81c3ea0SDavid du Colombier 
44*a81c3ea0SDavid du Colombier struct Label
45*a81c3ea0SDavid du Colombier {
46*a81c3ea0SDavid du Colombier 	ulong	sp;
47*a81c3ea0SDavid du Colombier 	ulong	pc;
48*a81c3ea0SDavid du Colombier };
49*a81c3ea0SDavid du Colombier 
50*a81c3ea0SDavid du Colombier struct Confmem
51*a81c3ea0SDavid du Colombier {
52*a81c3ea0SDavid du Colombier 	ulong	base;
53*a81c3ea0SDavid du Colombier 	ulong	npage;
54*a81c3ea0SDavid du Colombier 	ulong	kbase;
55*a81c3ea0SDavid du Colombier 	ulong	klimit;
56*a81c3ea0SDavid du Colombier };
57*a81c3ea0SDavid du Colombier 
58*a81c3ea0SDavid du Colombier struct Conf
59*a81c3ea0SDavid du Colombier {
60*a81c3ea0SDavid du Colombier 	ulong	nmach;		/* processors */
61*a81c3ea0SDavid du Colombier 	ulong	nproc;		/* processes */
62*a81c3ea0SDavid du Colombier 	Confmem	mem[2];		/* physical memory */
63*a81c3ea0SDavid du Colombier 	ulong	npage;		/* total physical pages of memory */
64*a81c3ea0SDavid du Colombier 	ulong	upages;		/* user page pool */
65*a81c3ea0SDavid du Colombier 	ulong	nimage;		/* number of page cache image headers */
66*a81c3ea0SDavid du Colombier 	ulong	nswap;		/* number of swap pages */
67*a81c3ea0SDavid du Colombier 	int	nswppo;		/* max # of pageouts per segment pass */
68*a81c3ea0SDavid du Colombier 	ulong	copymode;	/* 0 is copy on write, 1 is copy on reference */
69*a81c3ea0SDavid du Colombier 	ulong	ialloc;		/* bytes available for interrupt-time allocation */
70*a81c3ea0SDavid du Colombier 	ulong	pipeqsize;	/* size in bytes of pipe queues */
71*a81c3ea0SDavid du Colombier 	int	nuart;		/* number of uart devices */
72*a81c3ea0SDavid du Colombier 	int	monitor;	/* has monitor? */
73*a81c3ea0SDavid du Colombier };
74*a81c3ea0SDavid du Colombier 
75*a81c3ea0SDavid du Colombier /*
76*a81c3ea0SDavid du Colombier  * floating point registers
77*a81c3ea0SDavid du Colombier  */
78*a81c3ea0SDavid du Colombier enum
79*a81c3ea0SDavid du Colombier {
80*a81c3ea0SDavid du Colombier 	/* floating point state */
81*a81c3ea0SDavid du Colombier 	FPinit,
82*a81c3ea0SDavid du Colombier 	FPactive,
83*a81c3ea0SDavid du Colombier 	FPinactive,
84*a81c3ea0SDavid du Colombier 	FPemu,
85*a81c3ea0SDavid du Colombier 
86*a81c3ea0SDavid du Colombier 	/* bit meaning floating point illegal */
87*a81c3ea0SDavid du Colombier 	FPillegal= 0x100,
88*a81c3ea0SDavid du Colombier };
89*a81c3ea0SDavid du Colombier 
90*a81c3ea0SDavid du Colombier enum {
91*a81c3ea0SDavid du Colombier 	Nfpregs		= 32,		/* floats; half as many doubles */
92*a81c3ea0SDavid du Colombier };
93*a81c3ea0SDavid du Colombier 
94*a81c3ea0SDavid du Colombier /*
95*a81c3ea0SDavid du Colombier  * floating point
96*a81c3ea0SDavid du Colombier  * fpstate is separate, kept in Proc
97*a81c3ea0SDavid du Colombier  */
98*a81c3ea0SDavid du Colombier struct FPsave
99*a81c3ea0SDavid du Colombier {
100*a81c3ea0SDavid du Colombier 	/* /dev/proc expects the registers to be first in FPsave */
101*a81c3ea0SDavid du Colombier 	ulong	reg[Nfpregs];		/* the canonical bits */
102*a81c3ea0SDavid du Colombier 	union {
103*a81c3ea0SDavid du Colombier 		ulong	fpstatus;	/* both are fcr31 */
104*a81c3ea0SDavid du Colombier 		ulong	fpcontrol;
105*a81c3ea0SDavid du Colombier 	};
106*a81c3ea0SDavid du Colombier 
107*a81c3ea0SDavid du Colombier 	int	fpdelayexec;		/* executing delay slot of branch */
108*a81c3ea0SDavid du Colombier 	uintptr	fpdelaypc;		/* pc to resume at after */
109*a81c3ea0SDavid du Colombier 	ulong	fpdelaysts;	/* save across user-mode delay-slot execution */
110*a81c3ea0SDavid du Colombier 
111*a81c3ea0SDavid du Colombier 	/* stuck-fault detection */
112*a81c3ea0SDavid du Colombier 	uintptr	fppc;			/* addr of last fault */
113*a81c3ea0SDavid du Colombier 	int	fpcnt;			/* how many consecutive at that addr */
114*a81c3ea0SDavid du Colombier };
115*a81c3ea0SDavid du Colombier 
116*a81c3ea0SDavid du Colombier /*
117*a81c3ea0SDavid du Colombier  *  mmu goo in the Proc structure
118*a81c3ea0SDavid du Colombier  */
119*a81c3ea0SDavid du Colombier struct PMMU
120*a81c3ea0SDavid du Colombier {
121*a81c3ea0SDavid du Colombier 	int	pidonmach[MAXMACH];
122*a81c3ea0SDavid du Colombier };
123*a81c3ea0SDavid du Colombier 
124*a81c3ea0SDavid du Colombier #include "../port/portdat.h"
125*a81c3ea0SDavid du Colombier 
126*a81c3ea0SDavid du Colombier /* First FIVE members' offsets known by l.s */
127*a81c3ea0SDavid du Colombier struct Mach
128*a81c3ea0SDavid du Colombier {
129*a81c3ea0SDavid du Colombier 	/* the following are all known by l.s and cannot be moved */
130*a81c3ea0SDavid du Colombier 	int	machno;			/* physical id of processor FIRST */
131*a81c3ea0SDavid du Colombier 	Softtlb*stb;			/* Software tlb simulation SECOND */
132*a81c3ea0SDavid du Colombier 	Proc*	proc;			/* process on this processor THIRD */
133*a81c3ea0SDavid du Colombier 	ulong	splpc;			/* pc that called splhi() FOURTH */
134*a81c3ea0SDavid du Colombier 	ulong	tlbfault;		/* # of tlb faults FIFTH */
135*a81c3ea0SDavid du Colombier 	ulong	ktlbfault;
136*a81c3ea0SDavid du Colombier 	ulong	utlbfault;
137*a81c3ea0SDavid du Colombier 
138*a81c3ea0SDavid du Colombier 	/* the following is safe to move */
139*a81c3ea0SDavid du Colombier 	ulong	tlbpurge;
140*a81c3ea0SDavid du Colombier 	ulong	ticks;			/* of the clock since boot time */
141*a81c3ea0SDavid du Colombier 	Label	sched;			/* scheduler wakeup */
142*a81c3ea0SDavid du Colombier 	void*	alarm;			/* alarms bound to this clock */
143*a81c3ea0SDavid du Colombier 	int	lastpid;		/* last pid allocated on this machine */
144*a81c3ea0SDavid du Colombier 	Proc*	pidproc[NTLBPID];	/* proc that owns tlbpid on this mach */
145*a81c3ea0SDavid du Colombier 	KMap*	kactive;		/* active on this machine */
146*a81c3ea0SDavid du Colombier 	int	knext;
147*a81c3ea0SDavid du Colombier 	uchar	ktlbx[NTLB];		/* tlb index used for kmap */
148*a81c3ea0SDavid du Colombier 	uchar	ktlbnext;
149*a81c3ea0SDavid du Colombier 	int	speed;			/* cpu speed */
150*a81c3ea0SDavid du Colombier 	ulong	delayloop;		/* for the delay() routine */
151*a81c3ea0SDavid du Colombier 	ulong	fairness;		/* for runproc */
152*a81c3ea0SDavid du Colombier 	int	flushmmu;
153*a81c3ea0SDavid du Colombier 	int	inclockintr;
154*a81c3ea0SDavid du Colombier 	int	ilockdepth;
155*a81c3ea0SDavid du Colombier 	Perf	perf;			/* performance counters */
156*a81c3ea0SDavid du Colombier 	uvlong	cyclefreq;		/* Frequency of user readable cycle counter */
157*a81c3ea0SDavid du Colombier 
158*a81c3ea0SDavid du Colombier 	/* for per-processor timers */
159*a81c3ea0SDavid du Colombier 	ulong	lastcount;
160*a81c3ea0SDavid du Colombier 	uvlong	fastticks;
161*a81c3ea0SDavid du Colombier 	ulong	hz;
162*a81c3ea0SDavid du Colombier 	ulong	maxperiod;
163*a81c3ea0SDavid du Colombier 	ulong	minperiod;
164*a81c3ea0SDavid du Colombier 
165*a81c3ea0SDavid du Colombier 	Proc*	readied;		/* for runproc */
166*a81c3ea0SDavid du Colombier 	ulong	schedticks;		/* next forced context switch */
167*a81c3ea0SDavid du Colombier 
168*a81c3ea0SDavid du Colombier 	int	pfault;
169*a81c3ea0SDavid du Colombier 	int	cs;
170*a81c3ea0SDavid du Colombier 	int	syscall;
171*a81c3ea0SDavid du Colombier 	int	load;
172*a81c3ea0SDavid du Colombier 	int	intr;
173*a81c3ea0SDavid du Colombier 	int	hashcoll;		/* soft-tlb hash collisions */
174*a81c3ea0SDavid du Colombier 	int	paststartup;		/* for putktlb */
175*a81c3ea0SDavid du Colombier 
176*a81c3ea0SDavid du Colombier 	int	stack[1];
177*a81c3ea0SDavid du Colombier };
178*a81c3ea0SDavid du Colombier 
179*a81c3ea0SDavid du Colombier struct KMap
180*a81c3ea0SDavid du Colombier {
181*a81c3ea0SDavid du Colombier 	Ref;
182*a81c3ea0SDavid du Colombier 	ulong	virt;
183*a81c3ea0SDavid du Colombier 	ulong	phys0;
184*a81c3ea0SDavid du Colombier 	ulong	phys1;
185*a81c3ea0SDavid du Colombier 	KMap*	next;
186*a81c3ea0SDavid du Colombier 	KMap*	konmach[MAXMACH];
187*a81c3ea0SDavid du Colombier 	Page*	pg;
188*a81c3ea0SDavid du Colombier 	ulong	pc;			/* of caller to kmap() */
189*a81c3ea0SDavid du Colombier };
190*a81c3ea0SDavid du Colombier 
191*a81c3ea0SDavid du Colombier #define	VA(k)		((k)->virt)
192*a81c3ea0SDavid du Colombier #define PPN(x)		((ulong)(x)>>6)		/* PPN in TLBPHYS0-1 */
193*a81c3ea0SDavid du Colombier 
194*a81c3ea0SDavid du Colombier /* offsets known by l.s */
195*a81c3ea0SDavid du Colombier struct Softtlb
196*a81c3ea0SDavid du Colombier {
197*a81c3ea0SDavid du Colombier 	ulong	virt;
198*a81c3ea0SDavid du Colombier 	ulong	phys0;
199*a81c3ea0SDavid du Colombier 	ulong	phys1;
200*a81c3ea0SDavid du Colombier };
201*a81c3ea0SDavid du Colombier 
202*a81c3ea0SDavid du Colombier struct
203*a81c3ea0SDavid du Colombier {
204*a81c3ea0SDavid du Colombier 	Lock;
205*a81c3ea0SDavid du Colombier 	long	machs;		/* bitmap of processors */
206*a81c3ea0SDavid du Colombier 	short	exiting;
207*a81c3ea0SDavid du Colombier 	int	ispanic;
208*a81c3ea0SDavid du Colombier } active;
209*a81c3ea0SDavid du Colombier 
210*a81c3ea0SDavid du Colombier extern KMap kpte[];
211*a81c3ea0SDavid du Colombier extern register Mach	*m;
212*a81c3ea0SDavid du Colombier extern register Proc	*up;
213*a81c3ea0SDavid du Colombier 
214*a81c3ea0SDavid du Colombier extern FPsave initfp;
215*a81c3ea0SDavid du Colombier extern ulong memsize;
216*a81c3ea0SDavid du Colombier 
217*a81c3ea0SDavid du Colombier extern	int normalprint;
218*a81c3ea0SDavid du Colombier 
219*a81c3ea0SDavid du Colombier /*
220*a81c3ea0SDavid du Colombier  *  a parsed plan9.ini line
221*a81c3ea0SDavid du Colombier  */
222*a81c3ea0SDavid du Colombier #define NISAOPT		8
223*a81c3ea0SDavid du Colombier 
224*a81c3ea0SDavid du Colombier struct ISAConf {
225*a81c3ea0SDavid du Colombier 	char	*type;
226*a81c3ea0SDavid du Colombier 	ulong	port;
227*a81c3ea0SDavid du Colombier 	int	irq;
228*a81c3ea0SDavid du Colombier 	ulong	dma;
229*a81c3ea0SDavid du Colombier 	ulong	mem;
230*a81c3ea0SDavid du Colombier 	ulong	size;
231*a81c3ea0SDavid du Colombier 	ulong	freq;
232*a81c3ea0SDavid du Colombier 
233*a81c3ea0SDavid du Colombier 	int	nopt;
234*a81c3ea0SDavid du Colombier 	char	*opt[NISAOPT];
235*a81c3ea0SDavid du Colombier };
236*a81c3ea0SDavid du Colombier 
237*a81c3ea0SDavid du Colombier typedef struct {
238*a81c3ea0SDavid du Colombier 	ulong	port;
239*a81c3ea0SDavid du Colombier 	int	size;
240*a81c3ea0SDavid du Colombier } Devport;
241*a81c3ea0SDavid du Colombier 
242*a81c3ea0SDavid du Colombier struct DevConf
243*a81c3ea0SDavid du Colombier {
244*a81c3ea0SDavid du Colombier 	ulong	intnum;			/* interrupt number */
245*a81c3ea0SDavid du Colombier 	char	*type;			/* card type, malloced */
246*a81c3ea0SDavid du Colombier 	int		nports;			/* Number of ports */
247*a81c3ea0SDavid du Colombier 	Devport	*ports;			/* The ports themselves */
248*a81c3ea0SDavid du Colombier };
249*a81c3ea0SDavid du Colombier 
250*a81c3ea0SDavid du Colombier typedef int regint;			/* register sized int, ensure single instr'n */
251