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