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