xref: /xnu-8019.80.24/osfmk/vm/vm_kern.h (revision a325d9c4a84054e40bbe985afedcb50ab80993ea)
1 /*
2  * Copyright (c) 2000-2006 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  * Mach Operating System
33  * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University
34  * All Rights Reserved.
35  *
36  * Permission to use, copy, modify and distribute this software and its
37  * documentation is hereby granted, provided that both the copyright
38  * notice and this permission notice appear in all copies of the
39  * software, derivative works or modified versions, and any portions
40  * thereof, and that both notices appear in supporting documentation.
41  *
42  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
43  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
44  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
45  *
46  * Carnegie Mellon requests users of this software to return to
47  *
48  *  Software Distribution Coordinator  or  [email protected]
49  *  School of Computer Science
50  *  Carnegie Mellon University
51  *  Pittsburgh PA 15213-3890
52  *
53  * any improvements or extensions that they make and grant Carnegie Mellon
54  * the rights to redistribute these changes.
55  */
56 /*
57  */
58 /*
59  *	File:	vm/vm_kern.h
60  *	Author:	Avadis Tevanian, Jr., Michael Wayne Young
61  *	Date:	1985
62  *
63  *	Kernel memory management definitions.
64  */
65 
66 #ifndef _VM_VM_KERN_H_
67 #define _VM_VM_KERN_H_
68 
69 #ifdef XNU_KERNEL_PRIVATE
70 #include <kern/locks.h>
71 #endif /* XNU_KERNEL_PRIVATE */
72 
73 #ifdef __cplusplus
74 extern "C" {
75 #endif
76 
77 #include <mach/mach_types.h>
78 #include <mach/boolean.h>
79 #include <mach/kern_return.h>
80 
81 #ifdef  KERNEL_PRIVATE
82 
83 #ifdef XNU_KERNEL_PRIVATE
84 
85 struct vm_page;
86 
87 __options_decl(kma_flags_t, uint32_t, {
88 	KMA_NONE        = 0x00000000,
89 	KMA_HERE        = 0x00000001,
90 	KMA_NOPAGEWAIT  = 0x00000002,
91 	KMA_KOBJECT     = 0x00000004,
92 	KMA_LOMEM       = 0x00000008,
93 	KMA_GUARD_FIRST = 0x00000010,
94 	KMA_GUARD_LAST  = 0x00000020,
95 	KMA_PERMANENT   = 0x00000040,
96 	KMA_NOENCRYPT   = 0x00000080,
97 	KMA_KSTACK      = 0x00000100,
98 	KMA_VAONLY      = 0x00000200,
99 	/*
100 	 * Pages belonging to the compressor are not on the paging queues,
101 	 * nor are they counted as wired.
102 	 */
103 	KMA_COMPRESSOR  = 0x00000400,
104 	KMA_ATOMIC      = 0x00000800,
105 	KMA_ZERO        = 0x00001000,
106 	KMA_PAGEABLE    = 0x00002000,
107 	KMA_LAST_FREE   = 0x00004000,
108 });
109 
110 extern kern_return_t    kernel_memory_allocate(
111 	vm_map_t        map,
112 	vm_offset_t     *addrp,
113 	vm_size_t       size,
114 	vm_offset_t     mask,
115 	kma_flags_t     flags,
116 	vm_tag_t        tag);
117 
118 extern kern_return_t    kernel_memory_allocate_prot(
119 	vm_map_t        map,
120 	vm_offset_t     *addrp,
121 	vm_size_t       size,
122 	vm_offset_t     mask,
123 	kma_flags_t     flags,
124 	vm_tag_t        tag,
125 	vm_prot_t               protection,
126 	vm_prot_t               max_protection);
127 
128 extern kern_return_t kmem_alloc(
129 	vm_map_t        map,
130 	vm_offset_t     *addrp,
131 	vm_size_t       size,
132 	vm_tag_t        tag) __XNU_INTERNAL(kmem_alloc);
133 
134 extern kern_return_t kmem_alloc_contig(
135 	vm_map_t        map,
136 	vm_offset_t     *addrp,
137 	vm_size_t       size,
138 	vm_offset_t     mask,
139 	ppnum_t         max_pnum,
140 	ppnum_t         pnum_mask,
141 	kma_flags_t     flags,
142 	vm_tag_t        tag);
143 
144 extern kern_return_t    kmem_alloc_flags(
145 	vm_map_t        map,
146 	vm_offset_t     *addrp,
147 	vm_size_t       size,
148 	vm_tag_t        tag,
149 	kma_flags_t     flags);
150 
151 extern kern_return_t    kmem_alloc_pageable(
152 	vm_map_t        map,
153 	vm_offset_t     *addrp,
154 	vm_size_t       size,
155 	vm_tag_t        tag) __XNU_INTERNAL(kmem_alloc_pageable);
156 
157 extern kern_return_t    kmem_alloc_aligned(
158 	vm_map_t        map,
159 	vm_offset_t     *addrp,
160 	vm_size_t       size,
161 	vm_tag_t        tag);
162 
163 extern kern_return_t    kmem_realloc(
164 	vm_map_t        map,
165 	vm_offset_t     oldaddr,
166 	vm_size_t       oldsize,
167 	vm_offset_t     *newaddrp,
168 	vm_size_t       newsize,
169 	vm_tag_t        tag);
170 
171 extern void             kmem_free(
172 	vm_map_t        map,
173 	vm_offset_t     addr,
174 	vm_size_t       size);
175 
176 extern kern_return_t    kmem_suballoc(
177 	vm_map_t        parent,
178 	vm_offset_t     *addr,
179 	vm_size_t       size,
180 	boolean_t       pageable,
181 	int             flags,
182 	vm_map_kernel_flags_t vmk_flags,
183 	vm_tag_t        tag,
184 	vm_map_t        *new_map);
185 
186 extern kern_return_t    kmem_alloc_kobject(
187 	vm_map_t        map,
188 	vm_offset_t     *addrp,
189 	vm_size_t       size,
190 	vm_tag_t        tag) __XNU_INTERNAL(kmem_alloc_kobject);
191 
192 extern void kernel_memory_populate_with_pages(
193 	vm_map_t        map,
194 	vm_offset_t     addr,
195 	vm_size_t       size,
196 	struct vm_page *page_list,
197 	kma_flags_t     flags,
198 	vm_tag_t        tag,
199 	vm_prot_t       prot);
200 
201 extern kern_return_t kernel_memory_populate(
202 	vm_map_t        map,
203 	vm_offset_t     addr,
204 	vm_size_t       size,
205 	kma_flags_t     flags,
206 	vm_tag_t        tag);
207 
208 extern void kernel_memory_depopulate(
209 	vm_map_t        map,
210 	vm_offset_t     addr,
211 	vm_size_t       size,
212 	kma_flags_t     flags,
213 	vm_tag_t        tag);
214 
215 extern kern_return_t    memory_object_iopl_request(
216 	ipc_port_t              port,
217 	memory_object_offset_t  offset,
218 	upl_size_t              *upl_size,
219 	upl_t                   *upl_ptr,
220 	upl_page_info_array_t   user_page_list,
221 	unsigned int            *page_list_count,
222 	upl_control_flags_t     *flags,
223 	vm_tag_t                tag);
224 
225 struct mach_memory_info;
226 extern kern_return_t    vm_page_diagnose(
227 	struct mach_memory_info *info,
228 	unsigned int            num_info,
229 	uint64_t                zones_collectable_bytes);
230 
231 extern uint32_t         vm_page_diagnose_estimate(void);
232 
233 typedef enum {
234 	PMAP_FEAT_UEXEC = 1
235 } pmap_feature_flags_t;
236 
237 #if defined(__x86_64__)
238 extern bool             pmap_supported_feature(pmap_t pmap, pmap_feature_flags_t feat);
239 #endif
240 
241 #if DEBUG || DEVELOPMENT
242 
243 extern kern_return_t    mach_memory_info_check(void);
244 
245 extern kern_return_t    vm_kern_allocation_info(uintptr_t addr, vm_size_t * size, vm_tag_t * tag, vm_size_t * zone_size);
246 
247 #endif /* DEBUG || DEVELOPMENT */
248 
249 #if HIBERNATION
250 extern void             hibernate_rebuild_vm_structs(void);
251 #endif /* HIBERNATION */
252 
253 extern vm_tag_t         vm_tag_bt(void);
254 
255 extern vm_tag_t         vm_tag_alloc(vm_allocation_site_t * site);
256 
257 extern void             vm_tag_alloc_locked(vm_allocation_site_t * site, vm_allocation_site_t ** releasesiteP);
258 
259 extern void             vm_tag_update_size(vm_tag_t tag, int64_t size);
260 
261 #if VM_TAG_SIZECLASSES
262 
263 extern void             vm_allocation_zones_init(void);
264 extern vm_tag_t         vm_tag_will_update_zone(vm_tag_t tag, uint32_t zidx, uint32_t zflags);
265 extern void             vm_tag_update_zone_size(vm_tag_t tag, uint32_t zidx, long delta);
266 
267 #endif /* VM_TAG_SIZECLASSES */
268 
269 extern vm_tag_t         vm_tag_bt_debug(void);
270 
271 extern uint32_t         vm_tag_get_kext(vm_tag_t tag, char * name, vm_size_t namelen);
272 
273 extern boolean_t        vm_kernel_map_is_kernel(vm_map_t map);
274 
275 extern ppnum_t          kernel_pmap_present_mapping(uint64_t vaddr, uint64_t * pvincr, uintptr_t * pvphysaddr);
276 
277 #else /* XNU_KERNEL_PRIVATE */
278 
279 extern kern_return_t    kmem_alloc(
280 	vm_map_t        map,
281 	vm_offset_t     *addrp,
282 	vm_size_t       size);
283 
284 extern kern_return_t    kmem_alloc_pageable(
285 	vm_map_t        map,
286 	vm_offset_t     *addrp,
287 	vm_size_t       size);
288 
289 extern kern_return_t    kmem_alloc_kobject(
290 	vm_map_t        map,
291 	vm_offset_t     *addrp,
292 	vm_size_t       size);
293 
294 extern void             kmem_free(
295 	vm_map_t        map,
296 	vm_offset_t     addr,
297 	vm_size_t       size);
298 
299 #endif /* !XNU_KERNEL_PRIVATE */
300 
301 
302 #ifdef XNU_KERNEL_PRIVATE
303 typedef struct vm_allocation_site kern_allocation_name;
304 typedef kern_allocation_name * kern_allocation_name_t;
305 #else /* XNU_KERNEL_PRIVATE */
306 struct kern_allocation_name;
307 typedef struct kern_allocation_name * kern_allocation_name_t;
308 #endif /* !XNU_KERNEL_PRIVATE */
309 
310 extern kern_allocation_name_t   kern_allocation_name_allocate(const char * name, uint16_t suballocs);
311 extern void                     kern_allocation_name_release(kern_allocation_name_t allocation);
312 extern const char *             kern_allocation_get_name(kern_allocation_name_t allocation);
313 #ifdef XNU_KERNEL_PRIVATE
314 extern void                     kern_allocation_update_size(kern_allocation_name_t allocation, int64_t delta);
315 extern void                     kern_allocation_update_subtotal(kern_allocation_name_t allocation, uint32_t subtag, int64_t delta);
316 extern vm_tag_t                 kern_allocation_name_get_vm_tag(kern_allocation_name_t allocation);
317 #endif /* XNU_KERNEL_PRIVATE */
318 
319 #ifdef  MACH_KERNEL_PRIVATE
320 
321 extern void             kmem_init(
322 	vm_offset_t     start,
323 	vm_offset_t     end);
324 
325 extern kern_return_t    copyinmap(
326 	vm_map_t        map,
327 	vm_map_offset_t fromaddr,
328 	void            *todata,
329 	vm_size_t       length);
330 
331 extern kern_return_t    copyoutmap(
332 	vm_map_t        map,
333 	void            *fromdata,
334 	vm_map_offset_t toaddr,
335 	vm_size_t       length);
336 
337 extern kern_return_t    copyoutmap_atomic32(
338 	vm_map_t        map,
339 	uint32_t        value,
340 	vm_map_offset_t toaddr);
341 
342 extern kern_return_t    copyoutmap_atomic64(
343 	vm_map_t        map,
344 	uint64_t        value,
345 	vm_map_offset_t toaddr);
346 
347 extern kern_return_t    kmem_alloc_external(
348 	vm_map_t        map,
349 	vm_offset_t     *addrp,
350 	vm_size_t       size);
351 
352 extern kern_return_t    kmem_alloc_kobject_external(
353 	vm_map_t        map,
354 	vm_offset_t     *addrp,
355 	vm_size_t       size);
356 
357 extern kern_return_t    kmem_alloc_pageable_external(
358 	vm_map_t        map,
359 	vm_offset_t     *addrp,
360 	vm_size_t       size);
361 
362 #endif  /* MACH_KERNEL_PRIVATE */
363 
364 #ifdef XNU_KERNEL_PRIVATE
365 
366 extern kern_return_t    mach_vm_allocate_kernel(
367 	vm_map_t                map,
368 	mach_vm_offset_t        *addr,
369 	mach_vm_size_t          size,
370 	int                     flags,
371 	vm_tag_t                tag);
372 
373 extern kern_return_t    vm_allocate_kernel(
374 	vm_map_t                map,
375 	vm_offset_t             *addr,
376 	vm_size_t               size,
377 	int                     flags,
378 	vm_tag_t                tag);
379 
380 
381 extern kern_return_t mach_vm_map_kernel(
382 	vm_map_t                target_map,
383 	mach_vm_offset_t        *address,
384 	mach_vm_size_t          initial_size,
385 	mach_vm_offset_t        mask,
386 	int                     flags,
387 	vm_map_kernel_flags_t   vmk_flags,
388 	vm_tag_t                tag,
389 	ipc_port_t              port,
390 	vm_object_offset_t      offset,
391 	boolean_t               copy,
392 	vm_prot_t               cur_protection,
393 	vm_prot_t               max_protection,
394 	vm_inherit_t            inheritance);
395 
396 
397 extern kern_return_t vm_map_kernel(
398 	vm_map_t                target_map,
399 	vm_offset_t             *address,
400 	vm_size_t               size,
401 	vm_offset_t             mask,
402 	int                     flags,
403 	vm_map_kernel_flags_t   vmk_flags,
404 	vm_tag_t                tag,
405 	ipc_port_t              port,
406 	vm_offset_t             offset,
407 	boolean_t               copy,
408 	vm_prot_t               cur_protection,
409 	vm_prot_t               max_protection,
410 	vm_inherit_t            inheritance);
411 
412 extern kern_return_t mach_vm_remap_kernel(
413 	vm_map_t                target_map,
414 	mach_vm_offset_t        *address,
415 	mach_vm_size_t          size,
416 	mach_vm_offset_t        mask,
417 	int                     flags,
418 	vm_tag_t                tag,
419 	vm_map_t                src_map,
420 	mach_vm_offset_t        memory_address,
421 	boolean_t               copy,
422 	vm_prot_t               *cur_protection,
423 	vm_prot_t               *max_protection,
424 	vm_inherit_t            inheritance);
425 
426 extern kern_return_t vm_remap_kernel(
427 	vm_map_t                target_map,
428 	vm_offset_t             *address,
429 	vm_size_t               size,
430 	vm_offset_t             mask,
431 	int                     flags,
432 	vm_tag_t                tag,
433 	vm_map_t                src_map,
434 	vm_offset_t             memory_address,
435 	boolean_t               copy,
436 	vm_prot_t               *cur_protection,
437 	vm_prot_t               *max_protection,
438 	vm_inherit_t            inheritance);
439 
440 extern kern_return_t vm_map_64_kernel(
441 	vm_map_t                target_map,
442 	vm_offset_t             *address,
443 	vm_size_t               size,
444 	vm_offset_t             mask,
445 	int                     flags,
446 	vm_map_kernel_flags_t   vmk_flags,
447 	vm_tag_t                tag,
448 	ipc_port_t              port,
449 	vm_object_offset_t      offset,
450 	boolean_t               copy,
451 	vm_prot_t               cur_protection,
452 	vm_prot_t               max_protection,
453 	vm_inherit_t            inheritance);
454 
455 extern kern_return_t mach_vm_wire_kernel(
456 	host_priv_t             host_priv,
457 	vm_map_t                map,
458 	mach_vm_offset_t        start,
459 	mach_vm_size_t          size,
460 	vm_prot_t               access,
461 	vm_tag_t                tag);
462 
463 extern kern_return_t vm_map_wire_kernel(
464 	vm_map_t                map,
465 	vm_map_offset_t         start,
466 	vm_map_offset_t         end,
467 	vm_prot_t               caller_prot,
468 	vm_tag_t                tag,
469 	boolean_t               user_wire);
470 
471 extern kern_return_t vm_map_wire_and_extract_kernel(
472 	vm_map_t        map,
473 	vm_map_offset_t start,
474 	vm_prot_t       caller_prot,
475 	vm_tag_t        tag,
476 	boolean_t       user_wire,
477 	ppnum_t         *physpage_p);
478 
479 #endif  /* XNU_KERNEL_PRIVATE */
480 
481 extern vm_map_t kernel_map;
482 extern vm_map_t kernel_pageable_map;
483 extern vm_map_t ipc_kernel_map;
484 extern vm_map_t g_kext_map;
485 
486 #endif  /* KERNEL_PRIVATE */
487 
488 #ifdef KERNEL
489 
490 __BEGIN_DECLS
491 #if MACH_KERNEL_PRIVATE
492 extern vm_offset_t vm_kernel_addrhash(vm_offset_t addr)
493 __XNU_INTERNAL(vm_kernel_addrhash);
494 #else
495 extern vm_offset_t vm_kernel_addrhash(vm_offset_t addr);
496 #endif
497 __END_DECLS
498 
499 extern void vm_kernel_addrhide(
500 	vm_offset_t addr,
501 	vm_offset_t *hide_addr);
502 
503 extern vm_offset_t vm_kernel_addrperm_ext;
504 
505 extern void     vm_kernel_addrperm_external(
506 	vm_offset_t addr,
507 	vm_offset_t *perm_addr);
508 
509 extern void     vm_kernel_unslide_or_perm_external(
510 	vm_offset_t addr,
511 	vm_offset_t *up_addr);
512 
513 #if MACH_KERNEL_PRIVATE
514 extern uint64_t vm_kernel_addrhash_salt;
515 extern uint64_t vm_kernel_addrhash_salt_ext;
516 
517 extern void vm_kernel_addrhash_external(
518 	vm_offset_t addr,
519 	vm_offset_t *perm_addr);
520 #endif /* MACH_KERNEL_PRIVATE */
521 
522 extern void vm_init_before_launchd(void);
523 
524 #endif /* KERNEL */
525 
526 #ifdef __cplusplus
527 }
528 #endif
529 
530 #endif  /* _VM_VM_KERN_H_ */
531