Annotation of kernel/vm/vm_map.h, revision 1.1

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) 1993-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:  *     File:   vm/vm_map.h
        !            52:  *     Author: Avadis Tevanian, Jr., Michael Wayne Young
        !            53:  *     Date:   1985
        !            54:  *
        !            55:  *     Virtual memory map module definitions.
        !            56:  *
        !            57:  * Contributors:
        !            58:  *     avie, dlb, mwyoung
        !            59:  */
        !            60: 
        !            61: #ifndef        _VM_VM_MAP_H_
        !            62: #define _VM_VM_MAP_H_
        !            63: 
        !            64: #import <mach/features.h>
        !            65: 
        !            66: #include <mach/kern_return.h>
        !            67: #include <mach/boolean.h>
        !            68: #include <mach/machine/vm_types.h>
        !            69: #include <mach/vm_prot.h>
        !            70: #include <mach/vm_inherit.h>
        !            71: #include <vm/pmap.h>
        !            72: #include <vm/vm_object.h>
        !            73: #include <vm/vm_page.h>
        !            74: #include <kern/lock.h>
        !            75: #include <kern/macro_help.h>
        !            76: 
        !            77: /*
        !            78:  *     Types defined:
        !            79:  *
        !            80:  *     vm_map_t                the high-level address map data structure.
        !            81:  *     vm_map_entry_t          an entry in an address map.
        !            82:  *     vm_map_version_t        a timestamp of a map, for use with vm_map_lookup
        !            83:  *     vm_map_copy_t           represents memory copied from an address map,
        !            84:  *                              used for inter-map copy operations
        !            85:  */
        !            86: 
        !            87: /*
        !            88:  *     Type:           vm_map_object_t [internal use only]
        !            89:  *
        !            90:  *     Description:
        !            91:  *             The target of an address mapping, either a virtual
        !            92:  *             memory object or a sub map (of the kernel map).
        !            93:  */
        !            94: typedef union vm_map_object {
        !            95:        struct vm_object        *vm_object;     /* object object */
        !            96: #if    OLD_VM_CODE
        !            97:        struct vm_map           *share_map;     /* share map */
        !            98: #endif
        !            99:        struct vm_map           *sub_map;       /* belongs to another map */
        !           100: } vm_map_object_t;
        !           101: 
        !           102: /*
        !           103:  *     Type:           vm_map_entry_t [internal use only]
        !           104:  *
        !           105:  *     Description:
        !           106:  *             A single mapping within an address map.
        !           107:  *
        !           108:  *     Implementation:
        !           109:  *             Address map entries consist of start and end addresses,
        !           110:  *             a VM object (or sub map) and offset into that object,
        !           111:  *             and user-exported inheritance and protection information.
        !           112:  *             Control information for virtual copy operations is also
        !           113:  *             stored in the address map entry.
        !           114:  */
        !           115: struct vm_map_links {
        !           116:        struct vm_map_entry     *prev;          /* previous entry */
        !           117:        struct vm_map_entry     *next;          /* next entry */
        !           118:        vm_offset_t             start;          /* start address */
        !           119:        vm_offset_t             end;            /* end address */
        !           120: };
        !           121: 
        !           122: struct vm_map_entry {
        !           123:        struct vm_map_links     links;          /* links to other entries */
        !           124: #define vme_prev               links.prev
        !           125: #define vme_next               links.next
        !           126: #define vme_start              links.start
        !           127: #define vme_end                        links.end
        !           128:        union vm_map_object     object;         /* object I point to */
        !           129:        vm_offset_t             offset;         /* offset into object */
        !           130:        unsigned int
        !           131: #if    OLD_VM_CODE
        !           132:        /* boolean_t */         is_a_map:1,     /* Is "object" a map? */
        !           133: #endif
        !           134:        /* boolean_t */         is_shared:1,    /* region is shared */
        !           135:        /* boolean_t */         is_sub_map:1,   /* Is "object" a submap? */
        !           136: #if    OLD_VM_CODE
        !           137:                /* Only in sharing maps: */
        !           138:        /* boolean_t */         copy_on_write:1,/* is data copy-on-write */
        !           139: #endif
        !           140:        /* boolean_t */         in_transition:1, /* Entry being changed */
        !           141:        /* boolean_t */         needs_wakeup:1,  /* Waiters on in_transition */
        !           142:                /* Only used when object is a vm_object: */
        !           143:        /* boolean_t */         needs_copy:1;    /* does object need to be copied */
        !           144: 
        !           145:                /* Only in task maps: */
        !           146:        vm_prot_t               protection;     /* protection code */
        !           147:        vm_prot_t               max_protection; /* maximum protection */
        !           148:        vm_inherit_t            inheritance;    /* inheritance */
        !           149:        unsigned short          wired_count;    /* can be paged if = 0 */
        !           150:        unsigned short          user_wired_count; /* for vm_wire */
        !           151: };
        !           152: 
        !           153: typedef struct vm_map_entry    *vm_map_entry_t;
        !           154: 
        !           155: #define VM_MAP_ENTRY_NULL      ((vm_map_entry_t) 0)
        !           156: 
        !           157: /*
        !           158:  *     Type:           struct vm_map_header
        !           159:  *
        !           160:  *     Description:
        !           161:  *             Header for a vm_map and a vm_map_copy.
        !           162:  */
        !           163: struct vm_map_header {
        !           164:        struct vm_map_links     links;          /* first, last, min, max */
        !           165:        int                     nentries;       /* Number of entries */
        !           166:        boolean_t               entries_pageable;
        !           167:                                                /* are map entries pageable? */
        !           168: };
        !           169: 
        !           170: /*
        !           171:  *     Type:           vm_map_t [exported; contents invisible]
        !           172:  *
        !           173:  *     Description:
        !           174:  *             An address map -- a directory relating valid
        !           175:  *             regions of a task's address space to the corresponding
        !           176:  *             virtual memory objects.
        !           177:  *
        !           178:  *     Implementation:
        !           179:  *             Maps are doubly-linked lists of map entries, sorted
        !           180:  *             by address.  One hint is used to start
        !           181:  *             searches again from the last successful search,
        !           182:  *             insertion, or removal.  Another hint is used to
        !           183:  *             quickly find free space.
        !           184:  */
        !           185: typedef struct vm_map {
        !           186:        lock_data_t             lock;           /* Lock for map data */
        !           187:        struct vm_map_header    hdr;            /* Map entry header */
        !           188: #define min_offset             hdr.links.start /* start of range */
        !           189: #define max_offset             hdr.links.end   /* end of range */
        !           190:        pmap_t                  pmap;           /* Physical map */
        !           191:        vm_size_t               size;           /* virtual size */
        !           192: #if    OLD_VM_CODE
        !           193:        boolean_t               is_main_map;    /* Am I a main map? */
        !           194: #endif
        !           195:        int                     ref_count;      /* Reference count */
        !           196:        decl_simple_lock_data(, ref_lock)       /* Lock for ref_count field */
        !           197:        vm_map_entry_t          hint;           /* hint for quick lookups */
        !           198:        decl_simple_lock_data(, hint_lock)      /* lock for hint storage */
        !           199:        vm_map_entry_t          first_free;     /* First free space hint */
        !           200:        boolean_t               wait_for_space; /* Should callers wait
        !           201:                                                   for space? */
        !           202:        boolean_t               wiring_required;/* All memory wired? */
        !           203:        unsigned int            timestamp;      /* Version number */
        !           204: } *vm_map_t;
        !           205: 
        !           206: #define                VM_MAP_NULL     ((vm_map_t) 0)
        !           207: 
        !           208: #define vm_map_to_entry(map)   ((struct vm_map_entry *) &(map)->hdr.links)
        !           209: #define vm_map_first_entry(map)        ((map)->hdr.links.next)
        !           210: #define vm_map_last_entry(map) ((map)->hdr.links.prev)
        !           211: 
        !           212: /*
        !           213:  *     Type:           vm_map_version_t [exported; contents invisible]
        !           214:  *
        !           215:  *     Description:
        !           216:  *             Map versions may be used to quickly validate a previous
        !           217:  *             lookup operation.
        !           218:  *
        !           219:  *     Usage note:
        !           220:  *             Because they are bulky objects, map versions are usually
        !           221:  *             passed by reference.
        !           222:  *
        !           223:  *     Implementation:
        !           224:  *             Just a timestamp for the main map.
        !           225:  */
        !           226: typedef struct vm_map_version {
        !           227:        unsigned int    main_timestamp;
        !           228: #if    OLD_VM_CODE
        !           229:        vm_map_t        share_map;
        !           230:        int             share_timestamp;
        !           231: #endif
        !           232: } vm_map_version_t;
        !           233: 
        !           234: /*
        !           235:  *     Type:           vm_map_copy_t [exported; contents invisible]
        !           236:  *
        !           237:  *     Description:
        !           238:  *             A map copy object represents a region of virtual memory
        !           239:  *             that has been copied from an address map but is still
        !           240:  *             in transit.
        !           241:  *
        !           242:  *             A map copy object may only be used by a single thread
        !           243:  *             at a time.
        !           244:  *
        !           245:  *     Implementation:
        !           246:  *             There are three formats for map copy objects.  
        !           247:  *             The first is very similar to the main
        !           248:  *             address map in structure, and as a result, some
        !           249:  *             of the internal maintenance functions/macros can
        !           250:  *             be used with either address maps or map copy objects.
        !           251:  *
        !           252:  *             The map copy object contains a header links
        !           253:  *             entry onto which the other entries that represent
        !           254:  *             the region are chained.
        !           255:  *
        !           256:  *             The second format is a single vm object.  This is used
        !           257:  *             primarily in the pageout path.  The third format is a
        !           258:  *             list of vm pages.  An optional continuation provides
        !           259:  *             a hook to be called to obtain more of the memory,
        !           260:  *             or perform other operations.  The continuation takes 3
        !           261:  *             arguments, a saved arg buffer, a pointer to a new vm_map_copy
        !           262:  *             (returned) and an abort flag (abort if TRUE).
        !           263:  */
        !           264: 
        !           265: #define VM_MAP_COPY_PAGE_LIST_MAX      8
        !           266: 
        !           267: typedef struct vm_map_copy {
        !           268:        int                     type;
        !           269: #define VM_MAP_COPY_ENTRY_LIST 1
        !           270: #define VM_MAP_COPY_OBJECT     2
        !           271: #define VM_MAP_COPY_PAGE_LIST  3
        !           272:        vm_offset_t             offset;
        !           273:        vm_size_t               size;
        !           274:        union {
        !           275:            struct vm_map_header        hdr;    /* ENTRY_LIST */
        !           276:            struct {                            /* OBJECT */
        !           277:                vm_object_t             object;
        !           278:            } c_o;
        !           279:            struct {                            /* PAGE_LIST */
        !           280:                vm_page_t               page_list[VM_MAP_COPY_PAGE_LIST_MAX];
        !           281:                int                     npages;
        !           282:                kern_return_t           (*cont)();
        !           283:                char                    *cont_args;
        !           284:            } c_p;
        !           285:        } c_u;
        !           286: } *vm_map_copy_t;
        !           287: 
        !           288: #define cpy_hdr                        c_u.hdr
        !           289: 
        !           290: #define cpy_object             c_u.c_o.object
        !           291: 
        !           292: #define cpy_page_list          c_u.c_p.page_list
        !           293: #define cpy_npages             c_u.c_p.npages
        !           294: #define cpy_cont               c_u.c_p.cont
        !           295: #define cpy_cont_args          c_u.c_p.cont_args
        !           296: 
        !           297: #define        VM_MAP_COPY_NULL        ((vm_map_copy_t) 0)
        !           298: 
        !           299: /*
        !           300:  *     Useful macros for entry list copy objects
        !           301:  */
        !           302: 
        !           303: #define vm_map_copy_to_entry(copy)             \
        !           304:                ((struct vm_map_entry *) &(copy)->cpy_hdr.links)
        !           305: #define vm_map_copy_first_entry(copy)          \
        !           306:                ((copy)->cpy_hdr.links.next)
        !           307: #define vm_map_copy_last_entry(copy)           \
        !           308:                ((copy)->cpy_hdr.links.prev)
        !           309: 
        !           310: /*
        !           311:  *     Continuation macros for page list copy objects
        !           312:  */
        !           313: 
        !           314: #define        vm_map_copy_invoke_cont(old_copy, new_copy, result)             \
        !           315: MACRO_BEGIN                                                            \
        !           316:        vm_map_copy_page_discard(old_copy);                             \
        !           317:        *result = (*((old_copy)->cpy_cont))((old_copy)->cpy_cont_args,  \
        !           318:                                            new_copy);                  \
        !           319:        (old_copy)->cpy_cont = (kern_return_t (*)()) 0;                 \
        !           320: MACRO_END
        !           321: 
        !           322: #define        vm_map_copy_invoke_extend_cont(old_copy, new_copy, result)      \
        !           323: MACRO_BEGIN                                                            \
        !           324:        *result = (*((old_copy)->cpy_cont))((old_copy)->cpy_cont_args,  \
        !           325:                                            new_copy);                  \
        !           326:        (old_copy)->cpy_cont = (kern_return_t (*)()) 0;                 \
        !           327: MACRO_END
        !           328: 
        !           329: #define vm_map_copy_abort_cont(old_copy)                               \
        !           330: MACRO_BEGIN                                                            \
        !           331:        vm_map_copy_page_discard(old_copy);                             \
        !           332:        (*((old_copy)->cpy_cont))((old_copy)->cpy_cont_args,            \
        !           333:                                  (vm_map_copy_t *) 0);                 \
        !           334:        (old_copy)->cpy_cont = (kern_return_t (*)()) 0;                 \
        !           335:        (old_copy)->cpy_cont_args = (char *) 0;                         \
        !           336: MACRO_END
        !           337: 
        !           338: #define vm_map_copy_has_cont(copy)                                     \
        !           339:     (((copy)->cpy_cont) != (kern_return_t (*)()) 0)
        !           340: 
        !           341: /*
        !           342:  *     Continuation structures for vm_map_copyin_page_list.
        !           343:  */
        !           344: 
        !           345: typedef        struct {
        !           346:        vm_map_t        map;
        !           347:        vm_offset_t     src_addr;
        !           348:        vm_size_t       src_len;
        !           349:        vm_offset_t     destroy_addr;
        !           350:        vm_size_t       destroy_len;
        !           351:        boolean_t       steal_pages;
        !           352: }  vm_map_copyin_args_data_t, *vm_map_copyin_args_t;
        !           353: 
        !           354: #define        VM_MAP_COPYIN_ARGS_NULL ((vm_map_copyin_args_t) 0)
        !           355: 
        !           356: /*
        !           357:  *     Macros:         vm_map_lock, etc. [internal use only]
        !           358:  *     Description:
        !           359:  *             Perform locking on the data portion of a map.
        !           360:  */
        !           361: 
        !           362: #define vm_map_lock_init(map)                  \
        !           363: MACRO_BEGIN                                    \
        !           364:        lock_init(&(map)->lock, TRUE);          \
        !           365:        (map)->timestamp = 0;                   \
        !           366: MACRO_END
        !           367: 
        !           368: #define vm_map_lock(map)                       \
        !           369: MACRO_BEGIN                                    \
        !           370:        lock_write(&(map)->lock);               \
        !           371:        (map)->timestamp++;                     \
        !           372: MACRO_END
        !           373: 
        !           374: #define vm_map_unlock(map)     lock_write_done(&(map)->lock)
        !           375: #define vm_map_lock_read(map)  lock_read(&(map)->lock)
        !           376: #define vm_map_unlock_read(map)        lock_read_done(&(map)->lock)
        !           377: #define vm_map_lock_write_to_read(map) \
        !           378:                lock_write_to_read(&(map)->lock)
        !           379: #define vm_map_lock_read_to_write(map) \
        !           380:                (lock_read_to_write(&(map)->lock) || (((map)->timestamp++), 0))
        !           381: #define vm_map_lock_set_recursive(map) \
        !           382:                lock_set_recursive(&(map)->lock)
        !           383: #define vm_map_lock_clear_recursive(map) \
        !           384:                lock_clear_recursive(&(map)->lock)
        !           385: 
        !           386: /*
        !           387:  *     Exported procedures that operate on vm_map_t.
        !           388:  */
        !           389: 
        !           390: extern vm_offset_t     kentry_data;
        !           391: extern vm_offset_t     kentry_data_size;
        !           392: extern int             kentry_count;
        !           393: extern void            vm_map_init();          /* Initialize the module */
        !           394: 
        !           395: extern vm_map_t                vm_map_create();        /* Create an empty map */
        !           396: extern vm_map_t                vm_map_fork();          /* Create a map in the image
        !           397:                                                 * of an existing map */
        !           398: 
        !           399: extern void            vm_map_reference();     /* Gain a reference to
        !           400:                                                 * an existing map */
        !           401: extern void            vm_map_deallocate();    /* Lose a reference */
        !           402: 
        !           403: extern kern_return_t   vm_map_enter();         /* Enter a mapping */
        !           404: extern kern_return_t   vm_map_find_entry();    /* Enter a mapping primitive */
        !           405: extern kern_return_t   vm_map_remove();        /* Deallocate a region */
        !           406: extern kern_return_t   vm_map_reallocate();    /* *private* (BlueBox) */
        !           407: extern kern_return_t   vm_map_protect();       /* Change protection */
        !           408: extern kern_return_t   vm_map_inherit();       /* Change inheritance */
        !           409: 
        !           410: extern void            vm_map_print();         /* Debugging: print a map */
        !           411: 
        !           412: extern kern_return_t   vm_map_lookup();        /* Look up an address */
        !           413: extern boolean_t       vm_map_verify();        /* Verify that a previous
        !           414:                                                 * lookup is still valid */
        !           415: /* vm_map_verify_done is now a macro -- see below */
        !           416: extern kern_return_t   vm_map_copyin();        /* Make a copy of a region */
        !           417: extern kern_return_t   vm_map_copyin_page_list();/* Make a copy of a region
        !           418:                                                 * using a page list copy */
        !           419: extern kern_return_t   vm_map_copyout();       /* Place a copy into a map */
        !           420: extern kern_return_t   vm_map_copy_overwrite();/* Overwrite existing memory
        !           421:                                                 * with a copy */
        !           422: extern void            vm_map_copy_discard();  /* Discard a copy without
        !           423:                                                 * using it */
        !           424: extern kern_return_t   vm_map_copy_discard_cont();/* Page list continuation
        !           425:                                                 * version of previous */
        !           426: 
        !           427: extern kern_return_t   vm_map_machine_attribute();
        !           428:                                                /* Add or remove machine-
        !           429:                                                   dependent attributes from
        !           430:                                                   map regions */
        !           431: 
        !           432: /*
        !           433:  *     Functions implemented as macros
        !           434:  */
        !           435: #define                vm_map_min(map)         ((map)->min_offset)
        !           436:                                                /* Lowest valid address in
        !           437:                                                 * a map */
        !           438: 
        !           439: #define                vm_map_max(map)         ((map)->max_offset)
        !           440:                                                /* Highest valid address */
        !           441: 
        !           442: #define                vm_map_pmap(map)        ((map)->pmap)
        !           443:                                                /* Physical map associated
        !           444:                                                 * with this address map */
        !           445: 
        !           446: #if    NEW_VM_CODE
        !           447: #define                vm_map_verify_done(map, version)    (vm_map_unlock_read(map))
        !           448:                                                /* Operation that required
        !           449:                                                 * a verified lookup is
        !           450:                                                 * now complete */
        !           451: /*
        !           452:  *     Pageability functions.  Includes macro to preserve old interface.
        !           453:  */
        !           454: extern kern_return_t   vm_map_pageable_common();
        !           455: 
        !           456: #define vm_map_pageable(map, s, e, access)     \
        !           457:                vm_map_pageable_common(map, s, e, access, FALSE)
        !           458: 
        !           459: #define vm_map_pageable_user(map, s, e, access)        \
        !           460:                vm_map_pageable_common(map, s, e, access, TRUE)
        !           461: #endif
        !           462: 
        !           463: /*
        !           464:  *     Submap object.  Must be used to create memory to be put
        !           465:  *     in a submap by vm_map_submap.
        !           466:  */
        !           467: extern vm_object_t     vm_submap_object;
        !           468: 
        !           469: /*
        !           470:  *     Wait and wakeup macros for in_transition map entries.
        !           471:  */
        !           472: #define vm_map_entry_wait(map, interruptible)          \
        !           473:         MACRO_BEGIN                                     \
        !           474:         assert_wait((event_t)&(map)->hdr, interruptible);      \
        !           475:         vm_map_unlock(map);                             \
        !           476:        thread_block((void (*)()) 0);                   \
        !           477:         MACRO_END
        !           478: 
        !           479: #define vm_map_entry_wakeup(map)        thread_wakeup((event_t)&(map)->hdr)
        !           480: 
        !           481: #endif /* _VM_VM_MAP_H_ */

unix.superglobalmegacorp.com

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