xref: /plan9/sys/src/9/mtx/mem.h (revision 12009bff671a91993ae58f16dab833e809f4a6f3)
19a747e4fSDavid du Colombier /*
29a747e4fSDavid du Colombier  * Memory and machine-specific definitions.  Used in C and assembler.
39a747e4fSDavid du Colombier  */
49b7bf7dfSDavid du Colombier #define KiB		1024u			/* Kibi 0x0000000000000400 */
59b7bf7dfSDavid du Colombier #define MiB		1048576u		/* Mebi 0x0000000000100000 */
69b7bf7dfSDavid du Colombier #define GiB		1073741824u		/* Gibi 000000000040000000 */
79b7bf7dfSDavid du Colombier 
89a747e4fSDavid du Colombier /*
99a747e4fSDavid du Colombier  * Sizes
109a747e4fSDavid du Colombier  */
119a747e4fSDavid du Colombier 
129a747e4fSDavid du Colombier #define	BI2BY		8			/* bits per byte */
139a747e4fSDavid du Colombier #define	BI2WD		32			/* bits per word */
149a747e4fSDavid du Colombier #define	BY2WD		4			/* bytes per word */
159a747e4fSDavid du Colombier #define BY2V		8			/* bytes per vlong */
169a747e4fSDavid du Colombier #define	BY2PG		4096		/* bytes per page */
179a747e4fSDavid du Colombier #define	WD2PG		(BY2PG/BY2WD)	/* words per page */
189a747e4fSDavid du Colombier #define	PGSHIFT		12			/* log(BY2PG) */
199a747e4fSDavid du Colombier #define	CACHELINELOG	4
209a747e4fSDavid du Colombier #define	CACHELINESZ	(1<<CACHELINELOG)
219a747e4fSDavid du Colombier #define	BLOCKALIGN	CACHELINESZ
229a747e4fSDavid du Colombier 
239a747e4fSDavid du Colombier #define	MHz	1000000
249a747e4fSDavid du Colombier 
259a747e4fSDavid du Colombier #define	BY2PTE		8				/* bytes per pte entry */
269a747e4fSDavid du Colombier #define	BY2PTEG		64				/* bytes per pte group */
279a747e4fSDavid du Colombier 
289a747e4fSDavid du Colombier #define	MAXMACH	1				/* max # cpus system can run */
299a747e4fSDavid du Colombier #define	MACHSIZE	BY2PG
309a747e4fSDavid du Colombier #define	KSTACK		4096			/* Size of kernel stack */
319a747e4fSDavid du Colombier 
329a747e4fSDavid du Colombier /*
339a747e4fSDavid du Colombier  * Time
349a747e4fSDavid du Colombier  */
359a747e4fSDavid du Colombier #define	HZ		100			/* clock frequency */
369a747e4fSDavid du Colombier #define	TK2SEC(t)	((t)/HZ)		/* ticks to seconds */
379a747e4fSDavid du Colombier 
389a747e4fSDavid du Colombier /*
399a747e4fSDavid du Colombier  * Standard PPC Special Purpose Registers (OEA and VEA)
409a747e4fSDavid du Colombier  */
419a747e4fSDavid du Colombier #define DSISR	18
429a747e4fSDavid du Colombier #define DAR	19		/* Data Address Register */
439a747e4fSDavid du Colombier #define DEC	22		/* Decrementer */
449a747e4fSDavid du Colombier #define SDR1	25
459a747e4fSDavid du Colombier #define SRR0	26		/* Saved Registers (exception) */
469a747e4fSDavid du Colombier #define SRR1	27
479a747e4fSDavid du Colombier #define SPRG0	272		/* Supervisor Private Registers */
489a747e4fSDavid du Colombier #define SPRG1	273
499a747e4fSDavid du Colombier #define SPRG2	274
509a747e4fSDavid du Colombier #define SPRG3	275
519a747e4fSDavid du Colombier #define ASR	280		/* Address Space Register */
529a747e4fSDavid du Colombier #define EAR	282		/* External Access Register (optional) */
539a747e4fSDavid du Colombier #define TBRU	269		/* Time base Upper/Lower (Reading) */
549a747e4fSDavid du Colombier #define TBRL	268
559a747e4fSDavid du Colombier #define TBWU	284		/* Time base Upper/Lower (Writing) */
569a747e4fSDavid du Colombier #define TBWL	285
579a747e4fSDavid du Colombier #define PVR	287		/* Processor Version */
589a747e4fSDavid du Colombier #define IABR	1010	/* Instruction Address Breakpoint Register (optional) */
599a747e4fSDavid du Colombier #define DABR	1013	/* Data Address Breakpoint Register (optional) */
609a747e4fSDavid du Colombier #define FPECR	1022	/* Floating-Point Exception Cause Register (optional) */
619a747e4fSDavid du Colombier #define PIR	1023	/* Processor Identification Register (optional) */
629a747e4fSDavid du Colombier 
639a747e4fSDavid du Colombier #define IBATU(i)	(528+2*(i))	/* Instruction BAT register (upper) */
649a747e4fSDavid du Colombier #define IBATL(i)	(529+2*(i))	/* Instruction BAT register (lower) */
659a747e4fSDavid du Colombier #define DBATU(i)	(536+2*(i))	/* Data BAT register (upper) */
669a747e4fSDavid du Colombier #define DBATL(i)	(537+2*(i))	/* Data BAT register (lower) */
679a747e4fSDavid du Colombier 
689a747e4fSDavid du Colombier /*
699a747e4fSDavid du Colombier  * PPC604e-specific Special Purpose Registers (OEA)
709a747e4fSDavid du Colombier  */
719a747e4fSDavid du Colombier #define HID0		1008	/* Hardware Implementation Dependant Register 0 */
729a747e4fSDavid du Colombier #define HID1		1009	/* Hardware Implementation Dependant Register 1 */
739a747e4fSDavid du Colombier #define PMC1		953		/* Performance Monitor Counter 1 */
749a747e4fSDavid du Colombier #define PMC2		954		/* Performance Monitor Counter 2 */
759a747e4fSDavid du Colombier #define PMC3		957		/* Performance Monitor Counter 3 */
769a747e4fSDavid du Colombier #define PMC4		958		/* Performance Monitor Counter 4 */
779a747e4fSDavid du Colombier #define MMCR0	952		/* Monitor Control Register 0 */
789a747e4fSDavid du Colombier #define MMCR1	956		/* Monitor Control Register 0 */
799a747e4fSDavid du Colombier #define SIA		955		/* Sampled Instruction Address */
809a747e4fSDavid du Colombier #define SDA		959		/* Sampled Data Address */
819a747e4fSDavid du Colombier 
829a747e4fSDavid du Colombier #define BIT(i)	(1<<(31-(i)))	/* Silly backwards register bit numbering scheme */
839a747e4fSDavid du Colombier 
849a747e4fSDavid du Colombier /*
859a747e4fSDavid du Colombier  * Bit encodings for Machine State Register (MSR)
869a747e4fSDavid du Colombier  */
879a747e4fSDavid du Colombier #define MSR_POW		BIT(13)		/* Enable Power Management */
889a747e4fSDavid du Colombier #define MSR_ILE		BIT(15)		/* Interrupt Little-Endian enable */
899a747e4fSDavid du Colombier #define MSR_EE		BIT(16)		/* External Interrupt enable */
909a747e4fSDavid du Colombier #define MSR_PR		BIT(17)		/* Supervisor/User privelege */
919a747e4fSDavid du Colombier #define MSR_FP		BIT(18)		/* Floating Point enable */
929a747e4fSDavid du Colombier #define MSR_ME		BIT(19)		/* Machine Check enable */
939a747e4fSDavid du Colombier #define MSR_FE0		BIT(20)		/* Floating Exception mode 0 */
949a747e4fSDavid du Colombier #define MSR_SE		BIT(21)		/* Single Step (optional) */
959a747e4fSDavid du Colombier #define MSR_BE		BIT(22)		/* Branch Trace (optional) */
969a747e4fSDavid du Colombier #define MSR_FE1		BIT(23)		/* Floating Exception mode 1 */
979a747e4fSDavid du Colombier #define MSR_IP		BIT(25)		/* Exception prefix 0x000/0xFFF */
989a747e4fSDavid du Colombier #define MSR_IR		BIT(26)		/* Instruction MMU enable */
999a747e4fSDavid du Colombier #define MSR_DR		BIT(27)		/* Data MMU enable */
1009a747e4fSDavid du Colombier #define MSR_PM		BIT(29)		/* Performance Monitor marked mode (604e specific) */
1019a747e4fSDavid du Colombier #define MSR_RI		BIT(30)		/* Recoverable Exception */
1029a747e4fSDavid du Colombier #define MSR_LE		BIT(31)		/* Little-Endian enable */
1039a747e4fSDavid du Colombier 
1049a747e4fSDavid du Colombier /*
1059a747e4fSDavid du Colombier  * Exception codes (trap vectors)
1069a747e4fSDavid du Colombier  */
1079a747e4fSDavid du Colombier #define CRESET	0x01
1089a747e4fSDavid du Colombier #define CMCHECK	0x02
1099a747e4fSDavid du Colombier #define CDSI		0x03
1109a747e4fSDavid du Colombier #define CISI		0x04
1119a747e4fSDavid du Colombier #define CEI		0x05
1129a747e4fSDavid du Colombier #define CALIGN	0x06
1139a747e4fSDavid du Colombier #define CPROG		0x07
1149a747e4fSDavid du Colombier #define CFPU		0x08
1159a747e4fSDavid du Colombier #define CDEC		0x09
1169a747e4fSDavid du Colombier #define CSYSCALL	0x0C
1179a747e4fSDavid du Colombier #define CTRACE	0x0D	/* optional */
1189a747e4fSDavid du Colombier #define CFPA		0x0E		/* optional */
1199a747e4fSDavid du Colombier 
1209a747e4fSDavid du Colombier /* PPC604e-specific: */
1219a747e4fSDavid du Colombier #define CPERF		0x0F		/* performance monitoring */
1229a747e4fSDavid du Colombier #define CIBREAK	0x13
1239a747e4fSDavid du Colombier #define CSMI		0x14
1249a747e4fSDavid du Colombier 
1259a747e4fSDavid du Colombier /*
1269a747e4fSDavid du Colombier  * Magic registers
1279a747e4fSDavid du Colombier  */
1289a747e4fSDavid du Colombier 
1299a747e4fSDavid du Colombier #define	MACH	30		/* R30 is m-> */
1309a747e4fSDavid du Colombier #define	USER		29		/* R29 is up-> */
1319a747e4fSDavid du Colombier 
1329a747e4fSDavid du Colombier 
1339a747e4fSDavid du Colombier /*
1349a747e4fSDavid du Colombier  *  virtual MMU
1359a747e4fSDavid du Colombier  */
1369a747e4fSDavid du Colombier #define PTEMAPMEM	(1024*1024)
1379a747e4fSDavid du Colombier #define PTEPERTAB	(PTEMAPMEM/BY2PG)
1389a747e4fSDavid du Colombier #define SEGMAPSIZE	1984
1399a747e4fSDavid du Colombier #define SSEGMAPSIZE	16
1409a747e4fSDavid du Colombier #define PPN(x)		((x)&~(BY2PG-1))
1419a747e4fSDavid du Colombier 
1429a747e4fSDavid du Colombier /*
1439a747e4fSDavid du Colombier  *  First pte word
1449a747e4fSDavid du Colombier  */
1459a747e4fSDavid du Colombier #define	PTE0(v, vsid, h, va)	(((v)<<31)|((vsid)<<7)|((h)<<6)|(((va)>>22)&0x3f))
1469a747e4fSDavid du Colombier 
1479a747e4fSDavid du Colombier /*
1489a747e4fSDavid du Colombier  *  Second pte word; WIMG & PP(RW/RO) common to page table and BATs
1499a747e4fSDavid du Colombier  */
1509a747e4fSDavid du Colombier #define	PTE1_W	BIT(25)
1519a747e4fSDavid du Colombier #define	PTE1_I	BIT(26)
1529a747e4fSDavid du Colombier #define	PTE1_M	BIT(27)
1539a747e4fSDavid du Colombier #define	PTE1_G	BIT(28)
1549a747e4fSDavid du Colombier 
1559a747e4fSDavid du Colombier #define	PTE1_RW	BIT(30)
1569a747e4fSDavid du Colombier #define	PTE1_RO	BIT(31)
1579a747e4fSDavid du Colombier 
1589a747e4fSDavid du Colombier /*
1599a747e4fSDavid du Colombier  *  PTE bits for fault.c.  These belong to the second PTE word.  Validity is
1609a747e4fSDavid du Colombier  *  implied for putmmu(), and we always set PTE0_V.  PTEVALID is used
1619a747e4fSDavid du Colombier  *  here to set cache policy bits on a global basis.
1629a747e4fSDavid du Colombier  */
1639a747e4fSDavid du Colombier #define	PTEVALID		0
1649a747e4fSDavid du Colombier #define	PTEWRITE		PTE1_RW
1659a747e4fSDavid du Colombier #define	PTERONLY	PTE1_RO
1669a747e4fSDavid du Colombier #define	PTEUNCACHED	PTE1_I
1679a747e4fSDavid du Colombier 
1689a747e4fSDavid du Colombier /*
1699a747e4fSDavid du Colombier  * Address spaces
1709a747e4fSDavid du Colombier  */
1719a747e4fSDavid du Colombier 
1729a747e4fSDavid du Colombier #define	UZERO	0			/* base of user address space */
1739a747e4fSDavid du Colombier #define	UTZERO	(UZERO+BY2PG)		/* first address in user text */
174*12009bffSDavid du Colombier #define UTROUND(t)	ROUNDUP((t), 0x100000)
1759a747e4fSDavid du Colombier #define	USTKTOP	(TSTKTOP-TSTKSIZ*BY2PG)	/* byte just beyond user stack */
1769a747e4fSDavid du Colombier #define	TSTKTOP	KZERO	/* top of temporary stack */
1779a747e4fSDavid du Colombier #define	TSTKSIZ 100
1789a747e4fSDavid du Colombier #define	KZERO	0x80000000		/* base of kernel address space */
1799a747e4fSDavid du Colombier #define	KTZERO	(KZERO+0x4000)	/* first address in kernel text */
1809a747e4fSDavid du Colombier #define	USTKSIZE	(4*1024*1024)		/* size of user stack */
1819a747e4fSDavid du Colombier #define	UREGSIZE	((8+32)*4)
1829a747e4fSDavid du Colombier 
1839a747e4fSDavid du Colombier #define	PCIMEM0		0xf0000000
1849a747e4fSDavid du Colombier #define	PCISIZE0		0x0e000000
1859a747e4fSDavid du Colombier #define	PCIMEM1		0xc0000000
1869a747e4fSDavid du Colombier #define	PCISIZE1		0x30000000
1879a747e4fSDavid du Colombier #define	IOMEM		0xfe000000
1889a747e4fSDavid du Colombier #define	IOSIZE		0x00800000
1899a747e4fSDavid du Colombier #define	FALCON		0xfef80000
1909a747e4fSDavid du Colombier #define	RAVEN		0xfeff0000
1919a747e4fSDavid du Colombier #define	FLASHA		0xff000000
1929a747e4fSDavid du Colombier #define	FLASHB		0xff800000
1939a747e4fSDavid du Colombier #define	FLASHAorB	0xfff00000
1949a747e4fSDavid du Colombier 
1959a747e4fSDavid du Colombier #define isphys(x) (((ulong)x&KZERO)!=0)
1969a747e4fSDavid du Colombier 
1979a747e4fSDavid du Colombier #define getpgcolor(a)	0
198