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  Software.Distribution@CS.CMU.EDU
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 	mach_vm_size_t  virtual_size;   /* virtual memory size (bytes) */
116 	mach_vm_size_t  resident_size;  /* resident memory size (bytes) */
117 	time_value_t    user_time;      /* total user run time for
118 	                                 *  terminated threads */
119 	time_value_t    system_time;    /* total system run time for
120 	                                 *  terminated threads */
121 	policy_t        policy;         /* default policy for new threads */
122 };
123 typedef struct task_basic_info_64       task_basic_info_64_data_t;
124 typedef struct task_basic_info_64       *task_basic_info_64_t;
125 
126 #define TASK_BASIC_INFO_64      5       /* 64-bit capable basic info */
127 #define TASK_BASIC_INFO_64_COUNT   \
128 	        (sizeof(task_basic_info_64_data_t) / sizeof(natural_t))
129 
130 
131 /* localized structure - cannot be safely passed between tasks of differing sizes */
132 /* Don't use this, use MACH_TASK_BASIC_INFO instead */
133 struct task_basic_info {
134 	integer_t       suspend_count;  /* suspend count for task */
135 	vm_size_t       virtual_size;   /* virtual memory size (bytes) */
136 	vm_size_t       resident_size;  /* resident memory size (bytes) */
137 	time_value_t    user_time;      /* total user run time for
138 	                                 *  terminated threads */
139 	time_value_t    system_time;    /* total system run time for
140 	                                 *  terminated threads */
141 	policy_t        policy;         /* default policy for new threads */
142 };
143 
144 typedef struct task_basic_info          task_basic_info_data_t;
145 typedef struct task_basic_info          *task_basic_info_t;
146 #define TASK_BASIC_INFO_COUNT   \
147 	        (sizeof(task_basic_info_data_t) / sizeof(natural_t))
148 #if !defined(__LP64__)
149 #define TASK_BASIC_INFO TASK_BASIC_INFO_32
150 #else
151 #define TASK_BASIC_INFO TASK_BASIC_INFO_64
152 #endif
153 
154 
155 
156 #define TASK_EVENTS_INFO        2       /* various event counts */
157 
158 struct task_events_info {
159 	integer_t       faults;         /* number of page faults */
160 	integer_t       pageins;        /* number of actual pageins */
161 	integer_t       cow_faults;     /* number of copy-on-write faults */
162 	integer_t       messages_sent;  /* number of messages sent */
163 	integer_t       messages_received; /* number of messages received */
164 	integer_t       syscalls_mach;  /* number of mach system calls */
165 	integer_t       syscalls_unix;  /* number of unix system calls */
166 	integer_t       csw;            /* number of context switches */
167 };
168 typedef struct task_events_info         task_events_info_data_t;
169 typedef struct task_events_info         *task_events_info_t;
170 #define TASK_EVENTS_INFO_COUNT          ((mach_msg_type_number_t) \
171 	        (sizeof(task_events_info_data_t) / sizeof(natural_t)))
172 
173 #define TASK_THREAD_TIMES_INFO  3       /* total times for live threads -
174 	                                 *  only accurate if suspended */
175 
176 struct task_thread_times_info {
177 	time_value_t    user_time;      /* total user run time for
178 	                                 *  live threads */
179 	time_value_t    system_time;    /* total system run time for
180 	                                 *  live threads */
181 };
182 
183 typedef struct task_thread_times_info   task_thread_times_info_data_t;
184 typedef struct task_thread_times_info   *task_thread_times_info_t;
185 #define TASK_THREAD_TIMES_INFO_COUNT    ((mach_msg_type_number_t) \
186 	        (sizeof(task_thread_times_info_data_t) / sizeof(natural_t)))
187 
188 #define TASK_ABSOLUTETIME_INFO  1
189 
190 struct task_absolutetime_info {
191 	uint64_t                total_user;
192 	uint64_t                total_system;
193 	uint64_t                threads_user;   /* existing threads only */
194 	uint64_t                threads_system;
195 };
196 
197 typedef struct task_absolutetime_info   task_absolutetime_info_data_t;
198 typedef struct task_absolutetime_info   *task_absolutetime_info_t;
199 #define TASK_ABSOLUTETIME_INFO_COUNT    ((mach_msg_type_number_t) \
200 	        (sizeof (task_absolutetime_info_data_t) / sizeof (natural_t)))
201 
202 #define TASK_KERNELMEMORY_INFO  7
203 
204 struct task_kernelmemory_info {
205 	uint64_t                total_palloc;   /* private kernel mem alloc'ed */
206 	uint64_t                total_pfree;    /* private kernel mem freed */
207 	uint64_t                total_salloc;   /* shared kernel mem alloc'ed */
208 	uint64_t                total_sfree;    /* shared kernel mem freed */
209 };
210 
211 typedef struct task_kernelmemory_info   task_kernelmemory_info_data_t;
212 typedef struct task_kernelmemory_info   *task_kernelmemory_info_t;
213 #define TASK_KERNELMEMORY_INFO_COUNT    ((mach_msg_type_number_t) \
214 	        (sizeof (task_kernelmemory_info_data_t) / sizeof (natural_t)))
215 
216 #define TASK_SECURITY_TOKEN             13
217 #define TASK_SECURITY_TOKEN_COUNT       ((mach_msg_type_number_t) \
218 	        (sizeof(security_token_t) / sizeof(natural_t)))
219 
220 #define TASK_AUDIT_TOKEN                15
221 #define TASK_AUDIT_TOKEN_COUNT  \
222 	        (sizeof(audit_token_t) / sizeof(natural_t))
223 
224 
225 #define TASK_AFFINITY_TAG_INFO          16      /* This is experimental. */
226 
227 struct task_affinity_tag_info {
228 	integer_t               set_count;
229 	integer_t               min;
230 	integer_t               max;
231 	integer_t               task_count;
232 };
233 typedef struct task_affinity_tag_info   task_affinity_tag_info_data_t;
234 typedef struct task_affinity_tag_info   *task_affinity_tag_info_t;
235 #define TASK_AFFINITY_TAG_INFO_COUNT    \
236 	        (sizeof(task_affinity_tag_info_data_t) / sizeof(natural_t))
237 
238 #define TASK_DYLD_INFO                  17
239 
240 struct task_dyld_info {
241 	mach_vm_address_t       all_image_info_addr;
242 	mach_vm_size_t          all_image_info_size;
243 	integer_t               all_image_info_format;
244 };
245 typedef struct task_dyld_info   task_dyld_info_data_t;
246 typedef struct task_dyld_info   *task_dyld_info_t;
247 #define TASK_DYLD_INFO_COUNT    \
248 	        (sizeof(task_dyld_info_data_t) / sizeof(natural_t))
249 #define TASK_DYLD_ALL_IMAGE_INFO_32     0       /* format value */
250 #define TASK_DYLD_ALL_IMAGE_INFO_64     1       /* format value */
251 
252 
253 #define TASK_EXTMOD_INFO                        19
254 
255 struct task_extmod_info {
256 	unsigned char   task_uuid[16];
257 	vm_extmod_statistics_data_t             extmod_statistics;
258 };
259 typedef struct task_extmod_info task_extmod_info_data_t;
260 typedef struct task_extmod_info *task_extmod_info_t;
261 #define TASK_EXTMOD_INFO_COUNT  \
262 	        (sizeof(task_extmod_info_data_t) / sizeof(natural_t))
263 
264 
265 #define MACH_TASK_BASIC_INFO     20         /* always 64-bit basic info */
266 struct mach_task_basic_info {
267 	mach_vm_size_t  virtual_size;       /* virtual memory size (bytes) */
268 	mach_vm_size_t  resident_size;      /* resident memory size (bytes) */
269 	mach_vm_size_t  resident_size_max;  /* maximum resident memory size (bytes) */
270 	time_value_t    user_time;          /* total user run time for
271 	                                     *  terminated threads */
272 	time_value_t    system_time;        /* total system run time for
273 	                                     *  terminated threads */
274 	policy_t        policy;             /* default policy for new threads */
275 	integer_t       suspend_count;      /* suspend count for task */
276 };
277 typedef struct mach_task_basic_info       mach_task_basic_info_data_t;
278 typedef struct mach_task_basic_info       *mach_task_basic_info_t;
279 #define MACH_TASK_BASIC_INFO_COUNT   \
280 	        (sizeof(mach_task_basic_info_data_t) / sizeof(natural_t))
281 
282 
283 #define TASK_POWER_INFO 21
284 
285 struct task_power_info {
286 	uint64_t                total_user;
287 	uint64_t                total_system;
288 	uint64_t                task_interrupt_wakeups;
289 	uint64_t                task_platform_idle_wakeups;
290 	uint64_t                task_timer_wakeups_bin_1;
291 	uint64_t                task_timer_wakeups_bin_2;
292 };
293 
294 typedef struct task_power_info  task_power_info_data_t;
295 typedef struct task_power_info  *task_power_info_t;
296 #define TASK_POWER_INFO_COUNT   ((mach_msg_type_number_t) \
297 	        (sizeof (task_power_info_data_t) / sizeof (natural_t)))
298 
299 
300 
301 #define TASK_VM_INFO            22
302 #define TASK_VM_INFO_PURGEABLE  23
303 struct task_vm_info {
304 	mach_vm_size_t  virtual_size;       /* virtual memory size (bytes) */
305 	integer_t       region_count;       /* number of memory regions */
306 	integer_t       page_size;
307 	mach_vm_size_t  resident_size;      /* resident memory size (bytes) */
308 	mach_vm_size_t  resident_size_peak; /* peak resident size (bytes) */
309 
310 	mach_vm_size_t  device;
311 	mach_vm_size_t  device_peak;
312 	mach_vm_size_t  internal;
313 	mach_vm_size_t  internal_peak;
314 	mach_vm_size_t  external;
315 	mach_vm_size_t  external_peak;
316 	mach_vm_size_t  reusable;
317 	mach_vm_size_t  reusable_peak;
318 	mach_vm_size_t  purgeable_volatile_pmap;
319 	mach_vm_size_t  purgeable_volatile_resident;
320 	mach_vm_size_t  purgeable_volatile_virtual;
321 	mach_vm_size_t  compressed;
322 	mach_vm_size_t  compressed_peak;
323 	mach_vm_size_t  compressed_lifetime;
324 
325 	/* added for rev1 */
326 	mach_vm_size_t  phys_footprint;
327 
328 	/* added for rev2 */
329 	mach_vm_address_t       min_address;
330 	mach_vm_address_t       max_address;
331 
332 	/* added for rev3 */
333 	int64_t ledger_phys_footprint_peak;
334 	int64_t ledger_purgeable_nonvolatile;
335 	int64_t ledger_purgeable_novolatile_compressed;
336 	int64_t ledger_purgeable_volatile;
337 	int64_t ledger_purgeable_volatile_compressed;
338 	int64_t ledger_tag_network_nonvolatile;
339 	int64_t ledger_tag_network_nonvolatile_compressed;
340 	int64_t ledger_tag_network_volatile;
341 	int64_t ledger_tag_network_volatile_compressed;
342 	int64_t ledger_tag_media_footprint;
343 	int64_t ledger_tag_media_footprint_compressed;
344 	int64_t ledger_tag_media_nofootprint;
345 	int64_t ledger_tag_media_nofootprint_compressed;
346 	int64_t ledger_tag_graphics_footprint;
347 	int64_t ledger_tag_graphics_footprint_compressed;
348 	int64_t ledger_tag_graphics_nofootprint;
349 	int64_t ledger_tag_graphics_nofootprint_compressed;
350 	int64_t ledger_tag_neural_footprint;
351 	int64_t ledger_tag_neural_footprint_compressed;
352 	int64_t ledger_tag_neural_nofootprint;
353 	int64_t ledger_tag_neural_nofootprint_compressed;
354 
355 	/* added for rev4 */
356 	uint64_t limit_bytes_remaining;
357 
358 	/* added for rev5 */
359 	integer_t decompressions;
360 };
361 typedef struct task_vm_info     task_vm_info_data_t;
362 typedef struct task_vm_info     *task_vm_info_t;
363 #define TASK_VM_INFO_COUNT      ((mach_msg_type_number_t) \
364 	        (sizeof (task_vm_info_data_t) / sizeof (natural_t)))
365 #define TASK_VM_INFO_REV5_COUNT TASK_VM_INFO_COUNT
366 #define TASK_VM_INFO_REV4_COUNT /* doesn't include decompressions */ \
367 	((mach_msg_type_number_t) (TASK_VM_INFO_REV5_COUNT - 1))
368 #define TASK_VM_INFO_REV3_COUNT /* doesn't include limit bytes */ \
369 	((mach_msg_type_number_t) (TASK_VM_INFO_REV4_COUNT - 2))
370 #define TASK_VM_INFO_REV2_COUNT /* doesn't include extra ledgers info */ \
371 	((mach_msg_type_number_t) (TASK_VM_INFO_REV3_COUNT - 42))
372 #define TASK_VM_INFO_REV1_COUNT /* doesn't include min and max address */ \
373 	((mach_msg_type_number_t) (TASK_VM_INFO_REV2_COUNT - 4))
374 #define TASK_VM_INFO_REV0_COUNT /* doesn't include phys_footprint */ \
375 	((mach_msg_type_number_t) (TASK_VM_INFO_REV1_COUNT - 2))
376 
377 typedef struct vm_purgeable_info        task_purgable_info_t;
378 
379 
380 #define TASK_TRACE_MEMORY_INFO  24
381 struct task_trace_memory_info {
382 	uint64_t  user_memory_address;  /* address of start of trace memory buffer */
383 	uint64_t  buffer_size;                  /* size of buffer in bytes */
384 	uint64_t  mailbox_array_size;   /* size of mailbox area in bytes */
385 };
386 typedef struct task_trace_memory_info task_trace_memory_info_data_t;
387 typedef struct task_trace_memory_info * task_trace_memory_info_t;
388 #define TASK_TRACE_MEMORY_INFO_COUNT  ((mach_msg_type_number_t) \
389 	        (sizeof(task_trace_memory_info_data_t) / sizeof(natural_t)))
390 
391 #define TASK_WAIT_STATE_INFO  25    /* deprecated. */
392 struct task_wait_state_info {
393 	uint64_t  total_wait_state_time;        /* Time that all threads past and present have been in a wait state */
394 	uint64_t  total_wait_sfi_state_time;    /* Time that threads have been in SFI wait (should be a subset of total wait state time */
395 	uint32_t  _reserved[4];
396 };
397 typedef struct task_wait_state_info task_wait_state_info_data_t;
398 typedef struct task_wait_state_info * task_wait_state_info_t;
399 #define TASK_WAIT_STATE_INFO_COUNT  ((mach_msg_type_number_t) \
400 	        (sizeof(task_wait_state_info_data_t) / sizeof(natural_t)))
401 
402 #define TASK_POWER_INFO_V2      26
403 
404 typedef struct {
405 	uint64_t                task_gpu_utilisation;
406 	uint64_t                task_gpu_stat_reserved0;
407 	uint64_t                task_gpu_stat_reserved1;
408 	uint64_t                task_gpu_stat_reserved2;
409 } gpu_energy_data;
410 
411 typedef gpu_energy_data *gpu_energy_data_t;
412 struct task_power_info_v2 {
413 	task_power_info_data_t  cpu_energy;
414 	gpu_energy_data gpu_energy;
415 	uint64_t                task_ptime;
416 	uint64_t                task_pset_switches;
417 };
418 
419 typedef struct task_power_info_v2       task_power_info_v2_data_t;
420 typedef struct task_power_info_v2       *task_power_info_v2_t;
421 #define TASK_POWER_INFO_V2_COUNT_OLD    \
422 	        ((mach_msg_type_number_t) (sizeof (task_power_info_v2_data_t) - sizeof(uint64_t)*2) / sizeof (natural_t))
423 #define TASK_POWER_INFO_V2_COUNT        \
424 	        ((mach_msg_type_number_t) (sizeof (task_power_info_v2_data_t) / sizeof (natural_t)))
425 
426 #define TASK_VM_INFO_PURGEABLE_ACCOUNT 27 /* Used for xnu purgeable vm unit tests */
427 
428 
429 #define TASK_FLAGS_INFO  28                     /* return t_flags field */
430 struct task_flags_info {
431 	uint32_t        flags;                          /* task flags */
432 };
433 typedef struct task_flags_info task_flags_info_data_t;
434 typedef struct task_flags_info * task_flags_info_t;
435 #define TASK_FLAGS_INFO_COUNT  ((mach_msg_type_number_t) \
436 	        (sizeof(task_flags_info_data_t) / sizeof (natural_t)))
437 
438 #define TF_LP64         0x00000001 /* task has 64-bit addressing */
439 #define TF_64B_DATA     0x00000002 /* task has 64-bit data registers */
440 
441 #define TASK_DEBUG_INFO_INTERNAL    29 /* Used for kernel internal development tests. */
442 
443 
444 /*
445  * Type to control EXC_GUARD delivery options for a task
446  * via task_get/set_exc_guard_behavior interface(s).
447  */
448 typedef uint32_t task_exc_guard_behavior_t;
449 
450 /* EXC_GUARD optional delivery settings on a per-task basis */
451 #define TASK_EXC_GUARD_VM_DELIVER            0x01 /* Deliver virtual memory EXC_GUARD exceptions */
452 #define TASK_EXC_GUARD_VM_ONCE               0x02 /* Deliver them only once */
453 #define TASK_EXC_GUARD_VM_CORPSE             0x04 /* Deliver them via a forked corpse */
454 #define TASK_EXC_GUARD_VM_FATAL              0x08 /* Virtual Memory EXC_GUARD delivery is fatal */
455 #define TASK_EXC_GUARD_VM_ALL                0x0f
456 
457 #define TASK_EXC_GUARD_MP_DELIVER            0x10 /* Deliver mach port EXC_GUARD exceptions */
458 #define TASK_EXC_GUARD_MP_ONCE               0x20 /* Deliver them only once */
459 #define TASK_EXC_GUARD_MP_CORPSE             0x40 /* Deliver them via a forked corpse */
460 #define TASK_EXC_GUARD_MP_FATAL              0x80 /* mach port EXC_GUARD delivery is fatal */
461 #define TASK_EXC_GUARD_MP_ALL                0xf0
462 
463 #define TASK_EXC_GUARD_ALL                   0xff /* All optional deliver settings */
464 
465 
466 /*
467  * Obsolete interfaces.
468  */
469 
470 #define TASK_SCHED_TIMESHARE_INFO       10
471 #define TASK_SCHED_RR_INFO              11
472 #define TASK_SCHED_FIFO_INFO            12
473 
474 #define TASK_SCHED_INFO                 14
475 
476 #pragma pack(pop)
477 
478 #endif  /* _MACH_TASK_INFO_H_ */