1 /* 2 * Memory and machine-specific definitions. Used in C and assembler. 3 */ 4 5 #define MIN(a, b) ((a) < (b)? (a): (b)) 6 #define MAX(a, b) ((a) > (b)? (a): (b)) 7 8 /* 9 * Sizes 10 */ 11 #define BI2BY 8 /* bits per byte */ 12 #define BI2WD 32 /* bits per word */ 13 #define BY2WD 4 /* bytes per word */ 14 #define BY2V 8 /* bytes per double word */ 15 #define BY2PG 4096 /* bytes per page */ 16 #define WD2PG (BY2PG/BY2WD) /* words per page */ 17 #define BY2XPG (4096*1024) /* bytes per big page */ 18 #define PGSHIFT 12 /* log(BY2PG) */ 19 #define ROUND(s, sz) (((s)+((sz)-1))&~((sz)-1)) 20 #define PGROUND(s) ROUND(s, BY2PG) 21 #define CACHELINESZ 32 /* pentium & later */ 22 #define BLOCKALIGN 8 23 #define FPalign 16 /* required for FXSAVE */ 24 25 /* 26 * In 32-bit mode, the MAXMACH limit is 32 without 27 * changing the way active.machs is defined and used 28 * (unfortunately, it is also used in the port code). 29 */ 30 #define MAXMACH 32 /* max # cpus system can run */ 31 #define KSTACK 4096 /* Size of kernel stack */ 32 33 /* 34 * Time 35 */ 36 #define HZ (100) /* clock frequency */ 37 #define MS2HZ (1000/HZ) /* millisec per clock tick */ 38 #define TK2SEC(t) ((t)/HZ) /* ticks to seconds */ 39 40 /* 41 * Address spaces 42 */ 43 #define KZERO 0xF0000000 /* base of kernel address space */ 44 #define KTZERO (KZERO+0x100000) /* first address in kernel text - 9load sits below */ 45 #define VPT (KZERO-VPTSIZE) 46 #define VPTSIZE BY2XPG 47 #define NVPT (VPTSIZE/BY2WD) 48 #define KMAP (VPT-KMAPSIZE) 49 #define KMAPSIZE BY2XPG 50 #define VMAP (KMAP-VMAPSIZE) 51 #define VMAPSIZE (0x10000000-VPTSIZE-KMAPSIZE) 52 #define UZERO 0 /* base of user address space */ 53 #define UTZERO (UZERO+BY2PG) /* first address in user text */ 54 #define USTKTOP (VMAP-BY2PG) /* byte just beyond user stack */ 55 #define USTKSIZE (16*1024*1024) /* size of user stack */ 56 #define TSTKTOP (USTKTOP-USTKSIZE) /* end of new stack in sysexec */ 57 #define TSTKSIZ 100 /* pages in new stack; limits exec args */ 58 59 /* 60 * Fundamental addresses - bottom 64kB saved for return to real mode 61 */ 62 #define CONFADDR (KZERO+0x1200) /* info passed from boot loader */ 63 #define TMPADDR (KZERO+0x2000) /* used for temporary mappings */ 64 #define APBOOTSTRAP (KZERO+0x3000) /* AP bootstrap code */ 65 #define RMUADDR (KZERO+0x7C00) /* real mode Ureg */ 66 #define RMCODE (KZERO+0x8000) /* copy of first page of KTEXT */ 67 #define RMBUF (KZERO+0x9000) /* buffer for user space - known to vga */ 68 #define IDTADDR (KZERO+0x10800) /* idt */ 69 #define REBOOTADDR (0x11000) /* reboot code - physical address */ 70 #define CPU0PDB (KZERO+0x12000) /* bootstrap processor PDB */ 71 #define CPU0PTE (KZERO+0x13000) /* bootstrap processor PTE's for 0-4MB */ 72 #define CPU0GDT (KZERO+0x14000) /* bootstrap processor GDT */ 73 #define MACHADDR (KZERO+0x15000) /* as seen by current processor */ 74 #define CPU0MACH (KZERO+0x16000) /* Mach for bootstrap processor */ 75 #define MACHSIZE BY2PG 76 #define CPU0PTE1 (KZERO+0x17000) /* bootstrap processor PTE's for 4MB-8MB */ 77 #define CPU0END (CPU0PTE1+BY2PG) 78 /* 79 * N.B. ramscan knows that CPU0END is the end of reserved data 80 * N.B. _startPADDR knows that CPU0PDB is the first reserved page 81 * and that there are 6 of them. 82 */ 83 84 /* 85 * known x86 segments (in GDT) and their selectors 86 */ 87 #define NULLSEG 0 /* null segment */ 88 #define KDSEG 1 /* kernel data/stack */ 89 #define KESEG 2 /* kernel executable */ 90 #define UDSEG 3 /* user data/stack */ 91 #define UESEG 4 /* user executable */ 92 #define TSSSEG 5 /* task segment */ 93 #define APMCSEG 6 /* APM code segment */ 94 #define APMCSEG16 7 /* APM 16-bit code segment */ 95 #define APMDSEG 8 /* APM data segment */ 96 #define KESEG16 9 /* kernel executable 16-bit */ 97 #define NGDT 10 /* number of GDT entries required */ 98 /* #define APM40SEG 8 /* APM segment 0x40 */ 99 100 #define SELGDT (0<<2) /* selector is in gdt */ 101 #define SELLDT (1<<2) /* selector is in ldt */ 102 103 #define SELECTOR(i, t, p) (((i)<<3) | (t) | (p)) 104 105 #define NULLSEL SELECTOR(NULLSEG, SELGDT, 0) 106 #define KDSEL SELECTOR(KDSEG, SELGDT, 0) 107 #define KESEL SELECTOR(KESEG, SELGDT, 0) 108 #define UESEL SELECTOR(UESEG, SELGDT, 3) 109 #define UDSEL SELECTOR(UDSEG, SELGDT, 3) 110 #define TSSSEL SELECTOR(TSSSEG, SELGDT, 0) 111 #define APMCSEL SELECTOR(APMCSEG, SELGDT, 0) 112 #define APMCSEL16 SELECTOR(APMCSEG16, SELGDT, 0) 113 #define APMDSEL SELECTOR(APMDSEG, SELGDT, 0) 114 /* #define APM40SEL SELECTOR(APM40SEG, SELGDT, 0) */ 115 116 /* 117 * fields in segment descriptors 118 */ 119 #define SEGDATA (0x10<<8) /* data/stack segment */ 120 #define SEGEXEC (0x18<<8) /* executable segment */ 121 #define SEGTSS (0x9<<8) /* TSS segment */ 122 #define SEGCG (0x0C<<8) /* call gate */ 123 #define SEGIG (0x0E<<8) /* interrupt gate */ 124 #define SEGTG (0x0F<<8) /* trap gate */ 125 #define SEGTYPE (0x1F<<8) 126 127 #define SEGP (1<<15) /* segment present */ 128 #define SEGPL(x) ((x)<<13) /* priority level */ 129 #define SEGB (1<<22) /* granularity 1==4k (for expand-down) */ 130 #define SEGG (1<<23) /* granularity 1==4k (for other) */ 131 #define SEGE (1<<10) /* expand down */ 132 #define SEGW (1<<9) /* writable (for data/stack) */ 133 #define SEGR (1<<9) /* readable (for code) */ 134 #define SEGD (1<<22) /* default 1==32bit (for code) */ 135 136 /* 137 * virtual MMU 138 */ 139 #define PTEMAPMEM (1024*1024) 140 #define PTEPERTAB (PTEMAPMEM/BY2PG) 141 #define SEGMAPSIZE 1984 142 #define SSEGMAPSIZE 16 143 #define PPN(x) ((x)&~(BY2PG-1)) 144 145 /* 146 * physical MMU 147 */ 148 #define PTEVALID (1<<0) 149 #define PTEWT (1<<3) 150 #define PTEUNCACHED (1<<4) 151 #define PTEWRITE (1<<1) 152 #define PTERONLY (0<<1) 153 #define PTEKERNEL (0<<2) 154 #define PTEUSER (1<<2) 155 #define PTESIZE (1<<7) 156 #define PTEGLOBAL (1<<8) 157 158 /* 159 * Macros for calculating offsets within the page directory base 160 * and page tables. 161 */ 162 #define PDX(va) ((((ulong)(va))>>22) & 0x03FF) 163 #define PTX(va) ((((ulong)(va))>>12) & 0x03FF) 164 165 #define getpgcolor(a) 0 166 167