Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
/*
2
 * Memory and machine-specific definitions.  Used in C and assembler.
3
 */
4
 
5
/*
6
 * Sizes
7
 */
8
 
9
#define	BI2BY		8			/* bits per byte */
10
#define	BI2WD		32			/* bits per word */
11
#define	BY2WD		4			/* bytes per word */
12
#define	BY2V		8			/* bytes per vlong */
13
 
14
#define MAXBY2PG (16*1024) /* rounding for UTZERO in executables; see mkfile */
15
#define UTROUND(t)	ROUNDUP((t), MAXBY2PG)
16
 
17
#ifndef BIGPAGES
18
#define	BY2PG		4096			/* bytes per page */
19
#define	PGSHIFT		12			/* log2(BY2PG) */
20
#define	PGSZ		PGSZ4K
21
#define MACHSIZE	(2*BY2PG)
22
#else
23
/* 16K pages work very poorly */
24
#define	BY2PG		(16*1024)		/* bytes per page */
25
#define	PGSHIFT		14			/* log2(BY2PG) */
26
#define PGSZ		PGSZ16K
27
#define MACHSIZE	BY2PG
28
#endif
29
 
30
#define	KSTACK		8192			/* Size of kernel stack */
31
#define	WD2PG		(BY2PG/BY2WD)		/* words per page */
32
 
33
#define	MAXMACH		1   /* max # cpus system can run; see active.machs */
34
#define STACKALIGN(sp)	((sp) & ~7)		/* bug: assure with alloc */
35
#define	BLOCKALIGN	16
36
#define CACHELINESZ	32			/* mips24k */
37
#define ICACHESIZE	(64*1024)		/* rb450g */
38
#define DCACHESIZE	(32*1024)		/* rb450g */
39
 
40
#define MASK(w)		FMASK(0, w)
41
 
42
/*
43
 * Time
44
 */
45
#define	HZ		100			/* clock frequency */
46
#define	MS2HZ		(1000/HZ)		/* millisec per clock tick */
47
#define	TK2SEC(t)	((t)/HZ)		/* ticks to seconds */
48
 
49
/*
50
 * CP0 registers
51
 */
52
 
53
#define INDEX		0
54
#define RANDOM		1
55
#define TLBPHYS0	2	/* aka ENTRYLO0 */
56
#define TLBPHYS1	3	/* aka ENTRYLO1 */
57
#define CONTEXT		4
58
#define PAGEMASK	5
59
#define WIRED		6
60
#define BADVADDR	8
61
#define COUNT		9
62
#define TLBVIRT		10	/* aka ENTRYHI */
63
#define COMPARE		11
64
#define STATUS		12
65
#define CAUSE		13
66
#define EPC		14
67
#define	PRID		15
68
#define	CONFIG		16
69
#define	LLADDR		17
70
#define	WATCHLO		18
71
#define	WATCHHI		19
72
#define DEBUG		23
73
#define DEPC		24
74
#define PERFCOUNT	25
75
#define	CACHEECC	26
76
#define	CACHEERR	27
77
#define	TAGLO		28
78
#define	TAGHI		29
79
#define	ERROREPC	30
80
#define DESAVE		31
81
 
82
/*
83
 * M(STATUS) bits
84
 */
85
#define KMODEMASK	0x0000001f
86
#define IE		0x00000001	/* master interrupt enable */
87
#define EXL		0x00000002	/* exception level */
88
#define ERL		0x00000004	/* error level */
89
#define KSUPER		0x00000008
90
#define KUSER		0x00000010
91
#define KSU		0x00000018
92
//#define UX		0x00000020 /* no [USK]X 64-bit extension bits on 24k */
93
//#define SX		0x00000040
94
//#define KX		0x00000080
95
#define INTMASK		0x0000ff00
96
#define INTR0		0x00000100	/* interrupt enable bits */
97
#define INTR1		0x00000200
98
#define INTR2		0x00000400
99
#define INTR3		0x00000800
100
#define INTR4		0x00001000
101
#define INTR5		0x00002000
102
#define INTR6		0x00004000
103
#define INTR7		0x00008000
104
//#define DE		0x00010000	/* not on 24k */
105
#define TS		0x00200000	/* tlb shutdown; on 24k at least */
106
#define BEV		0x00400000	/* bootstrap exception vectors */
107
#define RE		0x02000000	/* reverse-endian in user mode */
108
#define FR		0x04000000	/* enable 32 FP regs */
109
#define CU0		0x10000000
110
#define CU1		0x20000000	/* FPU enable */
111
 
112
/*
113
 * M(CONFIG) bits
114
 */
115
 
116
#define CFG_K0		7	/* kseg0 cachability */
117
#define CFG_MM		(1<<18)	/* write-through merging enabled */
118
 
119
/*
120
 * M(CAUSE) bits
121
 */
122
 
123
#define BD		(1<<31)	/* last excep'n occurred in branch delay slot */
124
 
125
/*
126
 * Exception codes
127
 */
128
#define	EXCMASK	0x1f		/* mask of all causes */
129
#define	CINT	 0		/* external interrupt */
130
#define	CTLBM	 1		/* TLB modification: store to unwritable page */
131
#define	CTLBL	 2		/* TLB miss (load or fetch) */
132
#define	CTLBS	 3		/* TLB miss (store) */
133
#define	CADREL	 4		/* address error (load or fetch) */
134
#define	CADRES	 5		/* address error (store) */
135
#define	CBUSI	 6		/* bus error (fetch) */
136
#define	CBUSD	 7		/* bus error (data load or store) */
137
#define	CSYS	 8		/* system call */
138
#define	CBRK	 9		/* breakpoint */
139
#define	CRES	10		/* reserved instruction */
140
#define	CCPU	11		/* coprocessor unusable */
141
#define	COVF	12		/* arithmetic overflow */
142
#define	CTRAP	13		/* trap */
143
#define	CVCEI	14		/* virtual coherence exception (instruction) */
144
#define	CFPE	15		/* floating point exception */
145
#define CTLBRI	19		/* tlb read-inhibit */
146
#define CTLBXI	20		/* tlb execute-inhibit */
147
#define	CWATCH	23		/* watch exception */
148
#define CMCHK	24		/* machine checkcore */
149
#define CCACHERR 30		/* cache error */
150
#define	CVCED	31		/* virtual coherence exception (data) */
151
 
152
/*
153
 * M(CACHEECC) a.k.a. ErrCtl bits
154
 */
155
#define PE	(1<<31)
156
#define LBE	(1<<25)
157
#define WABE	(1<<24)
158
 
159
/*
160
 * Trap vectors
161
 */
162
 
163
#define	UTLBMISS	(KSEG0+0x000)
164
#define	XEXCEPTION	(KSEG0+0x080)
165
#define	CACHETRAP	(KSEG0+0x100)
166
#define	EXCEPTION	(KSEG0+0x180)
167
 
168
/*
169
 * Magic registers
170
 */
171
 
172
#define	USER		24		/* R24 is up-> */
173
#define	MACH		25		/* R25 is m-> */
174
 
175
/*
176
 * offsets in ureg.h for l.s
177
 */
178
#define	Ureg_status	(Uoffset+0)
179
#define	Ureg_pc		(Uoffset+4)
180
#define	Ureg_sp		(Uoffset+8)
181
#define	Ureg_cause	(Uoffset+12)
182
#define	Ureg_badvaddr	(Uoffset+16)
183
#define	Ureg_tlbvirt	(Uoffset+20)
184
 
185
#define	Ureg_hi		(Uoffset+24)
186
#define	Ureg_lo		(Uoffset+28)
187
#define	Ureg_r31	(Uoffset+32)
188
#define	Ureg_r30	(Uoffset+36)
189
#define	Ureg_r28	(Uoffset+40)
190
#define	Ureg_r27	(Uoffset+44)
191
#define	Ureg_r26	(Uoffset+48)
192
#define	Ureg_r25	(Uoffset+52)
193
#define	Ureg_r24	(Uoffset+56)
194
#define	Ureg_r23	(Uoffset+60)
195
#define	Ureg_r22	(Uoffset+64)
196
#define	Ureg_r21	(Uoffset+68)
197
#define	Ureg_r20	(Uoffset+72)
198
#define	Ureg_r19	(Uoffset+76)
199
#define	Ureg_r18	(Uoffset+80)
200
#define	Ureg_r17	(Uoffset+84)
201
#define	Ureg_r16	(Uoffset+88)
202
#define	Ureg_r15	(Uoffset+92)
203
#define	Ureg_r14	(Uoffset+96)
204
#define	Ureg_r13	(Uoffset+100)
205
#define	Ureg_r12	(Uoffset+104)
206
#define	Ureg_r11	(Uoffset+108)
207
#define	Ureg_r10	(Uoffset+112)
208
#define	Ureg_r9		(Uoffset+116)
209
#define	Ureg_r8		(Uoffset+120)
210
#define	Ureg_r7		(Uoffset+124)
211
#define	Ureg_r6		(Uoffset+128)
212
#define	Ureg_r5		(Uoffset+132)
213
#define	Ureg_r4		(Uoffset+136)
214
#define	Ureg_r3		(Uoffset+140)
215
#define	Ureg_r2		(Uoffset+144)
216
#define	Ureg_r1		(Uoffset+148)
217
 
218
/* ch and carrera used these defs */
219
	/* Sizeof(Ureg) + (R5,R6) + 16 bytes slop + retpc + ur */
220
// #define UREGSIZE ((Ureg_r1+4-Uoffset) + 2*BY2V + 16 + BY2WD + BY2WD)
221
// #define Uoffset	8
222
 
223
// #define UREGSIZE	(Ureg_r1 + 4 - Uoffset)	/* this ought to work */
224
#define UREGSIZE ((Ureg_r1+4-Uoffset) + 2*BY2V + 16 + BY2WD + BY2WD)
225
#define Uoffset		0
226
#define Notuoffset	8
227
 
228
/*
229
 * MMU
230
 */
231
#define	PGSZ4K		(0x00<<13)
232
#define PGSZ16K		(0x03<<13)	/* on 24k */
233
#define	PGSZ64K		(0x0F<<13)
234
#define	PGSZ256K	(0x3F<<13)
235
#define	PGSZ1M		(0xFF<<13)
236
#define	PGSZ4M		(0x3FF<<13)
237
// #define PGSZ8M	(0x7FF<<13)	/* not on 24k */
238
#define	PGSZ16M		(0xFFF<<13)
239
#define PGSZ64M		(0x3FFF<<13)	/* on 24k */
240
#define PGSZ256M	(0xFFFF<<13)	/* on 24k */
241
 
242
/* mips address spaces, tlb-mapped unless marked otherwise */
243
#define	KUSEG	0x00000000	/* user process */
244
#define KSEG0	0x80000000	/* kernel (direct mapped, cached) */
245
#define KSEG1	0xA0000000	/* kernel (direct mapped, uncached: i/o) */
246
#define	KSEG2	0xC0000000	/* kernel, used for TSTKTOP */
247
#define	KSEG3	0xE0000000	/* kernel, used by kmap */
248
#define	KSEGM	0xE0000000	/* mask to check which seg */
249
 
250
/*
251
 * Fundamental addresses
252
 */
253
 
254
#define	REBOOTADDR	KADDR(0x1000)	/* just above vectors */
255
#define	MACHADDR	0x80005000	/* Mach structures */
256
#define	MACHP(n)	((Mach *)(MACHADDR+(n)*MACHSIZE))
257
#define ROM		0xbfc00000
258
#define	KMAPADDR	0xE0000000	/* kmap'd addresses */
259
#define	WIREDADDR	0xE2000000	/* address wired kernel space */
260
 
261
#define PHYSCONS	(KSEG1|0x18020000)		/* i8250 uart */
262
 
263
#define PIDXSHFT	12
264
#ifndef BIGPAGES
265
#define NCOLOR		8
266
#define PIDX		((NCOLOR-1)<<PIDXSHFT)
267
#define getpgcolor(a)	(((ulong)(a)>>PIDXSHFT) % NCOLOR)
268
#else
269
/* no cache aliases are possible with pages of 16K or larger */
270
#define NCOLOR		1
271
#define PIDX		0
272
#define getpgcolor(a)	0
273
#endif
274
#define KMAPSHIFT	15
275
 
276
#define	PTEGLOBL	(1<<0)
277
#define	PTEVALID	(1<<1)
278
#define	PTEWRITE	(1<<2)
279
#define PTERONLY	0
280
#define PTEALGMASK	(7<<3)
281
#define PTENONCOHERWT	(0<<3)		/* cached, write-through (slower) */
282
#define PTEUNCACHED	(2<<3)
283
#define PTENONCOHERWB	(3<<3)		/* cached, write-back */
284
#define PTEUNCACHEDACC	(7<<3)
285
/* rest are reserved on 24k */
286
#define PTECOHERXCL	(4<<3)
287
#define PTECOHERXCLW	(5<<3)
288
#define PTECOHERUPDW	(6<<3)
289
 
290
/* how much faster is it? mflops goes from about .206 (WT) to .37 (WB) */
291
#define PTECACHABILITY PTENONCOHERWT	/* 24k erratum 48 disallows WB */
292
// #define PTECACHABILITY PTENONCOHERWB
293
 
294
#define	PTEPID(n)	(n)
295
#define PTEMAPMEM	(1024*1024)
296
#define	PTEPERTAB	(PTEMAPMEM/BY2PG)
297
#define SEGMAPSIZE	512
298
#define SSEGMAPSIZE	16
299
 
300
#define STLBLOG		15
301
#define STLBSIZE	(1<<STLBLOG)	/* entries in the soft TLB */
302
/* page # bits that don't fit in STLBLOG bits */
303
#define HIPFNBITS	(BI2WD - (PGSHIFT+1) - STLBLOG)
304
#define KPTELOG		8
305
#define KPTESIZE	(1<<KPTELOG)	/* entries in the kfault soft TLB */
306
 
307
#define TLBPID(n) ((n)&0xFF)
308
#define	NTLBPID	256		/* # of pids (affects size of Mach) */
309
#define	NTLB	16		/* # of entries (mips 24k) */
310
#define TLBOFF	1		/* first tlb entry (0 used within mmuswitch) */
311
#define NKTLB	2		/* # of initial kfault tlb entries */
312
#define WTLBOFF	(TLBOFF+NKTLB)	/* first large IO window tlb entry */
313
#define NWTLB	0		/* # of large IO window tlb entries */
314
#define	TLBROFF	(WTLBOFF+NWTLB)	/* offset of first randomly-indexed entry */
315
 
316
/*
317
 * Address spaces
318
 */
319
#define	UZERO	KUSEG			/* base of user address space */
320
#define	UTZERO	(UZERO+MAXBY2PG)	/* 1st user text address; see mkfile */
321
#define	USTKTOP	(KZERO-BY2PG)		/* byte just beyond user stack */
322
#define	USTKSIZE (8*1024*1024)		/* size of user stack */
323
#define TSTKTOP (KSEG2+USTKSIZE-BY2PG)	/* top of temporary stack */
324
#define TSTKSIZ (1024*1024/BY2PG)	/* can be at most UTSKSIZE/BY2PG */
325
#define	KZERO	KSEG0			/* base of kernel address space */
326
#define	KTZERO	(KZERO+0x20000)		/* first address in kernel text */
327
#define MEMSIZE	(256*MB)		/* fixed memory on routerboard */
328
#define PCIMEM	0x10000000		/* on rb450g */