125210b06SDavid du Colombier /* 225210b06SDavid du Colombier * Memory and machine-specific definitions. Used in C and assembler. 325210b06SDavid du Colombier */ 425210b06SDavid du Colombier 525210b06SDavid du Colombier /* 625210b06SDavid du Colombier * Sizes 725210b06SDavid du Colombier */ 825210b06SDavid du Colombier #define BI2BY 8 /* bits per byte */ 925210b06SDavid du Colombier #define BI2WD 32 /* bits per word */ 1025210b06SDavid du Colombier #define BY2WD 4 /* bytes per word */ 1125210b06SDavid du Colombier #define BY2V 8 /* bytes per double word */ 1225210b06SDavid du Colombier #define BY2PG 4096 /* bytes per page */ 1325210b06SDavid du Colombier #define WD2PG (BY2PG/BY2WD) /* words per page */ 1425210b06SDavid du Colombier #define BY2XPG (4096*1024) /* bytes per big page */ 1525210b06SDavid du Colombier #define PGSHIFT 12 /* log(BY2PG) */ 1625210b06SDavid du Colombier #define CACHELINESZ 32 /* pentium & later */ 1725210b06SDavid du Colombier #define BLOCKALIGN 8 1825210b06SDavid du Colombier 1925210b06SDavid du Colombier #define MAXMACH 1 /* max # cpus system can run */ 2025210b06SDavid du Colombier /* 2125210b06SDavid du Colombier * we use a larger-than-normal kernel stack in the bootstraps as we have 2225210b06SDavid du Colombier * significant arrays (buffers) on the stack. we typically consume about 2325210b06SDavid du Colombier * 4.5K of stack. 2425210b06SDavid du Colombier */ 2525210b06SDavid du Colombier #define KSTACK (4*BY2PG) /* Size of kernel stack */ 2625210b06SDavid du Colombier #define MACHSIZE BY2PG 2725210b06SDavid du Colombier 2825210b06SDavid du Colombier /* 2925210b06SDavid du Colombier * Time 3025210b06SDavid du Colombier */ 3125210b06SDavid du Colombier #define HZ (100) /* clock frequency */ 3225210b06SDavid du Colombier #define MS2HZ (1000/HZ) /* millisec per clock tick */ 3325210b06SDavid du Colombier #define TK2SEC(t) ((t)/HZ) /* ticks to seconds */ 3425210b06SDavid du Colombier 3525210b06SDavid du Colombier /* 3625210b06SDavid du Colombier * Address spaces 3725210b06SDavid du Colombier * 3825210b06SDavid du Colombier * Kernel is at 2GB-4GB 3925210b06SDavid du Colombier */ 4025210b06SDavid du Colombier #define KZERO 0x80000000 /* base of kernel address space */ 4125210b06SDavid du Colombier #define KSEGM 0xF0000000 4225210b06SDavid du Colombier #define VPT (KZERO-VPTSIZE) 4325210b06SDavid du Colombier #define VPTSIZE BY2XPG 4425210b06SDavid du Colombier #define NVPT (VPTSIZE/BY2WD) 4525210b06SDavid du Colombier #define KMAP (VPT-KMAPSIZE) 4625210b06SDavid du Colombier #define KMAPSIZE BY2XPG 4725210b06SDavid du Colombier #define VMAP (KMAP-VMAPSIZE) 4825210b06SDavid du Colombier #define VMAPSIZE (0x10000000-VPTSIZE-KMAPSIZE) 4925210b06SDavid du Colombier #define UZERO 0 /* base of user address space */ 5025210b06SDavid du Colombier #define UTZERO (UZERO+BY2PG) /* first address in user text */ 51*12009bffSDavid du Colombier #define UTROUND(t) ROUNDUP((t), BY2PG) 5225210b06SDavid du Colombier #define USTKTOP (VMAP-BY2PG) /* byte just beyond user stack */ 5325210b06SDavid du Colombier #define USTKSIZE (16*1024*1024) /* size of user stack */ 5425210b06SDavid du Colombier #define TSTKTOP (USTKTOP-USTKSIZE) /* end of new stack in sysexec */ 5525210b06SDavid du Colombier #define TSTKSIZ 100 /* pages in new stack; limits exec args */ 5625210b06SDavid du Colombier 5725210b06SDavid du Colombier /* 5825210b06SDavid du Colombier * Fundamental addresses - bottom 64kB saved for return to real mode 5925210b06SDavid du Colombier * 6025210b06SDavid du Colombier * we need some fixed address space for things that normally fit below the 6125210b06SDavid du Colombier * kernel and some of it needs to be addressible from real mode, thus under 1MB. 6225210b06SDavid du Colombier * 6325210b06SDavid du Colombier * pxe loading starts us at 0x7c00 and non-pxe loading starts us at 0x10000. 6425210b06SDavid du Colombier * 6525210b06SDavid du Colombier * this assertion must hold: PDX(TMPADDR) == PDX(MACHADDR). 6625210b06SDavid du Colombier * see realmode0.s for a description of the Chinese puzzle. 6725210b06SDavid du Colombier */ 6825210b06SDavid du Colombier /* first 1K is real-mode IVT (vectors) */ 6925210b06SDavid du Colombier /* next 256 bytes are bios data area (bda) */ 7025210b06SDavid du Colombier /* 0x500 to 0x800 unused [768] */ 7125210b06SDavid du Colombier /* 7225210b06SDavid du Colombier * RMCODE should be the lowest address used in real mode. 7325210b06SDavid du Colombier * all real-mode buffers, etc. should follow it. 7425210b06SDavid du Colombier */ 7525210b06SDavid du Colombier #define RMCODE (KZERO+0x800) /* copy of initial KTZERO [2K, magic] */ 7625210b06SDavid du Colombier #define REBOOTADDR (RMCODE-KZERO) /* reboot code - physical address [128] */ 7725210b06SDavid du Colombier #define RMSIZE 2048 7825210b06SDavid du Colombier /* 0x1000 to 0x1200 unused [512] */ 7925210b06SDavid du Colombier /* CONFADDR must match def'n in kernel being loaded */ 8025210b06SDavid du Colombier #define CONFADDR (KZERO+0x1200) /* cfg passed to kernel [3.5K, fixed] */ 8125210b06SDavid du Colombier #define BIOSXCHG (KZERO+0x2000) /* BIOS data exchange [2K+32] */ 8225210b06SDavid du Colombier /* 0x2820 to 0x2900 unused [224] */ 8325210b06SDavid du Colombier #define RMUADDR (KZERO+0x2900) /* real mode Ureg [128 (76 actual)] */ 8425210b06SDavid du Colombier /* 0x2980 to 0x3000 unused [1664] */ 8525210b06SDavid du Colombier #define IDTADDR (KZERO+0x3000) /* protected-mode idt [2K] */ 8625210b06SDavid du Colombier /* 0x3800 to 0x4000 unused [2K] */ 8725210b06SDavid du Colombier 8825210b06SDavid du Colombier /* we only use one processor for bootstrapping, so merge MACHADDR & CPU0MACH */ 8925210b06SDavid du Colombier #define MACHADDR (KZERO+0x4000) /* as seen by current processor */ 9025210b06SDavid du Colombier #define CPU0MACH MACHADDR /* Mach for bootstrap processor */ 9125210b06SDavid du Colombier #define CPU0GDT (KZERO+0x5000) /* bootstrap processor GDT after Mach */ 9225210b06SDavid du Colombier #define TMPADDR (KZERO+0x6000) /* used for temporary mappings */ 9325210b06SDavid du Colombier /* 0x7000—0x7800 unused [2K], could be extra real-mode stack */ 9425210b06SDavid du Colombier #define PXEBASE 0x7c00 /* pxe loads us here */ 9525210b06SDavid du Colombier #define RMSTACK PXEBASE /* real phys. stack base [1K below] */ 9625210b06SDavid du Colombier #define PBSBASE 0x10000 /* pbs loads us here (at 64K) */ 9725210b06SDavid du Colombier 9825210b06SDavid du Colombier /* 9925210b06SDavid du Colombier * we used to use 9boot's `end', rounded up, but that was when the boot loader 10025210b06SDavid du Colombier * was in the first 640K; now end is up around 10MB (at least for 9boot). 10125210b06SDavid du Colombier * various machines nibble away at the top of the lowest 640K. 10225210b06SDavid du Colombier */ 10325210b06SDavid du Colombier #define BIOSTABLES (512*1024) 10425210b06SDavid du Colombier // #define BIOSTABLES (600*1024) /* fails on amd64 */ 10525210b06SDavid du Colombier // #define BIOSTABLES 0x3800 /* 2K: fails on amd64 */ 10625210b06SDavid du Colombier 10725210b06SDavid du Colombier #define Bootkernaddr (9*MB) /* where to put decompressed boot kernel */ 10825210b06SDavid du Colombier #define Bootkernmax (4*MB) /* max size */ 10925210b06SDavid du Colombier #define Unzipbuf (13*MB) 11025210b06SDavid du Colombier #define Mallocbase (16*MB) 11125210b06SDavid du Colombier /* 11225210b06SDavid du Colombier * MemMin is what the bootstrap code in l*.s has already mapped; 11325210b06SDavid du Colombier * MemMax is the limit of physical memory to scan. 11425210b06SDavid du Colombier */ 11525210b06SDavid du Colombier #define MemMin (20*MB) /* don't have PTEs for more allocated yet */ 116e845aa5bSDavid du Colombier #define MemMax (512*MB) /* allow for huge 10gbe buffers */ 11725210b06SDavid du Colombier 11825210b06SDavid du Colombier #define Lowmemsz (640*KB) 11925210b06SDavid du Colombier 12025210b06SDavid du Colombier #define LOWPTEPAGES (MemMin / (4*MB)) 12125210b06SDavid du Colombier 12225210b06SDavid du Colombier #define Kernelmax (8*MB) /* max size of real kernel, not an address */ 12325210b06SDavid du Colombier 12425210b06SDavid du Colombier /* 12525210b06SDavid du Colombier * known x86 segments (in GDT) and their selectors 12625210b06SDavid du Colombier */ 12725210b06SDavid du Colombier #define NULLSEG 0 /* null segment */ 12825210b06SDavid du Colombier #define KDSEG 1 /* kernel data/stack */ 12925210b06SDavid du Colombier #define KESEG 2 /* kernel executable */ 13025210b06SDavid du Colombier #define UDSEG 3 /* user data/stack */ 13125210b06SDavid du Colombier #define UESEG 4 /* user executable */ 13225210b06SDavid du Colombier #define TSSSEG 5 /* task segment */ 13325210b06SDavid du Colombier #define APMCSEG 6 /* APM code segment */ 13425210b06SDavid du Colombier #define APMCSEG16 7 /* APM 16-bit code segment */ 13525210b06SDavid du Colombier #define APMDSEG 8 /* APM data segment */ 13625210b06SDavid du Colombier #define KESEG16 9 /* kernel executable 16-bit */ 13725210b06SDavid du Colombier #define NGDT 10 /* number of GDT entries required */ 13825210b06SDavid du Colombier /* #define APM40SEG 8 /* APM segment 0x40 */ 13925210b06SDavid du Colombier 14025210b06SDavid du Colombier #define SELGDT (0<<2) /* selector is in gdt */ 14125210b06SDavid du Colombier #define SELLDT (1<<2) /* selector is in ldt */ 14225210b06SDavid du Colombier 14325210b06SDavid du Colombier #define SELECTOR(i, t, p) (((i)<<3) | (t) | (p)) 14425210b06SDavid du Colombier 14525210b06SDavid du Colombier #define NULLSEL SELECTOR(NULLSEG, SELGDT, 0) 14625210b06SDavid du Colombier #define KDSEL SELECTOR(KDSEG, SELGDT, 0) 14725210b06SDavid du Colombier #define KESEL SELECTOR(KESEG, SELGDT, 0) 14825210b06SDavid du Colombier #define UESEL SELECTOR(UESEG, SELGDT, 3) 14925210b06SDavid du Colombier #define UDSEL SELECTOR(UDSEG, SELGDT, 3) 15025210b06SDavid du Colombier #define TSSSEL SELECTOR(TSSSEG, SELGDT, 0) 15125210b06SDavid du Colombier #define APMCSEL SELECTOR(APMCSEG, SELGDT, 0) 15225210b06SDavid du Colombier #define APMCSEL16 SELECTOR(APMCSEG16, SELGDT, 0) 15325210b06SDavid du Colombier #define APMDSEL SELECTOR(APMDSEG, SELGDT, 0) 15425210b06SDavid du Colombier /* #define APM40SEL SELECTOR(APM40SEG, SELGDT, 0) */ 15525210b06SDavid du Colombier 15625210b06SDavid du Colombier /* 15725210b06SDavid du Colombier * fields in segment descriptors 15825210b06SDavid du Colombier */ 15925210b06SDavid du Colombier #define SEGDATA (0x10<<8) /* data/stack segment */ 16025210b06SDavid du Colombier #define SEGEXEC (0x18<<8) /* executable segment */ 16125210b06SDavid du Colombier #define SEGTSS (0x9<<8) /* TSS segment */ 16225210b06SDavid du Colombier #define SEGCG (0x0C<<8) /* call gate */ 16325210b06SDavid du Colombier #define SEGIG (0x0E<<8) /* interrupt gate */ 16425210b06SDavid du Colombier #define SEGTG (0x0F<<8) /* trap gate */ 16525210b06SDavid du Colombier #define SEGTYPE (0x1F<<8) 16625210b06SDavid du Colombier 16725210b06SDavid du Colombier #define SEGP (1<<15) /* segment present */ 16825210b06SDavid du Colombier #define SEGPL(x) ((x)<<13) /* priority level */ 16925210b06SDavid du Colombier #define SEGB (1<<22) /* granularity 1==4k (for expand-down) */ 17025210b06SDavid du Colombier #define SEGG (1<<23) /* granularity 1==4k (for other) */ 17125210b06SDavid du Colombier #define SEGE (1<<10) /* expand down */ 17225210b06SDavid du Colombier #define SEGW (1<<9) /* writable (for data/stack) */ 17325210b06SDavid du Colombier #define SEGR (1<<9) /* readable (for code) */ 17425210b06SDavid du Colombier #define SEGD (1<<22) /* default 1==32bit (for code) */ 17525210b06SDavid du Colombier 17625210b06SDavid du Colombier /* 17725210b06SDavid du Colombier * virtual MMU 17825210b06SDavid du Colombier */ 17925210b06SDavid du Colombier #define PTEMAPMEM (1024*1024) 18025210b06SDavid du Colombier #define PTEPERTAB (PTEMAPMEM/BY2PG) 18125210b06SDavid du Colombier #define SEGMAPSIZE 1984 18225210b06SDavid du Colombier #define SSEGMAPSIZE 16 18325210b06SDavid du Colombier #define PPN(x) ((x)&~(BY2PG-1)) 18425210b06SDavid du Colombier 18525210b06SDavid du Colombier /* 18625210b06SDavid du Colombier * physical MMU 18725210b06SDavid du Colombier */ 18825210b06SDavid du Colombier #define PTEVALID (1<<0) 18925210b06SDavid du Colombier #define PTEWT (1<<3) 19025210b06SDavid du Colombier #define PTEUNCACHED (1<<4) 19125210b06SDavid du Colombier #define PTEWRITE (1<<1) 19225210b06SDavid du Colombier #define PTERONLY (0<<1) 19325210b06SDavid du Colombier #define PTEKERNEL (0<<2) 19425210b06SDavid du Colombier #define PTEUSER (1<<2) 19525210b06SDavid du Colombier #define PTESIZE (1<<7) 19625210b06SDavid du Colombier #define PTEGLOBAL (1<<8) 19725210b06SDavid du Colombier 19825210b06SDavid du Colombier /* CR0 */ 19925210b06SDavid du Colombier #define PG 0x80000000 20025210b06SDavid du Colombier 20125210b06SDavid du Colombier /* 20225210b06SDavid du Colombier * Macros for calculating offsets within the page directory base 20325210b06SDavid du Colombier * and page tables. 20425210b06SDavid du Colombier */ 20525210b06SDavid du Colombier #define PDX(va) ((((ulong)(va))>>22) & 0x03FF) 20625210b06SDavid du Colombier #define PTX(va) ((((ulong)(va))>>12) & 0x03FF) 20725210b06SDavid du Colombier 20825210b06SDavid du Colombier #define getpgcolor(a) 0 20925210b06SDavid du Colombier 210