xref: /inferno-os/os/fads/mem.h (revision 74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a)
1*74a4d8c2SCharles.Forsyth /*
2*74a4d8c2SCharles.Forsyth  * Memory and machine-specific definitions.  Used in C and assembler.
3*74a4d8c2SCharles.Forsyth  */
4*74a4d8c2SCharles.Forsyth 
5*74a4d8c2SCharles.Forsyth /*
6*74a4d8c2SCharles.Forsyth  * Sizes
7*74a4d8c2SCharles.Forsyth  */
8*74a4d8c2SCharles.Forsyth 
9*74a4d8c2SCharles.Forsyth #define	BI2BY		8			/* bits per byte */
10*74a4d8c2SCharles.Forsyth #define BI2WD		32			/* bits per word */
11*74a4d8c2SCharles.Forsyth #define	BY2WD		4			/* bytes per word */
12*74a4d8c2SCharles.Forsyth #define	BY2V		8			/* bytes per double word */
13*74a4d8c2SCharles.Forsyth #define	BY2PG		4096			/* bytes per page */
14*74a4d8c2SCharles.Forsyth #define	WD2PG		(BY2PG/BY2WD)		/* words per page */
15*74a4d8c2SCharles.Forsyth #define	PGSHIFT		12			/* log(BY2PG) */
16*74a4d8c2SCharles.Forsyth #define ROUND(s, sz)	(((s)+(sz-1))&~(sz-1))
17*74a4d8c2SCharles.Forsyth #define PGROUND(s)	ROUND(s, BY2PG)
18*74a4d8c2SCharles.Forsyth #define	CACHELINELOG	4
19*74a4d8c2SCharles.Forsyth #define CACHELINESZ	(1<<CACHELINELOG)
20*74a4d8c2SCharles.Forsyth 
21*74a4d8c2SCharles.Forsyth #define	MAXMACH		1			/* max # cpus system can run */
22*74a4d8c2SCharles.Forsyth #define	MACHSIZE	BY2PG
23*74a4d8c2SCharles.Forsyth 
24*74a4d8c2SCharles.Forsyth /*
25*74a4d8c2SCharles.Forsyth  * Time
26*74a4d8c2SCharles.Forsyth  */
27*74a4d8c2SCharles.Forsyth #define HZ		100			/* clock frequency */
28*74a4d8c2SCharles.Forsyth #define	MS2HZ		(1000/HZ)		/* millisec per clock tick */
29*74a4d8c2SCharles.Forsyth #define	TK2SEC(t)	((t)/HZ)		/* ticks to seconds */
30*74a4d8c2SCharles.Forsyth #define	MS2TK(t)	((t)/MS2HZ)		/* milliseconds to ticks */
31*74a4d8c2SCharles.Forsyth #define	MHz	1000000
32*74a4d8c2SCharles.Forsyth 
33*74a4d8c2SCharles.Forsyth /*
34*74a4d8c2SCharles.Forsyth  * MSR bits
35*74a4d8c2SCharles.Forsyth  */
36*74a4d8c2SCharles.Forsyth 
37*74a4d8c2SCharles.Forsyth #define	POW	0x40000	/* enable power mgmt */
38*74a4d8c2SCharles.Forsyth #define	TGPR	0x20000	/* GPR0-3 remapped; 603/603e specific */
39*74a4d8c2SCharles.Forsyth #define	ILE	0x10000	/* interrupts little endian */
40*74a4d8c2SCharles.Forsyth #define	EE	0x08000	/* enable external/decrementer interrupts */
41*74a4d8c2SCharles.Forsyth #define	PR	0x04000	/* =1, user mode */
42*74a4d8c2SCharles.Forsyth #define	FPE	0x02000	/* enable floating point */
43*74a4d8c2SCharles.Forsyth #define	ME	0x01000	/* enable machine check exceptions */
44*74a4d8c2SCharles.Forsyth #define	FE0	0x00800
45*74a4d8c2SCharles.Forsyth #define	SE	0x00400	/* single-step trace */
46*74a4d8c2SCharles.Forsyth #define	BE	0x00200	/* branch trace */
47*74a4d8c2SCharles.Forsyth #define	FE1	0x00100
48*74a4d8c2SCharles.Forsyth #define	MSR_IP	0x00040	/* =0, vector to nnnnn; =1, vector to FFFnnnnn */
49*74a4d8c2SCharles.Forsyth #define	IR	0x00020	/* enable instruction address translation */
50*74a4d8c2SCharles.Forsyth #define	DR	0x00010	/* enable data address translation */
51*74a4d8c2SCharles.Forsyth #define	RI	0x00002	/* exception is recoverable */
52*74a4d8c2SCharles.Forsyth #define	LE	0x00001	/* little endian mode */
53*74a4d8c2SCharles.Forsyth 
54*74a4d8c2SCharles.Forsyth #define	KMSR	(ME|FE0|FE1|FPE)
55*74a4d8c2SCharles.Forsyth #define	UMSR	(KMSR|PR|EE|IR|DR)
56*74a4d8c2SCharles.Forsyth 
57*74a4d8c2SCharles.Forsyth /*
58*74a4d8c2SCharles.Forsyth  * Magic registers
59*74a4d8c2SCharles.Forsyth  */
60*74a4d8c2SCharles.Forsyth 
61*74a4d8c2SCharles.Forsyth #define	MACH		30		/* R30 is m-> */
62*74a4d8c2SCharles.Forsyth #define	USER		29		/* R29 is up-> */
63*74a4d8c2SCharles.Forsyth #define	IOMEMR		28		/* R28 will be iomem-> */
64*74a4d8c2SCharles.Forsyth 
65*74a4d8c2SCharles.Forsyth /*
66*74a4d8c2SCharles.Forsyth  * Fundamental addresses
67*74a4d8c2SCharles.Forsyth  */
68*74a4d8c2SCharles.Forsyth 
69*74a4d8c2SCharles.Forsyth #define	UREGSIZE	((8+32)*4)
70*74a4d8c2SCharles.Forsyth 
71*74a4d8c2SCharles.Forsyth /*
72*74a4d8c2SCharles.Forsyth  * MMU
73*74a4d8c2SCharles.Forsyth  */
74*74a4d8c2SCharles.Forsyth 
75*74a4d8c2SCharles.Forsyth /* L1 table entry and Mx_TWC flags */
76*74a4d8c2SCharles.Forsyth #define PTEVALID	(1<<0)
77*74a4d8c2SCharles.Forsyth #define PTEWT		(1<<1)	/* write through */
78*74a4d8c2SCharles.Forsyth #define PTE4K		(0<<2)
79*74a4d8c2SCharles.Forsyth #define PTE512K	(1<<2)
80*74a4d8c2SCharles.Forsyth #define PTE8MB	(3<<2)
81*74a4d8c2SCharles.Forsyth #define PTEG		(1<<4)	/* guarded */
82*74a4d8c2SCharles.Forsyth 
83*74a4d8c2SCharles.Forsyth /* L2 table entry and Mx_RPN flags (also PTEVALID) */
84*74a4d8c2SCharles.Forsyth #define PTECI		(1<<1)	/*  cache inhibit */
85*74a4d8c2SCharles.Forsyth #define PTESH		(1<<2)	/* page is shared; ASID ignored */
86*74a4d8c2SCharles.Forsyth #define PTELPS		(1<<3)	/* large page size */
87*74a4d8c2SCharles.Forsyth #define PTEWRITE	0x9F0
88*74a4d8c2SCharles.Forsyth 
89*74a4d8c2SCharles.Forsyth /* TLB and MxEPN flag */
90*74a4d8c2SCharles.Forsyth #define	TLBVALID	(1<<9)
91*74a4d8c2SCharles.Forsyth 
92*74a4d8c2SCharles.Forsyth /*
93*74a4d8c2SCharles.Forsyth  * Address spaces
94*74a4d8c2SCharles.Forsyth  */
95*74a4d8c2SCharles.Forsyth 
96*74a4d8c2SCharles.Forsyth #define	KUSEG	0x00000000
97*74a4d8c2SCharles.Forsyth #define KSEG0	0x20000000
98*74a4d8c2SCharles.Forsyth #define	KSEGM	0xE0000000	/* mask to check which seg */
99*74a4d8c2SCharles.Forsyth 
100*74a4d8c2SCharles.Forsyth #define	KZERO	KSEG0			/* base of kernel address space */
101*74a4d8c2SCharles.Forsyth #define	KTZERO	(KZERO+0x3000)	/* first address in kernel text */
102*74a4d8c2SCharles.Forsyth #define	KSTACK	8192	/* Size of kernel stack */
103*74a4d8c2SCharles.Forsyth 
104*74a4d8c2SCharles.Forsyth #define	CONFADDR	(KZERO|0x200000)	/* where qboot leaves configuration info */
105*74a4d8c2SCharles.Forsyth 
106*74a4d8c2SCharles.Forsyth /*
107*74a4d8c2SCharles.Forsyth  * Exception codes (trap vectors)
108*74a4d8c2SCharles.Forsyth  */
109*74a4d8c2SCharles.Forsyth #define	CRESET	0x01
110*74a4d8c2SCharles.Forsyth #define	CMCHECK 0x02
111*74a4d8c2SCharles.Forsyth #define	CDSI	0x03
112*74a4d8c2SCharles.Forsyth #define	CISI	0x04
113*74a4d8c2SCharles.Forsyth #define	CEI	0x05
114*74a4d8c2SCharles.Forsyth #define	CALIGN	0x06
115*74a4d8c2SCharles.Forsyth #define	CPROG	0x07
116*74a4d8c2SCharles.Forsyth #define	CFPU	0x08
117*74a4d8c2SCharles.Forsyth #define	CDEC	0x09
118*74a4d8c2SCharles.Forsyth #define	CSYSCALL 0x0C
119*74a4d8c2SCharles.Forsyth #define	CTRACE	0x0D
120*74a4d8c2SCharles.Forsyth #define	CFPA	0x0E
121*74a4d8c2SCharles.Forsyth /* rest are power-implementation dependent (8xx) */
122*74a4d8c2SCharles.Forsyth #define	CEMU	0x10
123*74a4d8c2SCharles.Forsyth #define	CIMISS	0x11
124*74a4d8c2SCharles.Forsyth #define	CDMISS	0x12
125*74a4d8c2SCharles.Forsyth #define	CITLBE	0x13
126*74a4d8c2SCharles.Forsyth #define	CDTLBE	0x14
127*74a4d8c2SCharles.Forsyth #define	CDBREAK	0x1C
128*74a4d8c2SCharles.Forsyth #define	CIBREAK	0x1D
129*74a4d8c2SCharles.Forsyth #define	CPBREAK	0x1E
130*74a4d8c2SCharles.Forsyth #define	CDPORT	0x1F
131*74a4d8c2SCharles.Forsyth 
132*74a4d8c2SCharles.Forsyth /*
133*74a4d8c2SCharles.Forsyth  * MPC8xx physical addresses
134*74a4d8c2SCharles.Forsyth  */
135*74a4d8c2SCharles.Forsyth 
136*74a4d8c2SCharles.Forsyth /* those encouraged by mpc8bug */
137*74a4d8c2SCharles.Forsyth #define	PHYSDRAM	0x00000000
138*74a4d8c2SCharles.Forsyth #define	PHYSBCSR	0x02100000
139*74a4d8c2SCharles.Forsyth #define	PHYSIMM	0x02200000
140*74a4d8c2SCharles.Forsyth #define	PHYSFLASH	0x02800000
141*74a4d8c2SCharles.Forsyth 
142*74a4d8c2SCharles.Forsyth /* remaining ones are our choice */
143*74a4d8c2SCharles.Forsyth #define	PHYSSDRAM	0x03000000
144*74a4d8c2SCharles.Forsyth #define	PHYSPCMCIA	0x04000000
145*74a4d8c2SCharles.Forsyth #define	PCMCIALEN	(8*MB)	/* chosen to allow mapping by single TLB entry */
146*74a4d8c2SCharles.Forsyth #define	ISAIO	(KZERO|PHYSPCMCIA)	/* for inb.s */
147*74a4d8c2SCharles.Forsyth 
148*74a4d8c2SCharles.Forsyth /*
149*74a4d8c2SCharles.Forsyth  * MPC8xx dual-ported CPM memory physical addresses
150*74a4d8c2SCharles.Forsyth  */
151*74a4d8c2SCharles.Forsyth #define	PHYSDPRAM	(PHYSIMM+0x2000)
152*74a4d8c2SCharles.Forsyth #define	DPLEN1	0x200
153*74a4d8c2SCharles.Forsyth #define	DPLEN2	0x400
154*74a4d8c2SCharles.Forsyth #define	DPLEN3	0x800
155*74a4d8c2SCharles.Forsyth #define	DPBASE	(PHYSDPRAM+DPLEN1)
156*74a4d8c2SCharles.Forsyth 
157*74a4d8c2SCharles.Forsyth #define KEEP_ALIVE_KEY 0x55ccaa33	/* clock and rtc register key */
158