|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * The contents of this file constitute Original Code as defined in and ! 7: * are subject to the Apple Public Source License Version 1.1 (the ! 8: * "License"). You may not use this file except in compliance with the ! 9: * License. Please obtain a copy of the License at ! 10: * http://www.apple.com/publicsource and read it before using this file. ! 11: * ! 12: * This Original Code and all software distributed under the License are ! 13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 17: * License for the specific language governing rights and limitations ! 18: * under the License. ! 19: * ! 20: * @APPLE_LICENSE_HEADER_END@ ! 21: */ ! 22: /* ! 23: * @OSF_COPYRIGHT@ ! 24: */ ! 25: /* ! 26: * HISTORY ! 27: * ! 28: * Revision 1.2 1998/09/30 21:21:01 wsanchez ! 29: * Merged in IntelMerge1 (mburg: Intel support) ! 30: * ! 31: * Revision 1.1.1.1.6.1 1998/09/30 18:14:00 mburg ! 32: * Changes for Intel port ! 33: * ! 34: * Revision 1.1.1.1 1998/09/22 21:05:31 wsanchez ! 35: * Import of Mac OS X kernel (~semeria) ! 36: * ! 37: * Revision 1.1.1.1 1998/03/07 02:25:47 wsanchez ! 38: * Import of OSF Mach kernel (~mburg) ! 39: * ! 40: * Revision 1.2.45.1 1997/03/27 18:53:17 barbou ! 41: * Replaced reference to cpu_x86_model in PMAP_ENTER_386_CHECK() macro ! 42: * (replaced by cpuid_family). ! 43: * [addis] ! 44: * Remove i386 specific PMAP_ENTER macro. ! 45: * [95/08/29 rwd] ! 46: * [97/02/26 barbou] ! 47: * ! 48: * Revision 1.2.9.13 1996/07/31 09:57:05 paire ! 49: * Merged with nmk20b7_shared (1.2.39.1) ! 50: * [96/07/24 paire] ! 51: * ! 52: * Revision 1.2.39.1 1996/06/13 12:39:45 bernadat ! 53: * Linux drivers support: ! 54: * Arrange so that physical memory is mapped at ! 55: * identical virtual addresses. ! 56: * User segment linear address remains 0 ! 57: * kernel segment linear address is now LINEAR_KERNEL_ADDRESS ! 58: * Kernel and user segments linear address now differ. ! 59: * [96/06/04 bernadat] ! 60: * ! 61: * Revision 1.2.9.12 1996/02/02 12:19:49 emcmanus ! 62: * Merged with nmk20b5_shared. ! 63: * [1996/02/02 11:57:41 emcmanus] ! 64: * ! 65: * Checked in prior to merge. ! 66: * [1996/02/02 11:40:14 emcmanus] ! 67: * ! 68: * Revision 1.2.9.11 1996/01/29 13:15:45 bernadat ! 69: * 0xefffffff is much to large for VM_MAX_KERNEL_LOADED_ADDRESS. ! 70: * Page tables overwrite BIOS ! Must find away to dynamically ! 71: * allocate kernel page tables. Set it to 0xdfffffff. ! 72: * [96/01/29 bernadat] ! 73: * ! 74: * Revision 1.2.9.10 1996/01/25 12:58:26 bernadat ! 75: * Linux Server Support: ! 76: * increased VM_MAX_KERNEL_LOADED_ADDRESS. ! 77: * [95/12/28 barbou] ! 78: * ! 79: * Revision 1.2.34.1 1995/12/30 17:12:54 emcmanus ! 80: * Defined machine_btop here to avoid ugly #ifdefs in drivers. ! 81: * [1995/12/30 17:04:42 emcmanus] ! 82: * ! 83: * Revision 1.2.9.9 1995/06/13 18:40:24 bolinger ! 84: * Broader fix for ri-osc CR1387: for x86 only, change PMAP_ENTER ! 85: * to ensure that VM_PROT_WRITE is always set on calls to change ! 86: * kernel_pmap. ! 87: * [1995/06/12 19:16:51 bolinger] ! 88: * ! 89: * Revision 1.2.9.8 1995/05/22 20:26:50 dwm ! 90: * ri-osc CR1340 - turning off TASK_SWAPPER doesn't eliminate ! 91: * thread swapping, so kernel stack size must be congruent with ! 92: * zero mod page_size unless both TASK+THREAD_SWAPPER are off. ! 93: * [1995/05/22 20:26:15 dwm] ! 94: * ! 95: * Revision 1.2.9.7 1995/05/14 18:19:59 dwm ! 96: * ri-osc CR1304 - merge (nmk19_latest - nmk19b1) diffs into mainline. ! 97: * fix use of constant in comment, breaks ancient grep script ! 98: * [1995/05/14 17:34:44 dwm] ! 99: * ! 100: * Revision 1.2.9.6 1995/04/07 19:05:17 barbou ! 101: * Kernel stack needs to be a multiple of page_size if TASK_SWAPPER is on, ! 102: * or we won't be able to unwire them when swapping out. ! 103: * [95/03/10 barbou] ! 104: * ! 105: * Revision 1.2.9.5 1995/03/15 17:19:33 bruel ! 106: * Increased Vm Min Kernel Loaded Address ! 107: * (Corollary kernels are link edited at 0xc4000000) ! 108: * [95/02/27 bernadat] ! 109: * [95/03/06 bruel] ! 110: * ! 111: * Revision 1.2.18.1 1995/05/02 21:57:51 travos ! 112: * Use large stacks for XKMACHKERNEL (same as NORMA_VM) ! 113: * [1995/05/02 21:56:52 travos] ! 114: * ! 115: * Revision 1.2.9.4 1994/09/23 02:37:53 ezf ! 116: * change marker to not FREE ! 117: * [1994/09/22 21:40:25 ezf] ! 118: * ! 119: * Revision 1.2.9.3 1994/08/31 15:55:53 dwm ! 120: * mk6 CR300 - INTSTACK_SIZE needs to be one whole page ! 121: * - bump collo range for larger MP configs ! 122: * [1994/08/31 15:51:37 dwm] ! 123: * ! 124: * Revision 1.2.9.2 1994/07/14 20:47:05 bolinger ! 125: * Put use of kernel feature header file under #ifdef MACH_KERNEL. ! 126: * [1994/07/14 20:46:45 bolinger] ! 127: * ! 128: * Revision 1.2.9.1 1994/07/14 16:01:49 bolinger ! 129: * If NORMA_VM, make kernel thread and interrupt stack size be 8KB. ! 130: * (NORMA-associated threads seem to need at least 5KB.) ! 131: * [1994/07/14 16:01:01 bolinger] ! 132: * ! 133: * Revision 1.2.6.5 1994/02/16 20:27:59 condict ! 134: * Export the range of kernel virtual addresses that are reserved ! 135: * for use by kernel-loaded servers. ! 136: * [1994/02/16 19:42:48 condict] ! 137: * ! 138: * Revision 1.2.6.4 1994/02/09 00:40:49 dwm ! 139: * Reduce kernel & interrupt stack size to 1/2 page, in the ! 140: * never-ending quest to reduce wired memory consumption. ! 141: * [1994/02/09 00:34:14 dwm] ! 142: * ! 143: * Revision 1.2.6.3 1993/12/10 19:37:00 dwm ! 144: * Re-hack of workaround: KERNEL_STACK_SIZE back to 1 page; ! 145: * lower THREAD_STATE_MAX to 64 ints instead. ! 146: * [1993/12/10 19:36:34 dwm] ! 147: * ! 148: * Revision 1.2.6.2 1993/10/26 21:54:01 dwm ! 149: * Coloc: Bump kernel stack size to 2 pages temporarily; mach/exc_user.c ! 150: * builds the exception msg on the stack, mig seemingly ignores -maxonstack, ! 151: * and I don't want to lower THREAD_STATE_MAX and have to rebuild the server ! 152: * and risk breaking some RISC variant for now. Yuck. ! 153: * (all this in preparation for RPC short-circuiting of exception path). ! 154: * [1993/10/26 20:55:16 dwm] ! 155: * ! 156: * Revision 1.2.2.3 1993/07/12 18:07:25 gm ! 157: * CR9339: Added trailing 'U' to VM_*_ADDRESS definitions. ! 158: * [1993/07/12 13:36:47 gm] ! 159: * ! 160: * Revision 1.2.2.2 1993/06/09 02:40:56 gm ! 161: * Added to OSF/1 R1.3 from NMK15.0. ! 162: * [1993/06/02 21:16:35 jeffc] ! 163: * ! 164: * Revision 1.2 1993/04/19 16:34:29 devrcs ! 165: * ansi C conformance changes ! 166: * [1993/02/02 18:56:25 david] ! 167: * ! 168: * Revision 1.1 1992/09/30 02:30:55 robert ! 169: * Initial revision ! 170: * ! 171: * $EndLog$ ! 172: */ ! 173: /* CMU_HIST */ ! 174: /* ! 175: * Revision 2.5.2.1 92/03/03 16:21:49 jeffreyh ! 176: * Changes from TRUNK ! 177: * [92/02/26 12:01:03 jeffreyh] ! 178: * ! 179: * Revision 2.6 92/01/03 20:20:33 dbg ! 180: * Drop back to 1-page kernel stacks, since emulation_vector calls ! 181: * now pass data out-of-line. ! 182: * [92/01/03 dbg] ! 183: * ! 184: * Revision 2.5 91/11/19 08:08:35 rvb ! 185: * NORMA needs a larger stack so we do it for everyone, ! 186: * since stack space usage does not matter anymore. ! 187: * ! 188: * Revision 2.4 91/05/14 16:52:50 mrt ! 189: * Correcting copyright ! 190: * ! 191: * Revision 2.3 91/02/05 17:32:30 mrt ! 192: * Changed to new Mach copyright ! 193: * [91/02/01 17:10:30 mrt] ! 194: * ! 195: * Revision 2.2 90/05/03 15:48:20 dbg ! 196: * Move page-table definitions into i386/pmap.h. ! 197: * [90/04/05 dbg] ! 198: * ! 199: * Remove misleading comment about kernel stack size. ! 200: * [90/02/05 dbg] ! 201: * ! 202: * Revision 1.3 89/03/09 20:20:06 rpd ! 203: * More cleanup. ! 204: * ! 205: * Revision 1.2 89/02/26 13:01:13 gm0w ! 206: * Changes for cleanup. ! 207: * ! 208: * 31-Dec-88 Robert Baron (rvb) at Carnegie-Mellon University ! 209: * Derived from MACH2.0 vax release. ! 210: * ! 211: * 16-Jan-87 David Golub (dbg) at Carnegie-Mellon University ! 212: * Made vax_ptob return 'unsigned' instead of caddr_t. ! 213: * ! 214: */ ! 215: /* CMU_ENDHIST */ ! 216: /* ! 217: * Mach Operating System ! 218: * Copyright (c) 1991,1990,1989,1988 Carnegie Mellon University ! 219: * All Rights Reserved. ! 220: * ! 221: * Permission to use, copy, modify and distribute this software and its ! 222: * documentation is hereby granted, provided that both the copyright ! 223: * notice and this permission notice appear in all copies of the ! 224: * software, derivative works or modified versions, and any portions ! 225: * thereof, and that both notices appear in supporting documentation. ! 226: * ! 227: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" ! 228: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR ! 229: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. ! 230: * ! 231: * Carnegie Mellon requests users of this software to return to ! 232: * ! 233: * Software Distribution Coordinator or [email protected] ! 234: * School of Computer Science ! 235: * Carnegie Mellon University ! 236: * Pittsburgh PA 15213-3890 ! 237: * ! 238: * any improvements or extensions that they make and grant Carnegie Mellon ! 239: * the rights to redistribute these changes. ! 240: */ ! 241: ! 242: /* ! 243: * Copyright (c) 1994 The University of Utah and ! 244: * the Computer Systems Laboratory at the University of Utah (CSL). ! 245: * All rights reserved. ! 246: * ! 247: * Permission to use, copy, modify and distribute this software is hereby ! 248: * granted provided that (1) source code retains these copyright, permission, ! 249: * and disclaimer notices, and (2) redistributions including binaries ! 250: * reproduce the notices in supporting documentation, and (3) all advertising ! 251: * materials mentioning features or use of this software display the following ! 252: * acknowledgement: ``This product includes software developed by the ! 253: * Computer Systems Laboratory at the University of Utah.'' ! 254: * ! 255: * THE UNIVERSITY OF UTAH AND CSL ALLOW FREE USE OF THIS SOFTWARE IN ITS "AS ! 256: * IS" CONDITION. THE UNIVERSITY OF UTAH AND CSL DISCLAIM ANY LIABILITY OF ! 257: * ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. ! 258: * ! 259: * CSL requests users of this software to return to [email protected] any ! 260: * improvements that they make and grant CSL redistribution rights. ! 261: * ! 262: */ ! 263: ! 264: /* ! 265: * File: vm_param.h ! 266: * Author: Avadis Tevanian, Jr. ! 267: * Date: 1985 ! 268: * ! 269: * I386 machine dependent virtual memory parameters. ! 270: * Most of the declarations are preceeded by I386_ (or i386_) ! 271: * which is OK because only I386 specific code will be using ! 272: * them. ! 273: */ ! 274: ! 275: #ifndef _MACH_I386_VM_PARAM_H_ ! 276: #define _MACH_I386_VM_PARAM_H_ ! 277: ! 278: #define BYTE_SIZE 8 /* byte size in bits */ ! 279: ! 280: #define I386_PGBYTES 4096 /* bytes per 80386 page */ ! 281: #define I386_PGSHIFT 12 /* number of bits to shift for pages */ ! 282: ! 283: /* ! 284: * Convert bytes to pages and convert pages to bytes. ! 285: * No rounding is used. ! 286: */ ! 287: ! 288: #define i386_btop(x) (((unsigned)(x)) >> I386_PGSHIFT) ! 289: #define machine_btop(x) i386_btop(x) ! 290: #define i386_ptob(x) (((unsigned)(x)) << I386_PGSHIFT) ! 291: ! 292: /* ! 293: * Round off or truncate to the nearest page. These will work ! 294: * for either addresses or counts. (i.e. 1 byte rounds to 1 page ! 295: * bytes. ! 296: */ ! 297: ! 298: #define i386_round_page(x) ((((unsigned)(x)) + I386_PGBYTES - 1) & \ ! 299: ~(I386_PGBYTES-1)) ! 300: #define i386_trunc_page(x) (((unsigned)(x)) & ~(I386_PGBYTES-1)) ! 301: ! 302: #define VM_MIN_ADDRESS ((vm_offset_t) 0) ! 303: #define VM_MAX_ADDRESS ((vm_offset_t) 0xc0000000U) ! 304: ! 305: #define LINEAR_KERNEL_ADDRESS ((vm_offset_t) 0xc0000000) ! 306: ! 307: #define VM_MIN_KERNEL_ADDRESS ((vm_offset_t) 0x00000000U) ! 308: #define VM_MAX_KERNEL_ADDRESS ((vm_offset_t) 0x3fffffffU) ! 309: ! 310: #define VM_MIN_KERNEL_LOADED_ADDRESS ((vm_offset_t) 0x0c000000U) ! 311: #define VM_MAX_KERNEL_LOADED_ADDRESS ((vm_offset_t) 0x1fffffffU) ! 312: ! 313: /* FIXME - always leave like this? */ ! 314: #define INTSTACK_SIZE (I386_PGBYTES*4) ! 315: #define KERNEL_STACK_SIZE (I386_PGBYTES*4) ! 316: ! 317: #if 0 /* FIXME */ ! 318: ! 319: #include <norma_vm.h> ! 320: #include <xkmachkernel.h> ! 321: #include <task_swapper.h> ! 322: #include <thread_swapper.h> ! 323: ! 324: #if defined(AT386) ! 325: #include <i386/cpuid.h> ! 326: #endif ! 327: ! 328: #if !NORMA_VM && !XKMACHKERNEL ! 329: #if !TASK_SWAPPER && !THREAD_SWAPPER ! 330: #define KERNEL_STACK_SIZE (I386_PGBYTES/2) ! 331: #else ! 332: /* stack needs to be a multiple of page size to get unwired when swapped */ ! 333: #define KERNEL_STACK_SIZE (I386_PGBYTES) ! 334: #endif /* TASK || THREAD SWAPPER */ ! 335: #define INTSTACK_SIZE (I386_PGBYTES) /* interrupt stack size */ ! 336: #else /* NORMA_VM && !XKMACHKERNEL */ ! 337: #define KERNEL_STACK_SIZE (I386_PGBYTES*2) ! 338: #define INTSTACK_SIZE (I386_PGBYTES*2) /* interrupt stack size */ ! 339: #endif /* NORMA_VM && !XKMACHKERNEL */ ! 340: #endif /* MACH_KERNEL */ ! 341: ! 342: /* ! 343: * Conversion between 80386 pages and VM pages ! 344: */ ! 345: ! 346: #define trunc_i386_to_vm(p) (atop(trunc_page(i386_ptob(p)))) ! 347: #define round_i386_to_vm(p) (atop(round_page(i386_ptob(p)))) ! 348: #define vm_to_i386(p) (i386_btop(ptoa(p))) ! 349: ! 350: /* ! 351: * Physical memory is mapped 1-1 with virtual memory starting ! 352: * at VM_MIN_KERNEL_ADDRESS. ! 353: */ ! 354: #define phystokv(a) ((vm_offset_t)(a) + VM_MIN_KERNEL_ADDRESS) ! 355: ! 356: /* ! 357: * For 386 only, ensure that pages are installed in the ! 358: * kernel_pmap with VM_PROT_WRITE enabled. This avoids ! 359: * code in pmap_enter that disallows a read-only mapping ! 360: * in the kernel's pmap. (See ri-osc CR1387.) ! 361: * ! 362: * An entry in kernel_pmap is made only by the kernel or ! 363: * a collocated server -- by definition (;-)), the requester ! 364: * is trusted code. If it asked for read-only access, ! 365: * it won't attempt a write. We don't have to enforce the ! 366: * restriction. (Naturally, this assumes that any collocated ! 367: * server will _not_ depend on trapping write accesses to pages ! 368: * mapped read-only; this cannot be made to work in the current ! 369: * i386-inspired pmap model.) ! 370: */ ! 371: ! 372: /*#if defined(AT386) ! 373: ! 374: #define PMAP_ENTER_386_CHECK \ ! 375: if (cpuid_family == CPUID_FAMILY_386) ! 376: ! 377: #else -- FIXME? We're only running on Pentiums or better */ ! 378: ! 379: #define PMAP_ENTER_386_CHECK ! 380: ! 381: /*#endif*/ ! 382: ! 383: #define PMAP_ENTER(pmap, virtual_address, page, protection, wired) \ ! 384: MACRO_BEGIN \ ! 385: vm_prot_t __prot__ = \ ! 386: (protection) & ~(page)->page_lock; \ ! 387: \ ! 388: PMAP_ENTER_386_CHECK \ ! 389: if ((pmap) == kernel_pmap) \ ! 390: __prot__ |= VM_PROT_WRITE; \ ! 391: pmap_enter( \ ! 392: (pmap), \ ! 393: (virtual_address), \ ! 394: (page)->phys_addr, \ ! 395: __prot__, \ ! 396: (wired) \ ! 397: ); \ ! 398: MACRO_END ! 399: ! 400: #endif /* _MACH_I386_VM_PARAM_H_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.