mach_sys/
task_info.rs

1//! This module roughly corresponds to `mach/task_info.h`.
2
3use core::mem::size_of;
4use crate::ffi::c_uint;
5
6use crate::vm_types::{
7    integer_t,
8    natural_t,
9    mach_vm_address_t,
10    mach_vm_size_t,
11};
12use crate::message::mach_msg_type_number_t;
13
14pub const TASK_INFO_MAX:       c_uint = 1024;
15pub const TASK_BASIC_INFO_32:  c_uint = 4;
16pub const TASK_BASIC2_INFO_32: c_uint = 6; // what is this means?
17
18pub mod x86 {
19    pub const TASK_BASIC_INFO_64: super::c_uint = 5;
20}
21pub mod arm {
22    pub const TASK_BASIC_INFO_64: super::c_uint = 18;
23}
24
25#[cfg(target_arch = "x86_64")]
26pub use x86::*;
27
28#[cfg(target_arch = "aarch64")]
29pub use arm::*;
30
31#[cfg(target_pointer_width = "32")]
32pub use TASK_BASIC_INFO_32 as TASK_BASIC_INFO;
33
34#[cfg(target_pointer_width = "64")]
35pub use TASK_BASIC_INFO_64 as TASK_BASIC_INFO;
36
37pub const TASK_EVENTS_INFO:               c_uint = 2;
38pub const TASK_THREAD_TIMES_INFO:         c_uint = 3;
39pub const TASK_ABSOLUTETIME_INFO:         c_uint = 1;
40pub const TASK_KERNELMEMORY_INFO:         c_uint = 7;
41pub const TASK_SECURITY_TOKEN:            c_uint = 13;
42pub const TASK_AUDIT_TOKEN:               c_uint = 15;
43pub const TASK_AFFINITY_TAG_INFO:         c_uint = 16;
44pub const TASK_DYLD_INFO:                 c_uint = 17;
45pub const TASK_DYLD_ALL_IMAGE_INFO_32:    c_uint = 0;
46pub const TASK_DYLD_ALL_IMAGE_INFO_64:    c_uint = 1;
47pub const TASK_EXTMOD_INFO:               c_uint = 19;
48pub const MACH_TASK_BASIC_INFO:           c_uint = 20;
49pub const TASK_POWER_INFO:                c_uint = 21;
50pub const TASK_VM_INFO:                   c_uint = 22;
51pub const TASK_VM_INFO_PURGEABLE:         c_uint = 23;
52pub const TASK_TRACE_MEMORY_INFO:         c_uint = 24;
53pub const TASK_WAIT_STATE_INFO:           c_uint = 25;
54pub const TASK_POWER_INFO_V2:             c_uint = 26;
55pub const TASK_VM_INFO_PURGEABLE_ACCOUNT: c_uint = 27;
56pub const TASK_FLAGS_INFO:                c_uint = 28;
57pub const TASK_DEBUG_INFO_INTERNAL:       c_uint = 29;
58
59pub type task_info_t    = *mut integer_t;
60pub type task_flavor_t  = natural_t;
61
62pub type task_vm_info_t          =  task_vm_info_rev5_t;
63pub type task_vm_info            =  task_vm_info_t;
64pub use  TASK_VM_INFO_REV5_COUNT as TASK_VM_INFO_COUNT;
65
66pub const TASK_VM_INFO_REV5_COUNT: mach_msg_type_number_t = (size_of::<task_vm_info_rev5_t>() / size_of::<natural_t>() ) as _;
67pub const TASK_VM_INFO_REV4_COUNT: mach_msg_type_number_t = TASK_VM_INFO_REV5_COUNT - 1;
68pub const TASK_VM_INFO_REV3_COUNT: mach_msg_type_number_t = TASK_VM_INFO_REV4_COUNT - 2;
69pub const TASK_VM_INFO_REV2_COUNT: mach_msg_type_number_t = TASK_VM_INFO_REV3_COUNT - 42;
70pub const TASK_VM_INFO_REV1_COUNT: mach_msg_type_number_t = TASK_VM_INFO_REV2_COUNT - 4;
71pub const TASK_VM_INFO_REV0_COUNT: mach_msg_type_number_t = TASK_VM_INFO_REV1_COUNT - 2;
72
73// https://github.com/apple/darwin-xnu/blob/2ff845c2e033bd0ff64b5b6aa6063a1f8f65aa32/osfmk/mach/task_info.h#L425
74//
75/*
76
77#define TASK_VM_INFO_COUNT  ((mach_msg_type_number_t) \
78	(sizeof (task_vm_info_data_t) / sizeof (natural_t)))
79
80#define TASK_VM_INFO_REV5_COUNT TASK_VM_INFO_COUNT
81
82// doesn't include decompressions
83#define TASK_VM_INFO_REV4_COUNT \
84((mach_msg_type_number_t) (TASK_VM_INFO_REV5_COUNT - 1))
85
86// doesn't include limit bytes
87#define TASK_VM_INFO_REV3_COUNT \
88((mach_msg_type_number_t) (TASK_VM_INFO_REV4_COUNT - 2))
89
90// doesn't include extra ledgers info
91#define TASK_VM_INFO_REV2_COUNT \
92((mach_msg_type_number_t) (TASK_VM_INFO_REV3_COUNT - 42))
93
94// doesn't include min and max address
95#define TASK_VM_INFO_REV1_COUNT \
96((mach_msg_type_number_t) (TASK_VM_INFO_REV2_COUNT - 4))
97
98// doesn't include phys_footprint
99#define TASK_VM_INFO_REV0_COUNT \
100((mach_msg_type_number_t) (TASK_VM_INFO_REV1_COUNT - 2))
101
102*/
103
104#[repr(C, packed(4))]
105#[derive(
106    Copy, Clone,
107    Debug, Default,
108    Hash,
109    PartialOrd, Ord,
110    PartialEq, Eq,
111)]
112pub struct task_vm_info_rev0_t {
113    /// virtual memory size (bytes)
114    pub virtual_size:                mach_vm_size_t,
115
116    /// number of memory regions
117    pub region_count:                integer_t,
118
119    /// page size
120    pub page_size:                   integer_t,
121
122    /// resident memory size (bytes)
123    pub resident_size:               mach_vm_size_t,
124
125    /// peak resident size (bytes)
126    pub resident_size_peak:          mach_vm_size_t,
127
128    pub device:                      mach_vm_size_t,
129    pub device_peak:                 mach_vm_size_t,
130    pub internal:                    mach_vm_size_t,
131    pub internal_peak:               mach_vm_size_t,
132    pub external:                    mach_vm_size_t,
133    pub external_peak:               mach_vm_size_t,
134    pub reusable:                    mach_vm_size_t,
135    pub reusable_peak:               mach_vm_size_t,
136    pub purgeable_volatile_pmap:     mach_vm_size_t,
137    pub purgeable_volatile_resident: mach_vm_size_t,
138    pub purgeable_volatile_virtual:  mach_vm_size_t,
139    pub compressed:                  mach_vm_size_t,
140    pub compressed_peak:             mach_vm_size_t,
141    pub compressed_lifetime:         mach_vm_size_t,
142}
143
144#[repr(C, packed(4))]
145#[derive(
146    Copy, Clone,
147    Debug, Default,
148    Hash,
149    PartialOrd, Ord,
150    PartialEq, Eq,
151)]
152pub struct task_vm_info_rev1_t {
153    /// virtual memory size (bytes)
154    pub virtual_size:                mach_vm_size_t,
155
156    /// number of memory regions
157    pub region_count:                integer_t,
158
159    /// page size
160    pub page_size:                   integer_t,
161
162    /// resident memory size (bytes)
163    pub resident_size:               mach_vm_size_t,
164
165    /// peak resident size (bytes)
166    pub resident_size_peak:          mach_vm_size_t,
167
168    pub device:                      mach_vm_size_t,
169    pub device_peak:                 mach_vm_size_t,
170    pub internal:                    mach_vm_size_t,
171    pub internal_peak:               mach_vm_size_t,
172    pub external:                    mach_vm_size_t,
173    pub external_peak:               mach_vm_size_t,
174    pub reusable:                    mach_vm_size_t,
175    pub reusable_peak:               mach_vm_size_t,
176    pub purgeable_volatile_pmap:     mach_vm_size_t,
177    pub purgeable_volatile_resident: mach_vm_size_t,
178    pub purgeable_volatile_virtual:  mach_vm_size_t,
179    pub compressed:                  mach_vm_size_t,
180    pub compressed_peak:             mach_vm_size_t,
181    pub compressed_lifetime:         mach_vm_size_t,
182
183    /// added for rev1
184    pub phys_footprint: mach_vm_size_t,
185}
186
187#[repr(C, packed(4))]
188#[derive(
189    Copy, Clone,
190    Debug, Default,
191    Hash,
192    PartialOrd, Ord,
193    PartialEq, Eq,
194)]
195pub struct task_vm_info_rev2_t {
196    /// virtual memory size (bytes)
197    pub virtual_size:                mach_vm_size_t,
198
199    /// number of memory regions
200    pub region_count:                integer_t,
201
202    /// page size
203    pub page_size:                   integer_t,
204
205    /// resident memory size (bytes)
206    pub resident_size:               mach_vm_size_t,
207
208    /// peak resident size (bytes)
209    pub resident_size_peak:          mach_vm_size_t,
210
211    pub device:                      mach_vm_size_t,
212    pub device_peak:                 mach_vm_size_t,
213    pub internal:                    mach_vm_size_t,
214    pub internal_peak:               mach_vm_size_t,
215    pub external:                    mach_vm_size_t,
216    pub external_peak:               mach_vm_size_t,
217    pub reusable:                    mach_vm_size_t,
218    pub reusable_peak:               mach_vm_size_t,
219    pub purgeable_volatile_pmap:     mach_vm_size_t,
220    pub purgeable_volatile_resident: mach_vm_size_t,
221    pub purgeable_volatile_virtual:  mach_vm_size_t,
222    pub compressed:                  mach_vm_size_t,
223    pub compressed_peak:             mach_vm_size_t,
224    pub compressed_lifetime:         mach_vm_size_t,
225
226    // added for rev1
227    pub phys_footprint: mach_vm_size_t,
228
229    // added for rev2
230    pub min_address: mach_vm_address_t,
231    pub max_address: mach_vm_address_t,
232}
233
234#[repr(C, packed(4))]
235#[derive(
236    Copy, Clone,
237    Debug, Default,
238    Hash,
239    PartialOrd, Ord,
240    PartialEq, Eq,
241)]
242pub struct task_vm_info_rev3_t {
243    /// virtual memory size (bytes)
244    pub virtual_size:                mach_vm_size_t,
245
246    /// number of memory regions
247    pub region_count:                integer_t,
248
249    /// page size
250    pub page_size:                   integer_t,
251
252    /// resident memory size (bytes)
253    pub resident_size:               mach_vm_size_t,
254
255    /// peak resident size (bytes)
256    pub resident_size_peak:          mach_vm_size_t,
257
258    pub device:                      mach_vm_size_t,
259    pub device_peak:                 mach_vm_size_t,
260    pub internal:                    mach_vm_size_t,
261    pub internal_peak:               mach_vm_size_t,
262    pub external:                    mach_vm_size_t,
263    pub external_peak:               mach_vm_size_t,
264    pub reusable:                    mach_vm_size_t,
265    pub reusable_peak:               mach_vm_size_t,
266    pub purgeable_volatile_pmap:     mach_vm_size_t,
267    pub purgeable_volatile_resident: mach_vm_size_t,
268    pub purgeable_volatile_virtual:  mach_vm_size_t,
269    pub compressed:                  mach_vm_size_t,
270    pub compressed_peak:             mach_vm_size_t,
271    pub compressed_lifetime:         mach_vm_size_t,
272
273    // added for rev1
274    pub phys_footprint:              mach_vm_size_t,
275
276    // added for rev2
277    pub min_address:                 mach_vm_address_t,
278    pub max_address:                 mach_vm_address_t,
279
280    // added for rev3
281    pub ledger_phys_footprint_peak:                 i64,
282    pub ledger_purgeable_nonvolatile:               i64,
283    pub ledger_purgeable_novolatile_compressed:     i64,
284    pub ledger_purgeable_volatile:                  i64,
285    pub ledger_purgeable_volatile_compressed:       i64,
286    pub ledger_tag_network_nonvolatile:             i64,
287    pub ledger_tag_network_nonvolatile_compressed:  i64,
288    pub ledger_tag_network_volatile:                i64,
289    pub ledger_tag_network_volatile_compressed:     i64,
290    pub ledger_tag_media_footprint:                 i64,
291    pub ledger_tag_media_footprint_compressed:      i64,
292    pub ledger_tag_media_nofootprint:               i64,
293    pub ledger_tag_media_nofootprint_compressed:    i64,
294    pub ledger_tag_graphics_footprint:              i64,
295    pub ledger_tag_graphics_footprint_compressed:   i64,
296    pub ledger_tag_graphics_nofootprint:            i64,
297    pub ledger_tag_graphics_nofootprint_compressed: i64,
298    pub ledger_tag_neural_footprint:                i64,
299    pub ledger_tag_neural_footprint_compressed:     i64,
300    pub ledger_tag_neural_nofootprint:              i64,
301    pub ledger_tag_neural_nofootprint_compressed:   i64,
302}
303
304#[repr(C, packed(4))]
305#[derive(
306    Copy, Clone,
307    Debug, Default,
308    Hash,
309    PartialOrd, Ord,
310    PartialEq, Eq,
311)]
312pub struct task_vm_info_rev4_t {
313    /// virtual memory size (bytes)
314    pub virtual_size:                mach_vm_size_t,
315
316    /// number of memory regions
317    pub region_count:                integer_t,
318
319    /// page size
320    pub page_size:                   integer_t,
321
322    /// resident memory size (bytes)
323    pub resident_size:               mach_vm_size_t,
324
325    /// peak resident size (bytes)
326    pub resident_size_peak:          mach_vm_size_t,
327
328    pub device:                      mach_vm_size_t,
329    pub device_peak:                 mach_vm_size_t,
330    pub internal:                    mach_vm_size_t,
331    pub internal_peak:               mach_vm_size_t,
332    pub external:                    mach_vm_size_t,
333    pub external_peak:               mach_vm_size_t,
334    pub reusable:                    mach_vm_size_t,
335    pub reusable_peak:               mach_vm_size_t,
336    pub purgeable_volatile_pmap:     mach_vm_size_t,
337    pub purgeable_volatile_resident: mach_vm_size_t,
338    pub purgeable_volatile_virtual:  mach_vm_size_t,
339    pub compressed:                  mach_vm_size_t,
340    pub compressed_peak:             mach_vm_size_t,
341    pub compressed_lifetime:         mach_vm_size_t,
342
343    // added for rev1
344    pub phys_footprint:              mach_vm_size_t,
345
346    // added for rev2
347    pub min_address:                 mach_vm_address_t,
348    pub max_address:                 mach_vm_address_t,
349
350    // added for rev3
351    pub ledger_phys_footprint_peak:                 i64,
352    pub ledger_purgeable_nonvolatile:               i64,
353    pub ledger_purgeable_novolatile_compressed:     i64,
354    pub ledger_purgeable_volatile:                  i64,
355    pub ledger_purgeable_volatile_compressed:       i64,
356    pub ledger_tag_network_nonvolatile:             i64,
357    pub ledger_tag_network_nonvolatile_compressed:  i64,
358    pub ledger_tag_network_volatile:                i64,
359    pub ledger_tag_network_volatile_compressed:     i64,
360    pub ledger_tag_media_footprint:                 i64,
361    pub ledger_tag_media_footprint_compressed:      i64,
362    pub ledger_tag_media_nofootprint:               i64,
363    pub ledger_tag_media_nofootprint_compressed:    i64,
364    pub ledger_tag_graphics_footprint:              i64,
365    pub ledger_tag_graphics_footprint_compressed:   i64,
366    pub ledger_tag_graphics_nofootprint:            i64,
367    pub ledger_tag_graphics_nofootprint_compressed: i64,
368    pub ledger_tag_neural_footprint:                i64,
369    pub ledger_tag_neural_footprint_compressed:     i64,
370    pub ledger_tag_neural_nofootprint:              i64,
371    pub ledger_tag_neural_nofootprint_compressed:   i64,
372
373    // added for rev4
374    pub limit_bytes_remaining: u64,
375}
376
377#[repr(C, packed(4))]
378#[derive(
379    Copy, Clone,
380    Debug, Default,
381    Hash,
382    PartialOrd, Ord,
383    PartialEq, Eq,
384)]
385pub struct task_vm_info_rev5_t {
386    /// virtual memory size (bytes)
387    pub virtual_size:                mach_vm_size_t,
388
389    /// number of memory regions
390    pub region_count:                integer_t,
391
392    /// page size
393    pub page_size:                   integer_t,
394
395    /// resident memory size (bytes)
396    pub resident_size:               mach_vm_size_t,
397
398    /// peak resident size (bytes)
399    pub resident_size_peak:          mach_vm_size_t,
400
401    pub device:                      mach_vm_size_t,
402    pub device_peak:                 mach_vm_size_t,
403    pub internal:                    mach_vm_size_t,
404    pub internal_peak:               mach_vm_size_t,
405    pub external:                    mach_vm_size_t,
406    pub external_peak:               mach_vm_size_t,
407    pub reusable:                    mach_vm_size_t,
408    pub reusable_peak:               mach_vm_size_t,
409    pub purgeable_volatile_pmap:     mach_vm_size_t,
410    pub purgeable_volatile_resident: mach_vm_size_t,
411    pub purgeable_volatile_virtual:  mach_vm_size_t,
412    pub compressed:                  mach_vm_size_t,
413    pub compressed_peak:             mach_vm_size_t,
414    pub compressed_lifetime:         mach_vm_size_t,
415
416    // added for rev1
417    pub phys_footprint:              mach_vm_size_t,
418
419    // added for rev2
420    pub min_address:                 mach_vm_address_t,
421    pub max_address:                 mach_vm_address_t,
422
423    // added for rev3
424    pub ledger_phys_footprint_peak:                 i64,
425    pub ledger_purgeable_nonvolatile:               i64,
426    pub ledger_purgeable_novolatile_compressed:     i64,
427    pub ledger_purgeable_volatile:                  i64,
428    pub ledger_purgeable_volatile_compressed:       i64,
429    pub ledger_tag_network_nonvolatile:             i64,
430    pub ledger_tag_network_nonvolatile_compressed:  i64,
431    pub ledger_tag_network_volatile:                i64,
432    pub ledger_tag_network_volatile_compressed:     i64,
433    pub ledger_tag_media_footprint:                 i64,
434    pub ledger_tag_media_footprint_compressed:      i64,
435    pub ledger_tag_media_nofootprint:               i64,
436    pub ledger_tag_media_nofootprint_compressed:    i64,
437    pub ledger_tag_graphics_footprint:              i64,
438    pub ledger_tag_graphics_footprint_compressed:   i64,
439    pub ledger_tag_graphics_nofootprint:            i64,
440    pub ledger_tag_graphics_nofootprint_compressed: i64,
441    pub ledger_tag_neural_footprint:                i64,
442    pub ledger_tag_neural_footprint_compressed:     i64,
443    pub ledger_tag_neural_nofootprint:              i64,
444    pub ledger_tag_neural_nofootprint_compressed:   i64,
445
446    // added for rev4
447    pub limit_bytes_remaining: u64,
448
449    // added for rev5
450    pub decompressions: integer_t,
451}
452
453#[repr(C, packed(4))]
454#[derive(
455    Copy, Clone,
456    Debug, Default,
457    Hash,
458    PartialOrd, Ord,
459    PartialEq, Eq,
460)]
461pub struct task_dyld_info_t {
462    pub all_image_info_addr:   mach_vm_address_t,
463    pub all_image_info_size:   mach_vm_size_t,
464    pub all_image_info_format: integer_t,
465}
466pub type task_dyld_info        = task_dyld_info_t;
467pub type task_dyld_info_data_t = task_dyld_info_t;
468