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