xref: /inferno-os/os/js/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 
19*74a4d8c2SCharles.Forsyth #define	MAXMACH		1			/* max # cpus system can run */
20*74a4d8c2SCharles.Forsyth 
21*74a4d8c2SCharles.Forsyth /*
22*74a4d8c2SCharles.Forsyth  * Time
23*74a4d8c2SCharles.Forsyth  */
24*74a4d8c2SCharles.Forsyth #define	HZ		50			/* clock frequency */
25*74a4d8c2SCharles.Forsyth #define	MS2HZ		(1000/HZ)		/* millisec per clock tick */
26*74a4d8c2SCharles.Forsyth #define	TK2SEC(t)	((t)/HZ)		/* ticks to seconds */
27*74a4d8c2SCharles.Forsyth #define	MS2TK(t)	((((ulong)(t))*HZ)/1000)	/* milliseconds to ticks */
28*74a4d8c2SCharles.Forsyth 
29*74a4d8c2SCharles.Forsyth /*
30*74a4d8c2SCharles.Forsyth  * PSR bits
31*74a4d8c2SCharles.Forsyth  */
32*74a4d8c2SCharles.Forsyth #define	PSREC		0x00002000
33*74a4d8c2SCharles.Forsyth #define	PSREF		0x00001000
34*74a4d8c2SCharles.Forsyth #define PSRSUPER	0x00000080
35*74a4d8c2SCharles.Forsyth #define PSRPSUPER	0x00000040
36*74a4d8c2SCharles.Forsyth #define	PSRET		0x00000020
37*74a4d8c2SCharles.Forsyth #define SPL(n)		(n<<8)
38*74a4d8c2SCharles.Forsyth 
39*74a4d8c2SCharles.Forsyth /*
40*74a4d8c2SCharles.Forsyth  * Magic registers
41*74a4d8c2SCharles.Forsyth  */
42*74a4d8c2SCharles.Forsyth 
43*74a4d8c2SCharles.Forsyth #define	MACH		6		/* R6 is m-> */
44*74a4d8c2SCharles.Forsyth #define	USER		5		/* R5 is u-> */
45*74a4d8c2SCharles.Forsyth 
46*74a4d8c2SCharles.Forsyth /*
47*74a4d8c2SCharles.Forsyth  * Fundamental addresses
48*74a4d8c2SCharles.Forsyth  */
49*74a4d8c2SCharles.Forsyth 
50*74a4d8c2SCharles.Forsyth #define	USERADDR	0xE0000000
51*74a4d8c2SCharles.Forsyth #define	UREGADDR	(USERADDR+BY2PG-((32+6)*BY2WD))
52*74a4d8c2SCharles.Forsyth #define	BOOTSTACK	(KTZERO-0*BY2PG)
53*74a4d8c2SCharles.Forsyth #define	TRAPS		(KTZERO-2*BY2PG)
54*74a4d8c2SCharles.Forsyth 
55*74a4d8c2SCharles.Forsyth /*
56*74a4d8c2SCharles.Forsyth  * Reference MMU registers (ASI 4)
57*74a4d8c2SCharles.Forsyth  */
58*74a4d8c2SCharles.Forsyth #define	PCR		0x000
59*74a4d8c2SCharles.Forsyth #define	CTPR		0x100
60*74a4d8c2SCharles.Forsyth #define	CXR		0x200
61*74a4d8c2SCharles.Forsyth #define	SFSR		0x300
62*74a4d8c2SCharles.Forsyth #define	SFAR		0x400
63*74a4d8c2SCharles.Forsyth 
64*74a4d8c2SCharles.Forsyth /*
65*74a4d8c2SCharles.Forsyth  * Processor Control Register
66*74a4d8c2SCharles.Forsyth  */
67*74a4d8c2SCharles.Forsyth #define	ITBRDISABLE	(1<<16)
68*74a4d8c2SCharles.Forsyth #define	BOOTMODE	(1<<14)	/* `must be cleared for normal operation' */
69*74a4d8c2SCharles.Forsyth #define	MEMPCHECK	(1<<12)	/* check parity */
70*74a4d8c2SCharles.Forsyth #define	ENABCACHE	(3<<8)	/* I & D caches */
71*74a4d8c2SCharles.Forsyth #define	NOFAULT		(1<<1)	/* no fault */
72*74a4d8c2SCharles.Forsyth 
73*74a4d8c2SCharles.Forsyth /*
74*74a4d8c2SCharles.Forsyth  * special MMU regions
75*74a4d8c2SCharles.Forsyth  *	DMA segment for SBus DMA mapping via I/O MMU (hardware fixes location)
76*74a4d8c2SCharles.Forsyth  *	the frame buffer is mapped as one MMU region (16 Mbytes)
77*74a4d8c2SCharles.Forsyth  *	IO segments for device register pages etc.
78*74a4d8c2SCharles.Forsyth  */
79*74a4d8c2SCharles.Forsyth #define	DMARANGE	0
80*74a4d8c2SCharles.Forsyth #define	DMASEGSIZE	((16*MB)<<DMARANGE)
81*74a4d8c2SCharles.Forsyth #define	DMASEGBASE	(0 - DMASEGSIZE)
82*74a4d8c2SCharles.Forsyth #define	FBSEGSIZE	(1*(16*MB))	 /* multiples of 16*MB */
83*74a4d8c2SCharles.Forsyth #define	FBSEGBASE	(DMASEGBASE - DMASEGSIZE)
84*74a4d8c2SCharles.Forsyth #define	IOSEGSIZE	(16*MB)
85*74a4d8c2SCharles.Forsyth #define	IOSEGBASE	(FBSEGBASE - IOSEGSIZE)
86*74a4d8c2SCharles.Forsyth 
87*74a4d8c2SCharles.Forsyth /*
88*74a4d8c2SCharles.Forsyth  * MMU entries
89*74a4d8c2SCharles.Forsyth  */
90*74a4d8c2SCharles.Forsyth #define	PTPVALID	1	/* page table pointer */
91*74a4d8c2SCharles.Forsyth #define	PTEVALID	2	/* page table entry */
92*74a4d8c2SCharles.Forsyth #define	PTERONLY	(2<<2)	/* read/execute */
93*74a4d8c2SCharles.Forsyth #define	PTEWRITE	(3<<2)	/* read/write/execute */
94*74a4d8c2SCharles.Forsyth #define	PTEKERNEL	(4<<2)	/* execute only */
95*74a4d8c2SCharles.Forsyth #define	PTENOCACHE	(0<<7)
96*74a4d8c2SCharles.Forsyth #define	PTECACHE	(1<<7)
97*74a4d8c2SCharles.Forsyth #define	PTEACCESS	(1<<5)
98*74a4d8c2SCharles.Forsyth #define	PTEMODIFY	(1<<6)
99*74a4d8c2SCharles.Forsyth #define	PTEMAINMEM	0
100*74a4d8c2SCharles.Forsyth #define	PTEIO		0
101*74a4d8c2SCharles.Forsyth #define PTEPROBEMEM	(PTEVALID|PTEKERNEL|PTENOCACHE|PTEWRITE|PTEMAINMEM)
102*74a4d8c2SCharles.Forsyth #define PTEUNCACHED	PTEACCESS	/* use as software flag for putmmu */
103*74a4d8c2SCharles.Forsyth 
104*74a4d8c2SCharles.Forsyth #define	NTLBPID		64	/* limited by microsparc hardware contexts */
105*74a4d8c2SCharles.Forsyth 
106*74a4d8c2SCharles.Forsyth #define PTEMAPMEM	(1024*1024)
107*74a4d8c2SCharles.Forsyth #define	PTEPERTAB	(PTEMAPMEM/BY2PG)
108*74a4d8c2SCharles.Forsyth #define SEGMAPSIZE	128
109*74a4d8c2SCharles.Forsyth 
110*74a4d8c2SCharles.Forsyth #define	INVALIDPTE	0
111*74a4d8c2SCharles.Forsyth #define	PPN(pa)		(((ulong)(pa)>>4)&0x7FFFFF0)
112*74a4d8c2SCharles.Forsyth #define	PPT(pn)		((ulong*)KADDR((((ulong)(pn)&~0xF)<<4)))
113*74a4d8c2SCharles.Forsyth 
114*74a4d8c2SCharles.Forsyth /*
115*74a4d8c2SCharles.Forsyth  * Virtual addresses
116*74a4d8c2SCharles.Forsyth  */
117*74a4d8c2SCharles.Forsyth #define	VTAG(va)	((va>>22)&0x03F)
118*74a4d8c2SCharles.Forsyth #define	VPN(va)		((va>>13)&0x1FF)
119*74a4d8c2SCharles.Forsyth 
120*74a4d8c2SCharles.Forsyth /*
121*74a4d8c2SCharles.Forsyth  * Address spaces
122*74a4d8c2SCharles.Forsyth  */
123*74a4d8c2SCharles.Forsyth #define	KZERO	0xE0000000		/* base of kernel address space */
124*74a4d8c2SCharles.Forsyth #define	KTZERO	(KZERO+4*BY2PG)		/* first address in kernel text */
125*74a4d8c2SCharles.Forsyth #define KSTACK	8192			/* size of kernel stack */
126*74a4d8c2SCharles.Forsyth 
127*74a4d8c2SCharles.Forsyth #define	MACHSIZE	4096
128*74a4d8c2SCharles.Forsyth 
129*74a4d8c2SCharles.Forsyth /*
130*74a4d8c2SCharles.Forsyth  * control registers in physical address space (ASI 20)
131*74a4d8c2SCharles.Forsyth  */
132*74a4d8c2SCharles.Forsyth #define	IOCR		0x10000000	/* IO MMU control register */
133*74a4d8c2SCharles.Forsyth #define	IBAR		0x10000004	/* IO MMU page table base address */
134*74a4d8c2SCharles.Forsyth #define	AFR		0x10000018	/* address flush register */
135*74a4d8c2SCharles.Forsyth #define	AFSR		0x10001000	/* asynch fault status */
136*74a4d8c2SCharles.Forsyth #define	AFAR		0x10001004	/* asynch fault address */
137*74a4d8c2SCharles.Forsyth #define	SSCR(i)		(0x10001010+(i)*4)	/* Sbus slot i config register */
138*74a4d8c2SCharles.Forsyth #define	MFSR		0x10001020	/* memory fault status register */
139*74a4d8c2SCharles.Forsyth #define	MFAR		0x10001024	/* memory fault address register */
140*74a4d8c2SCharles.Forsyth #define	MID		0x10002000	/* sbus arbitration enable */
141*74a4d8c2SCharles.Forsyth 
142*74a4d8c2SCharles.Forsyth #define	SYSCTL		0x71F00000	/* system control & reset register */
143*74a4d8c2SCharles.Forsyth #define	PROCINTCLR	0x71E00004	/* clear pending processor interrupts */
144*74a4d8c2SCharles.Forsyth 
145*74a4d8c2SCharles.Forsyth /*
146*74a4d8c2SCharles.Forsyth  * IO MMU page table entry
147*74a4d8c2SCharles.Forsyth  */
148*74a4d8c2SCharles.Forsyth #define	IOPTEVALID	(1<<1)
149*74a4d8c2SCharles.Forsyth #define	IOPTEWRITE	(1<<2)
150