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