|
|
1.1 ! root 1: /*- ! 2: * Copyright (c) 1990 The Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * This code is derived from software contributed to Berkeley by ! 6: * William Jolitz. ! 7: * ! 8: * Redistribution and use in source and binary forms, with or without ! 9: * modification, are permitted provided that the following conditions ! 10: * are met: ! 11: * 1. Redistributions of source code must retain the above copyright ! 12: * notice, this list of conditions and the following disclaimer. ! 13: * 2. Redistributions in binary form must reproduce the above copyright ! 14: * notice, this list of conditions and the following disclaimer in the ! 15: * documentation and/or other materials provided with the distribution. ! 16: * 3. All advertising materials mentioning features or use of this software ! 17: * must display the following acknowledgement: ! 18: * This product includes software developed by the University of ! 19: * California, Berkeley and its contributors. ! 20: * 4. Neither the name of the University nor the names of its contributors ! 21: * may be used to endorse or promote products derived from this software ! 22: * without specific prior written permission. ! 23: * ! 24: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ! 25: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ! 26: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ! 27: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ! 28: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ! 29: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ! 30: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ! 31: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ! 32: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ! 33: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ! 34: * SUCH DAMAGE. ! 35: * ! 36: * @(#)vmparam.h 5.9 (Berkeley) 5/12/91 ! 37: */ ! 38: ! 39: ! 40: /* ! 41: * Machine dependent constants for 386. ! 42: */ ! 43: ! 44: /* ! 45: * Virtual address space arrangement. On 386, both user and kernel ! 46: * share the address space, not unlike the vax. ! 47: * USRTEXT is the start of the user text/data space, while USRSTACK ! 48: * is the top (end) of the user stack. Immediately above the user stack ! 49: * resides the user structure, which is UPAGES long and contains the ! 50: * kernel stack. ! 51: * ! 52: * Immediately after the user structure is the page table map, and then ! 53: * kernal address space. ! 54: */ ! 55: #define USRTEXT 0 ! 56: #define USRSTACK 0xFDBFE000 ! 57: #define BTOPUSRSTACK (0xFDC00-(UPAGES)) /* btop(USRSTACK) */ ! 58: #define LOWPAGES 0 ! 59: #define HIGHPAGES UPAGES ! 60: ! 61: /* ! 62: * Virtual memory related constants, all in bytes ! 63: */ ! 64: #define MAXTSIZ (6*1024*1024) /* max text size */ ! 65: #ifndef DFLDSIZ ! 66: #define DFLDSIZ (6*1024*1024) /* initial data size limit */ ! 67: #endif ! 68: #ifndef MAXDSIZ ! 69: #define MAXDSIZ (32*1024*1024) /* max data size */ ! 70: #endif ! 71: #ifndef DFLSSIZ ! 72: #define DFLSSIZ (512*1024) /* initial stack size limit */ ! 73: #endif ! 74: #ifndef MAXSSIZ ! 75: #define MAXSSIZ MAXDSIZ /* max stack size */ ! 76: #endif ! 77: ! 78: /* ! 79: * Default sizes of swap allocation chunks (see dmap.h). ! 80: * The actual values may be changed in vminit() based on MAXDSIZ. ! 81: * With MAXDSIZ of 16Mb and NDMAP of 38, dmmax will be 1024. ! 82: */ ! 83: #define DMMIN 32 /* smallest swap allocation */ ! 84: #define DMMAX 4096 /* largest potential swap allocation */ ! 85: #define DMTEXT 1024 /* swap allocation for text */ ! 86: ! 87: /* ! 88: * Sizes of the system and user portions of the system page table. ! 89: */ ! 90: #define SYSPTSIZE (2*NPTEPG) ! 91: #define USRPTSIZE (2*NPTEPG) ! 92: ! 93: /* ! 94: * Size of User Raw I/O map ! 95: */ ! 96: #define USRIOSIZE 300 ! 97: ! 98: /* ! 99: * The size of the clock loop. ! 100: */ ! 101: #define LOOPPAGES (maxfree - firstfree) ! 102: ! 103: /* ! 104: * The time for a process to be blocked before being very swappable. ! 105: * This is a number of seconds which the system takes as being a non-trivial ! 106: * amount of real time. You probably shouldn't change this; ! 107: * it is used in subtle ways (fractions and multiples of it are, that is, like ! 108: * half of a ``long time'', almost a long time, etc.) ! 109: * It is related to human patience and other factors which don't really ! 110: * change over time. ! 111: */ ! 112: #define MAXSLP 20 ! 113: ! 114: /* ! 115: * A swapped in process is given a small amount of core without being bothered ! 116: * by the page replacement algorithm. Basically this says that if you are ! 117: * swapped in you deserve some resources. We protect the last SAFERSS ! 118: * pages against paging and will just swap you out rather than paging you. ! 119: * Note that each process has at least UPAGES+CLSIZE pages which are not ! 120: * paged anyways (this is currently 8+2=10 pages or 5k bytes), so this ! 121: * number just means a swapped in process is given around 25k bytes. ! 122: * Just for fun: current memory prices are 4600$ a megabyte on VAX (4/22/81), ! 123: * so we loan each swapped in process memory worth 100$, or just admit ! 124: * that we don't consider it worthwhile and swap it out to disk which costs ! 125: * $30/mb or about $0.75. ! 126: * { wfj 6/16/89: Retail AT memory expansion $800/megabyte, loan of $17 ! 127: * on disk costing $7/mb or $0.18 (in memory still 100:1 in cost!) } ! 128: */ ! 129: #define SAFERSS 8 /* nominal ``small'' resident set size ! 130: protected against replacement */ ! 131: ! 132: /* ! 133: * DISKRPM is used to estimate the number of paging i/o operations ! 134: * which one can expect from a single disk controller. ! 135: */ ! 136: #define DISKRPM 60 ! 137: ! 138: /* ! 139: * Klustering constants. Klustering is the gathering ! 140: * of pages together for pagein/pageout, while clustering ! 141: * is the treatment of hardware page size as though it were ! 142: * larger than it really is. ! 143: * ! 144: * KLMAX gives maximum cluster size in CLSIZE page (cluster-page) ! 145: * units. Note that KLMAX*CLSIZE must be <= DMMIN in dmap.h. ! 146: */ ! 147: ! 148: #define KLMAX (4/CLSIZE) ! 149: #define KLSEQL (2/CLSIZE) /* in klust if vadvise(VA_SEQL) */ ! 150: #define KLIN (4/CLSIZE) /* default data/stack in klust */ ! 151: #define KLTXT (4/CLSIZE) /* default text in klust */ ! 152: #define KLOUT (4/CLSIZE) ! 153: ! 154: /* ! 155: * KLSDIST is the advance or retard of the fifo reclaim for sequential ! 156: * processes data space. ! 157: */ ! 158: #define KLSDIST 3 /* klusters advance/retard for seq. fifo */ ! 159: ! 160: /* ! 161: * Paging thresholds (see vm_sched.c). ! 162: * Strategy of 1/19/85: ! 163: * lotsfree is 512k bytes, but at most 1/4 of memory ! 164: * desfree is 200k bytes, but at most 1/8 of memory ! 165: * minfree is 64k bytes, but at most 1/2 of desfree ! 166: */ ! 167: #define LOTSFREE (512 * 1024) ! 168: #define LOTSFREEFRACT 4 ! 169: #define DESFREE (200 * 1024) ! 170: #define DESFREEFRACT 8 ! 171: #define MINFREE (64 * 1024) ! 172: #define MINFREEFRACT 2 ! 173: ! 174: /* ! 175: * There are two clock hands, initially separated by HANDSPREAD bytes ! 176: * (but at most all of user memory). The amount of time to reclaim ! 177: * a page once the pageout process examines it increases with this ! 178: * distance and decreases as the scan rate rises. ! 179: */ ! 180: #define HANDSPREAD (2 * 1024 * 1024) ! 181: ! 182: /* ! 183: * The number of times per second to recompute the desired paging rate ! 184: * and poke the pagedaemon. ! 185: */ ! 186: #define RATETOSCHEDPAGING 4 ! 187: ! 188: /* ! 189: * Believed threshold (in megabytes) for which interleaved ! 190: * swapping area is desirable. ! 191: */ ! 192: #define LOTSOFMEM 2 ! 193: ! 194: #define mapin(pte, v, pfnum, prot) \ ! 195: {(*(int *)(pte) = ((pfnum)<<PGSHIFT) | (prot)) ; } ! 196: ! 197: /* ! 198: * Mach derived constants ! 199: */ ! 200: ! 201: /* user/kernel map constants */ ! 202: #define VM_MIN_ADDRESS ((vm_offset_t)0) ! 203: #define VM_MAXUSER_ADDRESS ((vm_offset_t)0xFDBFD000) ! 204: #define UPT_MIN_ADDRESS ((vm_offset_t)0xFDC00000) ! 205: #define UPT_MAX_ADDRESS ((vm_offset_t)0xFDFF7000) ! 206: #define VM_MAX_ADDRESS UPT_MAX_ADDRESS ! 207: #define VM_MIN_KERNEL_ADDRESS ((vm_offset_t)0xFDFF7000) ! 208: #define UPDT VM_MIN_KERNEL_ADDRESS ! 209: #define KPT_MIN_ADDRESS ((vm_offset_t)0xFDFF8000) ! 210: #define KPT_MAX_ADDRESS ((vm_offset_t)0xFDFFF000) ! 211: #define VM_MAX_KERNEL_ADDRESS ((vm_offset_t)0xFF7FF000) ! 212: ! 213: /* virtual sizes (bytes) for various kernel submaps */ ! 214: #define VM_MBUF_SIZE (NMBCLUSTERS*MCLBYTES) ! 215: #define VM_KMEM_SIZE (NKMEMCLUSTERS*CLBYTES) ! 216: #define VM_PHYS_SIZE (USRIOSIZE*CLBYTES) ! 217: ! 218: /* # of kernel PT pages (initial only, can grow dynamically) */ ! 219: #define VM_KERNEL_PT_PAGES ((vm_size_t)2) /* XXX: SYSPTSIZE */ ! 220: ! 221: /* pcb base */ ! 222: #define pcbb(p) ((u_int)(p)->p_addr) ! 223: ! 224: /* ! 225: * Flush MMU TLB ! 226: */ ! 227: ! 228: #ifndef I386_CR3PAT ! 229: #define I386_CR3PAT 0x0 ! 230: #endif ! 231: ! 232: #ifdef notyet ! 233: #define _cr3() ({u_long rtn; \ ! 234: asm (" movl %%cr3,%%eax; movl %%eax,%0 " \ ! 235: : "=g" (rtn) \ ! 236: : \ ! 237: : "ax"); \ ! 238: rtn; \ ! 239: }) ! 240: ! 241: #define load_cr3(s) ({ u_long val; \ ! 242: val = (s) | I386_CR3PAT; \ ! 243: asm ("movl %0,%%eax; movl %%eax,%%cr3" \ ! 244: : \ ! 245: : "g" (val) \ ! 246: : "ax"); \ ! 247: }) ! 248: ! 249: #define tlbflush() ({ u_long val; \ ! 250: val = u.u_pcb.pcb_ptd | I386_CR3PAT; \ ! 251: asm ("movl %0,%%eax; movl %%eax,%%cr3" \ ! 252: : \ ! 253: : "g" (val) \ ! 254: : "ax"); \ ! 255: }) ! 256: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.