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_ */