xref: /plan9-contrib/sys/src/9k/k10/mem.h (revision 3ac4c0d6590dd3d4436892e401c93e14d7aa6a2a)
19ef1f84bSDavid du Colombier /*
29ef1f84bSDavid du Colombier  * Memory and machine-specific definitions.  Used in C and assembler.
39ef1f84bSDavid du Colombier  */
49ef1f84bSDavid du Colombier #define KiB		1024			/* Kibi 0x0000000000000400 */
59ef1f84bSDavid du Colombier #define MiB		1048576			/* Mebi 0x0000000000100000 */
69ef1f84bSDavid du Colombier #define GiB		1073741824		/* Gibi 000000000040000000 */
79ef1f84bSDavid du Colombier #define TiB		1099511627776ll		/* Tebi 0x0000010000000000 */
89ef1f84bSDavid du Colombier #define PiB		1125899906842624ll	/* Pebi 0x0004000000000000 */
99ef1f84bSDavid du Colombier #define EiB		1152921504606846976ll	/* Exbi 0x1000000000000000 */
109ef1f84bSDavid du Colombier 
119ef1f84bSDavid du Colombier #define HOWMANY(x, y)	(((x)+((y)-1))/(y))
129ef1f84bSDavid du Colombier #define ROUNDUP(x, y)	(HOWMANY((x), (y))*(y))
139ef1f84bSDavid du Colombier #define ROUNDDN(x, y)	(((x)/(y))*(y))
149ef1f84bSDavid du Colombier #define MIN(a, b)	((a) < (b)? (a): (b))
159ef1f84bSDavid du Colombier #define MAX(a, b)	((a) > (b)? (a): (b))
169ef1f84bSDavid du Colombier 
179ef1f84bSDavid du Colombier /*
189ef1f84bSDavid du Colombier  * Sizes
199ef1f84bSDavid du Colombier  */
209ef1f84bSDavid du Colombier #define BI2BY		8			/* bits per byte */
219ef1f84bSDavid du Colombier #define BY2V		8			/* bytes per double word */
229ef1f84bSDavid du Colombier #define BY2SE		8			/* bytes per stack element */
239ef1f84bSDavid du Colombier #define BLOCKALIGN	8
249ef1f84bSDavid du Colombier 
259ef1f84bSDavid du Colombier #define PGSZ		(4*KiB)			/* page size */
269ef1f84bSDavid du Colombier #define PGSHFT		12			/* log(PGSZ) */
279ef1f84bSDavid du Colombier #define PTSZ		(4*KiB)			/* page table page size */
289ef1f84bSDavid du Colombier #define PTSHFT		9			/*  */
299ef1f84bSDavid du Colombier 
309ef1f84bSDavid du Colombier #define MACHSZ		(4*KiB)			/* Mach+stack size */
319ef1f84bSDavid du Colombier #define MACHMAX		32			/* max. number of cpus */
329ef1f84bSDavid du Colombier #define MACHSTKSZ	(6*(4*KiB))		/* Mach stack size */
339ef1f84bSDavid du Colombier 
349ef1f84bSDavid du Colombier #define KSTACK		(16*1024)		/* Size of Proc kernel stack */
359ef1f84bSDavid du Colombier #define STACKALIGN(sp)	((sp) & ~(BY2SE-1))	/* bug: assure with alloc */
369ef1f84bSDavid du Colombier 
379ef1f84bSDavid du Colombier /*
389ef1f84bSDavid du Colombier  * Time
399ef1f84bSDavid du Colombier  */
409ef1f84bSDavid du Colombier #define HZ		(100)			/* clock frequency */
419ef1f84bSDavid du Colombier #define MS2HZ		(1000/HZ)		/* millisec per clock tick */
429ef1f84bSDavid du Colombier #define TK2SEC(t)	((t)/HZ)		/* ticks to seconds */
439ef1f84bSDavid du Colombier 
449ef1f84bSDavid du Colombier /*
459ef1f84bSDavid du Colombier  *  Address spaces
469ef1f84bSDavid du Colombier  *
479ef1f84bSDavid du Colombier  *  Kernel gets loaded at 1*MiB+64*KiB;
489ef1f84bSDavid du Colombier  *  Memory from 0 to 1MiB is not used for other things;
499ef1f84bSDavid du Colombier  *  1*MiB to 1MiB+64KiB is used to hold the Sys and
509ef1f84bSDavid du Colombier  *  Mach0 datastructures.
519ef1f84bSDavid du Colombier  *
529ef1f84bSDavid du Colombier  *  User is at low addresses; kernel vm starts at KZERO;
539ef1f84bSDavid du Colombier  *  KSEG0 maps the first TMFM bytes, one to one, (i.e KZERO);
549ef1f84bSDavid du Colombier  *  KSEG1 maps the PML4 into itself;
559ef1f84bSDavid du Colombier  *  KSEG2 maps all remaining physical memory.
569ef1f84bSDavid du Colombier  */
579ef1f84bSDavid du Colombier #define UTZERO		(0+2*MiB)		/* first address in user text */
589ef1f84bSDavid du Colombier #define UTROUND(t)	ROUNDUP((t), 2*MiB)
599ef1f84bSDavid du Colombier #define USTKTOP		0x00007ffffffff000ull
609ef1f84bSDavid du Colombier #define USTKSIZE	(16*1024*1024)		/* size of user stack */
619ef1f84bSDavid du Colombier #define TSTKTOP		(USTKTOP-USTKSIZE)	/* end of new stack in sysexec */
629ef1f84bSDavid du Colombier 
639ef1f84bSDavid du Colombier #define KSEG0		(0xfffffffff0000000ull)	/* 256MB - this is confused */
649ef1f84bSDavid du Colombier #define KSEG1		(0xffffff0000000000ull)	/* 512GB - embedded PML4 */
659ef1f84bSDavid du Colombier #define KSEG2		(0xfffffe0000000000ull)	/* 1TB - KMAP */
669ef1f84bSDavid du Colombier 
679ef1f84bSDavid du Colombier #define PMAPADDR	(0xffffffffffe00000ull)	/* unused as of yet (KMAP?) */
689ef1f84bSDavid du Colombier 
699ef1f84bSDavid du Colombier #define KZERO		(0xfffffffff0000000ull)
709ef1f84bSDavid du Colombier #define KTZERO		(KZERO+1*MiB+64*KiB)
719ef1f84bSDavid du Colombier 
729ef1f84bSDavid du Colombier /*
739ef1f84bSDavid du Colombier  *  virtual MMU
749ef1f84bSDavid du Colombier  */
759ef1f84bSDavid du Colombier #define PTEPERTAB	(256)
769ef1f84bSDavid du Colombier #define PTEMAPMEM	(PTEPERTAB*PGSZ)
77*3ac4c0d6SDavid du Colombier #define SEGMAPSIZE	65536
789ef1f84bSDavid du Colombier #define SSEGMAPSIZE	16
799ef1f84bSDavid du Colombier 
809ef1f84bSDavid du Colombier /*
819ef1f84bSDavid du Colombier  * This is the interface between fixfault and mmuput.
829ef1f84bSDavid du Colombier  * Should be in port.
839ef1f84bSDavid du Colombier  */
849ef1f84bSDavid du Colombier #define PTEVALID	(1<<0)
859ef1f84bSDavid du Colombier #define PTEWRITE	(1<<1)
869ef1f84bSDavid du Colombier #define PTERONLY	(0<<1)
879ef1f84bSDavid du Colombier #define PTEUSER		(1<<2)
889ef1f84bSDavid du Colombier #define PTEUNCACHED	(1<<4)
899ef1f84bSDavid du Colombier 
909ef1f84bSDavid du Colombier #define getpgcolor(a)	0
919ef1f84bSDavid du Colombier 
929ef1f84bSDavid du Colombier /*
939ef1f84bSDavid du Colombier  * Hierarchical Page Tables.
949ef1f84bSDavid du Colombier  * For example, traditional IA-32 paging structures have 2 levels,
959ef1f84bSDavid du Colombier  * level 1 is the PD, and level 0 the PT pages; with IA-32e paging,
969ef1f84bSDavid du Colombier  * level 3 is the PML4(!), level 2 the PDP, level 1 the PD,
979ef1f84bSDavid du Colombier  * and level 0 the PT pages. The PTLX macro gives an index into the
989ef1f84bSDavid du Colombier  * page-table page at level 'l' for the virtual address 'v'.
999ef1f84bSDavid du Colombier  */
1009ef1f84bSDavid du Colombier #define PTLX(v, l)	(((v)>>(((l)*PTSHFT)+PGSHFT)) & ((1<<PTSHFT)-1))
1019ef1f84bSDavid du Colombier #define PGLSZ(l)	(1<<(((l)*PTSHFT)+PGSHFT))
1029ef1f84bSDavid du Colombier 
10303f1b96dSDavid du Colombier #define TMFM		((256-32)*MiB)			/* GAK kernel memory */
1049ef1f84bSDavid du Colombier 
1059ef1f84bSDavid du Colombier /* this can go when the arguments to mmuput change */
1069ef1f84bSDavid du Colombier #define PPN(x)		((x) & ~(PGSZ-1))		/* GAK */
107fe56f827SDavid du Colombier 
108fe56f827SDavid du Colombier #define	KVATOP	(KSEG0&KSEG1&KSEG2)
109fe56f827SDavid du Colombier #define	iskaddr(a)	(((uintptr)(a)&KVATOP) == KVATOP)
110