Annotation of OSKit-Mach/vm/pmap.h, revision 1.1

1.1     ! root        1: /*
        !             2:  * Mach Operating System
        !             3:  * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University.
        !             4:  * Copyright (c) 1993,1994 The University of Utah and
        !             5:  * the Computer Systems Laboratory (CSL).
        !             6:  * All rights reserved.
        !             7:  *
        !             8:  * Permission to use, copy, modify and distribute this software and its
        !             9:  * documentation is hereby granted, provided that both the copyright
        !            10:  * notice and this permission notice appear in all copies of the
        !            11:  * software, derivative works or modified versions, and any portions
        !            12:  * thereof, and that both notices appear in supporting documentation.
        !            13:  *
        !            14:  * CARNEGIE MELLON, THE UNIVERSITY OF UTAH AND CSL ALLOW FREE USE OF
        !            15:  * THIS SOFTWARE IN ITS "AS IS" CONDITION, AND DISCLAIM ANY LIABILITY
        !            16:  * OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF
        !            17:  * THIS SOFTWARE.
        !            18:  *
        !            19:  * Carnegie Mellon requests users of this software to return to
        !            20:  *
        !            21:  *  Software Distribution Coordinator  or  [email protected]
        !            22:  *  School of Computer Science
        !            23:  *  Carnegie Mellon University
        !            24:  *  Pittsburgh PA 15213-3890
        !            25:  *
        !            26:  * any improvements or extensions that they make and grant Carnegie Mellon
        !            27:  * the rights to redistribute these changes.
        !            28:  */
        !            29: /*
        !            30:  *     File:   vm/pmap.h
        !            31:  *     Author: Avadis Tevanian, Jr.
        !            32:  *     Date:   1985
        !            33:  *
        !            34:  *     Machine address mapping definitions -- machine-independent
        !            35:  *     section.  [For machine-dependent section, see "machine/pmap.h".]
        !            36:  */
        !            37: 
        !            38: #ifndef        _VM_PMAP_H_
        !            39: #define _VM_PMAP_H_
        !            40: 
        !            41: #include <machine/pmap.h>
        !            42: #include <mach/machine/vm_types.h>
        !            43: #include <mach/vm_prot.h>
        !            44: #include <mach/boolean.h>
        !            45: 
        !            46: /*
        !            47:  *     The following is a description of the interface to the
        !            48:  *     machine-dependent "physical map" data structure.  The module
        !            49:  *     must provide a "pmap_t" data type that represents the
        !            50:  *     set of valid virtual-to-physical addresses for one user
        !            51:  *     address space.  [The kernel address space is represented
        !            52:  *     by a distinguished "pmap_t".]  The routines described manage
        !            53:  *     this type, install and update virtual-to-physical mappings,
        !            54:  *     and perform operations on physical addresses common to
        !            55:  *     many address spaces.
        !            56:  */
        !            57: 
        !            58: /*
        !            59:  *     Routines used for initialization.
        !            60:  *     There is traditionally also a pmap_bootstrap,
        !            61:  *     used very early by machine-dependent code,
        !            62:  *     but it is not part of the interface.
        !            63:  */
        !            64: 
        !            65: extern vm_offset_t     pmap_steal_memory();    /* During VM initialization,
        !            66:                                                 * steal a chunk of memory.
        !            67:                                                 */
        !            68: extern unsigned int    pmap_free_pages();      /* During VM initialization,
        !            69:                                                 * report remaining unused
        !            70:                                                 * physical pages.
        !            71:                                                 */
        !            72: extern void            pmap_startup();         /* During VM initialization,
        !            73:                                                 * use remaining physical pages
        !            74:                                                 * to allocate page frames.
        !            75:                                                 */
        !            76: extern void            pmap_init();            /* Initialization,
        !            77:                                                 * after kernel runs
        !            78:                                                 * in virtual memory.
        !            79:                                                 */
        !            80: 
        !            81: #ifndef        MACHINE_PAGES
        !            82: /*
        !            83:  *     If machine/pmap.h defines MACHINE_PAGES, it must implement
        !            84:  *     the above functions.  The pmap module has complete control.
        !            85:  *     Otherwise, it must implement
        !            86:  *             pmap_free_pages
        !            87:  *             pmap_virtual_space
        !            88:  *             pmap_next_page
        !            89:  *             pmap_init
        !            90:  *     and vm/vm_resident.c implements pmap_steal_memory and pmap_startup
        !            91:  *     using pmap_free_pages, pmap_next_page, pmap_virtual_space,
        !            92:  *     and pmap_enter.  pmap_free_pages may over-estimate the number
        !            93:  *     of unused physical pages, and pmap_next_page may return FALSE
        !            94:  *     to indicate that there are no more unused pages to return.
        !            95:  *     However, for best performance pmap_free_pages should be accurate.
        !            96:  */
        !            97: 
        !            98: extern boolean_t       pmap_next_page();       /* During VM initialization,
        !            99:                                                 * return the next unused
        !           100:                                                 * physical page.
        !           101:                                                 */
        !           102: extern void            pmap_virtual_space();   /* During VM initialization,
        !           103:                                                 * report virtual space
        !           104:                                                 * available for the kernel.
        !           105:                                                 */
        !           106: #endif /* MACHINE_PAGES */
        !           107: 
        !           108: /*
        !           109:  *     Routines to manage the physical map data structure.
        !           110:  */
        !           111: 
        !           112: /* Create a pmap_t. */
        !           113: pmap_t pmap_create(vm_size_t size);
        !           114: 
        !           115: /* Return the kernel's pmap_t. */
        !           116: #ifndef pmap_kernel
        !           117: extern pmap_t pmap_kernel(void);
        !           118: #endif /* pmap_kernel */
        !           119: 
        !           120: /* Gain and release a reference. */
        !           121: extern void pmap_reference(pmap_t pmap);
        !           122: extern void pmap_destroy(pmap_t pmap);
        !           123: 
        !           124: /* Enter a mapping */
        !           125: extern void pmap_enter(pmap_t pmap, vm_offset_t va, vm_offset_t pa,
        !           126:                       vm_prot_t prot, boolean_t wired);
        !           127: 
        !           128: 
        !           129: /*
        !           130:  *     Routines that operate on ranges of virtual addresses.
        !           131:  */
        !           132: 
        !           133: /* Remove mappings. */
        !           134: void pmap_remove(pmap_t pmap, vm_offset_t sva, vm_offset_t eva);
        !           135: 
        !           136: /* Change protections. */
        !           137: void pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot);
        !           138: 
        !           139: /*
        !           140:  *     Routines to set up hardware state for physical maps to be used.
        !           141:  */
        !           142: extern void            pmap_activate();        /* Prepare pmap_t to run
        !           143:                                                 * on a given processor.
        !           144:                                                 */
        !           145: extern void            pmap_deactivate();      /* Release pmap_t from
        !           146:                                                 * use on processor.
        !           147:                                                 */
        !           148: 
        !           149: 
        !           150: /*
        !           151:  *     Routines that operate on physical addresses.
        !           152:  */
        !           153: 
        !           154: /* Restrict access to page. */
        !           155: void pmap_page_protect(vm_offset_t pa, vm_prot_t prot);
        !           156: 
        !           157: /*
        !           158:  *     Routines to manage reference/modify bits based on
        !           159:  *     physical addresses, simulating them if not provided
        !           160:  *     by the hardware.
        !           161:  */
        !           162: 
        !           163: /* Clear reference bit */
        !           164: void pmap_clear_reference(vm_offset_t pa);
        !           165: 
        !           166: /* Return reference bit */
        !           167: #ifndef pmap_is_referenced
        !           168: boolean_t pmap_is_referenced(vm_offset_t pa);
        !           169: #endif /* pmap_is_referenced */
        !           170: 
        !           171: /* Clear modify bit */
        !           172: void pmap_clear_modify(vm_offset_t pa);
        !           173: 
        !           174: /* Return modify bit */
        !           175: boolean_t pmap_is_modified(vm_offset_t pa);
        !           176: 
        !           177: 
        !           178: /*
        !           179:  *     Statistics routines
        !           180:  */
        !           181: extern void            pmap_statistics();      /* Return statistics */
        !           182: 
        !           183: #ifndef        pmap_resident_count
        !           184: extern int             pmap_resident_count();
        !           185: #endif /* pmap_resident_count */
        !           186: 
        !           187: /*
        !           188:  *     Sundry required routines
        !           189:  */
        !           190: extern vm_offset_t     pmap_extract();         /* Return a virtual-to-physical
        !           191:                                                 * mapping, if possible.
        !           192:                                                 */
        !           193: 
        !           194: extern boolean_t       pmap_access();          /* Is virtual address valid? */
        !           195: 
        !           196: extern void            pmap_collect();         /* Perform garbage
        !           197:                                                 * collection, if any
        !           198:                                                 */
        !           199: 
        !           200: extern void            pmap_change_wiring();   /* Specify pageability */
        !           201: 
        !           202: #ifndef        pmap_phys_address
        !           203: extern vm_offset_t     pmap_phys_address();    /* Transform address
        !           204:                                                 * returned by device
        !           205:                                                 * driver mapping function
        !           206:                                                 * to physical address
        !           207:                                                 * known to this module.
        !           208:                                                 */
        !           209: #endif /* pmap_phys_address */
        !           210: #ifndef        pmap_phys_to_frame
        !           211: extern int             pmap_phys_to_frame();   /* Inverse of
        !           212:                                                 * pmap_phys_address,
        !           213:                                                 * for use by device driver
        !           214:                                                 * mapping function in
        !           215:                                                 * machine-independent
        !           216:                                                 * pseudo-devices.
        !           217:                                                 */
        !           218: #endif /* pmap_phys_to_frame */
        !           219: 
        !           220: /*
        !           221:  *     Optional routines
        !           222:  */
        !           223: #ifndef        pmap_copy
        !           224: extern void            pmap_copy();            /* Copy range of
        !           225:                                                 * mappings, if desired.
        !           226:                                                 */
        !           227: #endif /* pmap_copy */
        !           228: #ifndef pmap_attribute
        !           229: extern kern_return_t   pmap_attribute();       /* Get/Set special
        !           230:                                                 * memory attributes
        !           231:                                                 */
        !           232: #endif /* pmap_attribute */
        !           233: 
        !           234: /*
        !           235:  * Routines defined as macros.
        !           236:  */
        !           237: #ifndef        PMAP_ACTIVATE_USER
        !           238: #define        PMAP_ACTIVATE_USER(pmap, thread, cpu) {         \
        !           239:        if ((pmap) != kernel_pmap)                      \
        !           240:            PMAP_ACTIVATE(pmap, thread, cpu);           \
        !           241: }
        !           242: #endif /* PMAP_ACTIVATE_USER */
        !           243: 
        !           244: #ifndef        PMAP_DEACTIVATE_USER
        !           245: #define        PMAP_DEACTIVATE_USER(pmap, thread, cpu) {       \
        !           246:        if ((pmap) != kernel_pmap)                      \
        !           247:            PMAP_DEACTIVATE(pmap, thread, cpu);         \
        !           248: }
        !           249: #endif /* PMAP_DEACTIVATE_USER */
        !           250: 
        !           251: #ifndef        PMAP_ACTIVATE_KERNEL
        !           252: #define        PMAP_ACTIVATE_KERNEL(cpu)                       \
        !           253:                PMAP_ACTIVATE(kernel_pmap, THREAD_NULL, cpu)
        !           254: #endif /* PMAP_ACTIVATE_KERNEL */
        !           255: 
        !           256: #ifndef        PMAP_DEACTIVATE_KERNEL
        !           257: #define        PMAP_DEACTIVATE_KERNEL(cpu)                     \
        !           258:                PMAP_DEACTIVATE(kernel_pmap, THREAD_NULL, cpu)
        !           259: #endif /* PMAP_DEACTIVATE_KERNEL */
        !           260: 
        !           261: /*
        !           262:  *     Exported data structures
        !           263:  */
        !           264: 
        !           265: extern pmap_t  kernel_pmap;                    /* The kernel's map */
        !           266: 
        !           267: #endif /* _VM_PMAP_H_ */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.