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