]> git.saurik.com Git - apple/xnu.git/blame - osfmk/vm/vm_protos.h
xnu-7195.101.1.tar.gz
[apple/xnu.git] / osfmk / vm / vm_protos.h
CommitLineData
91447636 1/*
f427ee49 2 * Copyright (c) 2004-2020 Apple Inc. All rights reserved.
91447636 3 *
2d21ac55 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
0a7de745 5 *
2d21ac55
A
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.
0a7de745 14 *
2d21ac55
A
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
0a7de745 17 *
2d21ac55
A
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
8f6c56a5
A
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
2d21ac55
A
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.
0a7de745 25 *
2d21ac55 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
91447636
A
27 */
28
0a7de745 29#ifdef XNU_KERNEL_PRIVATE
91447636
A
30
31#ifndef _VM_VM_PROTOS_H_
32#define _VM_VM_PROTOS_H_
33
34#include <mach/mach_types.h>
35#include <kern/kern_types.h>
36
39037602
A
37#ifdef __cplusplus
38extern "C" {
39#endif
40
91447636
A
41/*
42 * This file contains various type definitions and routine prototypes
43 * that are needed to avoid compilation warnings for VM code (in osfmk,
44 * default_pager and bsd).
45 * Most of these should eventually go into more appropriate header files.
46 *
47 * Include it after all other header files since it doesn't include any
48 * type definitions and it works around some conflicts with other header
49 * files.
50 */
51
52/*
53 * iokit
54 */
55extern kern_return_t device_data_action(
0a7de745 56 uintptr_t device_handle,
91447636 57 ipc_port_t device_pager,
0a7de745
A
58 vm_prot_t protection,
59 vm_object_offset_t offset,
91447636
A
60 vm_size_t size);
61
62extern kern_return_t device_close(
b0d623f7 63 uintptr_t device_handle);
91447636 64
39037602 65extern boolean_t vm_swap_files_pinned(void);
91447636
A
66
67/*
68 * osfmk
69 */
91447636
A
70#ifndef _IPC_IPC_PORT_H_
71extern mach_port_name_t ipc_port_copyout_send(
0a7de745
A
72 ipc_port_t sright,
73 ipc_space_t space);
c3c9b80d
A
74extern mach_port_name_t ipc_port_copyout_send_pinned(
75 ipc_port_t sright,
76 ipc_space_t space);
91447636
A
77extern task_t port_name_to_task(
78 mach_port_name_t name);
c3c9b80d
A
79extern task_t port_name_to_task_read(
80 mach_port_name_t name);
f427ee49 81extern task_t port_name_to_task_name(
813fb2f6 82 mach_port_name_t name);
5ba3f43e 83extern void ipc_port_release_send(
0a7de745 84 ipc_port_t port);
91447636
A
85#endif /* _IPC_IPC_PORT_H_ */
86
87extern ipc_space_t get_task_ipcspace(
88 task_t t);
89
39037602 90#if CONFIG_MEMORYSTATUS
0a7de745 91extern int max_task_footprint_mb; /* Per-task limit on physical memory consumption in megabytes */
39037602 92#endif /* CONFIG_MEMORYSTATUS */
3e170ce0 93
91447636
A
94/* Some loose-ends VM stuff */
95
0a7de745
A
96extern vm_map_t kalloc_map;
97extern vm_size_t msg_ool_size_small;
91447636 98
f427ee49 99extern kern_return_t vm_tests(void);
91447636 100extern void consider_machine_adjust(void);
91447636
A
101extern vm_map_offset_t get_map_min(vm_map_t);
102extern vm_map_offset_t get_map_max(vm_map_t);
103extern vm_map_size_t get_vmmap_size(vm_map_t);
c3c9b80d 104extern int get_task_page_size(task_t);
39037602 105#if CONFIG_COREDUMP
91447636 106extern int get_vmmap_entries(vm_map_t);
39037602
A
107#endif
108extern int get_map_nentries(vm_map_t);
91447636 109
3e170ce0 110extern vm_map_offset_t vm_map_page_mask(vm_map_t);
39236c6e 111
5ba3f43e 112extern kern_return_t vm_map_purgable_control(
0a7de745
A
113 vm_map_t map,
114 vm_map_offset_t address,
115 vm_purgable_t control,
116 int *state);
5ba3f43e 117
cb323159
A
118#if MACH_ASSERT
119extern void vm_map_pmap_check_ledgers(
120 pmap_t pmap,
121 ledger_t ledger,
122 int pid,
123 char *procname);
124#endif /* MACH_ASSERT */
125
a39ff7e2
A
126extern kern_return_t
127vnode_pager_get_object_vnode(
128 memory_object_t mem_obj,
129 uintptr_t * vnodeaddr,
130 uint32_t * vid);
131
39037602 132#if CONFIG_COREDUMP
f427ee49 133extern boolean_t coredumpok(vm_map_t map, mach_vm_offset_t va);
39037602 134#endif
91447636
A
135
136/*
137 * VM routines that used to be published to
138 * user space, and are now restricted to the kernel.
139 *
140 * They should eventually go away entirely -
141 * to be replaced with standard vm_map() and
142 * vm_deallocate() calls.
143 */
144
145extern kern_return_t vm_upl_map
146(
147 vm_map_t target_task,
148 upl_t upl,
149 vm_address_t *address
150);
151
152extern kern_return_t vm_upl_unmap
153(
154 vm_map_t target_task,
155 upl_t upl
156);
157
158extern kern_return_t vm_region_object_create
159(
160 vm_map_t target_task,
161 vm_size_t size,
162 ipc_port_t *object_handle
163);
164
165extern mach_vm_offset_t mach_get_vm_start(vm_map_t);
166extern mach_vm_offset_t mach_get_vm_end(vm_map_t);
167
593a1d5f 168#if CONFIG_CODE_DECRYPTION
0a7de745 169#define VM_MAP_DEBUG_APPLE_PROTECT MACH_ASSERT
39037602
A
170#if VM_MAP_DEBUG_APPLE_PROTECT
171extern int vm_map_debug_apple_protect;
172#endif /* VM_MAP_DEBUG_APPLE_PROTECT */
593a1d5f 173struct pager_crypt_info;
0c530ab8 174extern kern_return_t vm_map_apple_protected(
0a7de745
A
175 vm_map_t map,
176 vm_map_offset_t start,
177 vm_map_offset_t end,
178 vm_object_offset_t crypto_backing_offset,
f427ee49
A
179 struct pager_crypt_info *crypt_info,
180 uint32_t cryptid);
3e170ce0 181extern memory_object_t apple_protect_pager_setup(
0a7de745
A
182 vm_object_t backing_object,
183 vm_object_offset_t backing_offset,
184 vm_object_offset_t crypto_backing_offset,
3e170ce0 185 struct pager_crypt_info *crypt_info,
0a7de745 186 vm_object_offset_t crypto_start,
c3c9b80d
A
187 vm_object_offset_t crypto_end,
188 boolean_t cache_pager);
0a7de745 189#endif /* CONFIG_CODE_DECRYPTION */
0c530ab8 190
d9a64523
A
191struct vm_shared_region_slide_info;
192extern kern_return_t vm_map_shared_region(
0a7de745
A
193 vm_map_t map,
194 vm_map_offset_t start,
195 vm_map_offset_t end,
196 vm_object_offset_t backing_offset,
d9a64523 197 struct vm_shared_region_slide_info *slide_info);
f427ee49 198
d9a64523 199extern memory_object_t shared_region_pager_setup(
0a7de745
A
200 vm_object_t backing_object,
201 vm_object_offset_t backing_offset,
f427ee49
A
202 struct vm_shared_region_slide_info *slide_info,
203 uint64_t jop_key);
204#if __has_feature(ptrauth_calls)
205extern memory_object_t shared_region_pager_match(
206 vm_object_t backing_object,
207 vm_object_offset_t backing_offset,
208 struct vm_shared_region_slide_info *slide_info,
209 uint64_t jop_key);
210extern void shared_region_key_alloc(
211 char *shared_region_id,
212 bool inherit,
213 uint64_t inherited_key);
214extern void shared_region_key_dealloc(
215 char *shared_region_id);
216extern uint64_t generate_jop_key(void);
217extern void shared_region_pager_match_task_key(memory_object_t memobj, task_t task);
218#endif /* __has_feature(ptrauth_calls) */
219extern bool vm_shared_region_is_reslide(struct task *task);
d9a64523 220
b0d623f7 221struct vnode;
b0d623f7
A
222extern memory_object_t swapfile_pager_setup(struct vnode *vp);
223extern memory_object_control_t swapfile_pager_control(memory_object_t mem_obj);
224
cb323159 225#if __arm64__ || (__ARM_ARCH_7K__ >= 2)
0a7de745
A
226#define SIXTEENK_PAGE_SIZE 0x4000
227#define SIXTEENK_PAGE_MASK 0x3FFF
228#define SIXTEENK_PAGE_SHIFT 14
cb323159 229#endif /* __arm64__ || (__ARM_ARCH_7K__ >= 2) */
3e170ce0 230
0a7de745
A
231#define FOURK_PAGE_SIZE 0x1000
232#define FOURK_PAGE_MASK 0xFFF
233#define FOURK_PAGE_SHIFT 12
5ba3f43e 234
f427ee49
A
235#if __arm64__
236
5ba3f43e
A
237extern unsigned int page_shift_user32;
238
0a7de745 239#define VM_MAP_DEBUG_FOURK MACH_ASSERT
5ba3f43e
A
240#if VM_MAP_DEBUG_FOURK
241extern int vm_map_debug_fourk;
242#endif /* VM_MAP_DEBUG_FOURK */
5ba3f43e
A
243extern memory_object_t fourk_pager_create(void);
244extern vm_object_t fourk_pager_to_vm_object(memory_object_t mem_obj);
245extern kern_return_t fourk_pager_populate(
246 memory_object_t mem_obj,
247 boolean_t overwrite,
248 int index,
249 vm_object_t new_backing_object,
250 vm_object_offset_t new_backing_offset,
251 vm_object_t *old_backing_object,
252 vm_object_offset_t *old_backing_offset);
253#endif /* __arm64__ */
91447636
A
254
255/*
256 * bsd
257 */
258struct vnode;
91447636
A
259extern void *upl_get_internal_page_list(
260 upl_t upl);
b0d623f7 261
fe8ab488 262extern void vnode_setswapmount(struct vnode *);
3e170ce0 263extern int64_t vnode_getswappin_avail(struct vnode *);
fe8ab488 264
d9a64523 265extern void vnode_pager_was_dirtied(
0a7de745 266 struct vnode *,
d9a64523
A
267 vm_object_offset_t,
268 vm_object_offset_t);
269
91447636 270typedef int pager_return_t;
0a7de745 271extern pager_return_t vnode_pagein(
91447636 272 struct vnode *, upl_t,
b0d623f7
A
273 upl_offset_t, vm_object_offset_t,
274 upl_size_t, int, int *);
0a7de745 275extern pager_return_t vnode_pageout(
91447636 276 struct vnode *, upl_t,
b0d623f7
A
277 upl_offset_t, vm_object_offset_t,
278 upl_size_t, int, int *);
0a7de745 279extern uint32_t vnode_trim(struct vnode *, int64_t offset, unsigned long len);
91447636
A
280extern memory_object_t vnode_pager_setup(
281 struct vnode *, memory_object_t);
282extern vm_object_offset_t vnode_pager_get_filesize(
283 struct vnode *);
b0d623f7
A
284extern uint32_t vnode_pager_isinuse(
285 struct vnode *);
6d2010ae
A
286extern boolean_t vnode_pager_isSSD(
287 struct vnode *);
288extern void vnode_pager_throttle(
289 void);
39236c6e 290extern uint32_t vnode_pager_return_throttle_io_limit(
b0d623f7 291 struct vnode *,
39236c6e 292 uint32_t *);
15129b1c 293extern kern_return_t vnode_pager_get_name(
0a7de745
A
294 struct vnode *vp,
295 char *pathname,
296 vm_size_t pathname_len,
297 char *filename,
298 vm_size_t filename_len,
299 boolean_t *truncated_path_p);
15129b1c
A
300struct timespec;
301extern kern_return_t vnode_pager_get_mtime(
0a7de745
A
302 struct vnode *vp,
303 struct timespec *mtime,
304 struct timespec *cs_mtime);
2d21ac55 305extern kern_return_t vnode_pager_get_cs_blobs(
0a7de745
A
306 struct vnode *vp,
307 void **blobs);
6d2010ae 308
fe8ab488
A
309#if CONFIG_IOSCHED
310void vnode_pager_issue_reprioritize_io(
0a7de745
A
311 struct vnode *devvp,
312 uint64_t blkno,
313 uint32_t len,
314 int priority);
fe8ab488
A
315#endif
316
0a7de745 317#if CHECK_CS_VALIDATION_BITMAP
6d2010ae 318/* used by the vnode_pager_cs_validation_bitmap routine*/
0a7de745
A
319#define CS_BITMAP_SET 1
320#define CS_BITMAP_CLEAR 2
321#define CS_BITMAP_CHECK 3
6d2010ae
A
322
323#endif /* CHECK_CS_VALIDATION_BITMAP */
b0d623f7 324
91447636
A
325extern kern_return_t
326vnode_pager_data_unlock(
0a7de745
A
327 memory_object_t mem_obj,
328 memory_object_offset_t offset,
329 memory_object_size_t size,
330 vm_prot_t desired_access);
91447636 331extern kern_return_t vnode_pager_init(
0a7de745
A
332 memory_object_t,
333 memory_object_control_t,
b0d623f7 334 memory_object_cluster_size_t);
91447636
A
335extern kern_return_t vnode_pager_get_object_size(
336 memory_object_t,
337 memory_object_offset_t *);
fe8ab488
A
338
339#if CONFIG_IOSCHED
340extern kern_return_t vnode_pager_get_object_devvp(
0a7de745
A
341 memory_object_t,
342 uintptr_t *);
fe8ab488
A
343#endif
344
d9a64523
A
345extern void vnode_pager_dirtied(
346 memory_object_t,
347 vm_object_offset_t,
348 vm_object_offset_t);
b0d623f7
A
349extern kern_return_t vnode_pager_get_isinuse(
350 memory_object_t,
351 uint32_t *);
6d2010ae
A
352extern kern_return_t vnode_pager_get_isSSD(
353 memory_object_t,
354 boolean_t *);
39236c6e 355extern kern_return_t vnode_pager_get_throttle_io_limit(
b0d623f7 356 memory_object_t,
39236c6e 357 uint32_t *);
15129b1c 358extern kern_return_t vnode_pager_get_object_name(
0a7de745
A
359 memory_object_t mem_obj,
360 char *pathname,
361 vm_size_t pathname_len,
362 char *filename,
363 vm_size_t filename_len,
364 boolean_t *truncated_path_p);
15129b1c 365extern kern_return_t vnode_pager_get_object_mtime(
0a7de745 366 memory_object_t mem_obj,
15129b1c 367 struct timespec *mtime,
0a7de745 368 struct timespec *cs_mtime);
6d2010ae 369
0a7de745
A
370#if CHECK_CS_VALIDATION_BITMAP
371extern kern_return_t vnode_pager_cs_check_validation_bitmap(
372 memory_object_t mem_obj,
373 memory_object_offset_t offset,
374 int optype);
6d2010ae
A
375#endif /*CHECK_CS_VALIDATION_BITMAP*/
376
0a7de745
A
377extern kern_return_t ubc_cs_check_validation_bitmap(
378 struct vnode *vp,
6d2010ae
A
379 memory_object_offset_t offset,
380 int optype);
381
0a7de745
A
382extern kern_return_t vnode_pager_data_request(
383 memory_object_t,
2d21ac55 384 memory_object_offset_t,
b0d623f7 385 memory_object_cluster_size_t,
2d21ac55
A
386 vm_prot_t,
387 memory_object_fault_info_t);
91447636
A
388extern kern_return_t vnode_pager_data_return(
389 memory_object_t,
390 memory_object_offset_t,
b0d623f7 391 memory_object_cluster_size_t,
91447636
A
392 memory_object_offset_t *,
393 int *,
394 boolean_t,
395 boolean_t,
396 int);
397extern kern_return_t vnode_pager_data_initialize(
398 memory_object_t,
399 memory_object_offset_t,
b0d623f7 400 memory_object_cluster_size_t);
91447636 401extern void vnode_pager_reference(
0a7de745 402 memory_object_t mem_obj);
91447636 403extern kern_return_t vnode_pager_synchronize(
0a7de745
A
404 memory_object_t mem_obj,
405 memory_object_offset_t offset,
406 memory_object_size_t length,
407 vm_sync_t sync_flags);
593a1d5f 408extern kern_return_t vnode_pager_map(
0a7de745
A
409 memory_object_t mem_obj,
410 vm_prot_t prot);
593a1d5f 411extern kern_return_t vnode_pager_last_unmap(
0a7de745 412 memory_object_t mem_obj);
91447636
A
413extern void vnode_pager_deallocate(
414 memory_object_t);
415extern kern_return_t vnode_pager_terminate(
416 memory_object_t);
417extern void vnode_pager_vrele(
418 struct vnode *vp);
39037602
A
419extern struct vnode *vnode_pager_lookup_vnode(
420 memory_object_t);
421
593a1d5f
A
422extern int ubc_map(
423 struct vnode *vp,
424 int flags);
91447636
A
425extern void ubc_unmap(
426 struct vnode *vp);
427
b0d623f7
A
428struct vm_map_entry;
429extern struct vm_object *find_vnode_object(struct vm_map_entry *entry);
430
91447636
A
431extern void device_pager_reference(memory_object_t);
432extern void device_pager_deallocate(memory_object_t);
433extern kern_return_t device_pager_init(memory_object_t,
0a7de745
A
434 memory_object_control_t,
435 memory_object_cluster_size_t);
436extern kern_return_t device_pager_terminate(memory_object_t);
437extern kern_return_t device_pager_data_request(memory_object_t,
438 memory_object_offset_t,
439 memory_object_cluster_size_t,
440 vm_prot_t,
441 memory_object_fault_info_t);
91447636 442extern kern_return_t device_pager_data_return(memory_object_t,
0a7de745
A
443 memory_object_offset_t,
444 memory_object_cluster_size_t,
445 memory_object_offset_t *,
446 int *,
447 boolean_t,
448 boolean_t,
449 int);
91447636 450extern kern_return_t device_pager_data_initialize(memory_object_t,
0a7de745
A
451 memory_object_offset_t,
452 memory_object_cluster_size_t);
91447636 453extern kern_return_t device_pager_data_unlock(memory_object_t,
0a7de745
A
454 memory_object_offset_t,
455 memory_object_size_t,
456 vm_prot_t);
91447636 457extern kern_return_t device_pager_synchronize(memory_object_t,
0a7de745
A
458 memory_object_offset_t,
459 memory_object_size_t,
460 vm_sync_t);
593a1d5f
A
461extern kern_return_t device_pager_map(memory_object_t, vm_prot_t);
462extern kern_return_t device_pager_last_unmap(memory_object_t);
91447636 463extern kern_return_t device_pager_populate_object(
0a7de745
A
464 memory_object_t device,
465 memory_object_offset_t offset,
466 ppnum_t page_num,
467 vm_size_t size);
91447636
A
468extern memory_object_t device_pager_setup(
469 memory_object_t,
b0d623f7 470 uintptr_t,
91447636
A
471 vm_size_t,
472 int);
f427ee49 473
39037602 474extern boolean_t is_device_pager_ops(const struct memory_object_pager_ops *pager_ops);
39236c6e
A
475
476extern kern_return_t pager_map_to_phys_contiguous(
0a7de745
A
477 memory_object_control_t object,
478 memory_object_offset_t offset,
479 addr64_t base_vaddr,
480 vm_size_t size);
91447636
A
481
482extern kern_return_t memory_object_create_named(
0a7de745
A
483 memory_object_t pager,
484 memory_object_offset_t size,
485 memory_object_control_t *control);
91447636 486
b0d623f7
A
487struct macx_triggers_args;
488extern int mach_macx_triggers(
0a7de745 489 struct macx_triggers_args *args);
91447636
A
490
491extern int macx_swapinfo(
0a7de745
A
492 memory_object_size_t *total_p,
493 memory_object_size_t *avail_p,
494 vm_size_t *pagesize_p,
495 boolean_t *encrypted_p);
91447636 496
2d21ac55 497extern void log_stack_execution_failure(addr64_t vaddr, vm_prot_t prot);
39037602
A
498extern void log_unnest_badness(
499 vm_map_t map,
500 vm_map_offset_t start_unnest,
501 vm_map_offset_t end_unnest,
502 boolean_t is_nested_map,
503 vm_map_offset_t lowest_unnestable_addr);
b0d623f7 504
39236c6e 505struct proc;
cb323159 506struct proc *current_proc(void);
b0d623f7 507extern int cs_allow_invalid(struct proc *p);
39037602 508extern int cs_invalid_page(addr64_t vaddr, boolean_t *cs_killed);
c18c124e 509
0a7de745
A
510#define CS_VALIDATE_TAINTED 0x00000001
511#define CS_VALIDATE_NX 0x00000002
39037602 512extern boolean_t cs_validate_range(struct vnode *vp,
0a7de745
A
513 memory_object_t pager,
514 memory_object_offset_t offset,
515 const void *data,
516 vm_size_t size,
517 unsigned *result);
f427ee49
A
518extern void cs_validate_page(
519 struct vnode *vp,
520 memory_object_t pager,
521 memory_object_offset_t offset,
522 const void *data,
523 int *validated_p,
524 int *tainted_p,
525 int *nx_p);
2d21ac55 526
5ba3f43e 527extern kern_return_t memory_entry_purgeable_control_internal(
0a7de745
A
528 ipc_port_t entry_port,
529 vm_purgable_t control,
530 int *state);
5ba3f43e 531
d9a64523 532extern kern_return_t memory_entry_access_tracking_internal(
0a7de745
A
533 ipc_port_t entry_port,
534 int *access_tracking,
535 uint32_t *access_tracking_reads,
536 uint32_t *access_tracking_writes);
d9a64523 537
2d21ac55 538extern kern_return_t mach_memory_entry_purgable_control(
0a7de745
A
539 ipc_port_t entry_port,
540 vm_purgable_t control,
541 int *state);
2d21ac55 542
39236c6e 543extern kern_return_t mach_memory_entry_get_page_counts(
0a7de745
A
544 ipc_port_t entry_port,
545 unsigned int *resident_page_count,
546 unsigned int *dirty_page_count);
39236c6e 547
f427ee49
A
548extern kern_return_t mach_memory_entry_phys_page_offset(
549 ipc_port_t entry_port,
550 vm_object_offset_t *offset_p);
551
552extern kern_return_t mach_memory_entry_map_size(
553 ipc_port_t entry_port,
554 vm_map_t map,
555 memory_object_offset_t offset,
556 memory_object_offset_t size,
557 mach_vm_size_t *map_size);
558
559extern kern_return_t vm_map_range_physical_size(
560 vm_map_t map,
561 vm_map_address_t start,
562 mach_vm_size_t size,
563 mach_vm_size_t * phys_size);
564
2d21ac55 565extern kern_return_t mach_memory_entry_page_op(
0a7de745
A
566 ipc_port_t entry_port,
567 vm_object_offset_t offset,
568 int ops,
569 ppnum_t *phys_entry,
570 int *flags);
2d21ac55
A
571
572extern kern_return_t mach_memory_entry_range_op(
0a7de745
A
573 ipc_port_t entry_port,
574 vm_object_offset_t offset_beg,
575 vm_object_offset_t offset_end,
2d21ac55
A
576 int ops,
577 int *range);
578
579extern void mach_memory_entry_port_release(ipc_port_t port);
580extern void mach_destroy_memory_entry(ipc_port_t port);
581extern kern_return_t mach_memory_entry_allocate(
582 struct vm_named_entry **user_entry_p,
583 ipc_port_t *user_handle_p);
f427ee49
A
584extern vm_object_t vm_named_entry_to_vm_object(
585 vm_named_entry_t named_entry);
586extern kern_return_t vm_named_entry_from_vm_object(
587 vm_named_entry_t named_entry,
588 vm_object_t object,
589 vm_object_offset_t offset,
590 vm_object_size_t size,
591 vm_prot_t prot);
2d21ac55
A
592
593extern void vm_paging_map_init(void);
0c530ab8 594
b0d623f7
A
595extern int macx_backing_store_compaction(int flags);
596extern unsigned int mach_vm_ctl_page_free_wanted(void);
597
fe8ab488 598extern int no_paging_space_action(void);
6d2010ae 599
c3c9b80d
A
600/*
601 * counts updated by revalidate_text_page()
602 */
603extern unsigned int vmtc_total; /* total # of text page corruptions detected */
604extern unsigned int vmtc_undiagnosed; /* of that what wasn't diagnosed */
605extern unsigned int vmtc_not_eligible; /* failed to correct, due to page attributes */
606extern unsigned int vmtc_copyin_fail; /* of undiagnosed, copyin failure count */
607extern unsigned int vmtc_not_found; /* of diagnosed, no error found - code signing error? */
608extern unsigned int vmtc_one_bit_flip; /* of diagnosed, single bit errors */
609#define MAX_TRACK_POWER2 9 /* of diagnosed, counts of 1, 2, 4,... bytes corrupted */
610extern unsigned int vmtc_byte_counts[MAX_TRACK_POWER2 + 1];
611
612extern kern_return_t revalidate_text_page(task_t, vm_map_offset_t);
613
0a7de745
A
614#define VM_TOGGLE_CLEAR 0
615#define VM_TOGGLE_SET 1
616#define VM_TOGGLE_GETVALUE 999
6d2010ae 617int vm_toggle_entry_reuse(int, int*);
39236c6e 618
0a7de745
A
619#define SWAP_WRITE 0x00000000 /* Write buffer (pseudo flag). */
620#define SWAP_READ 0x00000001 /* Read buffer. */
621#define SWAP_ASYNC 0x00000002 /* Start I/O, do not wait. */
39236c6e
A
622
623extern void vm_compressor_pager_init(void);
624extern kern_return_t compressor_memory_object_create(
22ba694c 625 memory_object_size_t,
39236c6e
A
626 memory_object_t *);
627
3e170ce0 628extern boolean_t vm_compressor_low_on_space(void);
5ba3f43e 629extern boolean_t vm_compressor_out_of_space(void);
0a7de745
A
630extern int vm_swap_low_on_space(void);
631void do_fastwake_warmup_all(void);
fe8ab488
A
632#if CONFIG_JETSAM
633extern int proc_get_memstat_priority(struct proc*, boolean_t);
634#endif /* CONFIG_JETSAM */
635
39236c6e
A
636/* the object purger. purges the next eligible object from memory. */
637/* returns TRUE if an object was purged, otherwise FALSE. */
638boolean_t vm_purgeable_object_purge_one_unlocked(int force_purge_below_group);
0a7de745
A
639void vm_purgeable_nonvolatile_owner_update(task_t owner,
640 int delta);
641void vm_purgeable_volatile_owner_update(task_t owner,
642 int delta);
cb323159 643void vm_owned_objects_disown(task_t task);
d9a64523 644
39236c6e
A
645
646struct trim_list {
0a7de745
A
647 uint64_t tl_offset;
648 uint64_t tl_length;
39236c6e
A
649 struct trim_list *tl_next;
650};
651
fe8ab488
A
652u_int32_t vnode_trim_list(struct vnode *vp, struct trim_list *tl, boolean_t route_only);
653
0a7de745
A
654#define MAX_SWAPFILENAME_LEN 1024
655#define SWAPFILENAME_INDEX_LEN 2 /* Doesn't include the terminating NULL character */
fe8ab488 656
0a7de745 657extern char swapfilename[MAX_SWAPFILENAME_LEN + 1];
fe8ab488
A
658
659struct vm_counters {
0a7de745
A
660 unsigned int do_collapse_compressor;
661 unsigned int do_collapse_compressor_pages;
662 unsigned int do_collapse_terminate;
663 unsigned int do_collapse_terminate_failure;
664 unsigned int should_cow_but_wired;
665 unsigned int create_upl_extra_cow;
666 unsigned int create_upl_extra_cow_pages;
667 unsigned int create_upl_lookup_failure_write;
668 unsigned int create_upl_lookup_failure_copy;
fe8ab488
A
669};
670extern struct vm_counters vm_counters;
39236c6e 671
39037602
A
672#if CONFIG_SECLUDED_MEMORY
673struct vm_page_secluded_data {
0a7de745
A
674 int eligible_for_secluded;
675 int grab_success_free;
676 int grab_success_other;
677 int grab_failure_locked;
678 int grab_failure_state;
679 int grab_failure_dirty;
680 int grab_for_iokit;
681 int grab_for_iokit_success;
39037602
A
682};
683extern struct vm_page_secluded_data vm_page_secluded;
684
685extern int num_tasks_can_use_secluded_mem;
686
687/* boot-args */
688extern int secluded_for_apps;
689extern int secluded_for_iokit;
690extern int secluded_for_filecache;
691#if 11
692extern int secluded_for_fbdp;
693#endif
694
cb323159 695extern uint64_t vm_page_secluded_drain(void);
0a7de745
A
696extern void memory_object_mark_eligible_for_secluded(
697 memory_object_control_t control,
698 boolean_t eligible_for_secluded);
39037602
A
699
700#endif /* CONFIG_SECLUDED_MEMORY */
701
0a7de745 702#define MAX_PAGE_RANGE_QUERY (1ULL * 1024 * 1024 * 1024) /* 1 GB */
5ba3f43e 703
9d749ea3 704extern kern_return_t mach_make_memory_entry_internal(
0a7de745
A
705 vm_map_t target_map,
706 memory_object_size_t *size,
9d749ea3 707 memory_object_offset_t offset,
0a7de745 708 vm_prot_t permission,
cb323159 709 vm_named_entry_kernel_flags_t vmne_kflags,
0a7de745
A
710 ipc_port_t *object_handle,
711 ipc_port_t parent_handle);
9d749ea3 712
f427ee49
A
713extern kern_return_t
714memory_entry_check_for_adjustment(
715 vm_map_t src_map,
716 ipc_port_t port,
717 vm_map_offset_t *overmap_start,
718 vm_map_offset_t *overmap_end);
719
0a7de745
A
720#define roundup(x, y) ((((x) % (y)) == 0) ? \
721 (x) : ((x) + ((y) - ((x) % (y)))))
d9a64523 722
39037602
A
723#ifdef __cplusplus
724}
725#endif
726
d9a64523
A
727/*
728 * Flags for the VM swapper/reclaimer.
729 * Used by vm_swap_consider_defragment()
730 * to force defrag/reclaim by the swap
731 * GC thread.
732 */
733#define VM_SWAP_FLAGS_NONE 0
734#define VM_SWAP_FLAGS_FORCE_DEFRAG 1
735#define VM_SWAP_FLAGS_FORCE_RECLAIM 2
736
cb323159
A
737#if __arm64__
738/*
739 * Flags to control the behavior of
740 * the legacy footprint entitlement.
741 */
742#define LEGACY_FOOTPRINT_ENTITLEMENT_IGNORE (1)
743#define LEGACY_FOOTPRINT_ENTITLEMENT_IOS11_ACCT (2)
744#define LEGACY_FOOTPRINT_ENTITLEMENT_LIMIT_INCREASE (3)
745
746#endif /* __arm64__ */
747
f427ee49
A
748#if MACH_ASSERT
749struct proc;
750extern struct proc *current_proc(void);
751extern int proc_pid(struct proc *);
752extern char *proc_best_name(struct proc *);
753struct thread;
754extern uint64_t thread_tid(struct thread *);
755extern int debug4k_filter;
756extern int debug4k_proc_filter;
757extern char debug4k_proc_name[];
758extern const char *debug4k_category_name[];
759
760#define __DEBUG4K(category, fmt, ...) \
761 MACRO_BEGIN \
762 int __category = (category); \
763 struct thread *__t = NULL; \
764 struct proc *__p = NULL; \
765 const char *__pname = "?"; \
766 boolean_t __do_log = FALSE; \
767 \
768 if ((1 << __category) & debug4k_filter) { \
769 __do_log = TRUE; \
770 } else if (((1 << __category) & debug4k_proc_filter) && \
771 debug4k_proc_name[0] != '\0') { \
772 __p = current_proc(); \
773 if (__p != NULL) { \
774 __pname = proc_best_name(__p); \
775 } \
776 if (!strcmp(debug4k_proc_name, __pname)) { \
777 __do_log = TRUE; \
778 } \
779 } \
780 if (__do_log) { \
781 if (__p == NULL) { \
782 __p = current_proc(); \
783 if (__p != NULL) { \
784 __pname = proc_best_name(__p); \
785 } \
786 } \
787 __t = current_thread(); \
788 printf("DEBUG4K(%s) %d[%s] %p(0x%llx) %s:%d: " fmt, \
789 debug4k_category_name[__category], \
790 __p ? proc_pid(__p) : 0, \
791 __pname, \
792 __t, \
793 thread_tid(__t), \
794 __FUNCTION__, \
795 __LINE__, \
796 ##__VA_ARGS__); \
797 } \
798 MACRO_END
799
800#define __DEBUG4K_ERROR 0
801#define __DEBUG4K_LIFE 1
802#define __DEBUG4K_LOAD 2
803#define __DEBUG4K_FAULT 3
804#define __DEBUG4K_COPY 4
805#define __DEBUG4K_SHARE 5
806#define __DEBUG4K_ADJUST 6
807#define __DEBUG4K_PMAP 7
808#define __DEBUG4K_MEMENTRY 8
809#define __DEBUG4K_IOKIT 9
810#define __DEBUG4K_UPL 10
811#define __DEBUG4K_EXC 11
812#define __DEBUG4K_VFS 12
813
814#define DEBUG4K_ERROR(...) __DEBUG4K(__DEBUG4K_ERROR, ##__VA_ARGS__)
815#define DEBUG4K_LIFE(...) __DEBUG4K(__DEBUG4K_LIFE, ##__VA_ARGS__)
816#define DEBUG4K_LOAD(...) __DEBUG4K(__DEBUG4K_LOAD, ##__VA_ARGS__)
817#define DEBUG4K_FAULT(...) __DEBUG4K(__DEBUG4K_FAULT, ##__VA_ARGS__)
818#define DEBUG4K_COPY(...) __DEBUG4K(__DEBUG4K_COPY, ##__VA_ARGS__)
819#define DEBUG4K_SHARE(...) __DEBUG4K(__DEBUG4K_SHARE, ##__VA_ARGS__)
820#define DEBUG4K_ADJUST(...) __DEBUG4K(__DEBUG4K_ADJUST, ##__VA_ARGS__)
821#define DEBUG4K_PMAP(...) __DEBUG4K(__DEBUG4K_PMAP, ##__VA_ARGS__)
822#define DEBUG4K_MEMENTRY(...) __DEBUG4K(__DEBUG4K_MEMENTRY, ##__VA_ARGS__)
823#define DEBUG4K_IOKIT(...) __DEBUG4K(__DEBUG4K_IOKIT, ##__VA_ARGS__)
824#define DEBUG4K_UPL(...) __DEBUG4K(__DEBUG4K_UPL, ##__VA_ARGS__)
825#define DEBUG4K_EXC(...) __DEBUG4K(__DEBUG4K_EXC, ##__VA_ARGS__)
826#define DEBUG4K_VFS(...) __DEBUG4K(__DEBUG4K_VFS, ##__VA_ARGS__)
827
828#else /* MACH_ASSERT */
829
830#define DEBUG4K_ERROR(...)
831#define DEBUG4K_LIFE(...)
832#define DEBUG4K_LOAD(...)
833#define DEBUG4K_FAULT(...)
834#define DEBUG4K_COPY(...)
835#define DEBUG4K_SHARE(...)
836#define DEBUG4K_ADJUST(...)
837#define DEBUG4K_PMAP(...)
838#define DEBUG4K_MEMENTRY(...)
839#define DEBUG4K_IOKIT(...)
840#define DEBUG4K_UPL(...)
841#define DEBUG4K_EXC(...)
842#define DEBUG4K_VFS(...)
843
844#endif /* MACH_ASSERT */
845
0a7de745 846#endif /* _VM_VM_PROTOS_H_ */
91447636 847
0a7de745 848#endif /* XNU_KERNEL_PRIVATE */