xref: /plan9/sys/src/9/ppc/mem.h (revision 12009bff671a91993ae58f16dab833e809f4a6f3)
1458db832SDavid du Colombier /*
2458db832SDavid du Colombier  * Memory and machine-specific definitions.  Used in C and assembler.
3458db832SDavid du Colombier  */
4458db832SDavid du Colombier 
5458db832SDavid du Colombier #ifdef ucuconf
6458db832SDavid du Colombier #include "ucu.h"
7fe853e23SDavid du Colombier #else
8458db832SDavid du Colombier #include "blast.h"
9458db832SDavid du Colombier #endif
10458db832SDavid du Colombier 
11458db832SDavid du Colombier /*
12458db832SDavid du Colombier  * Sizes
13458db832SDavid du Colombier  */
14458db832SDavid du Colombier 
15458db832SDavid du Colombier #define	BI2BY		8			/* bits per byte */
16458db832SDavid du Colombier #define	BI2WD		32			/* bits per word */
17458db832SDavid du Colombier #define	BY2WD		4			/* bytes per word */
18458db832SDavid du Colombier #define BY2V		8			/* bytes per vlong */
19458db832SDavid du Colombier #define	BY2PG		4096			/* bytes per page */
20458db832SDavid du Colombier #define	WD2PG		(BY2PG/BY2WD)		/* words per page */
21458db832SDavid du Colombier #define	PGSHIFT		12			/* log(BY2PG) */
22458db832SDavid du Colombier #define	CACHELINELOG	5
23458db832SDavid du Colombier #define	CACHELINESZ	(1<<CACHELINELOG)
24458db832SDavid du Colombier #define	BLOCKALIGN	CACHELINESZ
25458db832SDavid du Colombier 
26458db832SDavid du Colombier #define	MHz		1000000
27458db832SDavid du Colombier 
28458db832SDavid du Colombier #define	BY2PTE		8			/* bytes per pte entry */
29458db832SDavid du Colombier #define	BY2PTEG		64			/* bytes per pte group */
30458db832SDavid du Colombier 
31458db832SDavid du Colombier #define	MAXMACH	1				/* max # cpus system can run */
32458db832SDavid du Colombier #define	MACHSIZE	BY2PG
33458db832SDavid du Colombier #define	KSTACK		4096			/* Size of kernel stack */
34458db832SDavid du Colombier 
35458db832SDavid du Colombier /*
36458db832SDavid du Colombier  * Time
37458db832SDavid du Colombier  */
38fe853e23SDavid du Colombier #define	HZ		1000			/* clock frequency */
39458db832SDavid du Colombier #define	TK2SEC(t)	((t)/HZ)		/* ticks to seconds */
40458db832SDavid du Colombier 
41458db832SDavid du Colombier /*
42458db832SDavid du Colombier  * Standard PPC Special Purpose Registers (OEA and VEA)
43458db832SDavid du Colombier  */
44458db832SDavid du Colombier #define DSISR	18
45458db832SDavid du Colombier #define DAR	19		/* Data Address Register */
46458db832SDavid du Colombier #define DEC	22		/* Decrementer */
47458db832SDavid du Colombier #define SDR1	25
48458db832SDavid du Colombier #define SRR0	26		/* Saved Registers (exception) */
49458db832SDavid du Colombier #define SRR1	27
50fe853e23SDavid du Colombier #define TBRL	268
51fe853e23SDavid du Colombier #define TBRU	269		/* Time base Upper/Lower (Reading) */
52458db832SDavid du Colombier #define SPRG0	272		/* Supervisor Private Registers */
53458db832SDavid du Colombier #define SPRG1	273
54458db832SDavid du Colombier #define SPRG2	274
55458db832SDavid du Colombier #define SPRG3	275
56458db832SDavid du Colombier #define SPRG4	276
57458db832SDavid du Colombier #define SPRG5	277
58458db832SDavid du Colombier #define SPRG6	278
59458db832SDavid du Colombier #define SPRG7	279
60458db832SDavid du Colombier #define ASR	280		/* Address Space Register */
61458db832SDavid du Colombier #define EAR	282		/* External Access Register (optional) */
62458db832SDavid du Colombier #define TBWU	284		/* Time base Upper/Lower (Writing) */
63458db832SDavid du Colombier #define TBWL	285
64458db832SDavid du Colombier #define PVR	287		/* Processor Version */
65458db832SDavid du Colombier #define IABR	1010	/* Instruction Address Breakpoint Register (optional) */
66458db832SDavid du Colombier #define DABR	1013	/* Data Address Breakpoint Register (optional) */
67458db832SDavid du Colombier #define FPECR	1022	/* Floating-Point Exception Cause Register (optional) */
68458db832SDavid du Colombier #define PIR	1023	/* Processor Identification Register (optional) */
69458db832SDavid du Colombier 
70458db832SDavid du Colombier #define IBATU(i)	(528+2*(i))	/* Instruction BAT register (upper) */
71458db832SDavid du Colombier #define IBATL(i)	(529+2*(i))	/* Instruction BAT register (lower) */
72458db832SDavid du Colombier #define DBATU(i)	(536+2*(i))	/* Data BAT register (upper) */
73458db832SDavid du Colombier #define DBATL(i)	(537+2*(i))	/* Data BAT register (lower) */
74458db832SDavid du Colombier 
75458db832SDavid du Colombier /*
76458db832SDavid du Colombier  * PPC604e-specific Special Purpose Registers (OEA)
77458db832SDavid du Colombier  */
78458db832SDavid du Colombier #define MMCR0		952		/* Monitor Control Register 0 */
79458db832SDavid du Colombier #define PMC1		953		/* Performance Monitor Counter 1 */
80458db832SDavid du Colombier #define PMC2		954		/* Performance Monitor Counter 2 */
81458db832SDavid du Colombier #define SIA		955		/* Sampled Instruction Address */
82458db832SDavid du Colombier #define MMCR1		956		/* Monitor Control Register 0 */
83458db832SDavid du Colombier #define PMC3		957		/* Performance Monitor Counter 3 */
84458db832SDavid du Colombier #define PMC4		958		/* Performance Monitor Counter 4 */
85458db832SDavid du Colombier #define SDA		959		/* Sampled Data Address */
86458db832SDavid du Colombier /*
87458db832SDavid du Colombier  * PPC603e-specific Special Purpose Registers
88458db832SDavid du Colombier  */
89458db832SDavid du Colombier #define DMISS		976		/* Data Miss Address Register */
90458db832SDavid du Colombier #define DCMP		977		/* Data Miss Address Register */
91458db832SDavid du Colombier #define HASH1		978
92458db832SDavid du Colombier #define HASH2		979
93458db832SDavid du Colombier #define IMISS		980		/* Instruction Miss Address Register */
94458db832SDavid du Colombier #define iCMP		981		/* Instruction Miss Address Register */
95458db832SDavid du Colombier #define RPA		982
96458db832SDavid du Colombier #define HID0		1008	/* Hardware Implementation Dependent Register 0 */
97458db832SDavid du Colombier #define HID1		1009	/* Hardware Implementation Dependent Register 1 */
98458db832SDavid du Colombier /*
99458db832SDavid du Colombier  * PowerQUICC II (MPC 8260) Special Purpose Registers
100458db832SDavid du Colombier  */
101458db832SDavid du Colombier #define HID2		1011	/* Hardware Implementation Dependent Register 2 */
102458db832SDavid du Colombier 
103458db832SDavid du Colombier #define	BIT(i)		(1<<(31-(i)))	/* Silly backwards register bit numbering scheme */
104458db832SDavid du Colombier #define	SBIT(n)		((ushort)1<<(15-(n)))
105458db832SDavid du Colombier #define	RBIT(b,n)	(1<<(8*sizeof(n)-1-(b)))
106458db832SDavid du Colombier 
107458db832SDavid du Colombier /*
108458db832SDavid du Colombier  * Bit encodings for Machine State Register (MSR)
109458db832SDavid du Colombier  */
110458db832SDavid du Colombier #define MSR_POW		BIT(13)		/* Enable Power Management */
111458db832SDavid du Colombier #define MSR_TGPR	BIT(14)		/* Temporary GPR Registers in use (603e) */
112458db832SDavid du Colombier #define MSR_ILE		BIT(15)		/* Interrupt Little-Endian enable */
113458db832SDavid du Colombier #define MSR_EE		BIT(16)		/* External Interrupt enable */
114458db832SDavid du Colombier #define MSR_PR		BIT(17)		/* Supervisor/User privilege */
115458db832SDavid du Colombier #define MSR_FP		BIT(18)		/* Floating Point enable */
116458db832SDavid du Colombier #define MSR_ME		BIT(19)		/* Machine Check enable */
117458db832SDavid du Colombier #define MSR_FE0		BIT(20)		/* Floating Exception mode 0 */
118458db832SDavid du Colombier #define MSR_SE		BIT(21)		/* Single Step (optional) */
119458db832SDavid du Colombier #define MSR_BE		BIT(22)		/* Branch Trace (optional) */
120458db832SDavid du Colombier #define MSR_FE1		BIT(23)		/* Floating Exception mode 1 */
121458db832SDavid du Colombier #define MSR_IP		BIT(25)		/* Exception prefix 0x000/0xFFF */
122458db832SDavid du Colombier #define MSR_IR		BIT(26)		/* Instruction MMU enable */
123458db832SDavid du Colombier #define MSR_DR		BIT(27)		/* Data MMU enable */
124458db832SDavid du Colombier #define MSR_PM		BIT(29)		/* Performance Monitor marked mode (604e specific) */
125458db832SDavid du Colombier #define MSR_RI		BIT(30)		/* Recoverable Exception */
126458db832SDavid du Colombier #define MSR_LE		BIT(31)		/* Little-Endian enable */
127458db832SDavid du Colombier /* SRR1 bits for TLB operations */
128458db832SDavid du Colombier #define MSR_SR0		0xf0000000	/* Saved bits from CR register */
129458db832SDavid du Colombier #define MSR_KEY		BIT(12)		/* Copy of Ks or Kp bit */
130458db832SDavid du Colombier #define MSR_IMISS	BIT(13)		/* It was an I miss */
131458db832SDavid du Colombier #define MSR_WAY		BIT(14)		/* TLB set to be replaced */
132458db832SDavid du Colombier #define MSR_STORE	BIT(15)		/* Miss caused by a store */
133458db832SDavid du Colombier 
134458db832SDavid du Colombier /*
135458db832SDavid du Colombier  * Exception codes (trap vectors)
136458db832SDavid du Colombier  */
137458db832SDavid du Colombier #define CRESET	0x01
138458db832SDavid du Colombier #define CMCHECK	0x02
139458db832SDavid du Colombier #define CDSI		0x03
140458db832SDavid du Colombier #define CISI		0x04
141458db832SDavid du Colombier #define CEI		0x05
142458db832SDavid du Colombier #define CALIGN		0x06
143458db832SDavid du Colombier #define CPROG		0x07
144458db832SDavid du Colombier #define CFPU		0x08
145458db832SDavid du Colombier #define CDEC		0x09
146458db832SDavid du Colombier #define CSYSCALL	0x0C
147458db832SDavid du Colombier #define CTRACE		0x0D	/* optional */
148458db832SDavid du Colombier #define CFPA		0x0E	/* not implemented in 603e */
149458db832SDavid du Colombier 
150458db832SDavid du Colombier /* PPC603e-specific: */
151458db832SDavid du Colombier #define CIMISS		0x10	/* Instruction TLB miss */
152458db832SDavid du Colombier #define CLMISS		0x11	/* Data load TLB miss */
153458db832SDavid du Colombier #define CSMISS		0x12	/* Data store TLB miss */
154458db832SDavid du Colombier #define CIBREAK		0x13
155458db832SDavid du Colombier #define CSMI		0x14
156458db832SDavid du Colombier 
157458db832SDavid du Colombier /*
158458db832SDavid du Colombier  * Magic registers
159458db832SDavid du Colombier  */
160458db832SDavid du Colombier 
161458db832SDavid du Colombier #define	MACH		30	/* R30 is m-> */
162458db832SDavid du Colombier #define	USER		29	/* R29 is up-> */
163458db832SDavid du Colombier 
164458db832SDavid du Colombier 
165458db832SDavid du Colombier /*
166458db832SDavid du Colombier  *  virtual MMU
167458db832SDavid du Colombier  */
168458db832SDavid du Colombier #define PTEMAPMEM	(1024*1024)
169458db832SDavid du Colombier #define PTEPERTAB	(PTEMAPMEM/BY2PG)
170458db832SDavid du Colombier #define SEGMAPSIZE	1984
171458db832SDavid du Colombier #define SSEGMAPSIZE	16
172458db832SDavid du Colombier #define PPN(x)		((x)&~(BY2PG-1))
173458db832SDavid du Colombier 
174458db832SDavid du Colombier /*
175458db832SDavid du Colombier  *  First pte word
176458db832SDavid du Colombier  */
177458db832SDavid du Colombier #define	PTE0(v, vsid, h, va)	(((v)<<31)|((vsid)<<7)|((h)<<6)|(((va)>>22)&0x3f))
178458db832SDavid du Colombier 
179458db832SDavid du Colombier /*
180458db832SDavid du Colombier  *  Second pte word; WIMG & PP(RW/RO) common to page table and BATs
181458db832SDavid du Colombier  */
182458db832SDavid du Colombier #define	PTE1_R		BIT(23)
183458db832SDavid du Colombier #define	PTE1_C		BIT(24)
184458db832SDavid du Colombier 
185458db832SDavid du Colombier #define	PTE1_W		BIT(25)
186458db832SDavid du Colombier #define	PTE1_I		BIT(26)
187458db832SDavid du Colombier #define	PTE1_M		BIT(27)
188458db832SDavid du Colombier #define	PTE1_G		BIT(28)
189458db832SDavid du Colombier 
190458db832SDavid du Colombier #define	PTE1_RW		BIT(30)
191458db832SDavid du Colombier #define	PTE1_RO		BIT(31)
192458db832SDavid du Colombier 
193458db832SDavid du Colombier /* HID0 register bits */
194458db832SDavid du Colombier #define	HID_ICE		BIT(16)
195458db832SDavid du Colombier #define	HID_DCE		BIT(17)
196458db832SDavid du Colombier #define	HID_ILOCK	BIT(18)
197458db832SDavid du Colombier #define	HID_DLOCK	BIT(19)
198458db832SDavid du Colombier #define	HID_ICFI	BIT(20)
199458db832SDavid du Colombier #define	HID_DCFI	BIT(21)
200458db832SDavid du Colombier #define	HID_IFEM	BIT(24)
201458db832SDavid du Colombier 
202458db832SDavid du Colombier /*
203458db832SDavid du Colombier  * Address spaces
204458db832SDavid du Colombier  */
205458db832SDavid du Colombier 
206458db832SDavid du Colombier #define	KZERO		0x80000000		/* base of kernel address space */
207458db832SDavid du Colombier #define	KTZERO		0x80100000		/* first address in kernel text */
208458db832SDavid du Colombier #define	UZERO		0			/* base of user address space */
209458db832SDavid du Colombier #define	UTZERO		(UZERO+BY2PG)		/* first address in user text */
210*12009bffSDavid du Colombier #define UTROUND(t)	ROUNDUP((t), 0x100000)
211458db832SDavid du Colombier #define	USTKTOP		(TSTKTOP-TSTKSIZ*BY2PG)	/* byte just beyond user stack */
212458db832SDavid du Colombier #define	TSTKTOP		KZERO			/* top of temporary stack */
213458db832SDavid du Colombier #define	TSTKSIZ		100
214458db832SDavid du Colombier #define	USTKSIZE	(4*1024*1024)		/* size of user stack */
215458db832SDavid du Colombier #define	UREGSIZE	((8+40)*4)
216458db832SDavid du Colombier #define	MACHADDR	(KTZERO-MAXMACH*MACHSIZE)
217458db832SDavid du Colombier #define	MACHPADDR	(MACHADDR&~KZERO)
218458db832SDavid du Colombier #define	MACHP(n)	((Mach *)(MACHADDR+(n)*MACHSIZE))
219458db832SDavid du Colombier 
220458db832SDavid du Colombier #define isphys(x) (((ulong)x&KZERO)!=0)
221458db832SDavid du Colombier 
222458db832SDavid du Colombier /*
223458db832SDavid du Colombier  * MPC8xx addresses
224458db832SDavid du Colombier  */
225458db832SDavid du Colombier #define	INTMEM		0xf0000000
226458db832SDavid du Colombier #define	IOMEM		(INTMEM+0x10000)
227458db832SDavid du Colombier 
228458db832SDavid du Colombier #define getpgcolor(a)	0
229