vm_map.h revision 1817
1/*
2 * Copyright (c) 1991, 1993
3 *	The Regents of the University of California.  All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * The Mach Operating System project at Carnegie-Mellon University.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software
17 *    must display the following acknowledgement:
18 *	This product includes software developed by the University of
19 *	California, Berkeley and its contributors.
20 * 4. Neither the name of the University nor the names of its contributors
21 *    may be used to endorse or promote products derived from this software
22 *    without specific prior written permission.
23 *
24 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 * SUCH DAMAGE.
35 *
36 *	from: @(#)vm_map.h	8.3 (Berkeley) 3/15/94
37 *
38 *
39 * Copyright (c) 1987, 1990 Carnegie-Mellon University.
40 * All rights reserved.
41 *
42 * Authors: Avadis Tevanian, Jr., Michael Wayne Young
43 *
44 * Permission to use, copy, modify and distribute this software and
45 * its documentation is hereby granted, provided that both the copyright
46 * notice and this permission notice appear in all copies of the
47 * software, derivative works or modified versions, and any portions
48 * thereof, and that both notices appear in supporting documentation.
49 *
50 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
51 * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
52 * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
53 *
54 * Carnegie Mellon requests users of this software to return to
55 *
56 *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
57 *  School of Computer Science
58 *  Carnegie Mellon University
59 *  Pittsburgh PA 15213-3890
60 *
61 * any improvements or extensions that they make and grant Carnegie the
62 * rights to redistribute these changes.
63 *
64 * $Id$
65 */
66
67/*
68 *	Virtual memory map module definitions.
69 */
70
71#ifndef	_VM_MAP_
72#define	_VM_MAP_
73
74/*
75 *	Types defined:
76 *
77 *	vm_map_t		the high-level address map data structure.
78 *	vm_map_entry_t		an entry in an address map.
79 *	vm_map_version_t	a timestamp of a map, for use with vm_map_lookup
80 */
81
82/*
83 *	Objects which live in maps may be either VM objects, or
84 *	another map (called a "sharing map") which denotes read-write
85 *	sharing with other maps.
86 */
87
88union vm_map_object {
89	struct vm_object	*vm_object;	/* object object */
90	struct vm_map		*share_map;	/* share map */
91	struct vm_map		*sub_map;	/* belongs to another map */
92};
93
94/*
95 *	Address map entries consist of start and end addresses,
96 *	a VM object (or sharing map) and offset into that object,
97 *	and user-exported inheritance and protection information.
98 *	Also included is control information for virtual copy operations.
99 */
100struct vm_map_entry {
101	struct vm_map_entry	*prev;		/* previous entry */
102	struct vm_map_entry	*next;		/* next entry */
103	vm_offset_t		start;		/* start address */
104	vm_offset_t		end;		/* end address */
105	union vm_map_object	object;		/* object I point to */
106	vm_offset_t		offset;		/* offset into object */
107	boolean_t		is_a_map:1,	/* Is "object" a map? */
108				is_sub_map:1,	/* Is "object" a submap? */
109		/* Only in sharing maps: */
110				copy_on_write:1,/* is data copy-on-write */
111				needs_copy:1;	/* does object need to be copied */
112		/* Only in task maps: */
113	vm_prot_t		protection;	/* protection code */
114	vm_prot_t		max_protection;	/* maximum protection */
115	vm_inherit_t		inheritance;	/* inheritance */
116	int			wired_count;	/* can be paged if = 0 */
117};
118
119/*
120 *	Maps are doubly-linked lists of map entries, kept sorted
121 *	by address.  A single hint is provided to start
122 *	searches again from the last successful search,
123 *	insertion, or removal.
124 */
125struct vm_map {
126	struct pmap *		pmap;		/* Physical map */
127	lock_data_t		lock;		/* Lock for map data */
128	struct vm_map_entry	header;		/* List of entries */
129	int			nentries;	/* Number of entries */
130	vm_size_t		size;		/* virtual size */
131	boolean_t		is_main_map;	/* Am I a main map? */
132	int			ref_count;	/* Reference count */
133	simple_lock_data_t	ref_lock;	/* Lock for ref_count field */
134	vm_map_entry_t		hint;		/* hint for quick lookups */
135	simple_lock_data_t	hint_lock;	/* lock for hint storage */
136	vm_map_entry_t		first_free;	/* First free space hint */
137	boolean_t		entries_pageable; /* map entries pageable?? */
138	unsigned int		timestamp;	/* Version number */
139#define	min_offset		header.start
140#define max_offset		header.end
141};
142
143/*
144 *	Map versions are used to validate a previous lookup attempt.
145 *
146 *	Since lookup operations may involve both a main map and
147 *	a sharing map, it is necessary to have a timestamp from each.
148 *	[If the main map timestamp has changed, the share_map and
149 *	associated timestamp are no longer valid; the map version
150 *	does not include a reference for the imbedded share_map.]
151 */
152typedef struct {
153	int		main_timestamp;
154	vm_map_t	share_map;
155	int		share_timestamp;
156} vm_map_version_t;
157
158/*
159 *	Macros:		vm_map_lock, etc.
160 *	Function:
161 *		Perform locking on the data portion of a map.
162 */
163
164#define	vm_map_lock(map) { \
165	lock_write(&(map)->lock); \
166	(map)->timestamp++; \
167}
168#define	vm_map_unlock(map)	lock_write_done(&(map)->lock)
169#define	vm_map_lock_read(map)	lock_read(&(map)->lock)
170#define	vm_map_unlock_read(map)	lock_read_done(&(map)->lock)
171
172/*
173 *	Functions implemented as macros
174 */
175#define		vm_map_min(map)		((map)->min_offset)
176#define		vm_map_max(map)		((map)->max_offset)
177#define		vm_map_pmap(map)	((map)->pmap)
178
179/* XXX: number of kernel maps and entries to statically allocate */
180#define MAX_KMAP	10
181#define	MAX_KMAPENT	128
182
183#ifdef KERNEL
184boolean_t	 vm_map_check_protection __P((vm_map_t,
185		    vm_offset_t, vm_offset_t, vm_prot_t));
186int		 vm_map_copy __P((vm_map_t, vm_map_t, vm_offset_t,
187		    vm_size_t, vm_offset_t, boolean_t, boolean_t));
188void		 vm_map_copy_entry __P((vm_map_t,
189		    vm_map_t, vm_map_entry_t, vm_map_entry_t));
190struct pmap;
191vm_map_t	 vm_map_create __P((struct pmap *,
192		    vm_offset_t, vm_offset_t, boolean_t));
193void		 vm_map_deallocate __P((vm_map_t));
194int		 vm_map_delete __P((vm_map_t, vm_offset_t, vm_offset_t));
195vm_map_entry_t	 vm_map_entry_create __P((vm_map_t));
196void		 vm_map_entry_delete __P((vm_map_t, vm_map_entry_t));
197void		 vm_map_entry_dispose __P((vm_map_t, vm_map_entry_t));
198void		 vm_map_entry_unwire __P((vm_map_t, vm_map_entry_t));
199int		 vm_map_find __P((vm_map_t, vm_object_t,
200		    vm_offset_t, vm_offset_t *, vm_size_t, boolean_t));
201int		 vm_map_findspace __P((vm_map_t,
202		    vm_offset_t, vm_size_t, vm_offset_t *));
203int		 vm_map_inherit __P((vm_map_t,
204		    vm_offset_t, vm_offset_t, vm_inherit_t));
205void		 vm_map_init __P((struct vm_map *,
206		    vm_offset_t, vm_offset_t, boolean_t));
207int		 vm_map_insert __P((vm_map_t,
208		    vm_object_t, vm_offset_t, vm_offset_t, vm_offset_t));
209int		 vm_map_lookup __P((vm_map_t *, vm_offset_t, vm_prot_t,
210		    vm_map_entry_t *, vm_object_t *, vm_offset_t *, vm_prot_t *,
211		    boolean_t *, boolean_t *));
212void		 vm_map_lookup_done __P((vm_map_t, vm_map_entry_t));
213boolean_t	 vm_map_lookup_entry __P((vm_map_t,
214		    vm_offset_t, vm_map_entry_t *));
215int		 vm_map_pageable __P((vm_map_t,
216		    vm_offset_t, vm_offset_t, boolean_t));
217int		 vm_map_clean __P((vm_map_t,
218		    vm_offset_t, vm_offset_t, boolean_t, boolean_t));
219void		 vm_map_print __P((vm_map_t, boolean_t));
220int		 vm_map_protect __P((vm_map_t,
221		    vm_offset_t, vm_offset_t, vm_prot_t, boolean_t));
222void		 vm_map_reference __P((vm_map_t));
223int		 vm_map_remove __P((vm_map_t, vm_offset_t, vm_offset_t));
224void		 vm_map_simplify __P((vm_map_t, vm_offset_t));
225void		 vm_map_simplify_entry __P((vm_map_t, vm_map_entry_t));
226void		 vm_map_startup __P((void));
227int		 vm_map_submap __P((vm_map_t,
228		    vm_offset_t, vm_offset_t, vm_map_t));
229#endif
230#endif /* _VM_MAP_ */
231