|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights ! 7: * Reserved. This file contains Original Code and/or Modifications of ! 8: * Original Code as defined in and that are subject to the Apple Public ! 9: * Source License Version 1.1 (the "License"). You may not use this file ! 10: * except in compliance with the License. Please obtain a copy of the ! 11: * License at http://www.apple.com/publicsource and read it before using ! 12: * this file. ! 13: * ! 14: * The Original Code and all software distributed under the License are ! 15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 19: * License for the specific language governing rights and limitations ! 20: * under the License. ! 21: * ! 22: * @APPLE_LICENSE_HEADER_END@ ! 23: */ ! 24: ! 25: /* ! 26: * Mach Operating System ! 27: * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University ! 28: * All Rights Reserved. ! 29: * ! 30: * Permission to use, copy, modify and distribute this software and its ! 31: * documentation is hereby granted, provided that both the copyright ! 32: * notice and this permission notice appear in all copies of the ! 33: * software, derivative works or modified versions, and any portions ! 34: * thereof, and that both notices appear in supporting documentation. ! 35: * ! 36: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" ! 37: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR ! 38: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. ! 39: * ! 40: * Carnegie Mellon requests users of this software to return to ! 41: * ! 42: * Software Distribution Coordinator or [email protected] ! 43: * School of Computer Science ! 44: * Carnegie Mellon University ! 45: * Pittsburgh PA 15213-3890 ! 46: * ! 47: * any improvements or extensions that they make and grant Carnegie Mellon ! 48: * the rights to redistribute these changes. ! 49: */ ! 50: /* ! 51: * HISTORY ! 52: * Revision 1.1.1.1 1997/09/30 02:45:35 wsanchez ! 53: * Import of kernel from umeshv/kernel ! 54: * ! 55: * ! 56: * Revision ?.? 97/07/17 14:39:51 umeshv ! 57: * Fixed multipe definition of kernel_pmap. ! 58: * ! 59: * Revision 2.6 91/05/18 14:39:51 rpd ! 60: * Removed pmap_update. ! 61: * [91/04/12 rpd] ! 62: * Removed pmap_bootstrap, pmap_map, pmap_valid_page. ! 63: * Added pmap_startup, pmap_steal_memory, pmap_free_pages, ! 64: * pmap_virtual_space, pmap_next_page. ! 65: * [91/03/22 rpd] ! 66: * ! 67: * Revision 2.5 91/05/14 17:48:08 mrt ! 68: * Correcting copyright ! 69: * ! 70: * Revision 2.4 91/02/05 17:57:34 mrt ! 71: * Changed to new Mach copyright ! 72: * [91/02/01 16:31:04 mrt] ! 73: * ! 74: * Revision 2.3 90/01/22 23:09:05 af ! 75: * Added (optional) pmap_attributes. This should be implemented ! 76: * just as a macro that evaluates to KERN_INVALID_ARGUMENT for ! 77: * those architectures that do not support any special memory ! 78: * feature in hardware. NUMA machines and cache-incoherent ! 79: * machines (e.g. mips) should instead implement it as appropriate. ! 80: * [89/12/08 af] ! 81: * ! 82: * Revision 2.2 89/11/29 14:16:53 af ! 83: * Carried over the following mods from impure kernel. ! 84: * Added pmap_phys_to_frame as inverse of pmap_phys_address, for use by ! 85: * memory map function in machine-independent pseudo device drivers. ! 86: * The correct thing to do, of course, is to change the device driver map ! 87: * function spec to return a physical address instead of a frame, but ! 88: * this would require changing too many device drivers... ! 89: * [89/09/05 16:45:48 jsb] ! 90: * ! 91: * Removed unused and ugly pmap_redzone() from the list of required ! 92: * pmap functions. Made more routines implementable as macros. ! 93: * [89/08/05 af] ! 94: * Separate user and kernel cases of PMAP_ACTIVATE and ! 95: * PMAP_DEACTIVATE; supply default definitions. ! 96: * [89/04/28 dbg] ! 97: * ! 98: * Revision 2.1 89/08/03 16:44:35 rwd ! 99: * Created. ! 100: * ! 101: * Revision 2.8 89/04/18 21:24:43 mwyoung ! 102: * Recent history [mwyoung]: ! 103: * Remove pmap_remove_all(), pmap_copy_on_write(), as they're ! 104: * no longer required routines. The machine-independent code ! 105: * uses pmap_page_protect() instead. ! 106: * Documented interface. The precise interface specification ! 107: * should be reconstructed from the pmap implementations. ! 108: * History condensation: ! 109: * Added calls for page locking [mwyoung]. ! 110: * Added reference bit handling [avie]. ! 111: * Created [avie]. ! 112: * [89/04/18 mwyoung] ! 113: * ! 114: */ ! 115: /* ! 116: * File: vm/pmap.h ! 117: * Author: Avadis Tevanian, Jr. ! 118: * Date: 1985 ! 119: * ! 120: * Machine address mapping definitions -- machine-independent ! 121: * section. [For machine-dependent section, see "machine/pmap.h".] ! 122: */ ! 123: ! 124: #ifndef _VM_PMAP_H_ ! 125: #define _VM_PMAP_H_ ! 126: ! 127: #import <mach/features.h> ! 128: ! 129: #include <machdep/machine/pmap.h> ! 130: #include <mach/machine/vm_types.h> ! 131: #include <mach/boolean.h> ! 132: ! 133: #if OLD_VM_CODE ! 134: void pmap_bootstrap(); ! 135: void pmap_init(); ! 136: vm_offset_t pmap_map(); ! 137: pmap_t pmap_create(); ! 138: #ifdef pmap_kernel ! 139: extern ! 140: #endif ! 141: pmap_t pmap_kernel(); ! 142: void pmap_destroy(); ! 143: void pmap_reference(); ! 144: void pmap_remove(); ! 145: void pmap_remove_all(); ! 146: void pmap_copy_on_write(); ! 147: void pmap_protect(); ! 148: void pmap_enter(); ! 149: vm_offset_t pmap_extract(); ! 150: void pmap_update(); ! 151: void pmap_collect(); ! 152: void pmap_activate(); ! 153: void pmap_deactivate(); ! 154: #if !defined(ppc) ! 155: void pmap_copy(); ! 156: #endif ! 157: void pmap_statistics(); ! 158: void pmap_clear_reference(); ! 159: boolean_t pmap_is_referenced(); ! 160: void pmap_change_wiring(); ! 161: void pmap_clear_modify(); ! 162: void pmap_page_protect(); ! 163: ! 164: void pmap_redzone(); ! 165: boolean_t pmap_access(); ! 166: ! 167: typedef struct mem_region { ! 168: struct vm_page *vm_page_array; /* First resident page in table */ ! 169: unsigned first_page; /* first physical page number */ ! 170: /* ... represented in vm_page_array */ ! 171: unsigned last_page; /* last physical page number + 1 */ ! 172: /* ... represented in vm_page_array */ ! 173: /* [INCLUSIVE] */ ! 174: unsigned num_pages; /* last_page - first_page */ ! 175: vm_offset_t base_phys_addr; /* fixed base of region for dump() */ ! 176: vm_offset_t first_phys_addr;/* physical address for first_page */ ! 177: vm_offset_t last_phys_addr; /* physical address for last_page */ ! 178: } *mem_region_t; ! 179: ! 180: /* ! 181: * Machine dependent code must initialize the mem_region table before ! 182: * calling any machine independent code. ! 183: * ! 184: * Machine dependent code should initialize the following fields of ! 185: * mem_region: ! 186: * base_phys_addr -- first physical address of the contiguous ! 187: * memory region ! 188: * first_phys_addr -- same as base_phys_addr ! 189: * last_phys_addr -- last_phys_addr + 1 of the contiguous ! 190: * memory region ! 191: * ! 192: * Currently, machine independent code assumes (bogusly) that it can ! 193: * allocate 1-1 mapped kernel data from mem_regions. ! 194: * FIXME: Undo this. It's not portable. ! 195: * ! 196: * After all 1-1 allocations are complete, MI code (vm_resident) then ! 197: * goes and allocates vm_page_t's for the remaining memory in the ! 198: * mem_region table, and sets or modifies the following values in the ! 199: * mem_region table: ! 200: * ! 201: * vm_page_array -- points to the allocated vm_page_t's ! 202: * for the physical page frame of this region ! 203: * first_page -- phys page num of first page in vm_page_array ! 204: * last_page -- phys page num + 1 of last page in vm_page_array ! 205: * num_pages -- number of page frames in this mem region ! 206: * first_phys_addr -- address corresponding to first_page ! 207: * last_phys_ddr -- address corresponding to last_page ! 208: */ ! 209: extern struct mem_region mem_region[]; ! 210: extern int num_regions; ! 211: ! 212: /* convert a pa to an ordinal of the physical page frames */ ! 213: extern unsigned vm_ppi(vm_offset_t pa); ! 214: /* returns true if p refers to a page frame */ ! 215: extern boolean_t vm_valid_page(vm_offset_t p); ! 216: /* translates physical address to vm_page pointer */ ! 217: extern struct vm_page *vm_phys_to_vm_page(vm_offset_t pa); ! 218: /* allocates memory from the mem regions */ ! 219: extern vm_offset_t vm_alloc_from_region(vm_size_t size, vm_size_t align); ! 220: #else ! 221: /* ! 222: * The following is a description of the interface to the ! 223: * machine-dependent "physical map" data structure. The module ! 224: * must provide a "pmap_t" data type that represents the ! 225: * set of valid virtual-to-physical addresses for one user ! 226: * address space. [The kernel address space is represented ! 227: * by a distinguished "pmap_t".] The routines described manage ! 228: * this type, install and update virtual-to-physical mappings, ! 229: * and perform operations on physical addresses common to ! 230: * many address spaces. ! 231: */ ! 232: ! 233: /* ! 234: * Routines used for initialization. ! 235: * There is traditionally also a pmap_bootstrap, ! 236: * used very early by machine-dependent code, ! 237: * but it is not part of the interface. ! 238: */ ! 239: ! 240: extern vm_offset_t pmap_steal_memory(); /* During VM initialization, ! 241: * steal a chunk of memory. ! 242: */ ! 243: extern unsigned int pmap_free_pages(); /* During VM initialization, ! 244: * report remaining unused ! 245: * physical pages. ! 246: */ ! 247: extern void pmap_startup(); /* During VM initialization, ! 248: * use remaining physical pages ! 249: * to allocate page frames. ! 250: */ ! 251: extern void pmap_init(); /* Initialization, ! 252: * after kernel runs ! 253: * in virtual memory. ! 254: */ ! 255: ! 256: #ifndef MACHINE_PAGES ! 257: /* ! 258: * If machine/pmap.h defines MACHINE_PAGES, it must implement ! 259: * the above functions. The pmap module has complete control. ! 260: * Otherwise, it must implement ! 261: * pmap_free_pages ! 262: * pmap_virtual_space ! 263: * pmap_next_page ! 264: * pmap_init ! 265: * and vm/vm_resident.c implements pmap_steal_memory and pmap_startup ! 266: * using pmap_free_pages, pmap_next_page, pmap_virtual_space, ! 267: * and pmap_enter. pmap_free_pages may over-estimate the number ! 268: * of unused physical pages, and pmap_next_page may return FALSE ! 269: * to indicate that there are no more unused pages to return. ! 270: * However, for best performance pmap_free_pages should be accurate. ! 271: */ ! 272: ! 273: extern boolean_t pmap_next_page(); /* During VM initialization, ! 274: * return the next unused ! 275: * physical page. ! 276: */ ! 277: extern void pmap_virtual_space(); /* During VM initialization, ! 278: * report virtual space ! 279: * available for the kernel. ! 280: */ ! 281: #endif /* MACHINE_PAGES */ ! 282: ! 283: /* ! 284: * Routines to manage the physical map data structure. ! 285: */ ! 286: extern pmap_t pmap_create(); /* Create a pmap_t. */ ! 287: #ifndef pmap_kernel ! 288: extern pmap_t pmap_kernel(); /* Return the kernel's pmap_t. */ ! 289: #endif /* pmap_kernel */ ! 290: extern void pmap_reference(); /* Gain a reference. */ ! 291: extern void pmap_destroy(); /* Release a reference. */ ! 292: ! 293: extern void pmap_enter(); /* Enter a mapping */ ! 294: ! 295: /* ! 296: * Routines that operate on ranges of virtual addresses. ! 297: */ ! 298: extern void pmap_remove(); /* Remove mappings. */ ! 299: extern void pmap_protect(); /* Change protections. */ ! 300: ! 301: /* ! 302: * Routines to set up hardware state for physical maps to be used. ! 303: */ ! 304: extern void pmap_activate(); /* Prepare pmap_t to run ! 305: * on a given processor. ! 306: */ ! 307: extern void pmap_deactivate(); /* Release pmap_t from ! 308: * use on processor. ! 309: */ ! 310: ! 311: ! 312: /* ! 313: * Routines that operate on physical addresses. ! 314: */ ! 315: extern void pmap_page_protect(); /* Restrict access to page. */ ! 316: ! 317: /* ! 318: * Routines to manage reference/modify bits based on ! 319: * physical addresses, simulating them if not provided ! 320: * by the hardware. ! 321: */ ! 322: extern void pmap_clear_reference(); /* Clear reference bit */ ! 323: #ifndef pmap_is_referenced ! 324: extern boolean_t pmap_is_referenced(); /* Return reference bit */ ! 325: #endif /* pmap_is_referenced */ ! 326: extern void pmap_clear_modify(); /* Clear modify bit */ ! 327: extern boolean_t pmap_is_modified(); /* Return modify bit */ ! 328: ! 329: ! 330: /* ! 331: * Statistics routines ! 332: */ ! 333: extern void pmap_statistics(); /* Return statistics */ ! 334: ! 335: #ifndef pmap_resident_count ! 336: extern int pmap_resident_count(); ! 337: #endif /* pmap_resident_count */ ! 338: ! 339: /* ! 340: * Sundry required routines ! 341: */ ! 342: extern vm_offset_t pmap_extract(); /* Return a virtual-to-physical ! 343: * mapping, if possible. ! 344: */ ! 345: ! 346: extern boolean_t pmap_access(); /* Is virtual address valid? */ ! 347: ! 348: extern void pmap_collect(); /* Perform garbage ! 349: * collection, if any ! 350: */ ! 351: ! 352: extern void pmap_change_wiring(); /* Specify pageability */ ! 353: ! 354: #ifndef pmap_phys_address ! 355: extern vm_offset_t pmap_phys_address(); /* Transform address ! 356: * returned by device ! 357: * driver mapping function ! 358: * to physical address ! 359: * known to this module. ! 360: */ ! 361: #endif /* pmap_phys_address */ ! 362: #ifndef pmap_phys_to_frame ! 363: extern int pmap_phys_to_frame(); /* Inverse of ! 364: * pmap_phys_address, ! 365: * for use by device driver ! 366: * mapping function in ! 367: * machine-independent ! 368: * pseudo-devices. ! 369: */ ! 370: #endif /* pmap_phys_to_frame */ ! 371: ! 372: /* ! 373: * Optional routines ! 374: */ ! 375: #ifndef pmap_copy ! 376: extern void pmap_copy(); /* Copy range of ! 377: * mappings, if desired. ! 378: */ ! 379: #endif /* pmap_copy */ ! 380: #ifndef pmap_attribute ! 381: extern kern_return_t pmap_attribute(); /* Get/Set special ! 382: * memory attributes ! 383: */ ! 384: #endif /* pmap_attribute */ ! 385: ! 386: /* ! 387: * Routines defined as macros. ! 388: */ ! 389: #ifndef PMAP_ACTIVATE_USER ! 390: #define PMAP_ACTIVATE_USER(pmap, thread, cpu) { \ ! 391: if ((pmap) != kernel_pmap) \ ! 392: PMAP_ACTIVATE(pmap, thread, cpu); \ ! 393: } ! 394: #endif /* PMAP_ACTIVATE_USER */ ! 395: ! 396: #ifndef PMAP_DEACTIVATE_USER ! 397: #define PMAP_DEACTIVATE_USER(pmap, thread, cpu) { \ ! 398: if ((pmap) != kernel_pmap) \ ! 399: PMAP_DEACTIVATE(pmap, thread, cpu); \ ! 400: } ! 401: #endif /* PMAP_DEACTIVATE_USER */ ! 402: ! 403: ! 404: ! 405: #ifndef PMAP_ACTIVATE_KERNEL ! 406: #define PMAP_ACTIVATE_KERNEL(cpu) \ ! 407: PMAP_ACTIVATE(kernel_pmap, THREAD_NULL, cpu) ! 408: #endif /* PMAP_ACTIVATE_KERNEL */ ! 409: ! 410: #ifndef PMAP_DEACTIVATE_KERNEL ! 411: #define PMAP_DEACTIVATE_KERNEL(cpu) \ ! 412: PMAP_DEACTIVATE(kernel_pmap, THREAD_NULL, cpu) ! 413: #endif /* PMAP_DEACTIVATE_KERNEL */ ! 414: #endif ! 415: ! 416: /* ! 417: * Exported data structures ! 418: */ ! 419: ! 420: extern pmap_t kernel_pmap; /* The kernel's map */ ! 421: ! 422: #endif /* _VM_PMAP_H_ */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.