Annotation of sys/uvm/uvm_map_i.h, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: uvm_map_i.h,v 1.21 2007/04/11 12:10:42 art Exp $ */
! 2: /* $NetBSD: uvm_map_i.h,v 1.18 2000/11/27 08:40:04 chs Exp $ */
! 3:
! 4: /*
! 5: * Copyright (c) 1997 Charles D. Cranor and Washington University.
! 6: * Copyright (c) 1991, 1993, The Regents of the University of California.
! 7: *
! 8: * All rights reserved.
! 9: *
! 10: * This code is derived from software contributed to Berkeley by
! 11: * The Mach Operating System project at Carnegie-Mellon University.
! 12: *
! 13: * Redistribution and use in source and binary forms, with or without
! 14: * modification, are permitted provided that the following conditions
! 15: * are met:
! 16: * 1. Redistributions of source code must retain the above copyright
! 17: * notice, this list of conditions and the following disclaimer.
! 18: * 2. Redistributions in binary form must reproduce the above copyright
! 19: * notice, this list of conditions and the following disclaimer in the
! 20: * documentation and/or other materials provided with the distribution.
! 21: * 3. All advertising materials mentioning features or use of this software
! 22: * must display the following acknowledgement:
! 23: * This product includes software developed by Charles D. Cranor,
! 24: * Washington University, the University of California, Berkeley and
! 25: * its contributors.
! 26: * 4. Neither the name of the University nor the names of its contributors
! 27: * may be used to endorse or promote products derived from this software
! 28: * without specific prior written permission.
! 29: *
! 30: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
! 31: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 32: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 33: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
! 34: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 35: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 36: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 37: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 38: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 39: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 40: * SUCH DAMAGE.
! 41: *
! 42: * @(#)vm_map.c 8.3 (Berkeley) 1/12/94
! 43: * from: Id: uvm_map_i.h,v 1.1.2.1 1997/08/14 19:10:50 chuck Exp
! 44: *
! 45: *
! 46: * Copyright (c) 1987, 1990 Carnegie-Mellon University.
! 47: * All rights reserved.
! 48: *
! 49: * Permission to use, copy, modify and distribute this software and
! 50: * its documentation is hereby granted, provided that both the copyright
! 51: * notice and this permission notice appear in all copies of the
! 52: * software, derivative works or modified versions, and any portions
! 53: * thereof, and that both notices appear in supporting documentation.
! 54: *
! 55: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
! 56: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
! 57: * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
! 58: *
! 59: * Carnegie Mellon requests users of this software to return to
! 60: *
! 61: * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
! 62: * School of Computer Science
! 63: * Carnegie Mellon University
! 64: * Pittsburgh PA 15213-3890
! 65: *
! 66: * any improvements or extensions that they make and grant Carnegie the
! 67: * rights to redistribute these changes.
! 68: */
! 69:
! 70: #ifndef _UVM_UVM_MAP_I_H_
! 71: #define _UVM_UVM_MAP_I_H_
! 72:
! 73: /*
! 74: * uvm_map_i.h
! 75: */
! 76:
! 77: /*
! 78: * inline functions [maybe]
! 79: */
! 80:
! 81: #if defined(UVM_MAP_INLINE) || defined(UVM_MAP)
! 82:
! 83: /*
! 84: * uvm_map_create: create map
! 85: */
! 86:
! 87: MAP_INLINE vm_map_t
! 88: uvm_map_create(pmap, min, max, flags)
! 89: pmap_t pmap;
! 90: vaddr_t min, max;
! 91: int flags;
! 92: {
! 93: vm_map_t result;
! 94:
! 95: MALLOC(result, vm_map_t, sizeof(struct vm_map), M_VMMAP, M_WAITOK);
! 96: uvm_map_setup(result, min, max, flags);
! 97: result->pmap = pmap;
! 98: return(result);
! 99: }
! 100:
! 101: /*
! 102: * uvm_map_setup: init map
! 103: *
! 104: * => map must not be in service yet.
! 105: */
! 106:
! 107: MAP_INLINE void
! 108: uvm_map_setup(map, min, max, flags)
! 109: vm_map_t map;
! 110: vaddr_t min, max;
! 111: int flags;
! 112: {
! 113:
! 114: RB_INIT(&map->rbhead);
! 115: map->header.next = map->header.prev = &map->header;
! 116: map->nentries = 0;
! 117: map->size = 0;
! 118: map->ref_count = 1;
! 119: map->min_offset = min;
! 120: map->max_offset = max;
! 121: map->flags = flags;
! 122: map->first_free = &map->header;
! 123: map->hint = &map->header;
! 124: map->timestamp = 0;
! 125: rw_init(&map->lock, "vmmaplk");
! 126: simple_lock_init(&map->ref_lock);
! 127: simple_lock_init(&map->hint_lock);
! 128: }
! 129:
! 130:
! 131: /*
! 132: * U N M A P - m a i n e n t r y p o i n t
! 133: */
! 134:
! 135: /*
! 136: * uvm_unmap: remove mappings from a vm_map (from "start" up to "stop")
! 137: *
! 138: * => caller must check alignment and size
! 139: * => map must be unlocked (we will lock it)
! 140: */
! 141:
! 142: MAP_INLINE void
! 143: uvm_unmap_p(map, start, end, p)
! 144: vm_map_t map;
! 145: vaddr_t start,end;
! 146: struct proc *p;
! 147: {
! 148: vm_map_entry_t dead_entries;
! 149: UVMHIST_FUNC("uvm_unmap"); UVMHIST_CALLED(maphist);
! 150:
! 151: UVMHIST_LOG(maphist, " (map=%p, start=0x%lx, end=0x%lx)",
! 152: map, start, end, 0);
! 153: /*
! 154: * work now done by helper functions. wipe the pmap's and then
! 155: * detach from the dead entries...
! 156: */
! 157: vm_map_lock(map);
! 158: uvm_unmap_remove(map, start, end, &dead_entries, p);
! 159: vm_map_unlock(map);
! 160:
! 161: if (dead_entries != NULL)
! 162: uvm_unmap_detach(dead_entries, 0);
! 163:
! 164: UVMHIST_LOG(maphist, "<- done", 0,0,0,0);
! 165: }
! 166:
! 167:
! 168: /*
! 169: * uvm_map_reference: add reference to a map
! 170: *
! 171: * => map need not be locked (we use ref_lock).
! 172: */
! 173:
! 174: MAP_INLINE void
! 175: uvm_map_reference(map)
! 176: vm_map_t map;
! 177: {
! 178: simple_lock(&map->ref_lock);
! 179: map->ref_count++;
! 180: simple_unlock(&map->ref_lock);
! 181: }
! 182:
! 183: /*
! 184: * uvm_map_deallocate: drop reference to a map
! 185: *
! 186: * => caller must not lock map
! 187: * => we will zap map if ref count goes to zero
! 188: */
! 189:
! 190: MAP_INLINE void
! 191: uvm_map_deallocate(map)
! 192: vm_map_t map;
! 193: {
! 194: int c;
! 195:
! 196: simple_lock(&map->ref_lock);
! 197: c = --map->ref_count;
! 198: simple_unlock(&map->ref_lock);
! 199: if (c > 0) {
! 200: return;
! 201: }
! 202:
! 203: /*
! 204: * all references gone. unmap and free.
! 205: */
! 206:
! 207: uvm_unmap(map, map->min_offset, map->max_offset);
! 208: pmap_destroy(map->pmap);
! 209: FREE(map, M_VMMAP);
! 210: }
! 211:
! 212: #endif /* defined(UVM_MAP_INLINE) || defined(UVM_MAP) */
! 213:
! 214: #endif /* _UVM_UVM_MAP_I_H_ */
CVSweb