1 /*
2 * Copyright (c) 2000-2020 Apple 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: mach/vm_statistics.h
60 * Author: Avadis Tevanian, Jr., Michael Wayne Young, David Golub
61 *
62 * Virtual memory statistics structure.
63 *
64 */
65
66 #ifndef _MACH_VM_STATISTICS_H_
67 #define _MACH_VM_STATISTICS_H_
68
69 #include <stdbool.h>
70 #include <sys/cdefs.h>
71
72 #include <mach/machine/vm_types.h>
73 #include <mach/machine/kern_return.h>
74
75 __BEGIN_DECLS
76
77 /*
78 * vm_statistics
79 *
80 * History:
81 * rev0 - original structure.
82 * rev1 - added purgable info (purgable_count and purges).
83 * rev2 - added speculative_count.
84 *
85 * Note: you cannot add any new fields to this structure. Add them below in
86 * vm_statistics64.
87 */
88
89 struct vm_statistics {
90 natural_t free_count; /* # of pages free */
91 natural_t active_count; /* # of pages active */
92 natural_t inactive_count; /* # of pages inactive */
93 natural_t wire_count; /* # of pages wired down */
94 natural_t zero_fill_count; /* # of zero fill pages */
95 natural_t reactivations; /* # of pages reactivated */
96 natural_t pageins; /* # of pageins */
97 natural_t pageouts; /* # of pageouts */
98 natural_t faults; /* # of faults */
99 natural_t cow_faults; /* # of copy-on-writes */
100 natural_t lookups; /* object cache lookups */
101 natural_t hits; /* object cache hits */
102
103 /* added for rev1 */
104 natural_t purgeable_count; /* # of pages purgeable */
105 natural_t purges; /* # of pages purged */
106
107 /* added for rev2 */
108 /*
109 * NB: speculative pages are already accounted for in "free_count",
110 * so "speculative_count" is the number of "free" pages that are
111 * used to hold data that was read speculatively from disk but
112 * haven't actually been used by anyone so far.
113 */
114 natural_t speculative_count; /* # of pages speculative */
115 };
116
117 /* Used by all architectures */
118 typedef struct vm_statistics *vm_statistics_t;
119 typedef struct vm_statistics vm_statistics_data_t;
120
121 /*
122 * vm_statistics64
123 *
124 * History:
125 * rev0 - original structure.
126 * rev1 - added purgable info (purgable_count and purges).
127 * rev2 - added speculative_count.
128 * ----
129 * rev3 - changed name to vm_statistics64.
130 * changed some fields in structure to 64-bit on
131 * arm, i386 and x86_64 architectures.
132 * rev4 - require 64-bit alignment for efficient access
133 * in the kernel. No change to reported data.
134 *
135 */
136
137 struct vm_statistics64 {
138 natural_t free_count; /* # of pages free */
139 natural_t active_count; /* # of pages active */
140 natural_t inactive_count; /* # of pages inactive */
141 natural_t wire_count; /* # of pages wired down */
142 uint64_t zero_fill_count; /* # of zero fill pages */
143 uint64_t reactivations; /* # of pages reactivated */
144 uint64_t pageins; /* # of pageins */
145 uint64_t pageouts; /* # of pageouts */
146 uint64_t faults; /* # of faults */
147 uint64_t cow_faults; /* # of copy-on-writes */
148 uint64_t lookups; /* object cache lookups */
149 uint64_t hits; /* object cache hits */
150 uint64_t purges; /* # of pages purged */
151 natural_t purgeable_count; /* # of pages purgeable */
152 /*
153 * NB: speculative pages are already accounted for in "free_count",
154 * so "speculative_count" is the number of "free" pages that are
155 * used to hold data that was read speculatively from disk but
156 * haven't actually been used by anyone so far.
157 */
158 natural_t speculative_count; /* # of pages speculative */
159
160 /* added for rev1 */
161 uint64_t decompressions; /* # of pages decompressed */
162 uint64_t compressions; /* # of pages compressed */
163 uint64_t swapins; /* # of pages swapped in (via compression segments) */
164 uint64_t swapouts; /* # of pages swapped out (via compression segments) */
165 natural_t compressor_page_count; /* # of pages used by the compressed pager to hold all the compressed data */
166 natural_t throttled_count; /* # of pages throttled */
167 natural_t external_page_count; /* # of pages that are file-backed (non-swap) */
168 natural_t internal_page_count; /* # of pages that are anonymous */
169 uint64_t total_uncompressed_pages_in_compressor; /* # of pages (uncompressed) held within the compressor. */
170 } __attribute__((aligned(8)));
171
172 typedef struct vm_statistics64 *vm_statistics64_t;
173 typedef struct vm_statistics64 vm_statistics64_data_t;
174
175 kern_return_t vm_stats(void *info, unsigned int *count);
176
177 /*
178 * VM_STATISTICS_TRUNCATE_TO_32_BIT
179 *
180 * This is used by host_statistics() to truncate and peg the 64-bit in-kernel values from
181 * vm_statistics64 to the 32-bit values of the older structure above (vm_statistics).
182 */
183 #define VM_STATISTICS_TRUNCATE_TO_32_BIT(value) ((uint32_t)(((value) > UINT32_MAX ) ? UINT32_MAX : (value)))
184
185 /*
186 * vm_extmod_statistics
187 *
188 * Structure to record modifications to a task by an
189 * external agent.
190 *
191 * History:
192 * rev0 - original structure.
193 */
194
195 struct vm_extmod_statistics {
196 int64_t task_for_pid_count; /* # of times task port was looked up */
197 int64_t task_for_pid_caller_count; /* # of times this task called task_for_pid */
198 int64_t thread_creation_count; /* # of threads created in task */
199 int64_t thread_creation_caller_count; /* # of threads created by task */
200 int64_t thread_set_state_count; /* # of register state sets in task */
201 int64_t thread_set_state_caller_count; /* # of register state sets by task */
202 } __attribute__((aligned(8)));
203
204 typedef struct vm_extmod_statistics *vm_extmod_statistics_t;
205 typedef struct vm_extmod_statistics vm_extmod_statistics_data_t;
206
207 typedef struct vm_purgeable_stat {
208 uint64_t count;
209 uint64_t size;
210 }vm_purgeable_stat_t;
211
212 struct vm_purgeable_info {
213 vm_purgeable_stat_t fifo_data[8];
214 vm_purgeable_stat_t obsolete_data;
215 vm_purgeable_stat_t lifo_data[8];
216 };
217
218 typedef struct vm_purgeable_info *vm_purgeable_info_t;
219
220 /* included for the vm_map_page_query call */
221
222 #define VM_PAGE_QUERY_PAGE_PRESENT 0x1
223 #define VM_PAGE_QUERY_PAGE_FICTITIOUS 0x2
224 #define VM_PAGE_QUERY_PAGE_REF 0x4
225 #define VM_PAGE_QUERY_PAGE_DIRTY 0x8
226 #define VM_PAGE_QUERY_PAGE_PAGED_OUT 0x10
227 #define VM_PAGE_QUERY_PAGE_COPIED 0x20
228 #define VM_PAGE_QUERY_PAGE_SPECULATIVE 0x40
229 #define VM_PAGE_QUERY_PAGE_EXTERNAL 0x80
230 #define VM_PAGE_QUERY_PAGE_CS_VALIDATED 0x100
231 #define VM_PAGE_QUERY_PAGE_CS_TAINTED 0x200
232 #define VM_PAGE_QUERY_PAGE_CS_NX 0x400
233 #define VM_PAGE_QUERY_PAGE_REUSABLE 0x800
234
235 /*
236 * VM allocation flags:
237 *
238 * VM_FLAGS_FIXED
239 * (really the absence of VM_FLAGS_ANYWHERE)
240 * Allocate new VM region at the specified virtual address, if possible.
241 *
242 * VM_FLAGS_ANYWHERE
243 * Allocate new VM region anywhere it would fit in the address space.
244 *
245 * VM_FLAGS_PURGABLE
246 * Create a purgable VM object for that new VM region.
247 *
248 * VM_FLAGS_4GB_CHUNK
249 * The new VM region will be chunked up into 4GB sized pieces.
250 *
251 * VM_FLAGS_NO_PMAP_CHECK
252 * (for DEBUG kernel config only, ignored for other configs)
253 * Do not check that there is no stale pmap mapping for the new VM region.
254 * This is useful for kernel memory allocations at bootstrap when building
255 * the initial kernel address space while some memory is already in use.
256 *
257 * VM_FLAGS_OVERWRITE
258 * The new VM region can replace existing VM regions if necessary
259 * (to be used in combination with VM_FLAGS_FIXED).
260 *
261 * VM_FLAGS_NO_CACHE
262 * Pages brought in to this VM region are placed on the speculative
263 * queue instead of the active queue. In other words, they are not
264 * cached so that they will be stolen first if memory runs low.
265 */
266
267 #define VM_FLAGS_FIXED 0x00000000
268 #define VM_FLAGS_ANYWHERE 0x00000001
269 #define VM_FLAGS_PURGABLE 0x00000002
270 #define VM_FLAGS_4GB_CHUNK 0x00000004
271 #define VM_FLAGS_RANDOM_ADDR 0x00000008
272 #define VM_FLAGS_NO_CACHE 0x00000010
273 #define VM_FLAGS_RESILIENT_CODESIGN 0x00000020
274 #define VM_FLAGS_RESILIENT_MEDIA 0x00000040
275 #define VM_FLAGS_PERMANENT 0x00000080
276 #define VM_FLAGS_TPRO 0x00001000
277 #define VM_FLAGS_OVERWRITE 0x00004000 /* delete any existing mappings first */
278 /*
279 * VM_FLAGS_SUPERPAGE_MASK
280 * 3 bits that specify whether large pages should be used instead of
281 * base pages (!=0), as well as the requested page size.
282 */
283 #define VM_FLAGS_SUPERPAGE_MASK 0x00070000 /* bits 0x10000, 0x20000, 0x40000 */
284 #define VM_FLAGS_RETURN_DATA_ADDR 0x00100000 /* Return address of target data, rather than base of page */
285 #define VM_FLAGS_RETURN_4K_DATA_ADDR 0x00800000 /* Return 4K aligned address of target data */
286 #define VM_FLAGS_ALIAS_MASK 0xFF000000
287 #define VM_GET_FLAGS_ALIAS(flags, alias) \
288 (alias) = (((flags) >> 24) & 0xff)
289 #if !XNU_KERNEL_PRIVATE
290 #define VM_SET_FLAGS_ALIAS(flags, alias) \
291 (flags) = (((flags) & ~VM_FLAGS_ALIAS_MASK) | \
292 (((alias) & ~VM_FLAGS_ALIAS_MASK) << 24))
293 #endif /* !XNU_KERNEL_PRIVATE */
294
295 #if XNU_KERNEL_PRIVATE
296 /*
297 * When making a new VM_FLAG_*:
298 * - add it to this mask
299 * - add a vmf_* field to vm_map_kernel_flags_t in the right spot
300 * - add a check in vm_map_kernel_flags_check_vmflags()
301 * - update tests vm_parameter_validation_[user|kern] and their expected
302 * results; they deliberately call VM functions with invalid flag values
303 * and you may be turning one of those invalid flags valid.
304 */
305 #define VM_FLAGS_ANY_MASK (VM_FLAGS_FIXED | \
306 VM_FLAGS_ANYWHERE | \
307 VM_FLAGS_PURGABLE | \
308 VM_FLAGS_4GB_CHUNK | \
309 VM_FLAGS_RANDOM_ADDR | \
310 VM_FLAGS_NO_CACHE | \
311 VM_FLAGS_RESILIENT_CODESIGN | \
312 VM_FLAGS_RESILIENT_MEDIA | \
313 VM_FLAGS_PERMANENT | \
314 VM_FLAGS_TPRO | \
315 VM_FLAGS_OVERWRITE | \
316 VM_FLAGS_SUPERPAGE_MASK | \
317 VM_FLAGS_RETURN_DATA_ADDR | \
318 VM_FLAGS_RETURN_4K_DATA_ADDR | \
319 VM_FLAGS_ALIAS_MASK)
320 #endif /* XNU_KERNEL_PRIVATE */
321 #define VM_FLAGS_HW (VM_FLAGS_TPRO)
322
323 /* These are the flags that we accept from user-space */
324 #define VM_FLAGS_USER_ALLOCATE (VM_FLAGS_FIXED | \
325 VM_FLAGS_ANYWHERE | \
326 VM_FLAGS_PURGABLE | \
327 VM_FLAGS_4GB_CHUNK | \
328 VM_FLAGS_RANDOM_ADDR | \
329 VM_FLAGS_NO_CACHE | \
330 VM_FLAGS_PERMANENT | \
331 VM_FLAGS_OVERWRITE | \
332 VM_FLAGS_SUPERPAGE_MASK | \
333 VM_FLAGS_HW | \
334 VM_FLAGS_ALIAS_MASK)
335
336 #define VM_FLAGS_USER_MAP (VM_FLAGS_USER_ALLOCATE | \
337 VM_FLAGS_RETURN_4K_DATA_ADDR | \
338 VM_FLAGS_RETURN_DATA_ADDR)
339
340 #define VM_FLAGS_USER_REMAP (VM_FLAGS_FIXED | \
341 VM_FLAGS_ANYWHERE | \
342 VM_FLAGS_RANDOM_ADDR | \
343 VM_FLAGS_OVERWRITE| \
344 VM_FLAGS_RETURN_DATA_ADDR | \
345 VM_FLAGS_RESILIENT_CODESIGN | \
346 VM_FLAGS_RESILIENT_MEDIA)
347
348 #define VM_FLAGS_SUPERPAGE_SHIFT 16
349 #define SUPERPAGE_NONE 0 /* no superpages, if all bits are 0 */
350 #define SUPERPAGE_SIZE_ANY 1
351 #define VM_FLAGS_SUPERPAGE_NONE (SUPERPAGE_NONE << VM_FLAGS_SUPERPAGE_SHIFT)
352 #define VM_FLAGS_SUPERPAGE_SIZE_ANY (SUPERPAGE_SIZE_ANY << VM_FLAGS_SUPERPAGE_SHIFT)
353 #if defined(__x86_64__) || !defined(KERNEL)
354 #define SUPERPAGE_SIZE_2MB 2
355 #define VM_FLAGS_SUPERPAGE_SIZE_2MB (SUPERPAGE_SIZE_2MB<<VM_FLAGS_SUPERPAGE_SHIFT)
356 #endif
357
358 /*
359 * EXC_GUARD definitions for virtual memory.
360 */
361 #define GUARD_TYPE_VIRT_MEMORY 0x5
362
363 /* Reasons for exception for virtual memory */
364 __enum_decl(virtual_memory_guard_exception_code_t, uint32_t, {
365 kGUARD_EXC_DEALLOC_GAP = 1,
366 kGUARD_EXC_RECLAIM_COPYIO_FAILURE = 2,
367 kGUARD_EXC_SEC_LOOKUP_DENIED = 3,
368 kGUARD_EXC_RECLAIM_INDEX_FAILURE = 4,
369 kGUARD_EXC_SEC_RANGE_DENIED = 6,
370 kGUARD_EXC_SEC_ACCESS_FAULT = 7,
371 kGUARD_EXC_RECLAIM_DEALLOCATE_FAILURE = 8,
372 kGUARD_EXC_SEC_COPY_DENIED = 16,
373 kGUARD_EXC_SEC_SHARING_DENIED = 32,
374 kGUARD_EXC_SEC_ASYNC_ACCESS_FAULT = 64,
375 });
376
377 #ifdef XNU_KERNEL_PRIVATE
378
379 static inline bool
vm_guard_is_sec_access(uint32_t flavor)380 vm_guard_is_sec_access(uint32_t flavor)
381 {
382 return flavor == kGUARD_EXC_SEC_ACCESS_FAULT ||
383 flavor == kGUARD_EXC_SEC_ASYNC_ACCESS_FAULT;
384 }
385
386 static inline bool
vm_guard_is_sec_policy(uint32_t flavor)387 vm_guard_is_sec_policy(uint32_t flavor)
388 {
389 return flavor == kGUARD_EXC_SEC_LOOKUP_DENIED ||
390 flavor == kGUARD_EXC_SEC_RANGE_DENIED ||
391 flavor == kGUARD_EXC_SEC_COPY_DENIED ||
392 flavor == kGUARD_EXC_SEC_SHARING_DENIED;
393 }
394
395 /*!
396 * @enum vm_map_range_id_t
397 *
398 * @brief
399 * Enumerate a particular vm_map range.
400 *
401 * @discussion
402 * The kernel_map VA has been split into the following ranges. Userspace
403 * VA for any given process can also optionally be split by the following user
404 * ranges.
405 *
406 * @const KMEM_RANGE_ID_NONE
407 * This range is only used for early initialization.
408 *
409 * @const KMEM_RANGE_ID_PTR_*
410 * Range containing general purpose allocations from kalloc, etc that
411 * contain pointers.
412 *
413 * @const KMEM_RANGE_ID_SPRAYQTN
414 * The spray quarantine range contains allocations that have the following
415 * properties:
416 * - An attacker could control the size, lifetime and number of allocations
417 * of this type (or from this callsite).
418 * - The pointer to the allocation is zeroed to ensure that it isn't left
419 * dangling limiting the use of UaFs.
420 * - OOBs on the allocation is carefully considered and sufficiently
421 * addressed.
422 *
423 * @const KMEM_RANGE_ID_IOKIT
424 * Range containing memory mappings belonging to IOKit.
425 *
426 * @const KMEM_RANGE_ID_DATA
427 * Range containing allocations that are bags of bytes and contain no
428 * pointers.
429 */
430 __enum_decl(vm_map_range_id_t, uint8_t, {
431 KMEM_RANGE_ID_NONE,
432 KMEM_RANGE_ID_PTR_0,
433 KMEM_RANGE_ID_PTR_1,
434 KMEM_RANGE_ID_PTR_2,
435 KMEM_RANGE_ID_SPRAYQTN,
436 KMEM_RANGE_ID_IOKIT,
437 KMEM_RANGE_ID_DATA,
438
439 KMEM_RANGE_ID_FIRST = KMEM_RANGE_ID_PTR_0,
440 KMEM_RANGE_ID_NUM_PTR = KMEM_RANGE_ID_PTR_2,
441 KMEM_RANGE_ID_MAX = KMEM_RANGE_ID_DATA,
442
443 /* these UMEM_* correspond to the MACH_VM_RANGE_* tags and are ABI */
444 UMEM_RANGE_ID_DEFAULT = 0, /* same as MACH_VM_RANGE_DEFAULT */
445 UMEM_RANGE_ID_HEAP, /* same as MACH_VM_RANGE_DATA */
446 UMEM_RANGE_ID_FIXED, /* same as MACH_VM_RANGE_FIXED */
447 UMEM_RANGE_ID_LARGE_FILE,
448
449 /* these UMEM_* are XNU internal only range IDs, and aren't ABI */
450 UMEM_RANGE_ID_MAX = UMEM_RANGE_ID_LARGE_FILE,
451
452 #define KMEM_RANGE_COUNT (KMEM_RANGE_ID_MAX + 1)
453 });
454
455 typedef vm_map_range_id_t kmem_range_id_t;
456
457 #define kmem_log2down(mask) (31 - __builtin_clz(mask))
458 #define KMEM_RANGE_MAX (UMEM_RANGE_ID_MAX < KMEM_RANGE_ID_MAX \
459 ? KMEM_RANGE_ID_MAX : UMEM_RANGE_ID_MAX)
460 #define KMEM_RANGE_BITS kmem_log2down(2 * KMEM_RANGE_MAX - 1)
461
462 typedef union {
463 struct {
464 unsigned long long
465 /*
466 * VM_FLAG_* flags
467 */
468 vmf_fixed:1,
469 vmf_purgeable:1,
470 vmf_4gb_chunk:1,
471 vmf_random_addr:1,
472 vmf_no_cache:1,
473 vmf_resilient_codesign:1,
474 vmf_resilient_media:1,
475 vmf_permanent:1,
476
477 __unused_bit_8:1,
478 __unused_bit_9:1,
479 __unused_bit_10:1,
480 __unused_bit_11:1,
481 vmf_tpro:1,
482 __unused_bit_13:1,
483 vmf_overwrite:1,
484 __unused_bit_15:1,
485
486 vmf_superpage_size:3,
487 __unused_bit_19:1,
488 vmf_return_data_addr:1,
489 __unused_bit_21:1,
490 __unused_bit_22:1,
491 vmf_return_4k_data_addr:1,
492
493 /*
494 * VM tag (user or kernel)
495 *
496 * User tags are limited to 8 bits,
497 * kernel tags can use up to 12 bits
498 * with -zt or similar features.
499 */
500 vm_tag : 12, /* same as VME_ALIAS_BITS */
501
502 /*
503 * General kernel flags
504 */
505 vmkf_already:1, /* OK if same mapping already exists */
506 vmkf_beyond_max:1, /* map beyond the map's max offset */
507 vmkf_no_pmap_check:1, /* do not check that pmap is empty */
508 vmkf_map_jit:1, /* mark entry as JIT region */
509 vmkf_iokit_acct:1, /* IOKit accounting */
510 vmkf_keep_map_locked:1, /* keep map locked when returning from vm_map_enter() */
511 vmkf_overwrite_immutable:1, /* can overwrite immutable mappings */
512 vmkf_remap_prot_copy:1, /* vm_remap for VM_PROT_COPY */
513 vmkf_remap_legacy_mode:1, /* vm_remap, not vm_remap_new */
514 vmkf_cs_enforcement_override:1, /* override CS_ENFORCEMENT */
515 vmkf_cs_enforcement:1, /* new value for CS_ENFORCEMENT */
516 vmkf_nested_pmap:1, /* use a nested pmap */
517 vmkf_no_copy_on_read:1, /* do not use copy_on_read */
518 vmkf_copy_single_object:1, /* vm_map_copy only 1 VM object */
519 vmkf_copy_pageable:1, /* vm_map_copy with pageable entries */
520 vmkf_copy_same_map:1, /* vm_map_copy to remap in original map */
521 vmkf_translated_allow_execute:1, /* allow execute in translated processes */
522 vmkf_tpro_enforcement_override:1, /* override TPRO propagation */
523 vmkf_no_soft_limit:1, /* override soft allocation size limit */
524
525 /*
526 * Submap creation, altering vm_map_enter() only
527 */
528 vmkf_submap:1, /* mapping a VM submap */
529 vmkf_submap_atomic:1, /* keep entry atomic (no splitting/coalescing) */
530 vmkf_submap_adjust:1, /* the submap needs to be adjusted */
531
532 /*
533 * Flags altering the behavior of vm_map_locate_space_anywhere()
534 */
535 vmkf_32bit_map_va:1, /* allocate in low 32-bits range */
536 vmkf_guard_before:1, /* guard page before the mapping */
537 vmkf_last_free:1, /* find space from the end */
538 vmkf_range_id:KMEM_RANGE_BITS; /* kmem range to allocate in */
539
540 unsigned long long
541 __vmkf_unused2:64;
542 };
543
544 /*
545 * do not access these directly,
546 * use vm_map_kernel_flags_check_vmflags*()
547 */
548 uint32_t __vm_flags : 24;
549 } vm_map_kernel_flags_t;
550
551 /*
552 * using this means that vmf_* flags can't be used
553 * until vm_map_kernel_flags_set_vmflags() is set,
554 * or some manual careful init is done.
555 *
556 * Prefer VM_MAP_KERNEL_FLAGS_(FIXED,ANYWHERE) instead.
557 */
558 #define VM_MAP_KERNEL_FLAGS_NONE \
559 (vm_map_kernel_flags_t){ }
560
561 #define VM_MAP_KERNEL_FLAGS_FIXED(...) \
562 (vm_map_kernel_flags_t){ .vmf_fixed = true, __VA_ARGS__ }
563
564 #define VM_MAP_KERNEL_FLAGS_ANYWHERE(...) \
565 (vm_map_kernel_flags_t){ .vmf_fixed = false, __VA_ARGS__ }
566
567 #define VM_MAP_KERNEL_FLAGS_FIXED_PERMANENT(...) \
568 VM_MAP_KERNEL_FLAGS_FIXED(.vmf_permanent = true, __VA_ARGS__)
569
570 #define VM_MAP_KERNEL_FLAGS_ANYWHERE_PERMANENT(...) \
571 VM_MAP_KERNEL_FLAGS_ANYWHERE(.vmf_permanent = true, __VA_ARGS__)
572
573 #define VM_MAP_KERNEL_FLAGS_DATA_ANYWHERE(...) \
574 VM_MAP_KERNEL_FLAGS_ANYWHERE(.vmkf_range_id = KMEM_RANGE_ID_DATA, __VA_ARGS__)
575
576 typedef struct {
577 unsigned int
578 vmnekf_ledger_tag:3,
579 vmnekf_ledger_no_footprint:1,
580 __vmnekf_unused:28;
581 } vm_named_entry_kernel_flags_t;
582 #define VM_NAMED_ENTRY_KERNEL_FLAGS_NONE (vm_named_entry_kernel_flags_t) { \
583 .vmnekf_ledger_tag = 0, \
584 .vmnekf_ledger_no_footprint = 0, \
585 .__vmnekf_unused = 0 \
586 }
587
588 #endif /* XNU_KERNEL_PRIVATE */
589
590 /* current accounting postmark */
591 #define __VM_LEDGER_ACCOUNTING_POSTMARK 2019032600
592
593 /*
594 * When making a new VM_LEDGER_TAG_* or VM_LEDGER_FLAG_*, update tests
595 * vm_parameter_validation_[user|kern] and their expected results; they
596 * deliberately call VM functions with invalid ledger values and you may
597 * be turning one of those invalid tags/flags valid.
598 */
599 /* discrete values: */
600 #define VM_LEDGER_TAG_NONE 0x00000000
601 #define VM_LEDGER_TAG_DEFAULT 0x00000001
602 #define VM_LEDGER_TAG_NETWORK 0x00000002
603 #define VM_LEDGER_TAG_MEDIA 0x00000003
604 #define VM_LEDGER_TAG_GRAPHICS 0x00000004
605 #define VM_LEDGER_TAG_NEURAL 0x00000005
606 #define VM_LEDGER_TAG_MAX 0x00000005
607 #define VM_LEDGER_TAG_UNCHANGED ((int)-1)
608
609 /* individual bits: */
610 #define VM_LEDGER_FLAG_NO_FOOTPRINT (1 << 0)
611 #define VM_LEDGER_FLAG_NO_FOOTPRINT_FOR_DEBUG (1 << 1)
612 #define VM_LEDGER_FLAG_FROM_KERNEL (1 << 2)
613
614 #define VM_LEDGER_FLAGS_USER (VM_LEDGER_FLAG_NO_FOOTPRINT | VM_LEDGER_FLAG_NO_FOOTPRINT_FOR_DEBUG)
615 #define VM_LEDGER_FLAGS_ALL (VM_LEDGER_FLAGS_USER | VM_LEDGER_FLAG_FROM_KERNEL)
616
617 #define VM_MEMORY_MALLOC 1
618 #define VM_MEMORY_MALLOC_SMALL 2
619 #define VM_MEMORY_MALLOC_LARGE 3
620 #define VM_MEMORY_MALLOC_HUGE 4
621 #define VM_MEMORY_SBRK 5// uninteresting -- no one should call
622 #define VM_MEMORY_REALLOC 6
623 #define VM_MEMORY_MALLOC_TINY 7
624 #define VM_MEMORY_MALLOC_LARGE_REUSABLE 8
625 #define VM_MEMORY_MALLOC_LARGE_REUSED 9
626
627 #define VM_MEMORY_ANALYSIS_TOOL 10
628
629 #define VM_MEMORY_MALLOC_NANO 11
630 #define VM_MEMORY_MALLOC_MEDIUM 12
631 #define VM_MEMORY_MALLOC_PROB_GUARD 13
632
633 #define VM_MEMORY_MACH_MSG 20
634 #define VM_MEMORY_IOKIT 21
635 #define VM_MEMORY_STACK 30
636 #define VM_MEMORY_GUARD 31
637 #define VM_MEMORY_SHARED_PMAP 32
638 /* memory containing a dylib */
639 #define VM_MEMORY_DYLIB 33
640 #define VM_MEMORY_OBJC_DISPATCHERS 34
641
642 /* Was a nested pmap (VM_MEMORY_SHARED_PMAP) which has now been unnested */
643 #define VM_MEMORY_UNSHARED_PMAP 35
644
645
646 // Placeholders for now -- as we analyze the libraries and find how they
647 // use memory, we can make these labels more specific.
648 #define VM_MEMORY_APPKIT 40
649 #define VM_MEMORY_FOUNDATION 41
650 #define VM_MEMORY_COREGRAPHICS 42
651 #define VM_MEMORY_CORESERVICES 43
652 #define VM_MEMORY_CARBON VM_MEMORY_CORESERVICES
653 #define VM_MEMORY_JAVA 44
654 #define VM_MEMORY_COREDATA 45
655 #define VM_MEMORY_COREDATA_OBJECTIDS 46
656 #define VM_MEMORY_ATS 50
657 #define VM_MEMORY_LAYERKIT 51
658 #define VM_MEMORY_CGIMAGE 52
659 #define VM_MEMORY_TCMALLOC 53
660
661 /* private raster data (i.e. layers, some images, QGL allocator) */
662 #define VM_MEMORY_COREGRAPHICS_DATA 54
663
664 /* shared image and font caches */
665 #define VM_MEMORY_COREGRAPHICS_SHARED 55
666
667 /* Memory used for virtual framebuffers, shadowing buffers, etc... */
668 #define VM_MEMORY_COREGRAPHICS_FRAMEBUFFERS 56
669
670 /* Window backing stores, custom shadow data, and compressed backing stores */
671 #define VM_MEMORY_COREGRAPHICS_BACKINGSTORES 57
672
673 /* x-alloc'd memory */
674 #define VM_MEMORY_COREGRAPHICS_XALLOC 58
675
676 /* catch-all for other uses, such as the read-only shared data page */
677 #define VM_MEMORY_COREGRAPHICS_MISC VM_MEMORY_COREGRAPHICS
678
679 /* memory allocated by the dynamic loader for itself */
680 #define VM_MEMORY_DYLD 60
681 /* malloc'd memory created by dyld */
682 #define VM_MEMORY_DYLD_MALLOC 61
683
684 /* Used for sqlite page cache */
685 #define VM_MEMORY_SQLITE 62
686
687 /* JavaScriptCore heaps */
688 #define VM_MEMORY_JAVASCRIPT_CORE 63
689 #define VM_MEMORY_WEBASSEMBLY VM_MEMORY_JAVASCRIPT_CORE
690 /* memory allocated for the JIT */
691 #define VM_MEMORY_JAVASCRIPT_JIT_EXECUTABLE_ALLOCATOR 64
692 #define VM_MEMORY_JAVASCRIPT_JIT_REGISTER_FILE 65
693
694 /* memory allocated for GLSL */
695 #define VM_MEMORY_GLSL 66
696
697 /* memory allocated for OpenCL.framework */
698 #define VM_MEMORY_OPENCL 67
699
700 /* memory allocated for QuartzCore.framework */
701 #define VM_MEMORY_COREIMAGE 68
702
703 /* memory allocated for WebCore Purgeable Buffers */
704 #define VM_MEMORY_WEBCORE_PURGEABLE_BUFFERS 69
705
706 /* ImageIO memory */
707 #define VM_MEMORY_IMAGEIO 70
708
709 /* CoreProfile memory */
710 #define VM_MEMORY_COREPROFILE 71
711
712 /* assetsd / MobileSlideShow memory */
713 #define VM_MEMORY_ASSETSD 72
714
715 /* libsystem_kernel os_once_alloc */
716 #define VM_MEMORY_OS_ALLOC_ONCE 73
717
718 /* libdispatch internal allocator */
719 #define VM_MEMORY_LIBDISPATCH 74
720
721 /* Accelerate.framework image backing stores */
722 #define VM_MEMORY_ACCELERATE 75
723
724 /* CoreUI image block data */
725 #define VM_MEMORY_COREUI 76
726
727 /* CoreUI image file */
728 #define VM_MEMORY_COREUIFILE 77
729
730 /* Genealogy buffers */
731 #define VM_MEMORY_GENEALOGY 78
732
733 /* RawCamera VM allocated memory */
734 #define VM_MEMORY_RAWCAMERA 79
735
736 /* corpse info for dead process */
737 #define VM_MEMORY_CORPSEINFO 80
738
739 /* Apple System Logger (ASL) messages */
740 #define VM_MEMORY_ASL 81
741
742 /* Swift runtime */
743 #define VM_MEMORY_SWIFT_RUNTIME 82
744
745 /* Swift metadata */
746 #define VM_MEMORY_SWIFT_METADATA 83
747
748 /* DHMM data */
749 #define VM_MEMORY_DHMM 84
750
751
752 /* memory allocated by SceneKit.framework */
753 #define VM_MEMORY_SCENEKIT 86
754
755 /* memory allocated by skywalk networking */
756 #define VM_MEMORY_SKYWALK 87
757
758 #define VM_MEMORY_IOSURFACE 88
759
760 #define VM_MEMORY_LIBNETWORK 89
761
762 #define VM_MEMORY_AUDIO 90
763
764 #define VM_MEMORY_VIDEOBITSTREAM 91
765
766 /* memory allocated by CoreMedia */
767 #define VM_MEMORY_CM_XPC 92
768
769 #define VM_MEMORY_CM_RPC 93
770
771 #define VM_MEMORY_CM_MEMORYPOOL 94
772
773 #define VM_MEMORY_CM_READCACHE 95
774
775 #define VM_MEMORY_CM_CRABS 96
776
777 /* memory allocated for QuickLookThumbnailing */
778 #define VM_MEMORY_QUICKLOOK_THUMBNAILS 97
779
780 /* memory allocated by Accounts framework */
781 #define VM_MEMORY_ACCOUNTS 98
782
783 /* memory allocated by Sanitizer runtime libraries */
784 #define VM_MEMORY_SANITIZER 99
785
786 /* Differentiate memory needed by GPU drivers and frameworks from generic IOKit allocations */
787 #define VM_MEMORY_IOACCELERATOR 100
788
789 /* memory allocated by CoreMedia for global image registration of frames */
790 #define VM_MEMORY_CM_REGWARP 101
791
792 /* memory allocated by EmbeddedAcousticRecognition for speech decoder */
793 #define VM_MEMORY_EAR_DECODER 102
794
795 /* CoreUI cached image data */
796 #define VM_MEMORY_COREUI_CACHED_IMAGE_DATA 103
797
798 /* ColorSync is using mmap for read-only copies of ICC profile data */
799 #define VM_MEMORY_COLORSYNC 104
800
801 /* backtrace info for simulated crashes */
802 #define VM_MEMORY_BTINFO 105
803
804 /* memory allocated by CoreMedia */
805 #define VM_MEMORY_CM_HLS 106
806
807 /* Reserve 230-239 for Rosetta */
808 #define VM_MEMORY_ROSETTA 230
809 #define VM_MEMORY_ROSETTA_THREAD_CONTEXT 231
810 #define VM_MEMORY_ROSETTA_INDIRECT_BRANCH_MAP 232
811 #define VM_MEMORY_ROSETTA_RETURN_STACK 233
812 #define VM_MEMORY_ROSETTA_EXECUTABLE_HEAP 234
813 #define VM_MEMORY_ROSETTA_USER_LDT 235
814 #define VM_MEMORY_ROSETTA_ARENA 236
815 #define VM_MEMORY_ROSETTA_10 239
816
817 /* Reserve 240-255 for application */
818 #define VM_MEMORY_APPLICATION_SPECIFIC_1 240
819 #define VM_MEMORY_APPLICATION_SPECIFIC_16 255
820
821 #define VM_MEMORY_COUNT 256
822
823 #if !XNU_KERNEL_PRIVATE
824 #define VM_MAKE_TAG(tag) ((tag) << 24)
825 #endif /* XNU_KERNEL_PRIVATE */
826
827
828 #if KERNEL_PRIVATE
829
830 /* kernel map tags */
831 /* please add new definition strings to zprint */
832 /*
833 * When making a new VM_KERN_MEMORY_*, update tests vm_parameter_validation_[user|kern]
834 * and their expected results; they deliberately call VM functions with invalid
835 * kernel tag values and you may be turning one of those invalid tags valid.
836 */
837
838 #define VM_KERN_MEMORY_NONE 0
839
840 #define VM_KERN_MEMORY_OSFMK 1
841 #define VM_KERN_MEMORY_BSD 2
842 #define VM_KERN_MEMORY_IOKIT 3
843 #define VM_KERN_MEMORY_LIBKERN 4
844 #define VM_KERN_MEMORY_OSKEXT 5
845 #define VM_KERN_MEMORY_KEXT 6
846 #define VM_KERN_MEMORY_IPC 7
847 #define VM_KERN_MEMORY_STACK 8
848 #define VM_KERN_MEMORY_CPU 9
849 #define VM_KERN_MEMORY_PMAP 10
850 #define VM_KERN_MEMORY_PTE 11
851 #define VM_KERN_MEMORY_ZONE 12
852 #define VM_KERN_MEMORY_KALLOC 13
853 #define VM_KERN_MEMORY_COMPRESSOR 14
854 #define VM_KERN_MEMORY_COMPRESSED_DATA 15
855 #define VM_KERN_MEMORY_PHANTOM_CACHE 16
856 #define VM_KERN_MEMORY_WAITQ 17
857 #define VM_KERN_MEMORY_DIAG 18
858 #define VM_KERN_MEMORY_LOG 19
859 #define VM_KERN_MEMORY_FILE 20
860 #define VM_KERN_MEMORY_MBUF 21
861 #define VM_KERN_MEMORY_UBC 22
862 #define VM_KERN_MEMORY_SECURITY 23
863 #define VM_KERN_MEMORY_MLOCK 24
864 #define VM_KERN_MEMORY_REASON 25
865 #define VM_KERN_MEMORY_SKYWALK 26
866 #define VM_KERN_MEMORY_LTABLE 27
867 #define VM_KERN_MEMORY_HV 28
868 #define VM_KERN_MEMORY_KALLOC_DATA 29
869 #define VM_KERN_MEMORY_RETIRED 30
870 #define VM_KERN_MEMORY_KALLOC_TYPE 31
871 #define VM_KERN_MEMORY_TRIAGE 32
872 #define VM_KERN_MEMORY_RECOUNT 33
873 #define VM_KERN_MEMORY_EXCLAVES 35
874 #define VM_KERN_MEMORY_EXCLAVES_SHARED 36
875 #define VM_KERN_MEMORY_KALLOC_SHARED 37
876 /* add new tags here and adjust first-dynamic value */
877 #define VM_KERN_MEMORY_FIRST_DYNAMIC 38
878
879 /* out of tags: */
880 #define VM_KERN_MEMORY_ANY 255
881 #define VM_KERN_MEMORY_COUNT 256
882
883 /* end kernel map tags */
884
885 // mach_memory_info.flags
886 #define VM_KERN_SITE_TYPE 0x000000FF
887 #define VM_KERN_SITE_TAG 0x00000000
888 #define VM_KERN_SITE_KMOD 0x00000001
889 #define VM_KERN_SITE_KERNEL 0x00000002
890 #define VM_KERN_SITE_COUNTER 0x00000003
891 #define VM_KERN_SITE_WIRED 0x00000100 /* add to wired count */
892 #define VM_KERN_SITE_HIDE 0x00000200 /* no zprint */
893 #define VM_KERN_SITE_NAMED 0x00000400
894 #define VM_KERN_SITE_ZONE 0x00000800
895 #define VM_KERN_SITE_ZONE_VIEW 0x00001000
896 #define VM_KERN_SITE_KALLOC 0x00002000 /* zone field is size class */
897
898 #define VM_KERN_COUNT_MANAGED 0
899 #define VM_KERN_COUNT_RESERVED 1
900 #define VM_KERN_COUNT_WIRED 2
901 #define VM_KERN_COUNT_WIRED_MANAGED 3
902 #define VM_KERN_COUNT_STOLEN 4
903 #define VM_KERN_COUNT_LOPAGE 5
904 #define VM_KERN_COUNT_MAP_KERNEL 6
905 #define VM_KERN_COUNT_MAP_ZONE 7
906 #define VM_KERN_COUNT_MAP_KALLOC 8
907
908 #define VM_KERN_COUNT_WIRED_BOOT 9
909
910 #define VM_KERN_COUNT_BOOT_STOLEN 10
911
912 /* The number of bytes from the kernel cache that are wired in memory */
913 #define VM_KERN_COUNT_WIRED_STATIC_KERNELCACHE 11
914
915 #define VM_KERN_COUNT_MAP_KALLOC_LARGE VM_KERN_COUNT_MAP_KALLOC
916 #define VM_KERN_COUNT_MAP_KALLOC_LARGE_DATA 12
917 #define VM_KERN_COUNT_MAP_KERNEL_DATA 13
918
919 /* The size of the exclaves iboot carveout (exclaves memory not from XNU) in bytes. */
920 #define VM_KERN_COUNT_EXCLAVES_CARVEOUT 14
921
922 /* The number of VM_KERN_COUNT_ stats. New VM_KERN_COUNT_ entries should be less than this. */
923 #define VM_KERN_COUNTER_COUNT 15
924
925
926 #endif /* KERNEL_PRIVATE */
927
928 __END_DECLS
929
930 #endif /* _MACH_VM_STATISTICS_H_ */
931