xref: /xnu-10063.121.3/osfmk/mach/vm_region.h (revision 2c2f96dc2b9a4408a43d3150ae9c105355ca3daa)
1 /*
2  * Copyright (c) 2000-2016 Apple Computer, Inc. All rights reserved.
3  *
4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5  *
6  * This file contains Original Code and/or Modifications of Original Code
7  * as defined in and that are subject to the Apple Public Source License
8  * Version 2.0 (the 'License'). You may not use this file except in
9  * compliance with the License. The rights granted to you under the License
10  * may not be used to create, or enable the creation or redistribution of,
11  * unlawful or unlicensed copies of an Apple operating system, or to
12  * circumvent, violate, or enable the circumvention or violation of, any
13  * terms of an Apple operating system software license agreement.
14  *
15  * Please obtain a copy of the License at
16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17  *
18  * The Original Code and all software distributed under the License are
19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23  * Please see the License for the specific language governing rights and
24  * limitations under the License.
25  *
26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27  */
28 /*
29  * @OSF_COPYRIGHT@
30  */
31 /*
32  *	File:	mach/vm_region.h
33  *
34  *	Define the attributes of a task's memory region
35  *
36  */
37 
38 #ifndef _MACH_VM_REGION_H_
39 #define _MACH_VM_REGION_H_
40 
41 #include <mach/boolean.h>
42 #include <mach/vm_prot.h>
43 #include <mach/vm_inherit.h>
44 #include <mach/vm_behavior.h>
45 #include <mach/vm_types.h>
46 #include <mach/message.h>
47 #include <mach/machine/vm_param.h>
48 #include <mach/machine/vm_types.h>
49 #include <mach/memory_object_types.h>
50 
51 #include <sys/cdefs.h>
52 
53 #pragma pack(push, 4)
54 
55 // LP64todo: all the current tools are 32bit, obviously never worked for 64b
56 // so probably should be a real 32b ID vs. ptr.
57 // Current users just check for equality
58 typedef uint32_t vm32_object_id_t;
59 
60 /*
61  *	Types defined:
62  *
63  *	vm_region_info_t	memory region attributes
64  */
65 
66 #define VM_REGION_INFO_MAX      (1024)
67 typedef int     *vm_region_info_t;
68 typedef int     *vm_region_info_64_t;
69 typedef int     *vm_region_recurse_info_t;
70 typedef int     *vm_region_recurse_info_64_t;
71 typedef int      vm_region_flavor_t;
72 typedef int      vm_region_info_data_t[VM_REGION_INFO_MAX];
73 
74 #define VM_REGION_BASIC_INFO_64         9
75 struct vm_region_basic_info_64 {
76 	vm_prot_t               protection;
77 	vm_prot_t               max_protection;
78 	vm_inherit_t            inheritance;
79 	boolean_t               shared;
80 	boolean_t               reserved;
81 	memory_object_offset_t  offset;
82 	vm_behavior_t           behavior;
83 	unsigned short          user_wired_count;
84 };
85 typedef struct vm_region_basic_info_64          *vm_region_basic_info_64_t;
86 typedef struct vm_region_basic_info_64           vm_region_basic_info_data_64_t;
87 
88 #define VM_REGION_BASIC_INFO_COUNT_64   ((mach_msg_type_number_t) \
89 	(sizeof(vm_region_basic_info_data_64_t)/sizeof(int)))
90 
91 /*
92  * Passing VM_REGION_BASIC_INFO to vm_region_64
93  * automatically converts it to a VM_REGION_BASIC_INFO_64.
94  * Please use that explicitly instead.
95  */
96 #define VM_REGION_BASIC_INFO            10
97 
98 /*
99  * This is the legacy basic info structure.  It is
100  * deprecated because it passes only a 32-bit memory object
101  * offset back - too small for many larger objects (e.g. files).
102  */
103 struct vm_region_basic_info {
104 	vm_prot_t               protection;
105 	vm_prot_t               max_protection;
106 	vm_inherit_t            inheritance;
107 	boolean_t               shared;
108 	boolean_t               reserved;
109 	uint32_t                offset; /* too small for a real offset */
110 	vm_behavior_t           behavior;
111 	unsigned short          user_wired_count;
112 };
113 
114 typedef struct vm_region_basic_info             *vm_region_basic_info_t;
115 typedef struct vm_region_basic_info              vm_region_basic_info_data_t;
116 
117 #define VM_REGION_BASIC_INFO_COUNT ((mach_msg_type_number_t) \
118 	(sizeof(vm_region_basic_info_data_t)/sizeof(int)))
119 
120 #define SM_COW             1
121 #define SM_PRIVATE         2
122 #define SM_EMPTY           3
123 #define SM_SHARED          4
124 #define SM_TRUESHARED      5
125 #define SM_PRIVATE_ALIASED 6
126 #define SM_SHARED_ALIASED  7
127 #define SM_LARGE_PAGE      8
128 
129 /*
130  * For submap info,  the SM flags above are overlayed when a submap
131  * is encountered.  The field denotes whether or not machine level mapping
132  * information is being shared.  PTE's etc.  When such sharing is taking
133  * place the value returned is SM_TRUESHARED otherwise SM_PRIVATE is passed
134  * back.
135  */
136 
137 #ifdef MACH_KERNEL_PRIVATE
138 #define VM_REGION_EXTENDED_INFO__legacy 11
139 struct vm_region_extended_info__legacy {
140 	vm_prot_t               protection;
141 	unsigned int            user_tag;
142 	unsigned int            pages_resident;
143 	unsigned int            pages_shared_now_private;
144 	unsigned int            pages_swapped_out;
145 	unsigned int            pages_dirtied;
146 	unsigned int            ref_count;
147 	unsigned short          shadow_depth;
148 	unsigned char           external_pager;
149 	unsigned char           share_mode;
150 	/*
151 	 * XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX
152 	 *  DO NOT EXTEND THIS DATA STRUCTURE.
153 	 *  IT IS NOW ABANDONED AND REPLACED WITH vm_region_extended_info BELOW.
154 	 * XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX
155 	 */
156 };
157 #define VM_REGION_EXTENDED_INFO_COUNT__legacy               \
158 	((mach_msg_type_number_t)                           \
159 	 (sizeof (struct vm_region_extended_info__legacy) / \
160 	  sizeof (natural_t)))
161 #endif /* MACH_KERNEL_PRIVATE */
162 
163 
164 
165 #define VM_REGION_EXTENDED_INFO 13
166 struct vm_region_extended_info {
167 	vm_prot_t               protection;
168 	unsigned int            user_tag;
169 	unsigned int            pages_resident;
170 	unsigned int            pages_shared_now_private;
171 	unsigned int            pages_swapped_out;
172 	unsigned int            pages_dirtied;
173 	unsigned int            ref_count;
174 	unsigned short          shadow_depth;
175 	unsigned char           external_pager;
176 	unsigned char           share_mode;
177 	unsigned int            pages_reusable;
178 };
179 typedef struct vm_region_extended_info          *vm_region_extended_info_t;
180 typedef struct vm_region_extended_info           vm_region_extended_info_data_t;
181 #define VM_REGION_EXTENDED_INFO_COUNT                   \
182 	((mach_msg_type_number_t)                       \
183 	 (sizeof (vm_region_extended_info_data_t) / sizeof (natural_t)))
184 
185 
186 
187 
188 #define VM_REGION_TOP_INFO      12
189 
190 struct vm_region_top_info {
191 	unsigned int            obj_id;
192 	unsigned int            ref_count;
193 	unsigned int            private_pages_resident;
194 	unsigned int            shared_pages_resident;
195 	unsigned char           share_mode;
196 };
197 
198 typedef struct vm_region_top_info               *vm_region_top_info_t;
199 typedef struct vm_region_top_info                vm_region_top_info_data_t;
200 
201 #define VM_REGION_TOP_INFO_COUNT                                        \
202 	((mach_msg_type_number_t)                                       \
203 	 (sizeof(vm_region_top_info_data_t) / sizeof(natural_t)))
204 
205 
206 
207 /*
208  * vm_region_submap_info will return information on a submap or object.
209  * The user supplies a nesting level on the call.  When a walk of the
210  * user's map is done and a submap is encountered, the nesting count is
211  * checked. If the nesting count is greater than 1 the submap is entered and
212  * the offset relative to the address in the base map is examined.  If the
213  * nesting count is zero, the information on the submap is returned.
214  * The caller may thus learn about a submap and its contents by judicious
215  * choice of the base map address and nesting count.  The nesting count
216  * allows penetration of recursively mapped submaps.  If a submap is
217  * encountered as a mapped entry of another submap, the caller may bump
218  * the nesting count and call vm_region_recurse again on the target address
219  * range.  The "is_submap" field tells the caller whether or not a submap
220  * has been encountered.
221  *
222  * Object only fields are filled in through a walking of the object shadow
223  * chain (where one is present), and a walking of the resident page queue.
224  *
225  */
226 
227 struct vm_region_submap_info {
228 	vm_prot_t               protection;     /* present access protection */
229 	vm_prot_t               max_protection; /* max avail through vm_prot */
230 	vm_inherit_t            inheritance;/* behavior of map/obj on fork */
231 	uint32_t                offset;         /* offset into object/map */
232 	unsigned int            user_tag;       /* user tag on map entry */
233 	unsigned int            pages_resident; /* only valid for objects */
234 	unsigned int            pages_shared_now_private; /* only for objects */
235 	unsigned int            pages_swapped_out; /* only for objects */
236 	unsigned int            pages_dirtied;   /* only for objects */
237 	unsigned int            ref_count;       /* obj/map mappers, etc */
238 	unsigned short          shadow_depth;   /* only for obj */
239 	unsigned char           external_pager;  /* only for obj */
240 	unsigned char           share_mode;     /* see enumeration */
241 	boolean_t               is_submap;      /* submap vs obj */
242 	vm_behavior_t           behavior;       /* access behavior hint */
243 	vm32_object_id_t        object_id;      /* obj/map name, not a handle */
244 	unsigned short          user_wired_count;
245 };
246 
247 typedef struct vm_region_submap_info            *vm_region_submap_info_t;
248 typedef struct vm_region_submap_info             vm_region_submap_info_data_t;
249 
250 #define VM_REGION_SUBMAP_INFO_COUNT                                     \
251 	((mach_msg_type_number_t)                                       \
252 	 (sizeof(vm_region_submap_info_data_t) / sizeof(natural_t)))
253 
254 struct vm_region_submap_info_64 {
255 	vm_prot_t               protection;     /* present access protection */
256 	vm_prot_t               max_protection; /* max avail through vm_prot */
257 	vm_inherit_t            inheritance;/* behavior of map/obj on fork */
258 	memory_object_offset_t  offset;         /* offset into object/map */
259 	unsigned int            user_tag;       /* user tag on map entry */
260 	unsigned int            pages_resident; /* only valid for objects */
261 	unsigned int            pages_shared_now_private; /* only for objects */
262 	unsigned int            pages_swapped_out; /* only for objects */
263 	unsigned int            pages_dirtied;   /* only for objects */
264 	unsigned int            ref_count;       /* obj/map mappers, etc */
265 	unsigned short          shadow_depth;   /* only for obj */
266 	unsigned char           external_pager;  /* only for obj */
267 	unsigned char           share_mode;     /* see enumeration */
268 	boolean_t               is_submap;      /* submap vs obj */
269 	vm_behavior_t           behavior;       /* access behavior hint */
270 	vm32_object_id_t        object_id;      /* obj/map name, not a handle */
271 	unsigned short          user_wired_count;
272 	unsigned int            pages_reusable;
273 	vm_object_id_t          object_id_full;
274 };
275 
276 typedef struct vm_region_submap_info_64         *vm_region_submap_info_64_t;
277 typedef struct vm_region_submap_info_64          vm_region_submap_info_data_64_t;
278 
279 #define VM_REGION_SUBMAP_INFO_V2_SIZE   \
280 	(sizeof (vm_region_submap_info_data_64_t))
281 #define VM_REGION_SUBMAP_INFO_V1_SIZE   \
282 	(VM_REGION_SUBMAP_INFO_V2_SIZE - \
283 	 sizeof (vm_object_id_t) /* object_id_full */ )
284 #define VM_REGION_SUBMAP_INFO_V0_SIZE   \
285 	(VM_REGION_SUBMAP_INFO_V1_SIZE - \
286 	 sizeof (unsigned int) /* pages_reusable */ )
287 
288 #define VM_REGION_SUBMAP_INFO_V2_COUNT_64 \
289 	((mach_msg_type_number_t) \
290 	 (VM_REGION_SUBMAP_INFO_V2_SIZE / sizeof (natural_t)))
291 #define VM_REGION_SUBMAP_INFO_V1_COUNT_64 \
292 	((mach_msg_type_number_t) \
293 	 (VM_REGION_SUBMAP_INFO_V1_SIZE / sizeof (natural_t)))
294 #define VM_REGION_SUBMAP_INFO_V0_COUNT_64 \
295 	((mach_msg_type_number_t) \
296 	 (VM_REGION_SUBMAP_INFO_V0_SIZE / sizeof (natural_t)))
297 
298 /* set this to the latest version */
299 #define VM_REGION_SUBMAP_INFO_COUNT_64          VM_REGION_SUBMAP_INFO_V2_COUNT_64
300 
301 struct vm_region_submap_short_info_64 {
302 	vm_prot_t               protection;     /* present access protection */
303 	vm_prot_t               max_protection; /* max avail through vm_prot */
304 	vm_inherit_t            inheritance;/* behavior of map/obj on fork */
305 	memory_object_offset_t  offset;         /* offset into object/map */
306 	unsigned int            user_tag;       /* user tag on map entry */
307 	unsigned int            ref_count;       /* obj/map mappers, etc */
308 	unsigned short          shadow_depth;   /* only for obj */
309 	unsigned char           external_pager;  /* only for obj */
310 	unsigned char           share_mode;     /* see enumeration */
311 	boolean_t               is_submap;      /* submap vs obj */
312 	vm_behavior_t           behavior;       /* access behavior hint */
313 	vm32_object_id_t        object_id;      /* obj/map name, not a handle */
314 	unsigned short          user_wired_count;
315 };
316 
317 typedef struct vm_region_submap_short_info_64   *vm_region_submap_short_info_64_t;
318 typedef struct vm_region_submap_short_info_64    vm_region_submap_short_info_data_64_t;
319 
320 #define VM_REGION_SUBMAP_SHORT_INFO_COUNT_64                            \
321 	((mach_msg_type_number_t)                                       \
322 	 (sizeof (vm_region_submap_short_info_data_64_t) / sizeof (natural_t)))
323 
324 struct mach_vm_read_entry {
325 	mach_vm_address_t address;
326 	mach_vm_size_t size;
327 };
328 
329 struct vm_read_entry {
330 	vm_address_t    address;
331 	vm_size_t       size;
332 };
333 
334 #ifdef VM32_SUPPORT
335 struct vm32_read_entry {
336 	vm32_address_t  address;
337 	vm32_size_t     size;
338 };
339 #endif
340 
341 
342 #define VM_MAP_ENTRY_MAX  (256)
343 
344 typedef struct mach_vm_read_entry       mach_vm_read_entry_t[VM_MAP_ENTRY_MAX];
345 typedef struct vm_read_entry            vm_read_entry_t[VM_MAP_ENTRY_MAX];
346 #ifdef VM32_SUPPORT
347 typedef struct vm32_read_entry          vm32_read_entry_t[VM_MAP_ENTRY_MAX];
348 #endif
349 
350 #pragma pack(pop)
351 
352 
353 #define VM_PAGE_INFO_MAX
354 typedef int *vm_page_info_t;
355 typedef int vm_page_info_data_t[VM_PAGE_INFO_MAX];
356 typedef int vm_page_info_flavor_t;
357 
358 #define VM_PAGE_INFO_BASIC              1
359 struct vm_page_info_basic {
360 	int                     disposition;
361 	int                     ref_count;
362 	vm_object_id_t          object_id;
363 	memory_object_offset_t  offset;
364 	int                     depth;
365 	int                     __pad; /* pad to 64-bit boundary */
366 };
367 typedef struct vm_page_info_basic               *vm_page_info_basic_t;
368 typedef struct vm_page_info_basic               vm_page_info_basic_data_t;
369 
370 #define VM_PAGE_INFO_BASIC_COUNT        ((mach_msg_type_number_t) \
371 	(sizeof(vm_page_info_basic_data_t)/sizeof(int)))
372 
373 
374 #endif  /*_MACH_VM_REGION_H_*/
375