xref: /xnu-11215/osfmk/mach/task_info.h (revision 8d741a5d)
1 /*
2  * Copyright (c) 2000-2007, 2015 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  *	Machine-independent task information structures and definitions.
58  *
59  *	The definitions in this file are exported to the user.  The kernel
60  *	will translate its internal data structures to these structures
61  *	as appropriate.
62  *
63  */
64 
65 #ifndef _MACH_TASK_INFO_H_
66 #define _MACH_TASK_INFO_H_
67 
68 #include <mach/message.h>
69 #include <mach/machine/vm_types.h>
70 #include <mach/time_value.h>
71 #include <mach/policy.h>
72 #include <mach/vm_statistics.h> /* for vm_extmod_statistics_data_t */
73 #include <Availability.h>
74 
75 #include <sys/cdefs.h>
76 
77 /*
78  *	Generic information structure to allow for expansion.
79  */
80 typedef natural_t       task_flavor_t;
81 typedef integer_t       *task_info_t;           /* varying array of int */
82 
83 /* Deprecated, use per structure _data_t's instead */
84 #define TASK_INFO_MAX   (1024)          /* maximum array size */
85 typedef integer_t       task_info_data_t[TASK_INFO_MAX];
86 
87 /*
88  *	Currently defined information structures.
89  */
90 
91 #pragma pack(push, 4)
92 
93 /* Don't use this, use MACH_TASK_BASIC_INFO instead */
94 #define TASK_BASIC_INFO_32      4       /* basic information */
95 #define TASK_BASIC2_INFO_32      6
96 
97 struct task_basic_info_32 {
98 	integer_t       suspend_count;  /* suspend count for task */
99 	natural_t       virtual_size;   /* virtual memory size (bytes) */
100 	natural_t       resident_size;  /* resident memory size (bytes) */
101 	time_value_t    user_time;      /* total user run time for
102 	                                 *  terminated threads */
103 	time_value_t    system_time;    /* total system run time for
104 	                                 *  terminated threads */
105 	policy_t        policy;         /* default policy for new threads */
106 };
107 typedef struct task_basic_info_32       task_basic_info_32_data_t;
108 typedef struct task_basic_info_32       *task_basic_info_32_t;
109 #define TASK_BASIC_INFO_32_COUNT   \
110 	        (sizeof(task_basic_info_32_data_t) / sizeof(natural_t))
111 
112 /* Don't use this, use MACH_TASK_BASIC_INFO instead */
113 struct task_basic_info_64 {
114 	integer_t       suspend_count;  /* suspend count for task */
115 #if defined(__arm__) || defined(__arm64__)
116 #if defined(KERNEL)
117 	/* Compatibility with old 32-bit mach_vm_size_t */
118 	natural_t       virtual_size;   /* virtual memory size (bytes) */
119 	natural_t       resident_size;  /* resident memory size (bytes) */
120 #else
121 	mach_vm_size_t  virtual_size;   /* virtual memory size (bytes) */
122 	mach_vm_size_t  resident_size;  /* resident memory size (bytes) */
123 #endif
124 #else /* defined(__arm__) || defined(__arm64__) */
125 	mach_vm_size_t  virtual_size;   /* virtual memory size (bytes) */
126 	mach_vm_size_t  resident_size;  /* resident memory size (bytes) */
127 #endif /* defined(__arm__) || defined(__arm64__) */
128 	time_value_t    user_time;      /* total user run time for
129 	                                 *  terminated threads */
130 	time_value_t    system_time;    /* total system run time for
131 	                                 *  terminated threads */
132 	policy_t        policy;         /* default policy for new threads */
133 };
134 typedef struct task_basic_info_64       task_basic_info_64_data_t;
135 typedef struct task_basic_info_64       *task_basic_info_64_t;
136 
137 #if defined(__arm__) || defined(__arm64__)
138 	#if defined(KERNEL)
139 /*
140  * Backwards-compatibility for old mach_vm*_t types.
141  * The kernel knows about old and new, and if you are compiled
142  * to run on an earlier iOS version, you interact with the old
143  * (narrow) version.  If you are compiled for a newer OS
144  * version, however, you are mapped to the wide version.
145  */
146 
147 	#define TASK_BASIC_INFO_64      5
148 	#define TASK_BASIC_INFO_64_COUNT   \
149 	        (sizeof(task_basic_info_64_data_t) / sizeof(natural_t))
150 
151 	#elif defined(__arm__) && defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_5_0)
152 /*
153  * Note: arm64 can't use the old flavor.  If you somehow manage to,
154  * you can cope with the nonsense data yourself.
155  */
156 	#define TASK_BASIC_INFO_64      5
157 	#define TASK_BASIC_INFO_64_COUNT   \
158 	        (sizeof(task_basic_info_64_data_t) / sizeof(natural_t))
159 
160 	#else
161 
162 	#define TASK_BASIC_INFO_64              TASK_BASIC_INFO_64_2
163 	#define TASK_BASIC_INFO_64_COUNT        TASK_BASIC_INFO_64_2_COUNT
164 	#endif
165 #else /* defined(__arm__) || defined(__arm64__) */
166 #define TASK_BASIC_INFO_64      5       /* 64-bit capable basic info */
167 #define TASK_BASIC_INFO_64_COUNT   \
168 	        (sizeof(task_basic_info_64_data_t) / sizeof(natural_t))
169 #endif
170 
171 
172 /* localized structure - cannot be safely passed between tasks of differing sizes */
173 /* Don't use this, use MACH_TASK_BASIC_INFO instead */
174 struct task_basic_info {
175 	integer_t       suspend_count;  /* suspend count for task */
176 	vm_size_t       virtual_size;   /* virtual memory size (bytes) */
177 	vm_size_t       resident_size;  /* resident memory size (bytes) */
178 	time_value_t    user_time;      /* total user run time for
179 	                                 *  terminated threads */
180 	time_value_t    system_time;    /* total system run time for
181 	                                 *  terminated threads */
182 	policy_t        policy;         /* default policy for new threads */
183 };
184 
185 typedef struct task_basic_info          task_basic_info_data_t;
186 typedef struct task_basic_info          *task_basic_info_t;
187 #define TASK_BASIC_INFO_COUNT   \
188 	        (sizeof(task_basic_info_data_t) / sizeof(natural_t))
189 #if !defined(__LP64__)
190 #define TASK_BASIC_INFO TASK_BASIC_INFO_32
191 #else
192 #define TASK_BASIC_INFO TASK_BASIC_INFO_64
193 #endif
194 
195 
196 
197 #define TASK_EVENTS_INFO        2       /* various event counts */
198 
199 struct task_events_info {
200 	integer_t       faults;         /* number of page faults */
201 	integer_t       pageins;        /* number of actual pageins */
202 	integer_t       cow_faults;     /* number of copy-on-write faults */
203 	integer_t       messages_sent;  /* number of messages sent */
204 	integer_t       messages_received; /* number of messages received */
205 	integer_t       syscalls_mach;  /* number of mach system calls */
206 	integer_t       syscalls_unix;  /* number of unix system calls */
207 	integer_t       csw;            /* number of context switches */
208 };
209 typedef struct task_events_info         task_events_info_data_t;
210 typedef struct task_events_info         *task_events_info_t;
211 #define TASK_EVENTS_INFO_COUNT          ((mach_msg_type_number_t) \
212 	        (sizeof(task_events_info_data_t) / sizeof(natural_t)))
213 
214 #define TASK_THREAD_TIMES_INFO  3       /* total times for live threads -
215 	                                 *  only accurate if suspended */
216 
217 struct task_thread_times_info {
218 	time_value_t    user_time;      /* total user run time for
219 	                                 *  live threads */
220 	time_value_t    system_time;    /* total system run time for
221 	                                 *  live threads */
222 };
223 
224 typedef struct task_thread_times_info   task_thread_times_info_data_t;
225 typedef struct task_thread_times_info   *task_thread_times_info_t;
226 #define TASK_THREAD_TIMES_INFO_COUNT    ((mach_msg_type_number_t) \
227 	        (sizeof(task_thread_times_info_data_t) / sizeof(natural_t)))
228 
229 #define TASK_ABSOLUTETIME_INFO  1
230 
231 struct task_absolutetime_info {
232 	uint64_t                total_user;
233 	uint64_t                total_system;
234 	uint64_t                threads_user;   /* existing threads only */
235 	uint64_t                threads_system;
236 };
237 
238 typedef struct task_absolutetime_info   task_absolutetime_info_data_t;
239 typedef struct task_absolutetime_info   *task_absolutetime_info_t;
240 #define TASK_ABSOLUTETIME_INFO_COUNT    ((mach_msg_type_number_t) \
241 	        (sizeof (task_absolutetime_info_data_t) / sizeof (natural_t)))
242 
243 #define TASK_KERNELMEMORY_INFO  7
244 
245 struct task_kernelmemory_info {
246 	uint64_t                total_palloc;   /* private kernel mem alloc'ed */
247 	uint64_t                total_pfree;    /* private kernel mem freed */
248 	uint64_t                total_salloc;   /* shared kernel mem alloc'ed */
249 	uint64_t                total_sfree;    /* shared kernel mem freed */
250 };
251 
252 typedef struct task_kernelmemory_info   task_kernelmemory_info_data_t;
253 typedef struct task_kernelmemory_info   *task_kernelmemory_info_t;
254 #define TASK_KERNELMEMORY_INFO_COUNT    ((mach_msg_type_number_t) \
255 	        (sizeof (task_kernelmemory_info_data_t) / sizeof (natural_t)))
256 
257 #define TASK_SECURITY_TOKEN             13
258 #define TASK_SECURITY_TOKEN_COUNT       ((mach_msg_type_number_t) \
259 	        (sizeof(security_token_t) / sizeof(natural_t)))
260 
261 #define TASK_AUDIT_TOKEN                15
262 #define TASK_AUDIT_TOKEN_COUNT  \
263 	        (sizeof(audit_token_t) / sizeof(natural_t))
264 
265 
266 #define TASK_AFFINITY_TAG_INFO          16      /* This is experimental. */
267 
268 struct task_affinity_tag_info {
269 	integer_t               set_count;
270 	integer_t               min;
271 	integer_t               max;
272 	integer_t               task_count;
273 };
274 typedef struct task_affinity_tag_info   task_affinity_tag_info_data_t;
275 typedef struct task_affinity_tag_info   *task_affinity_tag_info_t;
276 #define TASK_AFFINITY_TAG_INFO_COUNT    \
277 	        (sizeof(task_affinity_tag_info_data_t) / sizeof(natural_t))
278 
279 #define TASK_DYLD_INFO                  17
280 
281 struct task_dyld_info {
282 	mach_vm_address_t       all_image_info_addr;
283 	mach_vm_size_t          all_image_info_size;
284 	integer_t               all_image_info_format;
285 };
286 typedef struct task_dyld_info   task_dyld_info_data_t;
287 typedef struct task_dyld_info   *task_dyld_info_t;
288 #define TASK_DYLD_INFO_COUNT    \
289 	        (sizeof(task_dyld_info_data_t) / sizeof(natural_t))
290 #define TASK_DYLD_ALL_IMAGE_INFO_32     0       /* format value */
291 #define TASK_DYLD_ALL_IMAGE_INFO_64     1       /* format value */
292 
293 #if defined(__arm__) || defined(__arm64__)
294 
295 /* Don't use this, use MACH_TASK_BASIC_INFO instead */
296 /* Compatibility for old 32-bit mach_vm_*_t */
297 #define TASK_BASIC_INFO_64_2     18       /* 64-bit capable basic info */
298 
299 struct task_basic_info_64_2 {
300 	integer_t       suspend_count;  /* suspend count for task */
301 	mach_vm_size_t  virtual_size;   /* virtual memory size (bytes) */
302 	mach_vm_size_t  resident_size;  /* resident memory size (bytes) */
303 	time_value_t    user_time;      /* total user run time for
304 	                                 *  terminated threads */
305 	time_value_t    system_time;    /* total system run time for
306 	                                 *  terminated threads */
307 	policy_t        policy;         /* default policy for new threads */
308 };
309 typedef struct task_basic_info_64_2       task_basic_info_64_2_data_t;
310 typedef struct task_basic_info_64_2       *task_basic_info_64_2_t;
311 #define TASK_BASIC_INFO_64_2_COUNT   \
312 	        (sizeof(task_basic_info_64_2_data_t) / sizeof(natural_t))
313 #endif
314 
315 #define TASK_EXTMOD_INFO                        19
316 
317 struct task_extmod_info {
318 	unsigned char   task_uuid[16];
319 	vm_extmod_statistics_data_t             extmod_statistics;
320 };
321 typedef struct task_extmod_info task_extmod_info_data_t;
322 typedef struct task_extmod_info *task_extmod_info_t;
323 #define TASK_EXTMOD_INFO_COUNT  \
324 	        (sizeof(task_extmod_info_data_t) / sizeof(natural_t))
325 
326 
327 #define MACH_TASK_BASIC_INFO     20         /* always 64-bit basic info */
328 struct mach_task_basic_info {
329 	mach_vm_size_t  virtual_size;       /* virtual memory size (bytes) */
330 	mach_vm_size_t  resident_size;      /* resident memory size (bytes) */
331 	mach_vm_size_t  resident_size_max;  /* maximum resident memory size (bytes) */
332 	time_value_t    user_time;          /* total user run time for
333 	                                     *  terminated threads */
334 	time_value_t    system_time;        /* total system run time for
335 	                                     *  terminated threads */
336 	policy_t        policy;             /* default policy for new threads */
337 	integer_t       suspend_count;      /* suspend count for task */
338 };
339 typedef struct mach_task_basic_info       mach_task_basic_info_data_t;
340 typedef struct mach_task_basic_info       *mach_task_basic_info_t;
341 #define MACH_TASK_BASIC_INFO_COUNT   \
342 	        (sizeof(mach_task_basic_info_data_t) / sizeof(natural_t))
343 
344 
345 #define TASK_POWER_INFO 21
346 
347 struct task_power_info {
348 	uint64_t                total_user;
349 	uint64_t                total_system;
350 	uint64_t                task_interrupt_wakeups;
351 	uint64_t                task_platform_idle_wakeups;
352 	uint64_t                task_timer_wakeups_bin_1;
353 	uint64_t                task_timer_wakeups_bin_2;
354 };
355 
356 typedef struct task_power_info  task_power_info_data_t;
357 typedef struct task_power_info  *task_power_info_t;
358 #define TASK_POWER_INFO_COUNT   ((mach_msg_type_number_t) \
359 	        (sizeof (task_power_info_data_t) / sizeof (natural_t)))
360 
361 
362 
363 #define TASK_VM_INFO            22
364 #define TASK_VM_INFO_PURGEABLE  23
365 struct task_vm_info {
366 	mach_vm_size_t  virtual_size;       /* virtual memory size (bytes) */
367 	integer_t       region_count;       /* number of memory regions */
368 	integer_t       page_size;
369 	mach_vm_size_t  resident_size;      /* resident memory size (bytes) */
370 	mach_vm_size_t  resident_size_peak; /* peak resident size (bytes) */
371 
372 	mach_vm_size_t  device;
373 	mach_vm_size_t  device_peak;
374 	mach_vm_size_t  internal;
375 	mach_vm_size_t  internal_peak;
376 	mach_vm_size_t  external;
377 	mach_vm_size_t  external_peak;
378 	mach_vm_size_t  reusable;
379 	mach_vm_size_t  reusable_peak;
380 	mach_vm_size_t  purgeable_volatile_pmap;
381 	mach_vm_size_t  purgeable_volatile_resident;
382 	mach_vm_size_t  purgeable_volatile_virtual;
383 	mach_vm_size_t  compressed;
384 	mach_vm_size_t  compressed_peak;
385 	mach_vm_size_t  compressed_lifetime;
386 
387 	/* added for rev1 */
388 	mach_vm_size_t  phys_footprint;
389 
390 	/* added for rev2 */
391 	mach_vm_address_t       min_address;
392 	mach_vm_address_t       max_address;
393 
394 	/* added for rev3 */
395 	int64_t ledger_phys_footprint_peak;
396 	int64_t ledger_purgeable_nonvolatile;
397 	int64_t ledger_purgeable_novolatile_compressed;
398 	int64_t ledger_purgeable_volatile;
399 	int64_t ledger_purgeable_volatile_compressed;
400 	int64_t ledger_tag_network_nonvolatile;
401 	int64_t ledger_tag_network_nonvolatile_compressed;
402 	int64_t ledger_tag_network_volatile;
403 	int64_t ledger_tag_network_volatile_compressed;
404 	int64_t ledger_tag_media_footprint;
405 	int64_t ledger_tag_media_footprint_compressed;
406 	int64_t ledger_tag_media_nofootprint;
407 	int64_t ledger_tag_media_nofootprint_compressed;
408 	int64_t ledger_tag_graphics_footprint;
409 	int64_t ledger_tag_graphics_footprint_compressed;
410 	int64_t ledger_tag_graphics_nofootprint;
411 	int64_t ledger_tag_graphics_nofootprint_compressed;
412 	int64_t ledger_tag_neural_footprint;
413 	int64_t ledger_tag_neural_footprint_compressed;
414 	int64_t ledger_tag_neural_nofootprint;
415 	int64_t ledger_tag_neural_nofootprint_compressed;
416 
417 	/* added for rev4 */
418 	uint64_t limit_bytes_remaining;
419 
420 	/* added for rev5 */
421 	integer_t decompressions;
422 
423 	/* added for rev6 */
424 	int64_t ledger_swapins;
425 
426 	/* added for rev7 */
427 	int64_t ledger_tag_neural_nofootprint_total;
428 	int64_t ledger_tag_neural_nofootprint_peak;
429 };
430 typedef struct task_vm_info     task_vm_info_data_t;
431 typedef struct task_vm_info     *task_vm_info_t;
432 #define TASK_VM_INFO_COUNT      ((mach_msg_type_number_t) \
433 	        (sizeof (task_vm_info_data_t) / sizeof (natural_t)))
434 /*
435  * The capacity of task_info_t in mach_types.defs also needs to be adjusted
436  */
437 #define TASK_VM_INFO_REV7_COUNT TASK_VM_INFO_COUNT
438 #define TASK_VM_INFO_REV6_COUNT /* doesn't include neural total and peak */ \
439 	((mach_msg_type_number_t) (TASK_VM_INFO_REV7_COUNT - 4))
440 #define TASK_VM_INFO_REV5_COUNT /* doesn't include ledger swapins */ \
441 	((mach_msg_type_number_t) (TASK_VM_INFO_REV6_COUNT - 2))
442 #define TASK_VM_INFO_REV4_COUNT /* doesn't include decompressions */ \
443 	((mach_msg_type_number_t) (TASK_VM_INFO_REV5_COUNT - 1))
444 #define TASK_VM_INFO_REV3_COUNT /* doesn't include limit bytes */ \
445 	((mach_msg_type_number_t) (TASK_VM_INFO_REV4_COUNT - 2))
446 #define TASK_VM_INFO_REV2_COUNT /* doesn't include extra ledgers info */ \
447 	((mach_msg_type_number_t) (TASK_VM_INFO_REV3_COUNT - 42))
448 #define TASK_VM_INFO_REV1_COUNT /* doesn't include min and max address */ \
449 	((mach_msg_type_number_t) (TASK_VM_INFO_REV2_COUNT - 4))
450 #define TASK_VM_INFO_REV0_COUNT /* doesn't include phys_footprint */ \
451 	((mach_msg_type_number_t) (TASK_VM_INFO_REV1_COUNT - 2))
452 
453 typedef struct vm_purgeable_info        task_purgable_info_t;
454 
455 
456 #define TASK_TRACE_MEMORY_INFO  24  /* no longer supported */
457 struct task_trace_memory_info {
458 	uint64_t  user_memory_address;  /* address of start of trace memory buffer */
459 	uint64_t  buffer_size;                  /* size of buffer in bytes */
460 	uint64_t  mailbox_array_size;   /* size of mailbox area in bytes */
461 };
462 typedef struct task_trace_memory_info task_trace_memory_info_data_t;
463 typedef struct task_trace_memory_info * task_trace_memory_info_t;
464 #define TASK_TRACE_MEMORY_INFO_COUNT  ((mach_msg_type_number_t) \
465 	        (sizeof(task_trace_memory_info_data_t) / sizeof(natural_t)))
466 
467 #define TASK_WAIT_STATE_INFO  25    /* deprecated. */
468 struct task_wait_state_info {
469 	uint64_t  total_wait_state_time;        /* Time that all threads past and present have been in a wait state */
470 	uint64_t  total_wait_sfi_state_time;    /* Time that threads have been in SFI wait (should be a subset of total wait state time */
471 	uint32_t  _reserved[4];
472 };
473 typedef struct task_wait_state_info task_wait_state_info_data_t;
474 typedef struct task_wait_state_info * task_wait_state_info_t;
475 #define TASK_WAIT_STATE_INFO_COUNT  ((mach_msg_type_number_t) \
476 	        (sizeof(task_wait_state_info_data_t) / sizeof(natural_t)))
477 
478 #define TASK_POWER_INFO_V2      26
479 
480 typedef struct {
481 	uint64_t                task_gpu_utilisation;
482 	uint64_t                task_gpu_stat_reserved0;
483 	uint64_t                task_gpu_stat_reserved1;
484 	uint64_t                task_gpu_stat_reserved2;
485 } gpu_energy_data;
486 
487 typedef gpu_energy_data *gpu_energy_data_t;
488 struct task_power_info_v2 {
489 	task_power_info_data_t  cpu_energy;
490 	gpu_energy_data gpu_energy;
491 #if defined(__arm__) || defined(__arm64__)
492 	uint64_t                task_energy;
493 #endif /* defined(__arm__) || defined(__arm64__) */
494 	uint64_t                task_ptime;
495 	uint64_t                task_pset_switches;
496 };
497 
498 typedef struct task_power_info_v2       task_power_info_v2_data_t;
499 typedef struct task_power_info_v2       *task_power_info_v2_t;
500 #define TASK_POWER_INFO_V2_COUNT_OLD    \
501 	        ((mach_msg_type_number_t) (sizeof (task_power_info_v2_data_t) - sizeof(uint64_t)*2) / sizeof (natural_t))
502 #define TASK_POWER_INFO_V2_COUNT        \
503 	        ((mach_msg_type_number_t) (sizeof (task_power_info_v2_data_t) / sizeof (natural_t)))
504 
505 #define TASK_VM_INFO_PURGEABLE_ACCOUNT 27 /* Used for xnu purgeable vm unit tests */
506 
507 #ifdef PRIVATE
508 struct pvm_account_info {
509 	uint64_t pvm_volatile_count; /* Number of volatile bytes associated with a task */
510 	uint64_t pvm_volatile_compressed_count; /* Number of volatile compressed bytes associated with a task */
511 	uint64_t pvm_nonvolatile_count; /* Number of nonvolatile bytes associated with a task */
512 	uint64_t pvm_nonvolatile_compressed_count; /* Number of nonvolatile compressed bytes associated with a task */
513 };
514 
515 typedef struct pvm_account_info *pvm_account_info_t;
516 typedef struct pvm_account_info pvm_account_info_data_t;
517 
518 #define PVM_ACCOUNT_INFO_COUNT ((mach_msg_type_number_t) \
519 	        (sizeof (pvm_account_info_data_t) / sizeof (natural_t)))
520 #endif /* PRIVATE */
521 
522 #define TASK_FLAGS_INFO  28                     /* return t_flags field */
523 struct task_flags_info {
524 	uint32_t        flags;                          /* task flags */
525 };
526 typedef struct task_flags_info task_flags_info_data_t;
527 typedef struct task_flags_info * task_flags_info_t;
528 #define TASK_FLAGS_INFO_COUNT  ((mach_msg_type_number_t) \
529 	        (sizeof(task_flags_info_data_t) / sizeof (natural_t)))
530 
531 #define TF_LP64         0x00000001 /* task has 64-bit addressing */
532 #define TF_64B_DATA     0x00000002 /* task has 64-bit data registers */
533 
534 #define TASK_DEBUG_INFO_INTERNAL    29 /* Used for kernel internal development tests. */
535 
536 #ifdef PRIVATE
537 struct task_debug_info_internal {
538 	integer_t suspend_count;
539 	uint64_t ipc_space_size;
540 };
541 typedef struct task_debug_info_internal *task_debug_info_internal_t;
542 typedef struct task_debug_info_internal task_debug_info_internal_data_t;
543 #define TASK_DEBUG_INFO_INTERNAL_COUNT  ((mach_msg_type_number_t) \
544 	        (sizeof (task_debug_info_internal_data_t) / sizeof(natural_t)))
545 
546 #endif /* PRIVATE */
547 
548 #ifdef PRIVATE
549 
550 typedef struct task_suspend_stats_s {
551 	uint64_t tss_last_start; /* mach_absolute_time of beginning of last suspension*/
552 	uint64_t tss_last_end; /* mach_absolute_time of end of last suspension */
553 	uint64_t tss_count; /* number of times this task has been suspended */
554 	uint64_t tss_duration; /* sum(mach_absolute_time) of time spend suspended */
555 } *task_suspend_stats_t;
556 
557 typedef struct task_suspend_stats_s task_suspend_stats_data_t;
558 #define TASK_SUSPEND_STATS_INFO 30
559 #define TASK_SUSPEND_STATS_INFO_COUNT ((mach_msg_type_number_t) \
560 	        (sizeof(task_suspend_stats_data_t) / sizeof(natural_t)))
561 
562 typedef struct task_suspend_source_s {
563 	uint64_t tss_time; /* mach_absolute_time of suspend */
564 	uint64_t tss_tid; /* tid of suspending thread */
565 	int tss_pid; /* pid of suspending task */
566 	char tss_procname[65]; /* name of suspending task */
567 	uint8_t tss_padding[3]; /* pad to multiple of natural_t */
568 } *task_suspend_source_t;
569 #define TASK_SUSPEND_SOURCES_MAX 4
570 typedef struct task_suspend_source_s task_suspend_source_array_t[TASK_SUSPEND_SOURCES_MAX];
571 
572 typedef struct task_suspend_source_s task_suspend_source_data_t;
573 #define TASK_SUSPEND_SOURCES_INFO 31
574 #define TASK_SUSPEND_SOURCES_INFO_COUNT ((mach_msg_type_number_t) \
575 	        (sizeof(task_suspend_source_data_t) * TASK_SUSPEND_SOURCES_MAX / sizeof(natural_t)))
576 
577 #endif /* PRIVATE */
578 
579 /*
580  * Type to control EXC_GUARD delivery options for a task
581  * via task_get/set_exc_guard_behavior interface(s).
582  */
583 typedef uint32_t task_exc_guard_behavior_t;
584 
585 /* EXC_GUARD optional delivery settings on a per-task basis */
586 #define TASK_EXC_GUARD_NONE                  0x00
587 #define TASK_EXC_GUARD_VM_DELIVER            0x01 /* Deliver virtual memory EXC_GUARD exceptions */
588 #define TASK_EXC_GUARD_VM_ONCE               0x02 /* Deliver them only once */
589 #define TASK_EXC_GUARD_VM_CORPSE             0x04 /* Deliver them via a forked corpse */
590 #define TASK_EXC_GUARD_VM_FATAL              0x08 /* Virtual Memory EXC_GUARD delivery is fatal */
591 #define TASK_EXC_GUARD_VM_ALL                0x0f
592 
593 #define TASK_EXC_GUARD_MP_DELIVER            0x10 /* Deliver mach port EXC_GUARD exceptions */
594 #define TASK_EXC_GUARD_MP_ONCE               0x20 /* Deliver them only once */
595 #define TASK_EXC_GUARD_MP_CORPSE             0x40 /* Deliver them via a forked corpse */
596 #define TASK_EXC_GUARD_MP_FATAL              0x80 /* mach port EXC_GUARD delivery is fatal */
597 #define TASK_EXC_GUARD_MP_ALL                0xf0
598 
599 #define TASK_EXC_GUARD_ALL                   0xff /* All optional deliver settings */
600 
601 #ifdef PRIVATE
602 /*
603  * Experimental mode of setting default guard behavior for non-Apple processes
604  * The default for 3rd party guards is shifted up 8 bits - but otherwise the same values as above.
605  */
606 #define TASK_EXC_GUARD_THIRD_PARTY_DEFAULT_SHIFT 0x8 /* 3rd party default shifted up in boot-arg */
607 
608 #define TASK_EXC_GUARD_HONOR_NAMED_DEFAULTS 0x10000  /* Honor the by-process-name defaults */
609 
610 #endif
611 
612 /*
613  * Type to control corpse forking options for a task
614  * via task_get/set_corpse_forking_behavior interface(s).
615  */
616 typedef uint32_t task_corpse_forking_behavior_t;
617 
618 #define TASK_CORPSE_FORKING_DISABLED_MEM_DIAG  0x01 /* Disable corpse forking because the task is running under a diagnostic tool */
619 
620 #ifdef XNU_KERNEL_PRIVATE
621 
622 __options_decl(task_control_port_options_t, uint32_t, {
623 	TASK_CONTROL_PORT_OPTIONS_NONE     = 0x00000000,
624 
625 	TASK_CONTROL_PORT_PINNED_SOFT      = 0x00000001,
626 	TASK_CONTROL_PORT_PINNED_HARD      = 0x00000002,
627 	TASK_CONTROL_PORT_IMMOVABLE_SOFT   = 0x00000004,
628 	TASK_CONTROL_PORT_IMMOVABLE_HARD   = 0x00000008,
629 });
630 
631 #define TASK_CONTROL_PORT_IMMOVABLE (TASK_CONTROL_PORT_IMMOVABLE_SOFT | TASK_CONTROL_PORT_IMMOVABLE_HARD)
632 #define TASK_CONTROL_PORT_PINNED    (TASK_CONTROL_PORT_PINNED_SOFT | TASK_CONTROL_PORT_PINNED_HARD)
633 
634 #endif /* XNU_KERNEL_PRIVATE */
635 
636 /*
637  * Obsolete interfaces.
638  */
639 
640 #define TASK_SCHED_TIMESHARE_INFO       10
641 #define TASK_SCHED_RR_INFO              11
642 #define TASK_SCHED_FIFO_INFO            12
643 
644 #define TASK_SCHED_INFO                 14
645 
646 #pragma pack(pop)
647 
648 #endif  /* _MACH_TASK_INFO_H_ */
649