summaryrefslogtreecommitdiff
path: root/sys/src/9/ppc/mem.h
blob: da232dda03c593028c2b619f10db772f931890cb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
/*
 * Memory and machine-specific definitions.  Used in C and assembler.
 */

#ifdef ucuconf
#include "ucu.h"
#else
#include "blast.h"
#endif

/*
 * Sizes
 */

#define	BI2BY		8			/* bits per byte */
#define	BI2WD		32			/* bits per word */
#define	BY2WD		4			/* bytes per word */
#define BY2V		8			/* bytes per vlong */
#define	BY2PG		4096			/* bytes per page */
#define	WD2PG		(BY2PG/BY2WD)		/* words per page */
#define	PGSHIFT		12			/* log(BY2PG) */
#define ROUND(s, sz)	(((s)+(sz-1))&~(sz-1))
#define PGROUND(s)	ROUND(s, BY2PG)
#define	CACHELINELOG	5
#define	CACHELINESZ	(1<<CACHELINELOG)
#define	BLOCKALIGN	CACHELINESZ

#define	MHz		1000000

#define	BY2PTE		8			/* bytes per pte entry */
#define	BY2PTEG		64			/* bytes per pte group */

#define	MAXMACH	1				/* max # cpus system can run */
#define	MACHSIZE	BY2PG
#define	KSTACK		4096			/* Size of kernel stack */

/*
 * Time
 */
#define	HZ		1000			/* clock frequency */
#define	TK2SEC(t)	((t)/HZ)		/* ticks to seconds */

/*
 * Standard PPC Special Purpose Registers (OEA and VEA)
 */
#define DSISR	18
#define DAR	19		/* Data Address Register */
#define DEC	22		/* Decrementer */
#define SDR1	25
#define SRR0	26		/* Saved Registers (exception) */
#define SRR1	27
#define TBRL	268
#define TBRU	269		/* Time base Upper/Lower (Reading) */
#define SPRG0	272		/* Supervisor Private Registers */
#define SPRG1	273
#define SPRG2	274
#define SPRG3	275
#define SPRG4	276
#define SPRG5	277
#define SPRG6	278
#define SPRG7	279
#define ASR	280		/* Address Space Register */
#define EAR	282		/* External Access Register (optional) */
#define TBWU	284		/* Time base Upper/Lower (Writing) */
#define TBWL	285
#define PVR	287		/* Processor Version */
#define IABR	1010	/* Instruction Address Breakpoint Register (optional) */
#define DABR	1013	/* Data Address Breakpoint Register (optional) */
#define FPECR	1022	/* Floating-Point Exception Cause Register (optional) */
#define PIR	1023	/* Processor Identification Register (optional) */

#define IBATU(i)	(528+2*(i))	/* Instruction BAT register (upper) */
#define IBATL(i)	(529+2*(i))	/* Instruction BAT register (lower) */
#define DBATU(i)	(536+2*(i))	/* Data BAT register (upper) */
#define DBATL(i)	(537+2*(i))	/* Data BAT register (lower) */

/*
 * PPC604e-specific Special Purpose Registers (OEA)
 */
#define MMCR0		952		/* Monitor Control Register 0 */
#define PMC1		953		/* Performance Monitor Counter 1 */
#define PMC2		954		/* Performance Monitor Counter 2 */
#define SIA		955		/* Sampled Instruction Address */
#define MMCR1		956		/* Monitor Control Register 0 */
#define PMC3		957		/* Performance Monitor Counter 3 */
#define PMC4		958		/* Performance Monitor Counter 4 */
#define SDA		959		/* Sampled Data Address */
/*
 * PPC603e-specific Special Purpose Registers
 */
#define DMISS		976		/* Data Miss Address Register */
#define DCMP		977		/* Data Miss Address Register */
#define HASH1		978
#define HASH2		979
#define IMISS		980		/* Instruction Miss Address Register */
#define iCMP		981		/* Instruction Miss Address Register */
#define RPA		982
#define HID0		1008	/* Hardware Implementation Dependent Register 0 */
#define HID1		1009	/* Hardware Implementation Dependent Register 1 */
/*
 * PowerQUICC II (MPC 8260) Special Purpose Registers
 */
#define HID2		1011	/* Hardware Implementation Dependent Register 2 */

#define	BIT(i)		(1<<(31-(i)))	/* Silly backwards register bit numbering scheme */
#define	SBIT(n)		((ushort)1<<(15-(n)))
#define	RBIT(b,n)	(1<<(8*sizeof(n)-1-(b)))

/*
 * Bit encodings for Machine State Register (MSR)
 */
#define MSR_POW		BIT(13)		/* Enable Power Management */
#define MSR_TGPR	BIT(14)		/* Temporary GPR Registers in use (603e) */
#define MSR_ILE		BIT(15)		/* Interrupt Little-Endian enable */
#define MSR_EE		BIT(16)		/* External Interrupt enable */
#define MSR_PR		BIT(17)		/* Supervisor/User privilege */
#define MSR_FP		BIT(18)		/* Floating Point enable */
#define MSR_ME		BIT(19)		/* Machine Check enable */
#define MSR_FE0		BIT(20)		/* Floating Exception mode 0 */
#define MSR_SE		BIT(21)		/* Single Step (optional) */
#define MSR_BE		BIT(22)		/* Branch Trace (optional) */
#define MSR_FE1		BIT(23)		/* Floating Exception mode 1 */
#define MSR_IP		BIT(25)		/* Exception prefix 0x000/0xFFF */
#define MSR_IR		BIT(26)		/* Instruction MMU enable */
#define MSR_DR		BIT(27)		/* Data MMU enable */
#define MSR_PM		BIT(29)		/* Performance Monitor marked mode (604e specific) */
#define MSR_RI		BIT(30)		/* Recoverable Exception */
#define MSR_LE		BIT(31)		/* Little-Endian enable */
/* SRR1 bits for TLB operations */
#define MSR_SR0		0xf0000000	/* Saved bits from CR register */
#define MSR_KEY		BIT(12)		/* Copy of Ks or Kp bit */
#define MSR_IMISS	BIT(13)		/* It was an I miss */
#define MSR_WAY		BIT(14)		/* TLB set to be replaced */
#define MSR_STORE	BIT(15)		/* Miss caused by a store */

/*
 * Exception codes (trap vectors)
 */
#define CRESET	0x01
#define CMCHECK	0x02
#define CDSI		0x03
#define CISI		0x04
#define CEI		0x05
#define CALIGN		0x06
#define CPROG		0x07
#define CFPU		0x08
#define CDEC		0x09
#define CSYSCALL	0x0C
#define CTRACE		0x0D	/* optional */
#define CFPA		0x0E	/* not implemented in 603e */

/* PPC603e-specific: */
#define CIMISS		0x10	/* Instruction TLB miss */
#define CLMISS		0x11	/* Data load TLB miss */
#define CSMISS		0x12	/* Data store TLB miss */
#define CIBREAK		0x13
#define CSMI		0x14

/*
 * Magic registers
 */

#define	MACH		30	/* R30 is m-> */
#define	USER		29	/* R29 is up-> */


/*
 *  virtual MMU
 */
#define PTEMAPMEM	(1024*1024)	
#define PTEPERTAB	(PTEMAPMEM/BY2PG)
#define SEGMAPSIZE	1984
#define SSEGMAPSIZE	16
#define PPN(x)		((x)&~(BY2PG-1))

/*
 *  First pte word
 */
#define	PTE0(v, vsid, h, va)	(((v)<<31)|((vsid)<<7)|((h)<<6)|(((va)>>22)&0x3f))

/*
 *  Second pte word; WIMG & PP(RW/RO) common to page table and BATs
 */
#define	PTE1_R		BIT(23)
#define	PTE1_C		BIT(24)

#define	PTE1_W		BIT(25)
#define	PTE1_I		BIT(26)
#define	PTE1_M		BIT(27)
#define	PTE1_G		BIT(28)

#define	PTE1_RW		BIT(30)
#define	PTE1_RO		BIT(31)

/* HID0 register bits */
#define	HID_ICE		BIT(16)
#define	HID_DCE		BIT(17)
#define	HID_ILOCK	BIT(18)
#define	HID_DLOCK	BIT(19)
#define	HID_ICFI	BIT(20)
#define	HID_DCFI	BIT(21)
#define	HID_IFEM	BIT(24)

/*
 * Address spaces
 */

#define	KZERO		0x80000000		/* base of kernel address space */
#define	KTZERO		0x80100000		/* first address in kernel text */
#define	UZERO		0			/* base of user address space */
#define	UTZERO		(UZERO+BY2PG)		/* first address in user text */
#define	USTKTOP		KZERO			/* byte just beyond user stack */
#define	USTKSIZE	(4*1024*1024)		/* size of user stack */
#define	UREGSIZE	((8+40)*4)
#define	MACHADDR	(KTZERO-MAXMACH*MACHSIZE)
#define	MACHPADDR	(MACHADDR&~KZERO)
#define	MACHP(n)	((Mach *)(MACHADDR+(n)*MACHSIZE))

#define isphys(x) (((ulong)x&KZERO)!=0)

/*
 * MPC8xx addresses
 */
#define	INTMEM		0xf0000000
#define	IOMEM		(INTMEM+0x10000)

#define getpgcolor(a)	0