xref: /plan9-contrib/sys/src/9/vt5/mem.h (revision 1c9d674cbfa2c1924558af05e99c43e5c5cd4845)
1*1c9d674cSDavid du Colombier /*
2*1c9d674cSDavid du Colombier  * Memory and machine-specific definitions.  Used in C and assembler.
3*1c9d674cSDavid du Colombier  */
4*1c9d674cSDavid du Colombier #define KiB		1024u			/* Kibi 0x0000000000000400 */
5*1c9d674cSDavid du Colombier #define MiB		1048576u		/* Mebi 0x0000000000100000 */
6*1c9d674cSDavid du Colombier #define GiB		1073741824u		/* Gibi 000000000040000000 */
7*1c9d674cSDavid du Colombier #define TiB		1099511627776ull	/* Tebi 0x0000010000000000 */
8*1c9d674cSDavid du Colombier #define PiB		1125899906842624ull	/* Pebi 0x0004000000000000 */
9*1c9d674cSDavid du Colombier #define EiB		1152921504606846976ull	/* Exbi 0x1000000000000000 */
10*1c9d674cSDavid du Colombier 
11*1c9d674cSDavid du Colombier /*
12*1c9d674cSDavid du Colombier  * Sizes
13*1c9d674cSDavid du Colombier  */
14*1c9d674cSDavid du Colombier #define BI2BY		8			/* bits per byte */
15*1c9d674cSDavid du Colombier #define BI2WD		32			/* bits per word */
16*1c9d674cSDavid du Colombier #define BY2WD		4			/* bytes per word */
17*1c9d674cSDavid du Colombier #define BY2V		8			/* bytes per vlong */
18*1c9d674cSDavid du Colombier #define BY2SE		4			/* bytes per stack element */
19*1c9d674cSDavid du Colombier #define BY2PG		4096			/* bytes per page */
20*1c9d674cSDavid du Colombier #define PGSHIFT		12			/* log(BY2PG) */
21*1c9d674cSDavid du Colombier #define STACKALIGN(sp)	((sp) & ~7)		/* bug: assure with alloc */
22*1c9d674cSDavid du Colombier #define SEGALIGN	(1024*1024)		/* alignment for segments */
23*1c9d674cSDavid du Colombier #define BY2PTE		8			/* bytes per pte entry */
24*1c9d674cSDavid du Colombier #define BY2PTEG		64			/* bytes per pte group */
25*1c9d674cSDavid du Colombier 
26*1c9d674cSDavid du Colombier #define ICACHESIZE	32768			/* 0, 4, 8, 16, or 32 KB */
27*1c9d674cSDavid du Colombier #define ICACHEWAYSIZE	(ICACHESIZE/64)		/* 64-way set associative */
28*1c9d674cSDavid du Colombier #define ICACHELINELOG	5			/* 8 words (4 bytes) per line */
29*1c9d674cSDavid du Colombier #define ICACHELINESZ	(1<<ICACHELINELOG)
30*1c9d674cSDavid du Colombier 
31*1c9d674cSDavid du Colombier #define DCACHESIZE	32768			/* 0, 4, 8, 16, or 32 KB */
32*1c9d674cSDavid du Colombier #define DCACHEWAYSIZE	(DCACHESIZE/64)		/* 64-way set associative */
33*1c9d674cSDavid du Colombier #define DCACHELINELOG	5			/* 8 words (4 bytes) per line */
34*1c9d674cSDavid du Colombier #define DCACHELINESZ	(1<<DCACHELINELOG)
35*1c9d674cSDavid du Colombier 
36*1c9d674cSDavid du Colombier #define BLOCKALIGN	DCACHELINESZ		/* for ../port/allocb.c */
37*1c9d674cSDavid du Colombier 
38*1c9d674cSDavid du Colombier #define MAXMACH		2			/* max # cpus system can run */
39*1c9d674cSDavid du Colombier #define MACHSIZE	BY2PG			/* 16K on BG/L */
40*1c9d674cSDavid du Colombier 
41*1c9d674cSDavid du Colombier /*
42*1c9d674cSDavid du Colombier  * Time
43*1c9d674cSDavid du Colombier  */
44*1c9d674cSDavid du Colombier #define HZ		100			/* clock frequency */
45*1c9d674cSDavid du Colombier #define MHz		1000000
46*1c9d674cSDavid du Colombier #define TK2SEC(t)	((t)/HZ)		/* ticks to seconds */
47*1c9d674cSDavid du Colombier 
48*1c9d674cSDavid du Colombier /*
49*1c9d674cSDavid du Colombier  * IBM bit field order
50*1c9d674cSDavid du Colombier  * used only to derive bit mask for interrupt vector numbers
51*1c9d674cSDavid du Colombier  */
52*1c9d674cSDavid du Colombier #define IBIT(n)	(1UL<<(31-(n)))
53*1c9d674cSDavid du Colombier 
54*1c9d674cSDavid du Colombier /*
55*1c9d674cSDavid du Colombier  * Bit encodings for Machine State Register (MSR)
56*1c9d674cSDavid du Colombier  */
57*1c9d674cSDavid du Colombier #define MSR_AP	0x02000000	/* auxiliary processor available */
58*1c9d674cSDavid du Colombier #define MSR_APE	0x00080000	/* APU exception enable */
59*1c9d674cSDavid du Colombier #define MSR_WE	0x00040000	/* wait state enable */
60*1c9d674cSDavid du Colombier #define MSR_CE	0x00020000	/* critical interrupt enable */
61*1c9d674cSDavid du Colombier #define MSR_EE	0x00008000	/* enable external/decrementer interrupts */
62*1c9d674cSDavid du Colombier #define MSR_PR	0x00004000	/* =1, user mode */
63*1c9d674cSDavid du Colombier #define MSR_FP	0x00002000	/* floating-point available */
64*1c9d674cSDavid du Colombier #define MSR_ME	0x00001000	/* enable machine check exceptions */
65*1c9d674cSDavid du Colombier #define MSR_FE0	0x00000800	/* floating-point exception mode 0 */
66*1c9d674cSDavid du Colombier #define MSR_DWE	0x00000400	/* debug wait enable */
67*1c9d674cSDavid du Colombier #define MSR_DE	0x00000200	/* debug interrupts enable */
68*1c9d674cSDavid du Colombier #define MSR_FE1	0x00000100	/* floating-point exception mode 1 */
69*1c9d674cSDavid du Colombier #define MSR_IS	0x00000020	/* instruction address space */
70*1c9d674cSDavid du Colombier #define MSR_DS	0x00000010	/* data address space */
71*1c9d674cSDavid du Colombier 
72*1c9d674cSDavid du Colombier /* state in user mode */
73*1c9d674cSDavid du Colombier #define UMSR	(MSR_PR|MSR_CE|MSR_EE|MSR_DE)
74*1c9d674cSDavid du Colombier 
75*1c9d674cSDavid du Colombier /*
76*1c9d674cSDavid du Colombier  * Exception Syndrome Register (ESR)
77*1c9d674cSDavid du Colombier  */
78*1c9d674cSDavid du Colombier #define ESR_MCI	0x80000000	/* instruction machine check */
79*1c9d674cSDavid du Colombier #define ESR_PIL	0x08000000	/* program interrupt: illegal instruction */
80*1c9d674cSDavid du Colombier #define ESR_PPR	0x04000000	/* program interrupt: privileged */
81*1c9d674cSDavid du Colombier #define ESR_PTR	0x02000000	/* program interrupt: trap with successful compare */
82*1c9d674cSDavid du Colombier #define ESR_PEU	0x01000000	/* program interrupt: unimplemented APU/FPU operation */
83*1c9d674cSDavid du Colombier #define ESR_DST	0x00800000	/* data storage interrupt: store fault */
84*1c9d674cSDavid du Colombier #define ESR_DIZ	0x00400000	/* data/instruction storage interrupt: zone fault */
85*1c9d674cSDavid du Colombier #define ESR_PFP	0x00080000	/* program interrupt: FPU interrupt occurred */
86*1c9d674cSDavid du Colombier #define ESR_PAP	0x00040000	/* program interrupt: APU interrupt occurred */
87*1c9d674cSDavid du Colombier #define ESR_U0F	0x00008000	/* data storage interrupt: u0 fault */
88*1c9d674cSDavid du Colombier 
89*1c9d674cSDavid du Colombier /*
90*1c9d674cSDavid du Colombier  * Interrupt vector offsets
91*1c9d674cSDavid du Colombier  */
92*1c9d674cSDavid du Colombier #define INT_CI		0x0100		/* Critical input interrupt */
93*1c9d674cSDavid du Colombier #define INT_MCHECK	0x0200		/* Machine check */
94*1c9d674cSDavid du Colombier #define INT_DSI		0x0300		/* Data storage interrupt */
95*1c9d674cSDavid du Colombier #define INT_ISI		0x0400		/* Instruction storage interrupt */
96*1c9d674cSDavid du Colombier #define INT_EI		0x0500		/* External interrupt */
97*1c9d674cSDavid du Colombier #define INT_ALIGN	0x0600		/* Alignment */
98*1c9d674cSDavid du Colombier #define INT_PROG	0x0700		/* Program */
99*1c9d674cSDavid du Colombier #define INT_FPU		0x0800		/* FPU unavailable */
100*1c9d674cSDavid du Colombier #define INT_DEC		0x0900		/* UNUSED on 405? */
101*1c9d674cSDavid du Colombier #define INT_SYSCALL	0x0C00		/* System call */
102*1c9d674cSDavid du Colombier #define INT_TRACE	0x0D00		/* UNUSED on 405? */
103*1c9d674cSDavid du Colombier #define INT_FPA		0x0E00		/* UNUSED on 405? */
104*1c9d674cSDavid du Colombier #define INT_APU		0x0F20		/* APU unavailable */
105*1c9d674cSDavid du Colombier #define INT_PIT		0x1000		/* PIT interrupt */
106*1c9d674cSDavid du Colombier #define INT_FIT		0x1010		/* FIT interrupt */
107*1c9d674cSDavid du Colombier #define INT_WDT		0x1020		/* Watchdog timer */
108*1c9d674cSDavid du Colombier #define INT_DMISS	0x1100		/* Data TLB miss */
109*1c9d674cSDavid du Colombier #define INT_IMISS	0x1200		/* Instruction TLB miss */
110*1c9d674cSDavid du Colombier #define INT_DEBUG	0x2000		/* Debug */
111*1c9d674cSDavid du Colombier 
112*1c9d674cSDavid du Colombier /*
113*1c9d674cSDavid du Colombier  * Magic registers
114*1c9d674cSDavid du Colombier  */
115*1c9d674cSDavid du Colombier #define MACH		30		/* R30 is m-> */
116*1c9d674cSDavid du Colombier #define USER		29		/* R29 is up-> */
117*1c9d674cSDavid du Colombier 
118*1c9d674cSDavid du Colombier /*
119*1c9d674cSDavid du Colombier  * Virtual MMU
120*1c9d674cSDavid du Colombier  */
121*1c9d674cSDavid du Colombier #define PTEMAPMEM	(1024*1024)
122*1c9d674cSDavid du Colombier #define PTEPERTAB	(PTEMAPMEM/BY2PG)
123*1c9d674cSDavid du Colombier #define SEGMAPSIZE	1984
124*1c9d674cSDavid du Colombier #define SSEGMAPSIZE	16
125*1c9d674cSDavid du Colombier #define PPN(x)		((x)&~(BY2PG-1))
126*1c9d674cSDavid du Colombier 
127*1c9d674cSDavid du Colombier #define PTEVALID	(1<<0)
128*1c9d674cSDavid du Colombier #define PTEWRITE	(1<<1)
129*1c9d674cSDavid du Colombier #define PTERONLY	(0<<1)
130*1c9d674cSDavid du Colombier #define PTEUNCACHED	(1<<2)
131*1c9d674cSDavid du Colombier 
132*1c9d674cSDavid du Colombier /*
133*1c9d674cSDavid du Colombier  * Physical MMU
134*1c9d674cSDavid du Colombier  */
135*1c9d674cSDavid du Colombier #define NTLB		64	/* number of entries */
136*1c9d674cSDavid du Colombier #define NTLBPID		256	/* number of hardware pids (0 = global) */
137*1c9d674cSDavid du Colombier 
138*1c9d674cSDavid du Colombier /* TLBHI */
139*1c9d674cSDavid du Colombier #define TLBEPN(x)	((x) & ~0x3FF)
140*1c9d674cSDavid du Colombier #define TLB1K		(0<<4)
141*1c9d674cSDavid du Colombier #define TLB4K		(1<<4)
142*1c9d674cSDavid du Colombier #define TLB16K		(2<<4)
143*1c9d674cSDavid du Colombier #define TLB64K		(3<<4)
144*1c9d674cSDavid du Colombier #define TLB256K		(4<<4)
145*1c9d674cSDavid du Colombier #define TLB1MB		(5<<4)
146*1c9d674cSDavid du Colombier /* 4Mbyte not implemented */
147*1c9d674cSDavid du Colombier #define TLB16MB		(7<<4)
148*1c9d674cSDavid du Colombier /* 32Mbyte not implemented */
149*1c9d674cSDavid du Colombier #define TLB256MB	(9<<4)
150*1c9d674cSDavid du Colombier #define TLBVALID		(1<<9)
151*1c9d674cSDavid du Colombier #define TLBTS		(1<<8) /* Translation address space */
152*1c9d674cSDavid du Colombier 
153*1c9d674cSDavid du Colombier /* TLBMID */
154*1c9d674cSDavid du Colombier #define TLBRPN(x)	((x) & ~0x3FF)
155*1c9d674cSDavid du Colombier #define TLBERPN(uv)	(((uv)>>32)&0xF)	/* with full address as uvlong */
156*1c9d674cSDavid du Colombier 
157*1c9d674cSDavid du Colombier /* TLBLO */
158*1c9d674cSDavid du Colombier #define TLBU0	(1<<15) /* user definable */
159*1c9d674cSDavid du Colombier #define TLBU1	(1<<14) /* user definable */
160*1c9d674cSDavid du Colombier #define TLBU2	(1<<13) /* user definable */
161*1c9d674cSDavid du Colombier #define TLBU3	(1<<12) /* user definable */
162*1c9d674cSDavid du Colombier #define TLBW	(1<<11)	/* write-through? */
163*1c9d674cSDavid du Colombier #define TLBI	(1<<10)	/* cache inhibit */
164*1c9d674cSDavid du Colombier #define TLBM	(1<<9)	/* memory coherent */
165*1c9d674cSDavid du Colombier #define TLBG	(1<<8)	/* guarded */
166*1c9d674cSDavid du Colombier #define TLBLE	(1<<7)  /* little endian mode */
167*1c9d674cSDavid du Colombier #define TLBUX	(1<<5)	/* user execute enable */
168*1c9d674cSDavid du Colombier #define TLBUW	(1<<4)  /* user writable */
169*1c9d674cSDavid du Colombier #define TLBUR	(1<<3)  /* user readable */
170*1c9d674cSDavid du Colombier #define TLBSX	(1<<2)	/* supervisor execute enable */
171*1c9d674cSDavid du Colombier #define TLBSW	(1<<1)  /* supervisor writable */
172*1c9d674cSDavid du Colombier #define TLBSR	(1<<0)  /* supervisor readable */
173*1c9d674cSDavid du Colombier 
174*1c9d674cSDavid du Colombier #define TLBWR	(TLBSW|TLBSR)
175*1c9d674cSDavid du Colombier 
176*1c9d674cSDavid du Colombier /*
177*1c9d674cSDavid du Colombier  * software TLB (for quick reload by [id]tlbmiss)
178*1c9d674cSDavid du Colombier  */
179*1c9d674cSDavid du Colombier #define STLBLOG		10
180*1c9d674cSDavid du Colombier #define STLBSIZE	(1<<STLBLOG)
181*1c9d674cSDavid du Colombier 
182*1c9d674cSDavid du Colombier /*
183*1c9d674cSDavid du Colombier  * Address spaces
184*1c9d674cSDavid du Colombier  */
185*1c9d674cSDavid du Colombier #define KSEG0		0x80000000
186*1c9d674cSDavid du Colombier #define KSEG1		0xA0000000		/* uncached alias for KZERO */
187*1c9d674cSDavid du Colombier #define KSEGM		0xE0000000		/* mask to check segment */
188*1c9d674cSDavid du Colombier #define KZERO		KSEG0			/* base of kernel address space */
189*1c9d674cSDavid du Colombier #define KTZERO		(KZERO+SEGALIGN)	/* first address in kernel text */
190*1c9d674cSDavid du Colombier 
191*1c9d674cSDavid du Colombier #define TSTKTOP		KZERO			/* top of temporary stack */
192*1c9d674cSDavid du Colombier #define	TSTKSIZ 	256	/* pages in new stack; limits exec args */
193*1c9d674cSDavid du Colombier 
194*1c9d674cSDavid du Colombier #define UZERO		0			/* base of user address space */
195*1c9d674cSDavid du Colombier #define UTZERO		(UZERO+SEGALIGN)	/* first address in user text */
196*1c9d674cSDavid du Colombier #define UTROUND(t)	ROUNDUP((t), SEGALIGN)
197*1c9d674cSDavid du Colombier #define USTKTOP		(TSTKTOP-TSTKSIZ*BY2PG)	/* byte just beyond user stack */
198*1c9d674cSDavid du Colombier 
199*1c9d674cSDavid du Colombier /*
200*1c9d674cSDavid du Colombier  * Where configuration info is left for the loaded programme.
201*1c9d674cSDavid du Colombier  * This will turn into a structure as more is done by the boot loader
202*1c9d674cSDavid du Colombier  * (e.g. why parse the .ini file twice?).
203*1c9d674cSDavid du Colombier  * On the power pc, we can use 0x2100 through 0x4000.
204*1c9d674cSDavid du Colombier  */
205*1c9d674cSDavid du Colombier #define	CONFADDR	(KZERO+0x2200)		/* info passed from boot loader */
206*1c9d674cSDavid du Colombier #define	REBOOTADDR (CONFADDR+BOOTLINELEN+BOOTARGSLEN) /* reboot code - virtual address */
207*1c9d674cSDavid du Colombier 
208*1c9d674cSDavid du Colombier #define BOOTLINE	((char*)CONFADDR)	/* from 9load */
209*1c9d674cSDavid du Colombier #define BOOTLINELEN	64
210*1c9d674cSDavid du Colombier #define BOOTARGS	((char*)(CONFADDR+BOOTLINELEN))
211*1c9d674cSDavid du Colombier #define	BOOTARGSLEN	1024			/* must be enough to hold #ec */
212*1c9d674cSDavid du Colombier 
213*1c9d674cSDavid du Colombier #define KSTACK		(16*1024)  /* Size of kernel stack (not proc 0's in Mach); 16K on BG/L */
214*1c9d674cSDavid du Colombier 
215*1c9d674cSDavid du Colombier #define USTKSIZE	(4*1024*1024)		/* size of user stack */
216*1c9d674cSDavid du Colombier #define UREGSIZE	((8+40)*4)
217*1c9d674cSDavid du Colombier 
218*1c9d674cSDavid du Colombier #include "physmem.h"
219*1c9d674cSDavid du Colombier 
220*1c9d674cSDavid du Colombier #define getpgcolor(a)	0		/* ../port/page.c */
221