xref: /xnu-12377.41.6/libkdd/kcdtypes.c (revision bbb1b6f9e71b8cdde6e5cd6f4841f207dee3d828)
1 /*
2  * Copyright (c) 2015 Apple Inc. All rights reserved.
3  *
4  * @APPLE_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. Please obtain a copy of the License at
10  * http://www.opensource.apple.com/apsl/ and read it before using this
11  * file.
12  *
13  * The Original Code and all software distributed under the License are
14  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18  * Please see the License for the specific language governing rights and
19  * limitations under the License.
20  *
21  * @APPLE_LICENSE_HEADER_END@
22  */
23 
24 #include <kcdata.h>
25 #include <sys/time.h>
26 #include <stdlib.h>
27 #include <stddef.h>
28 #include <string.h>
29 #include <assert.h>
30 #include <stdio.h>
31 #include <mach/mach_time.h>
32 #include <assert.h>
33 
34 /*!
35  * @function kcdata_get_typedescription
36  *
37  * @abstract
38  * Search the known type definitions for type with id type_id.
39  *
40  * @param type_id
41  * A unsinged int type specified by the KCDATA.
42  *
43  * @param buffer
44  * pointer to data area where type definition will be saved.
45  *
46  * @param buffer_size
47  * size of the buffer provided.
48  *
49  * @return struct kcdata_type_definition *
50  * pointer to a malloc'ed buffer holding the type definition and each subtype defintion for its fields.
51  * It may return NULL if no type with id == type_id is found.
52  * Note: The caller is responsible to free() the memory when its no longer used.
53  *
54  * @discussion
55  * This function queries the known type definitions table. If found the defintion data is returned
56  * else NULL is returned. It is advised to cache the return value from this function since the data
57  * is always going to be the same for same type_id. The definition setup requires memory on heap.
58  * The caller should make sure to free() the data once its done with using it.
59  *
60  */
61 struct kcdata_type_definition * kcdata_get_typedescription(unsigned type_id, uint8_t * buffer, uint32_t buffer_size);
62 
63 /* forward declarations for helper routines */
64 static uint32_t get_kctype_subtype_size(kctype_subtype_t type);
65 static void setup_subtype_description(kcdata_subtype_descriptor_t desc, kctype_subtype_t type, uint32_t offset, char * name);
66 static void setup_subtype_array_description(
67 	kcdata_subtype_descriptor_t desc, kctype_subtype_t type, uint32_t offset, uint32_t count, char * name);
68 static void setup_type_definition(struct kcdata_type_definition * d, uint32_t type, uint32_t num_elems, char * name);
69 
70 struct kcdata_type_definition *
kcdata_get_typedescription(unsigned type_id,uint8_t * buffer,uint32_t buffer_size)71 kcdata_get_typedescription(unsigned type_id, uint8_t * buffer, uint32_t buffer_size)
72 {
73 	unsigned int i = 0;
74 #define _STR_VALUE(x) #x
75 #define _SUBTYPE_TRUNC(t, s, f, name) do { \
76     setup_subtype_description(&subtypes[i++], (t), offsetof(s, f), name); \
77     _Static_assert(sizeof(name) == sizeof ((struct kcdata_subtype_descriptor *)0)->kcs_name, "\"" name "\" should fit exactly in kcs_name"); \
78 } while (0)
79 #define _SUBTYPE(t, s, f) do { \
80     setup_subtype_description(&subtypes[i++], (t), offsetof(s, f), _STR_VALUE(f)); \
81     _Static_assert(sizeof(_STR_VALUE(f)) <= sizeof ((struct kcdata_subtype_descriptor *)0)->kcs_name, "\"" _STR_VALUE(f) "\" should fit in kcs_name"); \
82 } while (0)
83 
84 #define _SUBTYPE_ARRAY(t, s, f, c) setup_subtype_array_description(&subtypes[i++], (t), offsetof(s, f), (c), _STR_VALUE(f))
85 #define _STRINGTYPE(f) setup_subtype_array_description(&subtypes[i++], KC_ST_CHAR, 0, UINT16_MAX, f)
86 
87 	if (buffer_size < sizeof(struct kcdata_type_definition) || buffer == NULL) {
88 		return NULL;
89 	}
90 
91 	struct kcdata_type_definition * retval = (struct kcdata_type_definition *)&buffer[0];
92 	kcdata_subtype_descriptor_t subtypes = (kcdata_subtype_descriptor_t)&buffer[sizeof(struct kcdata_type_definition)];
93 	switch (type_id) {
94 	case KCDATA_TYPE_STRING_DESC: {
95 		i = 0;
96 		setup_subtype_array_description(&subtypes[i++], KC_ST_CHAR, 0, KCDATA_DESC_MAXLEN, "desc");
97 		setup_subtype_array_description(&subtypes[i++], KC_ST_CHAR, KCDATA_DESC_MAXLEN, UINT16_MAX, "data");
98 		setup_type_definition(retval, type_id, i, "string_desc");
99 		break;
100 	}
101 
102 	case KCDATA_TYPE_UINT32_DESC: {
103 		i = 0;
104 		setup_subtype_array_description(&subtypes[i++], KC_ST_CHAR, 0, KCDATA_DESC_MAXLEN, "desc");
105 		setup_subtype_description(&subtypes[i++], KC_ST_UINT32, KCDATA_DESC_MAXLEN, "data");
106 		setup_type_definition(retval, type_id, i, "uint32_desc");
107 		break;
108 	}
109 
110 	case KCDATA_TYPE_UINT64_DESC: {
111 		i = 0;
112 		setup_subtype_array_description(&subtypes[i++], KC_ST_CHAR, 0, KCDATA_DESC_MAXLEN, "desc");
113 		setup_subtype_description(&subtypes[i++], KC_ST_UINT64, KCDATA_DESC_MAXLEN, "data");
114 		setup_type_definition(retval, type_id, i, "uint64_desc");
115 		break;
116 	}
117 
118 	case KCDATA_TYPE_INT32_DESC: {
119 		i = 0;
120 		setup_subtype_array_description(&subtypes[i++], KC_ST_CHAR, 0, KCDATA_DESC_MAXLEN, "desc");
121 		setup_subtype_description(&subtypes[i++], KC_ST_INT32, KCDATA_DESC_MAXLEN, "data");
122 		setup_type_definition(retval, type_id, i, "int32_desc");
123 		break;
124 	}
125 
126 	case KCDATA_TYPE_INT64_DESC: {
127 		i = 0;
128 		setup_subtype_array_description(&subtypes[i++], KC_ST_CHAR, 0, KCDATA_DESC_MAXLEN, "desc");
129 		setup_subtype_description(&subtypes[i++], KC_ST_INT64, KCDATA_DESC_MAXLEN, "data");
130 		setup_type_definition(retval, type_id, i, "int64_desc");
131 		break;
132 	}
133 
134 	case KCDATA_TYPE_TYPEDEFINTION: {
135 		i = 0;
136 		setup_subtype_description(&subtypes[i++], KC_ST_UINT32, offsetof(struct kcdata_type_definition, kct_type_identifier), "typeID");
137 		setup_subtype_description(&subtypes[i++], KC_ST_UINT32, offsetof(struct kcdata_type_definition, kct_num_elements), "numOfFields");
138 		setup_subtype_array_description(&subtypes[i++], KC_ST_CHAR, offsetof(struct kcdata_type_definition, kct_name), KCDATA_DESC_MAXLEN, "name");
139 		// Note "fields" is an array of run time defined length. So we populate fields at parsing time.
140 		setup_type_definition(retval, type_id, i, "typedef");
141 		break;
142 	}
143 
144 	case KCDATA_TYPE_CONTAINER_BEGIN: {
145 		i = 0;
146 		setup_subtype_description(&subtypes[i++], KC_ST_UINT32, 0, "kcContainerType");
147 		setup_type_definition(retval, type_id, i, "container_begin");
148 		break;
149 	}
150 
151 	case KCDATA_TYPE_LIBRARY_LOADINFO: {
152 		i = 0;
153 		_SUBTYPE(KC_ST_UINT32, struct user32_dyld_uuid_info, imageLoadAddress);
154 		_SUBTYPE_ARRAY(KC_ST_UINT8, struct user32_dyld_uuid_info, imageUUID, 16);
155 		setup_type_definition(retval, type_id, i, "dyld_load_info");
156 		break;
157 	}
158 
159 	case KCDATA_TYPE_LIBRARY_LOADINFO64: {
160 		i = 0;
161 		_SUBTYPE(KC_ST_UINT64, struct user64_dyld_uuid_info, imageLoadAddress);
162 		_SUBTYPE_ARRAY(KC_ST_UINT8, struct user64_dyld_uuid_info, imageUUID, 16);
163 		setup_type_definition(retval, type_id, i, "dyld_load_info");
164 		break;
165 	}
166 	case STACKSHOT_KCTYPE_LOADINFO64_TEXT_EXEC: {
167 		i = 0;
168 		_SUBTYPE(KC_ST_UINT64, struct user64_dyld_uuid_info, imageLoadAddress);
169 		_SUBTYPE_ARRAY(KC_ST_UINT8, struct user64_dyld_uuid_info, imageUUID, 16);
170 		setup_type_definition(retval, type_id, i, "dyld_load_info_text_exec");
171 		break;
172 	}
173 	case STACKSHOT_KCTYPE_SHAREDCACHE_LOADINFO: {
174 		i = 0;
175 		/*
176 		 * for backwards compatibility, we keep the old field names, but the
177 		 * new data is being put in dyld_shared_cache_loadinfo
178 		 */
179 		_SUBTYPE(KC_ST_UINT64, struct dyld_uuid_info_64_v2, imageLoadAddress);
180 		_SUBTYPE_ARRAY(KC_ST_UINT8, struct dyld_uuid_info_64_v2, imageUUID, 16);
181 		_SUBTYPE(KC_ST_UINT64, struct dyld_uuid_info_64_v2, imageSlidBaseAddress);
182 		_SUBTYPE(KC_ST_UINT64, struct dyld_shared_cache_loadinfo, sharedCacheSlidFirstMapping);
183 		_SUBTYPE(KC_ST_UINT32, struct dyld_shared_cache_loadinfo_v2, sharedCacheID);
184 		_SUBTYPE(KC_ST_UINT32, struct dyld_shared_cache_loadinfo_v2, sharedCacheFlags);
185 		setup_type_definition(retval, type_id, i, "shared_cache_dyld_load_info");
186 		break;
187 	}
188 	case STACKSHOT_KCTYPE_SHAREDCACHE_INFO: {
189 		i = 0;
190 		_SUBTYPE(KC_ST_UINT64, struct dyld_shared_cache_loadinfo_v2, sharedCacheSlide);
191 		_SUBTYPE_ARRAY(KC_ST_UINT8, struct dyld_shared_cache_loadinfo_v2, sharedCacheUUID, 16);
192 		_SUBTYPE_TRUNC(KC_ST_UINT64, struct dyld_shared_cache_loadinfo_v2, sharedCacheUnreliableSlidBaseAddress, "sharedCacheUnreliableSlidBaseAd");
193 		_SUBTYPE(KC_ST_UINT64, struct dyld_shared_cache_loadinfo_v2, sharedCacheSlidFirstMapping);
194 		_SUBTYPE(KC_ST_UINT32, struct dyld_shared_cache_loadinfo_v2, sharedCacheID);
195 		_SUBTYPE(KC_ST_UINT32, struct dyld_shared_cache_loadinfo_v2, sharedCacheFlags);
196 		setup_type_definition(retval, type_id, i, "shared_cache_dyld_load_info");
197 		break;
198 	}
199 
200 	case STACKSHOT_KCTYPE_KERNELCACHE_LOADINFO: {
201 		i = 0;
202 		_SUBTYPE(KC_ST_UINT64, struct dyld_uuid_info_64, imageLoadAddress);
203 		_SUBTYPE_ARRAY(KC_ST_UINT8, struct dyld_uuid_info_64, imageUUID, 16);
204 		setup_type_definition(retval, type_id, i, "kernelcache_load_info");
205 		break;
206 	}
207 
208 	case KCDATA_TYPE_TIMEBASE: {
209 		i = 0;
210 		_SUBTYPE(KC_ST_UINT32, struct mach_timebase_info, numer);
211 		_SUBTYPE(KC_ST_UINT32, struct mach_timebase_info, denom);
212 		setup_type_definition(retval, type_id, i, "mach_timebase_info");
213 		break;
214 	}
215 
216 	case KCDATA_TYPE_MACH_ABSOLUTE_TIME:
217 		setup_type_definition(retval, type_id, 1, "mach_absolute_time");
218 		setup_subtype_description(&subtypes[0], KC_ST_UINT64, 0, "mach_absolute_time");
219 		break;
220 
221 	case KCDATA_TYPE_TIMEVAL: {
222 		i = 0;
223 		_SUBTYPE(KC_ST_INT64, struct timeval64, tv_sec);
224 		_SUBTYPE(KC_ST_INT64, struct timeval64, tv_usec);
225 		setup_type_definition(retval, type_id, i, "timeval");
226 		break;
227 	}
228 
229 	case KCDATA_TYPE_USECS_SINCE_EPOCH:
230 		setup_type_definition(retval, type_id, 1, "usecs_since_epoch");
231 		setup_subtype_description(&subtypes[0], KC_ST_UINT64, 0, "usecs_since_epoch");
232 		break;
233 
234 	case KCDATA_TYPE_PID:
235 		setup_subtype_description(&subtypes[0], KC_ST_INT32, 0, "pid");
236 		setup_type_definition(retval, type_id, 1, "pid");
237 		break;
238 
239 	case KCDATA_TYPE_PROCNAME:
240 		i = 0;
241 		setup_subtype_array_description(&subtypes[i++], KC_ST_CHAR, 0, 64, "proc_name");
242 		setup_type_definition(retval, type_id, i, "proc_name");
243 		break;
244 
245 	case KCDATA_TYPE_LIBRARY_AOTINFO: {
246 		i = 0;
247 		_SUBTYPE(KC_ST_UINT64, struct user64_dyld_aot_info, x86LoadAddress);
248 		_SUBTYPE(KC_ST_UINT64, struct user64_dyld_aot_info, aotLoadAddress);
249 		_SUBTYPE(KC_ST_UINT64, struct user64_dyld_aot_info, aotImageSize);
250 		_SUBTYPE_ARRAY(KC_ST_UINT8, struct user64_dyld_aot_info, aotImageKey, DYLD_AOT_IMAGE_KEY_SIZE);
251 		setup_type_definition(retval, type_id, i, "dyld_aot_info");
252 		break;
253 	}
254 	case STACKSHOT_KCTYPE_AOTCACHE_LOADINFO: {
255 		i = 0;
256 		_SUBTYPE(KC_ST_UINT64, struct dyld_aot_cache_uuid_info, x86SlidBaseAddress);
257 		_SUBTYPE_ARRAY(KC_ST_UINT8, struct dyld_aot_cache_uuid_info, x86UUID, 16);
258 		_SUBTYPE(KC_ST_UINT64, struct dyld_aot_cache_uuid_info, aotSlidBaseAddress);
259 		_SUBTYPE_ARRAY(KC_ST_UINT8, struct dyld_aot_cache_uuid_info, aotUUID, 16);
260 		setup_type_definition(retval, type_id, i, "dyld_aot_cache_uuid_info");
261 		break;
262 	}
263 	case STACKSHOT_KCTYPE_SHAREDCACHE_AOTINFO: {
264 		i = 0;
265 		_SUBTYPE(KC_ST_UINT64, struct dyld_aot_cache_uuid_info, x86SlidBaseAddress);
266 		_SUBTYPE_ARRAY(KC_ST_UINT8, struct dyld_aot_cache_uuid_info, x86UUID, 16);
267 		_SUBTYPE(KC_ST_UINT64, struct dyld_aot_cache_uuid_info, aotSlidBaseAddress);
268 		_SUBTYPE_ARRAY(KC_ST_UINT8, struct dyld_aot_cache_uuid_info, aotUUID, 16);
269 		setup_type_definition(retval, type_id, i, "dyld_aot_cache_uuid_info");
270 		break;
271 	}
272 
273 	/* stackshot specific types */
274 	case STACKSHOT_KCTYPE_IOSTATS: {
275 		i = 0;
276 		_SUBTYPE(KC_ST_UINT64, struct io_stats_snapshot, ss_disk_reads_count);
277 		_SUBTYPE(KC_ST_UINT64, struct io_stats_snapshot, ss_disk_reads_size);
278 		_SUBTYPE(KC_ST_UINT64, struct io_stats_snapshot, ss_disk_writes_count);
279 		_SUBTYPE(KC_ST_UINT64, struct io_stats_snapshot, ss_disk_writes_size);
280 		_SUBTYPE_ARRAY(KC_ST_UINT64, struct io_stats_snapshot, ss_io_priority_count, STACKSHOT_IO_NUM_PRIORITIES);
281 		_SUBTYPE_ARRAY(KC_ST_UINT64, struct io_stats_snapshot, ss_io_priority_size, STACKSHOT_IO_NUM_PRIORITIES);
282 		_SUBTYPE(KC_ST_UINT64, struct io_stats_snapshot, ss_paging_count);
283 		_SUBTYPE(KC_ST_UINT64, struct io_stats_snapshot, ss_paging_size);
284 		_SUBTYPE(KC_ST_UINT64, struct io_stats_snapshot, ss_non_paging_count);
285 		_SUBTYPE(KC_ST_UINT64, struct io_stats_snapshot, ss_non_paging_size);
286 		_SUBTYPE(KC_ST_UINT64, struct io_stats_snapshot, ss_data_count);
287 		_SUBTYPE(KC_ST_UINT64, struct io_stats_snapshot, ss_data_size);
288 		_SUBTYPE(KC_ST_UINT64, struct io_stats_snapshot, ss_metadata_count);
289 		_SUBTYPE(KC_ST_UINT64, struct io_stats_snapshot, ss_metadata_size);
290 
291 		setup_type_definition(retval, type_id, i, "io_statistics");
292 		break;
293 	}
294 
295 	case STACKSHOT_KCTYPE_GLOBAL_MEM_STATS: {
296 		i = 0;
297 		_SUBTYPE(KC_ST_UINT32, struct mem_and_io_snapshot, snapshot_magic);
298 		_SUBTYPE(KC_ST_UINT32, struct mem_and_io_snapshot, free_pages);
299 		_SUBTYPE(KC_ST_UINT32, struct mem_and_io_snapshot, active_pages);
300 		_SUBTYPE(KC_ST_UINT32, struct mem_and_io_snapshot, inactive_pages);
301 		_SUBTYPE(KC_ST_UINT32, struct mem_and_io_snapshot, purgeable_pages);
302 		_SUBTYPE(KC_ST_UINT32, struct mem_and_io_snapshot, wired_pages);
303 		_SUBTYPE(KC_ST_UINT32, struct mem_and_io_snapshot, speculative_pages);
304 		_SUBTYPE(KC_ST_UINT32, struct mem_and_io_snapshot, throttled_pages);
305 		_SUBTYPE(KC_ST_UINT32, struct mem_and_io_snapshot, filebacked_pages);
306 		_SUBTYPE(KC_ST_UINT32, struct mem_and_io_snapshot, compressions);
307 		_SUBTYPE(KC_ST_UINT32, struct mem_and_io_snapshot, decompressions);
308 		_SUBTYPE(KC_ST_UINT32, struct mem_and_io_snapshot, compressor_size);
309 		_SUBTYPE(KC_ST_UINT32, struct mem_and_io_snapshot, busy_buffer_count);
310 		_SUBTYPE(KC_ST_UINT32, struct mem_and_io_snapshot, pages_wanted);
311 		_SUBTYPE(KC_ST_UINT32, struct mem_and_io_snapshot, pages_reclaimed);
312 		_SUBTYPE(KC_ST_UINT8, struct mem_and_io_snapshot, pages_wanted_reclaimed_valid);
313 		setup_type_definition(retval, type_id, i, "mem_and_io_snapshot");
314 		break;
315 	}
316 
317 	case STACKSHOT_KCCONTAINER_SHAREDCACHE:
318 		setup_type_definition(retval, type_id, 0, "shared_caches");
319 		break;
320 
321 	case STACKSHOT_KCCONTAINER_TASK:
322 		setup_type_definition(retval, type_id, 0, "task_snapshots");
323 		break;
324 
325 	case STACKSHOT_KCCONTAINER_TRANSITIONING_TASK:
326 		setup_type_definition(retval, type_id, 0, "transitioning_task_snapshots");
327 		break;
328 
329 	case STACKSHOT_KCCONTAINER_THREAD:
330 		setup_type_definition(retval, type_id, 0, "thread_snapshots");
331 		break;
332 
333 	case STACKSHOT_KCCONTAINER_PORTLABEL:
334 		setup_type_definition(retval, type_id, 0, "portlabels");
335 		break;
336 
337 	case STACKSHOT_KCTYPE_TASK_SNAPSHOT: {
338 		i = 0;
339 		_SUBTYPE(KC_ST_UINT64, struct task_snapshot_v3, ts_unique_pid);
340 		_SUBTYPE(KC_ST_UINT64, struct task_snapshot_v3, ts_ss_flags);
341 		_SUBTYPE_TRUNC(KC_ST_UINT64, struct task_snapshot_v3, ts_user_time_in_terminated_threads, "ts_user_time_in_terminated_thre");
342 		_SUBTYPE_TRUNC(KC_ST_UINT64, struct task_snapshot_v3, ts_system_time_in_terminated_threads, "ts_system_time_in_terminated_th");
343 		_SUBTYPE(KC_ST_UINT64, struct task_snapshot_v3, ts_p_start_sec);
344 		_SUBTYPE(KC_ST_UINT64, struct task_snapshot_v3, ts_task_size);
345 		_SUBTYPE(KC_ST_UINT64, struct task_snapshot_v3, ts_max_resident_size);
346 		_SUBTYPE(KC_ST_UINT32, struct task_snapshot_v3, ts_suspend_count);
347 		_SUBTYPE(KC_ST_UINT32, struct task_snapshot_v3, ts_faults);
348 		_SUBTYPE(KC_ST_UINT32, struct task_snapshot_v3, ts_pageins);
349 		_SUBTYPE(KC_ST_UINT32, struct task_snapshot_v3, ts_cow_faults);
350 		_SUBTYPE(KC_ST_UINT32, struct task_snapshot_v3, ts_was_throttled);
351 		_SUBTYPE(KC_ST_UINT32, struct task_snapshot_v3, ts_did_throttle);
352 		_SUBTYPE(KC_ST_UINT32, struct task_snapshot_v3, ts_latency_qos);
353 		_SUBTYPE(KC_ST_INT32, struct task_snapshot_v3, ts_pid);
354 		_SUBTYPE_ARRAY(KC_ST_CHAR, struct task_snapshot_v3, ts_p_comm, 32);
355 		_SUBTYPE(KC_ST_UINT32, struct task_snapshot_v3, ts_uid);
356 		_SUBTYPE(KC_ST_UINT32, struct task_snapshot_v3, ts_gid);
357 		setup_type_definition(retval, type_id, i, "task_snapshot");
358 		break;
359 	}
360 
361 	case STACKSHOT_KCTYPE_TRANSITIONING_TASK_SNAPSHOT: {
362 		i = 0;
363 		_SUBTYPE(KC_ST_UINT64, struct transitioning_task_snapshot, tts_unique_pid);
364 		_SUBTYPE(KC_ST_UINT64, struct transitioning_task_snapshot, tts_ss_flags);
365 		_SUBTYPE(KC_ST_UINT64, struct transitioning_task_snapshot, tts_transition_type);
366 		_SUBTYPE(KC_ST_INT32, struct transitioning_task_snapshot, tts_pid);
367 		_SUBTYPE_ARRAY(KC_ST_CHAR, struct transitioning_task_snapshot, tts_p_comm, 32);
368 		setup_type_definition(retval, type_id, i, "transitioning_task_snapshot");
369 		break;
370 	}
371 
372 	case STACKSHOT_KCTYPE_TASK_DELTA_SNAPSHOT: {
373 		i = 0;
374 		_SUBTYPE(KC_ST_UINT64, struct task_delta_snapshot_v2, tds_unique_pid);
375 		_SUBTYPE(KC_ST_UINT64, struct task_delta_snapshot_v2, tds_ss_flags);
376 		_SUBTYPE_TRUNC(KC_ST_UINT64, struct task_delta_snapshot_v2, tds_user_time_in_terminated_threads, "tds_user_time_in_terminated_thr");
377 		_SUBTYPE_TRUNC(KC_ST_UINT64, struct task_delta_snapshot_v2, tds_system_time_in_terminated_threads, "tds_system_time_in_terminated_t");
378 		_SUBTYPE(KC_ST_UINT64, struct task_delta_snapshot_v2, tds_task_size);
379 		_SUBTYPE(KC_ST_UINT64, struct task_delta_snapshot_v2, tds_max_resident_size);
380 		_SUBTYPE(KC_ST_UINT32, struct task_delta_snapshot_v2, tds_suspend_count);
381 		_SUBTYPE(KC_ST_UINT32, struct task_delta_snapshot_v2, tds_faults);
382 		_SUBTYPE(KC_ST_UINT32, struct task_delta_snapshot_v2, tds_pageins);
383 		_SUBTYPE(KC_ST_UINT32, struct task_delta_snapshot_v2, tds_cow_faults);
384 		_SUBTYPE(KC_ST_UINT32, struct task_delta_snapshot_v2, tds_was_throttled);
385 		_SUBTYPE(KC_ST_UINT32, struct task_delta_snapshot_v2, tds_did_throttle);
386 		_SUBTYPE(KC_ST_UINT32, struct task_delta_snapshot_v2, tds_latency_qos);
387 		setup_type_definition(retval, type_id, i, "task_delta_snapshot");
388 		break;
389 	}
390 
391 	case STACKSHOT_KCTYPE_THREAD_SNAPSHOT: {
392 		i = 0;
393 
394 		_SUBTYPE(KC_ST_UINT64, struct thread_snapshot_v3, ths_thread_id);
395 		_SUBTYPE(KC_ST_UINT64, struct thread_snapshot_v3, ths_wait_event);
396 		_SUBTYPE(KC_ST_UINT64, struct thread_snapshot_v3, ths_continuation);
397 		_SUBTYPE(KC_ST_UINT64, struct thread_snapshot_v3, ths_total_syscalls);
398 		_SUBTYPE(KC_ST_UINT64, struct thread_snapshot_v3, ths_voucher_identifier);
399 		_SUBTYPE(KC_ST_UINT64, struct thread_snapshot_v3, ths_dqserialnum);
400 		_SUBTYPE(KC_ST_UINT64, struct thread_snapshot_v3, ths_user_time);
401 		_SUBTYPE(KC_ST_UINT64, struct thread_snapshot_v3, ths_sys_time);
402 		_SUBTYPE(KC_ST_UINT64, struct thread_snapshot_v3, ths_ss_flags);
403 		_SUBTYPE(KC_ST_UINT64, struct thread_snapshot_v3, ths_last_run_time);
404 		_SUBTYPE(KC_ST_UINT64, struct thread_snapshot_v3, ths_last_made_runnable_time);
405 		_SUBTYPE(KC_ST_UINT32, struct thread_snapshot_v3, ths_state);
406 		_SUBTYPE(KC_ST_UINT32, struct thread_snapshot_v3, ths_sched_flags);
407 		_SUBTYPE(KC_ST_INT16, struct thread_snapshot_v3, ths_base_priority);
408 		_SUBTYPE(KC_ST_INT16, struct thread_snapshot_v3, ths_sched_priority);
409 		_SUBTYPE(KC_ST_UINT8, struct thread_snapshot_v3, ths_eqos);
410 		_SUBTYPE(KC_ST_UINT8, struct thread_snapshot_v3, ths_rqos);
411 		_SUBTYPE(KC_ST_UINT8, struct thread_snapshot_v3, ths_rqos_override);
412 		_SUBTYPE(KC_ST_UINT8, struct thread_snapshot_v3, ths_io_tier);
413 		_SUBTYPE(KC_ST_UINT64, struct thread_snapshot_v3, ths_thread_t);
414 		_SUBTYPE(KC_ST_UINT64, struct thread_snapshot_v4, ths_requested_policy);
415 		_SUBTYPE(KC_ST_UINT64, struct thread_snapshot_v4, ths_effective_policy);
416 
417 		setup_type_definition(retval, type_id, i, "thread_snapshot");
418 		break;
419 	}
420 
421 	case STACKSHOT_KCTYPE_THREAD_DELTA_SNAPSHOT: {
422 		i = 0;
423 
424 		_SUBTYPE(KC_ST_UINT64, struct thread_delta_snapshot_v2, tds_thread_id);
425 		_SUBTYPE(KC_ST_UINT64, struct thread_delta_snapshot_v2, tds_voucher_identifier);
426 		_SUBTYPE(KC_ST_UINT64, struct thread_delta_snapshot_v2, tds_ss_flags);
427 		_SUBTYPE(KC_ST_UINT64, struct thread_delta_snapshot_v2, tds_last_made_runnable_time);
428 		_SUBTYPE(KC_ST_UINT32, struct thread_delta_snapshot_v2, tds_state);
429 		_SUBTYPE(KC_ST_UINT32, struct thread_delta_snapshot_v2, tds_sched_flags);
430 		_SUBTYPE(KC_ST_INT16, struct thread_delta_snapshot_v2, tds_base_priority);
431 		_SUBTYPE(KC_ST_INT16, struct thread_delta_snapshot_v2, tds_sched_priority);
432 		_SUBTYPE(KC_ST_UINT8, struct thread_delta_snapshot_v2, tds_eqos);
433 		_SUBTYPE(KC_ST_UINT8, struct thread_delta_snapshot_v2, tds_rqos);
434 		_SUBTYPE(KC_ST_UINT8, struct thread_delta_snapshot_v2, tds_rqos_override);
435 		_SUBTYPE(KC_ST_UINT8, struct thread_delta_snapshot_v2, tds_io_tier);
436 		_SUBTYPE(KC_ST_UINT64, struct thread_delta_snapshot_v3, tds_requested_policy);
437 		_SUBTYPE(KC_ST_UINT64, struct thread_delta_snapshot_v3, tds_effective_policy);
438 
439 		setup_type_definition(retval, type_id, i, "thread_delta_snapshot");
440 
441 		break;
442 	}
443 
444 	case STACKSHOT_KCTYPE_DONATING_PIDS:
445 		setup_type_definition(retval, type_id, 1, "donating_pids");
446 		setup_subtype_description(&subtypes[0], KC_ST_INT32, 0, "donating_pids");
447 		break;
448 
449 	case STACKSHOT_KCTYPE_THREAD_NAME: {
450 		i = 0;
451 		setup_subtype_array_description(&subtypes[i++], KC_ST_CHAR, 0, 64, "pth_name");
452 		setup_type_definition(retval, type_id, i, "pth_name");
453 		break;
454 	}
455 
456 	case STACKSHOT_KCTYPE_KERN_STACKFRAME:
457 		setup_type_definition(retval, type_id, 2, "kernel_stack_frames");
458 		setup_subtype_description(&subtypes[0], KC_ST_UINT32, 0, "lr");
459 		setup_subtype_description(&subtypes[1], KC_ST_UINT32, sizeof(uint32_t), "sp");
460 		break;
461 
462 	case STACKSHOT_KCTYPE_KERN_STACKFRAME64:
463 		setup_type_definition(retval, type_id, 2, "kernel_stack_frames");
464 		setup_subtype_description(&subtypes[0], KC_ST_UINT64, 0, "lr");
465 		setup_subtype_description(&subtypes[1], KC_ST_UINT64, sizeof(uint64_t), "sp");
466 		break;
467 
468 	case STACKSHOT_KCTYPE_USER_STACKFRAME:
469 		setup_type_definition(retval, type_id, 2, "user_stack_frames");
470 		setup_subtype_description(&subtypes[0], KC_ST_UINT32, 0, "lr");
471 		setup_subtype_description(&subtypes[1], KC_ST_UINT32, sizeof(uint32_t), "sp");
472 		break;
473 
474 	case STACKSHOT_KCTYPE_USER_STACKFRAME64:
475 		setup_type_definition(retval, type_id, 2, "user_stack_frames");
476 		setup_subtype_description(&subtypes[0], KC_ST_UINT64, 0, "lr");
477 		setup_subtype_description(&subtypes[1], KC_ST_UINT64, sizeof(uint64_t), "sp");
478 		break;
479 
480 	case STACKSHOT_KCTYPE_KERN_STACKLR:
481 		setup_type_definition(retval, type_id, 1, "kernel_stack_frames");
482 		setup_subtype_description(&subtypes[0], KC_ST_UINT32, 0, "lr");
483 		subtypes[0].kcs_flags |= KCS_SUBTYPE_FLAGS_STRUCT;
484 		break;
485 
486 	case STACKSHOT_KCTYPE_KERN_STACKLR64:
487 		setup_type_definition(retval, type_id, 1, "kernel_stack_frames");
488 		setup_subtype_description(&subtypes[0], KC_ST_UINT64, 0, "lr");
489 		subtypes[0].kcs_flags |= KCS_SUBTYPE_FLAGS_STRUCT;
490 		break;
491 
492 	case STACKSHOT_KCTYPE_USER_STACKLR:
493 		setup_type_definition(retval, type_id, 1, "user_stack_frames");
494 		setup_subtype_description(&subtypes[0], KC_ST_UINT32, 0, "lr");
495 		subtypes[0].kcs_flags |= KCS_SUBTYPE_FLAGS_STRUCT;
496 		break;
497 
498 	case STACKSHOT_KCTYPE_USER_STACKLR64:
499 		setup_type_definition(retval, type_id, 1, "user_stack_frames");
500 		setup_subtype_description(&subtypes[0], KC_ST_UINT64, 0, "lr");
501 		subtypes[0].kcs_flags |= KCS_SUBTYPE_FLAGS_STRUCT;
502 		break;
503 
504 	case STACKSHOT_KCTYPE_USER_ASYNC_START_INDEX:
505 		setup_type_definition(retval, type_id, 1, "user_async_start_index");
506 		setup_subtype_description(&subtypes[0], KC_ST_UINT32, 0, "user_async_start_index");
507 		break;
508 
509 	case STACKSHOT_KCTYPE_USER_ASYNC_STACKLR64:
510 		setup_type_definition(retval, type_id, 1, "user_async_stack_frames");
511 		setup_subtype_description(&subtypes[0], KC_ST_UINT64, 0, "lr");
512 		subtypes[0].kcs_flags |= KCS_SUBTYPE_FLAGS_STRUCT;
513 		break;
514 
515 	case STACKSHOT_KCTYPE_NONRUNNABLE_TIDS:
516 		setup_type_definition(retval, type_id, 1, "nonrunnable_threads");
517 		setup_subtype_description(&subtypes[0], KC_ST_INT64, 0, "nonrunnable_threads");
518 		break;
519 
520 	case STACKSHOT_KCTYPE_NONRUNNABLE_TASKS:
521 		setup_type_definition(retval, type_id, 1, "nonrunnable_tasks");
522 		setup_subtype_description(&subtypes[0], KC_ST_INT64, 0, "nonrunnable_tasks");
523 		break;
524 
525 	case STACKSHOT_KCTYPE_SHAREDCACHE_ID:
526 		setup_type_definition(retval, type_id, 1, "sharedCacheID");
527 		setup_subtype_description(&subtypes[0], KC_ST_INT32, 0, "sharedCacheID");
528 		break;
529 
530 	case STACKSHOT_KCTYPE_CODESIGNING_INFO:
531 		i = 0;
532 		_SUBTYPE(KC_ST_UINT64, struct stackshot_task_codesigning_info, csflags);
533 		_SUBTYPE(KC_ST_UINT32, struct stackshot_task_codesigning_info, cs_trust_level);
534 		setup_type_definition(retval, type_id, i, "stackshot_task_codesigning_info");
535 		break;
536 
537 	case STACKSHOT_KCTYPE_KERN_EXCLAVES_THREADINFO:
538 		i = 0;
539 		_SUBTYPE(KC_ST_UINT64, struct thread_exclaves_info, tei_scid);
540 		_SUBTYPE(KC_ST_UINT32, struct thread_exclaves_info, tei_thread_offset);
541 		_SUBTYPE(KC_ST_UINT32, struct thread_exclaves_info, tei_flags);
542 		setup_type_definition(retval, type_id, i, "exclaves_thread_info");
543 		break;
544 
545 	case STACKSHOT_KCTYPE_KERN_EXCLAVES_CRASH_THREADINFO:
546 		i = 0;
547 		_SUBTYPE(KC_ST_UINT64, struct thread_crash_exclaves_info, tcei_scid);
548 		_SUBTYPE(KC_ST_UINT64, struct thread_crash_exclaves_info, tcei_thread_id);
549 		_SUBTYPE(KC_ST_UINT32, struct thread_crash_exclaves_info, tcei_flags);
550 		setup_type_definition(retval, type_id, i, "exclaves_crash_thread_info");
551 		break;
552 
553 	case STACKSHOT_KCCONTAINER_EXCLAVES:
554 		setup_type_definition(retval, type_id, 0, "threads_exclave");
555 		break;
556 
557 	case STACKSHOT_KCCONTAINER_EXCLAVE_SCRESULT:
558 		setup_type_definition(retval, type_id, 0, "thread_exclave");
559 		break;
560 
561 	case STACKSHOT_KCTYPE_EXCLAVE_SCRESULT_INFO:
562 		i = 0;
563 		_SUBTYPE(KC_ST_UINT64, struct exclave_scresult_info, esc_id);
564 		_SUBTYPE(KC_ST_UINT64, struct exclave_scresult_info, esc_flags);
565 		setup_type_definition(retval, type_id, i, "exclave_scresult_info");
566 		break;
567 
568 	case STACKSHOT_KCCONTAINER_EXCLAVE_IPCSTACKENTRY:
569 		setup_type_definition(retval, type_id, 0, "exclave_ipcstackentry");
570 		break;
571 
572 	case STACKSHOT_KCTYPE_EXCLAVE_IPCSTACKENTRY_INFO:
573 		i = 0;
574 		_SUBTYPE(KC_ST_UINT64, struct exclave_ipcstackentry_info, eise_asid);
575 		_SUBTYPE(KC_ST_UINT64, struct exclave_ipcstackentry_info, eise_tnid);
576 		_SUBTYPE(KC_ST_UINT64, struct exclave_ipcstackentry_info, eise_invocationid);
577 		_SUBTYPE(KC_ST_UINT64, struct exclave_ipcstackentry_info, eise_flags);
578 		setup_type_definition(retval, type_id, i, "exclave_ipcstackentry_info");
579 		break;
580 
581 	case STACKSHOT_KCTYPE_EXCLAVE_IPCSTACKENTRY_ECSTACK:
582 		setup_type_definition(retval, type_id, 1, "secure_ecstack_entry");
583 		setup_subtype_description(&subtypes[0], KC_ST_UINT64, 0, "lr");
584 		subtypes[0].kcs_flags |= KCS_SUBTYPE_FLAGS_STRUCT;
585 		break;
586 
587 	case STACKSHOT_KCCONTAINER_EXCLAVE_ADDRESSSPACE:
588 		setup_type_definition(retval, type_id, 0, "exclave_addressspace");
589 		break;
590 
591 	case STACKSHOT_KCTYPE_EXCLAVE_ADDRESSSPACE_INFO:
592 		i = 0;
593 		_SUBTYPE(KC_ST_UINT64, struct exclave_addressspace_info, eas_id);
594 		_SUBTYPE(KC_ST_UINT64, struct exclave_addressspace_info, eas_flags);
595 		_SUBTYPE(KC_ST_UINT64, struct exclave_addressspace_info, eas_layoutid);
596 		_SUBTYPE(KC_ST_UINT64, struct exclave_addressspace_info, eas_slide);
597 		_SUBTYPE(KC_ST_UINT64, struct exclave_addressspace_info, eas_asroot);
598 		setup_type_definition(retval, type_id, i, "exclave_addressspace_info");
599 		break;
600 
601 	case STACKSHOT_KCTYPE_EXCLAVE_ADDRESSSPACE_NAME:
602 		i = 0;
603 		_STRINGTYPE("exclave_addressspace_name");
604 		setup_type_definition(retval, type_id, i, "exclave_addressspace_name");
605 		break;
606 
607 	case STACKSHOT_KCCONTAINER_EXCLAVE_TEXTLAYOUT:
608 		setup_type_definition(retval, type_id, 0, "exclave_textlayout");
609 		break;
610 
611 	case STACKSHOT_KCTYPE_EXCLAVE_TEXTLAYOUT_INFO:
612 		i = 0;
613 		_SUBTYPE(KC_ST_UINT64, struct exclave_textlayout_info, layout_id);
614 		_SUBTYPE(KC_ST_UINT64, struct exclave_textlayout_info, etl_flags);
615 		_SUBTYPE(KC_ST_UINT32, struct exclave_textlayout_info, sharedcache_index);
616 		setup_type_definition(retval, type_id, i, "exclave_textlayout_info");
617 		break;
618 
619 	case STACKSHOT_KCTYPE_EXCLAVE_TEXTLAYOUT_SEGMENTS:
620 		i = 0;
621 		_SUBTYPE_ARRAY(KC_ST_UINT8, struct exclave_textlayout_segment_v2, layoutSegment_uuid, 16);
622 		_SUBTYPE(KC_ST_UINT64, struct exclave_textlayout_segment_v2, layoutSegment_loadAddress);
623 		_SUBTYPE(KC_ST_UINT64, struct exclave_textlayout_segment_v2, layoutSegment_rawLoadAddress);
624 		setup_type_definition(retval, type_id, i, "exclave_textlayout_segments");
625 		break;
626 
627 	case STACKSHOT_KCTYPE_BOOTARGS: {
628 		i = 0;
629 		_STRINGTYPE("boot_args");
630 		setup_type_definition(retval, type_id, i, "boot_args");
631 		break;
632 	}
633 
634 	case STACKSHOT_KCTYPE_OSVERSION: {
635 		i = 0;
636 		_STRINGTYPE("osversion");
637 		setup_type_definition(retval, type_id, i, "osversion");
638 		break;
639 	}
640 
641 	case STACKSHOT_KCTYPE_OS_BUILD_VERSION: {
642 		i = 0;
643 		_STRINGTYPE("os_build_version");
644 		setup_type_definition(retval, type_id, i, "os_build_version");
645 		break;
646 	}
647 
648 	case STACKSHOT_KCTYPE_KERN_PAGE_SIZE: {
649 		i = 0;
650 		setup_subtype_description(&subtypes[i++], KC_ST_UINT32, 0, "kernel_page_size");
651 		setup_type_definition(retval, type_id, i, "kernel_page_size");
652 		break;
653 	}
654 
655 	case STACKSHOT_KCTYPE_THREAD_POLICY_VERSION: {
656 		i = 0;
657 		setup_subtype_description(&subtypes[i++], KC_ST_UINT32, 0, "thread_policy_version");
658 		setup_type_definition(retval, type_id, i, "thread_policy_version");
659 		break;
660 	}
661 
662 	case STACKSHOT_KCTYPE_JETSAM_LEVEL: {
663 		i = 0;
664 		setup_subtype_description(&subtypes[i++], KC_ST_UINT32, 0, "jetsam_level");
665 		setup_type_definition(retval, type_id, i, "jetsam_level");
666 		break;
667 	}
668 
669 	case STACKSHOT_KCTYPE_DELTA_SINCE_TIMESTAMP: {
670 		i = 0;
671 		setup_subtype_description(&subtypes[i++], KC_ST_UINT64, 0, "stackshot_delta_since_timestamp");
672 		setup_type_definition(retval, type_id, i, "stackshot_delta_since_timestamp");
673 		break;
674 	}
675 
676 	/* crashinfo types */
677 	case TASK_CRASHINFO_BSDINFOWITHUNIQID: {
678 		i = 0;
679 		_SUBTYPE_ARRAY(KC_ST_UINT8, struct crashinfo_proc_uniqidentifierinfo, p_uuid, 16);
680 		_SUBTYPE(KC_ST_UINT64, struct crashinfo_proc_uniqidentifierinfo, p_uniqueid);
681 		_SUBTYPE(KC_ST_UINT64, struct crashinfo_proc_uniqidentifierinfo, p_puniqueid);
682 		/* Ignore the p_reserve fields */
683 		setup_type_definition(retval, type_id, i, "proc_uniqidentifierinfo");
684 		break;
685 	}
686 
687 	case TASK_CRASHINFO_PID: {
688 		setup_subtype_description(&subtypes[0], KC_ST_INT32, 0, "pid");
689 		setup_type_definition(retval, type_id, 1, "pid");
690 		break;
691 	}
692 
693 	case TASK_CRASHINFO_PPID: {
694 		setup_subtype_description(&subtypes[0], KC_ST_INT32, 0, "ppid");
695 		setup_type_definition(retval, type_id, 1, "ppid");
696 		break;
697 	}
698 
699 	/* case TASK_CRASHINFO_RUSAGE: { */
700 	/*      /\* */
701 	/*       * rusage is a complex structure and is only for legacy use for crashed processes rusage info. */
702 	/*       * So we just consider it as opaque data. */
703 	/*       *\/ */
704 	/*      i = 0; */
705 	/*      setup_subtype_array_description(&subtypes[i++], KC_ST_UINT8, 0, sizeof(struct rusage), "rusage"); */
706 	/*      setup_type_definition(retval, type_id, i, "rusage"); */
707 	/*      break; */
708 	/* } */
709 
710 	case TASK_CRASHINFO_RUSAGE_INFO: {
711 		i = 0;
712 		_SUBTYPE_ARRAY(KC_ST_UINT8, struct rusage_info_v3, ri_uuid, 16);
713 		_SUBTYPE(KC_ST_UINT64, struct rusage_info_v3, ri_user_time);
714 		_SUBTYPE(KC_ST_UINT64, struct rusage_info_v3, ri_system_time);
715 		_SUBTYPE(KC_ST_UINT64, struct rusage_info_v3, ri_pkg_idle_wkups);
716 		_SUBTYPE(KC_ST_UINT64, struct rusage_info_v3, ri_interrupt_wkups);
717 		_SUBTYPE(KC_ST_UINT64, struct rusage_info_v3, ri_pageins);
718 		_SUBTYPE(KC_ST_UINT64, struct rusage_info_v3, ri_wired_size);
719 		_SUBTYPE(KC_ST_UINT64, struct rusage_info_v3, ri_resident_size);
720 		_SUBTYPE(KC_ST_UINT64, struct rusage_info_v3, ri_phys_footprint);
721 		_SUBTYPE(KC_ST_UINT64, struct rusage_info_v3, ri_proc_start_abstime);
722 		_SUBTYPE(KC_ST_UINT64, struct rusage_info_v3, ri_proc_exit_abstime);
723 		_SUBTYPE(KC_ST_UINT64, struct rusage_info_v3, ri_child_user_time);
724 		_SUBTYPE(KC_ST_UINT64, struct rusage_info_v3, ri_child_system_time);
725 		_SUBTYPE(KC_ST_UINT64, struct rusage_info_v3, ri_child_pkg_idle_wkups);
726 		_SUBTYPE(KC_ST_UINT64, struct rusage_info_v3, ri_child_interrupt_wkups);
727 		_SUBTYPE(KC_ST_UINT64, struct rusage_info_v3, ri_child_pageins);
728 		_SUBTYPE(KC_ST_UINT64, struct rusage_info_v3, ri_child_elapsed_abstime);
729 		_SUBTYPE(KC_ST_UINT64, struct rusage_info_v3, ri_diskio_bytesread);
730 		_SUBTYPE(KC_ST_UINT64, struct rusage_info_v3, ri_diskio_byteswritten);
731 		_SUBTYPE(KC_ST_UINT64, struct rusage_info_v3, ri_cpu_time_qos_default);
732 		_SUBTYPE(KC_ST_UINT64, struct rusage_info_v3, ri_cpu_time_qos_maintenance);
733 		_SUBTYPE(KC_ST_UINT64, struct rusage_info_v3, ri_cpu_time_qos_background);
734 		_SUBTYPE(KC_ST_UINT64, struct rusage_info_v3, ri_cpu_time_qos_utility);
735 		_SUBTYPE(KC_ST_UINT64, struct rusage_info_v3, ri_cpu_time_qos_legacy);
736 		_SUBTYPE(KC_ST_UINT64, struct rusage_info_v3, ri_cpu_time_qos_user_initiated);
737 		_SUBTYPE_TRUNC(KC_ST_UINT64, struct rusage_info_v3, ri_cpu_time_qos_user_interactive, "ri_cpu_time_qos_user_interactiv");
738 		_SUBTYPE(KC_ST_UINT64, struct rusage_info_v3, ri_billed_system_time);
739 		_SUBTYPE(KC_ST_UINT64, struct rusage_info_v3, ri_serviced_system_time);
740 		setup_type_definition(retval, type_id, i, "rusage_info");
741 		break;
742 	}
743 
744 	case STACKSHOT_KCTYPE_CPU_TIMES: {
745 		i = 0;
746 		_SUBTYPE(KC_ST_UINT64, struct stackshot_cpu_times_v2, user_usec);
747 		_SUBTYPE(KC_ST_UINT64, struct stackshot_cpu_times_v2, system_usec);
748 		_SUBTYPE(KC_ST_UINT64, struct stackshot_cpu_times_v2, runnable_usec);
749 		setup_type_definition(retval, type_id, i, "cpu_times");
750 		break;
751 	}
752 
753 	case STACKSHOT_KCTYPE_STACKSHOT_DURATION: {
754 		i = 0;
755 		_SUBTYPE(KC_ST_UINT64, struct stackshot_duration_v2, stackshot_duration);
756 		_SUBTYPE(KC_ST_UINT64, struct stackshot_duration_v2, stackshot_duration_outer);
757 		_SUBTYPE(KC_ST_UINT64, struct stackshot_duration_v2, stackshot_duration_prior);
758 		subtypes[0].kcs_flags |= KCS_SUBTYPE_FLAGS_MERGE;
759 		subtypes[1].kcs_flags |= KCS_SUBTYPE_FLAGS_MERGE;
760 		subtypes[2].kcs_flags |= KCS_SUBTYPE_FLAGS_MERGE;
761 		setup_type_definition(retval, type_id, i, "stackshot_duration");
762 		break;
763 	}
764 
765 	case STACKSHOT_KCTYPE_STACKSHOT_FAULT_STATS: {
766 		i = 0;
767 		_SUBTYPE(KC_ST_UINT32, struct stackshot_fault_stats, sfs_pages_faulted_in);
768 		_SUBTYPE(KC_ST_UINT64, struct stackshot_fault_stats, sfs_time_spent_faulting);
769 		_SUBTYPE(KC_ST_UINT64, struct stackshot_fault_stats, sfs_system_max_fault_time);
770 		_SUBTYPE(KC_ST_UINT8, struct stackshot_fault_stats, sfs_stopped_faulting);
771 
772 		setup_type_definition(retval, type_id, i, "stackshot_fault_stats");
773 		break;
774 	}
775 
776 	case STACKSHOT_KCTYPE_THREAD_WAITINFO: {
777 		i = 0;
778 		_SUBTYPE(KC_ST_UINT64, struct stackshot_thread_waitinfo_v2, owner);
779 		_SUBTYPE(KC_ST_UINT64, struct stackshot_thread_waitinfo_v2, waiter);
780 		_SUBTYPE(KC_ST_UINT64, struct stackshot_thread_waitinfo_v2, context);
781 		_SUBTYPE(KC_ST_UINT8, struct stackshot_thread_waitinfo_v2, wait_type);
782 		_SUBTYPE(KC_ST_INT16, struct stackshot_thread_waitinfo_v2, portlabel_id);
783 		_SUBTYPE(KC_ST_UINT32, struct stackshot_thread_waitinfo_v2, wait_flags);
784 		setup_type_definition(retval, type_id, i, "thread_waitinfo");
785 		break;
786 	}
787 
788 	case STACKSHOT_KCTYPE_THREAD_GROUP_SNAPSHOT: {
789 		i = 0;
790 		_SUBTYPE(KC_ST_UINT64, struct thread_group_snapshot_v3, tgs_id);
791 		_SUBTYPE_ARRAY(KC_ST_CHAR, struct thread_group_snapshot_v3, tgs_name, 16);
792 		_SUBTYPE(KC_ST_UINT64, struct thread_group_snapshot_v3, tgs_flags);
793 		_SUBTYPE_ARRAY(KC_ST_CHAR, struct thread_group_snapshot_v3, tgs_name_cont, 16);
794 		setup_type_definition(retval, type_id, i, "thread_group_snapshot");
795 		break;
796 	}
797 
798 	case STACKSHOT_KCTYPE_THREAD_GROUP: {
799 		i = 0;
800 		setup_subtype_description(&subtypes[i++], KC_ST_UINT64, 0, "thread_group");
801 		setup_type_definition(retval, type_id, i, "thread_group");
802 		break;
803 	};
804 
805 	case STACKSHOT_KCTYPE_JETSAM_COALITION_SNAPSHOT: {
806 		i = 0;
807 		_SUBTYPE(KC_ST_UINT64, struct jetsam_coalition_snapshot, jcs_id);
808 		_SUBTYPE(KC_ST_UINT64, struct jetsam_coalition_snapshot, jcs_flags);
809 		_SUBTYPE(KC_ST_UINT64, struct jetsam_coalition_snapshot, jcs_thread_group);
810 		_SUBTYPE(KC_ST_UINT64, struct jetsam_coalition_snapshot, jcs_leader_task_uniqueid);
811 		setup_type_definition(retval, type_id, i, "jetsam_coalition_snapshot");
812 		break;
813 	}
814 
815 	case STACKSHOT_KCTYPE_JETSAM_COALITION: {
816 		i = 0;
817 		setup_subtype_description(&subtypes[i++], KC_ST_UINT64, 0, "jetsam_coalition");
818 		setup_type_definition(retval, type_id, i, "jetsam_coalition");
819 		break;
820 	};
821 
822 	case STACKSHOT_KCTYPE_INSTRS_CYCLES: {
823 		i = 0;
824 		_SUBTYPE(KC_ST_UINT64, struct instrs_cycles_snapshot_v2, ics_instructions);
825 		_SUBTYPE(KC_ST_UINT64, struct instrs_cycles_snapshot_v2, ics_cycles);
826 		_SUBTYPE(KC_ST_UINT64, struct instrs_cycles_snapshot_v2, ics_p_instructions);
827 		_SUBTYPE(KC_ST_UINT64, struct instrs_cycles_snapshot_v2, ics_p_cycles);
828 		setup_type_definition(retval, type_id, i, "instrs_cycles_snapshot");
829 		break;
830 	}
831 
832 	case STACKSHOT_KCTYPE_USER_STACKTOP: {
833 		i = 0;
834 		_SUBTYPE(KC_ST_UINT64, struct stack_snapshot_stacktop, sp);
835 		_SUBTYPE_ARRAY(KC_ST_UINT8, struct stack_snapshot_stacktop, stack_contents, 8);
836 		setup_type_definition(retval, type_id, i, "user_stacktop");
837 		break;
838 	}
839 
840 	case TASK_CRASHINFO_PROC_STARTTIME: {
841 		i = 0;
842 		_SUBTYPE(KC_ST_INT64, struct timeval64, tv_sec);
843 		_SUBTYPE(KC_ST_INT64, struct timeval64, tv_usec);
844 		setup_type_definition(retval, type_id, i, "proc_starttime");
845 		break;
846 	}
847 
848 	case TASK_CRASHINFO_EXCEPTION_CODES: {
849 		i = 0;
850 		char codenum[100];
851 		for (i = 0; i < EXCEPTION_CODE_MAX; i++) {
852 			snprintf(codenum, sizeof(codenum), "code_%d", i);
853 			setup_subtype_description(&subtypes[i], KC_ST_UINT64, i * (sizeof(uint64_t)), codenum);
854 		}
855 		setup_type_definition(retval, type_id, i, "mach_exception_data_t");
856 		break;
857 	}
858 
859 	case TASK_CRASHINFO_PROC_NAME: {
860 		i = 0;
861 		_STRINGTYPE("p_comm");
862 		setup_type_definition(retval, type_id, i, "p_comm");
863 		break;
864 	}
865 
866 	case TASK_CRASHINFO_USERSTACK: {
867 		i = 0;
868 		setup_subtype_description(&subtypes[0], KC_ST_UINT64, 0, "userstack_ptr");
869 		setup_type_definition(retval, type_id, 1, "userstack_ptr");
870 		break;
871 	}
872 
873 	case TASK_CRASHINFO_ARGSLEN: {
874 		i = 0;
875 		setup_subtype_description(&subtypes[0], KC_ST_INT32, 0, "p_argslen");
876 		setup_type_definition(retval, type_id, 1, "p_argslen");
877 		break;
878 	}
879 
880 	case TASK_CRASHINFO_PROC_PATH: {
881 		i = 0;
882 		_STRINGTYPE("p_path");
883 		setup_type_definition(retval, type_id, i, "p_path");
884 		break;
885 	}
886 
887 	case TASK_CRASHINFO_PROC_CSFLAGS: {
888 		setup_subtype_description(&subtypes[0], KC_ST_UINT32, 0, "p_csflags");
889 		setup_type_definition(retval, type_id, 1, "p_csflags");
890 		break;
891 	}
892 
893 	case TASK_CRASHINFO_PROC_STATUS: {
894 		setup_subtype_description(&subtypes[0], KC_ST_UINT8, 0, "p_status");
895 		setup_type_definition(retval, type_id, 1, "p_status");
896 		break;
897 	}
898 
899 	case TASK_CRASHINFO_UID: {
900 		setup_subtype_description(&subtypes[0], KC_ST_INT32, 0, "uid");
901 		setup_type_definition(retval, type_id, 1, "uid");
902 		break;
903 	}
904 
905 	case TASK_CRASHINFO_GID: {
906 		setup_subtype_description(&subtypes[0], KC_ST_INT32, 0, "gid");
907 		setup_type_definition(retval, type_id, 1, "gid");
908 		break;
909 	}
910 
911 	case TASK_CRASHINFO_PROC_ARGC: {
912 		setup_subtype_description(&subtypes[0], KC_ST_INT32, 0, "argc");
913 		setup_type_definition(retval, type_id, 1, "argc");
914 		break;
915 	}
916 
917 	case TASK_CRASHINFO_PROC_FLAGS: {
918 		setup_subtype_description(&subtypes[0], KC_ST_UINT32, 0, "p_flags");
919 		setup_type_definition(retval, type_id, 1, "p_flags");
920 		break;
921 	}
922 
923 	case TASK_CRASHINFO_CPUTYPE: {
924 		setup_subtype_description(&subtypes[0], KC_ST_INT32, 0, "cputype");
925 		setup_type_definition(retval, type_id, 1, "cputype");
926 		break;
927 	}
928 
929 	case TASK_CRASHINFO_RESPONSIBLE_PID: {
930 		setup_subtype_description(&subtypes[0], KC_ST_INT32, 0, "responsible_pid");
931 		setup_type_definition(retval, type_id, 1, "responsible_pid");
932 		break;
933 	}
934 
935 	case TASK_CRASHINFO_DIRTY_FLAGS: {
936 		setup_subtype_description(&subtypes[0], KC_ST_UINT32, 0, "dirty_flags");
937 		setup_type_definition(retval, type_id, 1, "dirty_flags");
938 		break;
939 	}
940 
941 	case TASK_CRASHINFO_CRASHED_THREADID: {
942 		setup_subtype_description(&subtypes[0], KC_ST_UINT64, 0, "crashed_threadid");
943 		setup_type_definition(retval, type_id, 1, "crashed_threadid");
944 		break;
945 	}
946 
947 	case TASK_CRASHINFO_COALITION_ID: {
948 		setup_subtype_description(&subtypes[0], KC_ST_UINT64, 0, "coalition_id");
949 		setup_type_definition(retval, type_id, 1, "coalition_id");
950 		break;
951 	}
952 
953 	case TASK_CRASHINFO_UDATA_PTRS: {
954 		setup_subtype_description(&subtypes[0], KC_ST_UINT64, 0, "udata_ptrs");
955 		setup_type_definition(retval, type_id, 1, "udata_ptrs");
956 		break;
957 	}
958 
959 	case TASK_CRASHINFO_MEMORY_LIMIT: {
960 		setup_subtype_description(&subtypes[0], KC_ST_UINT64, 0, "task_phys_mem_limit");
961 		setup_type_definition(retval, type_id, 1, "task_phys_mem_limit");
962 		break;
963 	}
964 
965 	case TASK_CRASHINFO_TASK_IS_CORPSE_FORK: {
966 		setup_subtype_description(&subtypes[0], KC_ST_UINT32, 0, "task_is_corpse_fork");
967 		setup_type_definition(retval, type_id, 1, "task_is_corpse_fork");
968 		break;
969 	}
970 
971 	case TASK_CRASHINFO_EXCEPTION_TYPE: {
972 		setup_subtype_description(&subtypes[0], KC_ST_UINT32, 0, "exception_type");
973 		setup_type_definition(retval, type_id, 1, "exception_type");
974 		break;
975 	}
976 
977 	case TASK_CRASHINFO_CS_SIGNING_ID: {
978 		i = 0;
979 		_STRINGTYPE("cs_signing_id");
980 		setup_type_definition(retval, type_id, i, "cs_signing_id");
981 		break;
982 	}
983 
984 	case TASK_CRASHINFO_CS_TEAM_ID: {
985 		i = 0;
986 		_STRINGTYPE("cs_team_id");
987 		setup_type_definition(retval, type_id, i, "cs_team_id");
988 		break;
989 	}
990 
991 	case TASK_CRASHINFO_CS_VALIDATION_CATEGORY: {
992 		setup_subtype_description(&subtypes[0], KC_ST_UINT32, 0, "cs_validation_category");
993 		setup_type_definition(retval, type_id, 1, "cs_validation_category");
994 		break;
995 	}
996 	case TASK_CRASHINFO_CS_TRUST_LEVEL: {
997 		setup_subtype_description(&subtypes[0], KC_ST_UINT32, 0, "cs_trust_level");
998 		setup_type_definition(retval, type_id, 1, "cs_trust_level");
999 		break;
1000 	}
1001 	case TASK_CRASHINFO_JIT_ADDRESS_RANGE: {
1002 		i = 0;
1003 		_SUBTYPE(KC_ST_UINT64, struct crashinfo_jit_address_range, start_address);
1004 		_SUBTYPE(KC_ST_UINT64, struct crashinfo_jit_address_range, end_address);
1005 		setup_type_definition(retval, type_id, 1, "jit_address_range");
1006 		break;
1007 	}
1008 	case TASK_CRASHINFO_MB: {
1009 		_SUBTYPE(KC_ST_UINT64, struct crashinfo_mb, start_address);
1010 		_SUBTYPE_ARRAY(KC_ST_UINT64, struct crashinfo_mb, data, 64);
1011 		setup_type_definition(retval, type_id, 1, "tags");
1012 	}
1013 	case TASK_CRASHINFO_CS_AUXILIARY_INFO: {
1014 		setup_subtype_description(&subtypes[0], KC_ST_UINT64, 0, "cs_auxiliary_info");
1015 		setup_type_definition(retval, type_id, 1, "cs_auxiliary_info");
1016 		break;
1017 	}
1018 	case TASK_CRASHINFO_RLIM_CORE: {
1019 		setup_subtype_description(&subtypes[0], KC_ST_UINT64, 0, "rlim_core");
1020 		setup_type_definition(retval, type_id, 1, "rlim_core");
1021 		break;
1022 	}
1023 	case TASK_CRASHINFO_CORE_ALLOWED: {
1024 		setup_subtype_description(&subtypes[0], KC_ST_UINT8, 0, "core_allowed");
1025 		setup_type_definition(retval, type_id, 1, "core_allowed");
1026 		break;
1027 	}
1028 	case EXIT_REASON_SNAPSHOT: {
1029 		_SUBTYPE(KC_ST_UINT32, struct exit_reason_snapshot, ers_namespace);
1030 		_SUBTYPE(KC_ST_UINT64, struct exit_reason_snapshot, ers_code);
1031 		_SUBTYPE(KC_ST_UINT64, struct exit_reason_snapshot, ers_flags);
1032 		setup_type_definition(retval, type_id, i, "exit_reason_basic_info");
1033 
1034 		break;
1035 	}
1036 
1037 	case EXIT_REASON_USER_DESC: {
1038 		i = 0;
1039 
1040 		_STRINGTYPE("exit_reason_user_description");
1041 		setup_type_definition(retval, type_id, i, "exit_reason_user_description");
1042 		break;
1043 	}
1044 
1045 	case EXIT_REASON_USER_PAYLOAD: {
1046 		i = 0;
1047 
1048 		setup_subtype_array_description(&subtypes[i++], KC_ST_UINT8, 0, EXIT_REASON_PAYLOAD_MAX_LEN, "exit_reason_user_payload");
1049 		setup_type_definition(retval, type_id, i, "exit_reason_user_payload");
1050 		break;
1051 	}
1052 
1053 	case EXIT_REASON_CODESIGNING_INFO: {
1054 		_SUBTYPE(KC_ST_UINT64, struct codesigning_exit_reason_info, ceri_virt_addr);
1055 		_SUBTYPE(KC_ST_UINT64, struct codesigning_exit_reason_info, ceri_file_offset);
1056 		_SUBTYPE_ARRAY(KC_ST_CHAR, struct codesigning_exit_reason_info, ceri_pathname, EXIT_REASON_CODESIG_PATH_MAX);
1057 		_SUBTYPE_ARRAY(KC_ST_CHAR, struct codesigning_exit_reason_info, ceri_filename, EXIT_REASON_CODESIG_PATH_MAX);
1058 		_SUBTYPE(KC_ST_UINT64, struct codesigning_exit_reason_info, ceri_codesig_modtime_secs);
1059 		_SUBTYPE(KC_ST_UINT64, struct codesigning_exit_reason_info, ceri_codesig_modtime_nsecs);
1060 		_SUBTYPE(KC_ST_UINT64, struct codesigning_exit_reason_info, ceri_page_modtime_secs);
1061 		_SUBTYPE(KC_ST_UINT64, struct codesigning_exit_reason_info, ceri_page_modtime_nsecs);
1062 		_SUBTYPE(KC_ST_UINT8, struct codesigning_exit_reason_info, ceri_path_truncated);
1063 		_SUBTYPE(KC_ST_UINT8, struct codesigning_exit_reason_info, ceri_object_codesigned);
1064 		_SUBTYPE(KC_ST_UINT8, struct codesigning_exit_reason_info, ceri_page_codesig_validated);
1065 		_SUBTYPE(KC_ST_UINT8, struct codesigning_exit_reason_info, ceri_page_codesig_tainted);
1066 		_SUBTYPE(KC_ST_UINT8, struct codesigning_exit_reason_info, ceri_page_codesig_nx);
1067 		_SUBTYPE(KC_ST_UINT8, struct codesigning_exit_reason_info, ceri_page_wpmapped);
1068 		_SUBTYPE(KC_ST_UINT8, struct codesigning_exit_reason_info, ceri_page_slid);
1069 		_SUBTYPE(KC_ST_UINT8, struct codesigning_exit_reason_info, ceri_page_dirty);
1070 		_SUBTYPE(KC_ST_UINT32, struct codesigning_exit_reason_info, ceri_page_shadow_depth);
1071 		setup_type_definition(retval, type_id, i, "exit_reason_codesigning_info");
1072 		break;
1073 	}
1074 
1075 	case EXIT_REASON_WORKLOOP_ID: {
1076 		i = 0;
1077 		setup_subtype_description(&subtypes[i++], KC_ST_UINT64, 0, "exit_reason_workloop_id");
1078 		setup_type_definition(retval, type_id, i, "exit_reason_workloop_id");
1079 		break;
1080 	}
1081 
1082 	case EXIT_REASON_DISPATCH_QUEUE_NO: {
1083 		i = 0;
1084 		setup_subtype_description(&subtypes[i++], KC_ST_UINT64, 0, "exit_reason_dispatch_queue_no");
1085 		setup_type_definition(retval, type_id, i, "exit_reason_dispatch_queue_no");
1086 		break;
1087 	}
1088 
1089 	case STACKSHOT_KCTYPE_ASID: {
1090 		i = 0;
1091 		setup_subtype_description(&subtypes[i++], KC_ST_UINT32, 0, "ts_asid");
1092 		setup_type_definition(retval, type_id, i, "ts_asid");
1093 		break;
1094 	}
1095 
1096 	case STACKSHOT_KCTYPE_PAGE_TABLES: {
1097 		i = 0;
1098 		setup_subtype_description(&subtypes[i++], KC_ST_UINT64, 0, "ts_pagetable");
1099 		setup_type_definition(retval, type_id, i, "ts_pagetable");
1100 		break;
1101 	}
1102 
1103 	case STACKSHOT_KCTYPE_SYS_SHAREDCACHE_LAYOUT: {
1104 		i = 0;
1105 		_SUBTYPE(KC_ST_UINT64, struct user64_dyld_uuid_info, imageLoadAddress);
1106 		_SUBTYPE_ARRAY(KC_ST_UINT8, struct user64_dyld_uuid_info, imageUUID, 16);
1107 		setup_type_definition(retval, type_id, i, "system_shared_cache_layout");
1108 		break;
1109 	}
1110 
1111 	case STACKSHOT_KCTYPE_THREAD_DISPATCH_QUEUE_LABEL: {
1112 		i = 0;
1113 		_STRINGTYPE("dispatch_queue_label");
1114 		setup_type_definition(retval, type_id, i, "dispatch_queue_label");
1115 		break;
1116 	}
1117 
1118 	case STACKSHOT_KCTYPE_THREAD_TURNSTILEINFO: {
1119 		i = 0;
1120 		_SUBTYPE(KC_ST_UINT64, struct stackshot_thread_turnstileinfo_v2, waiter);
1121 		_SUBTYPE(KC_ST_UINT64, struct stackshot_thread_turnstileinfo_v2, turnstile_context);
1122 		_SUBTYPE(KC_ST_UINT8, struct stackshot_thread_turnstileinfo_v2, turnstile_priority);
1123 		_SUBTYPE(KC_ST_UINT8, struct stackshot_thread_turnstileinfo_v2, number_of_hops);
1124 		_SUBTYPE(KC_ST_UINT64, struct stackshot_thread_turnstileinfo_v2, turnstile_flags);
1125 		_SUBTYPE(KC_ST_INT16, struct stackshot_thread_turnstileinfo_v2, portlabel_id);
1126 		setup_type_definition(retval, type_id, i, "thread_turnstileinfo");
1127 		break;
1128 	}
1129 
1130 	case STACKSHOT_KCTYPE_PORTLABEL: {
1131 		i = 0;
1132 		_SUBTYPE(KC_ST_INT16, struct portlabel_info, portlabel_id);
1133 		_SUBTYPE(KC_ST_UINT16, struct portlabel_info, portlabel_flags);
1134 		_SUBTYPE(KC_ST_INT8, struct portlabel_info, portlabel_domain);
1135 		subtypes[0].kcs_flags |= KCS_SUBTYPE_FLAGS_MERGE;
1136 		subtypes[1].kcs_flags |= KCS_SUBTYPE_FLAGS_MERGE;
1137 		subtypes[2].kcs_flags |= KCS_SUBTYPE_FLAGS_MERGE;
1138 		setup_type_definition(retval, type_id, i, "portlabel_info");
1139 		break;
1140 	}
1141 
1142 	case STACKSHOT_KCTYPE_PORTLABEL_NAME:
1143 		i = 0;
1144 		_STRINGTYPE("portlabel_name");
1145 		setup_type_definition(retval, type_id, i, "portlabel_name");
1146 		break;
1147 
1148 	case STACKSHOT_KCTYPE_TASK_CPU_ARCHITECTURE: {
1149 		i = 0;
1150 		_SUBTYPE(KC_ST_INT32, struct stackshot_cpu_architecture, cputype);
1151 		_SUBTYPE(KC_ST_INT32, struct stackshot_cpu_architecture, cpusubtype);
1152 		setup_type_definition(retval, type_id, i, "task_cpu_architecture");
1153 		break;
1154 	}
1155 
1156 	case STACKSHOT_KCTYPE_LATENCY_INFO: {
1157 		i = 0;
1158 		_SUBTYPE(KC_ST_UINT64, struct stackshot_latency_collection, latency_version);
1159 		_SUBTYPE(KC_ST_UINT64, struct stackshot_latency_collection, setup_latency);
1160 		_SUBTYPE(KC_ST_UINT64, struct stackshot_latency_collection, total_task_iteration_latency);
1161 		_SUBTYPE_TRUNC(KC_ST_UINT64, struct stackshot_latency_collection, total_terminated_task_iteration_latency, "total_terminated_task_iteration");
1162 		setup_type_definition(retval, type_id, i, "stackshot_latency_collection");
1163 		break;
1164 	}
1165 	case STACKSHOT_KCTYPE_LATENCY_INFO_TASK: {
1166 		i = 0;
1167 		_SUBTYPE(KC_ST_UINT64, struct stackshot_latency_task, task_uniqueid);
1168 		_SUBTYPE(KC_ST_UINT64, struct stackshot_latency_task, setup_latency);
1169 		_SUBTYPE(KC_ST_UINT64, struct stackshot_latency_task, task_thread_count_loop_latency);
1170 		_SUBTYPE(KC_ST_UINT64, struct stackshot_latency_task, task_thread_data_loop_latency);
1171 		_SUBTYPE(KC_ST_UINT64, struct stackshot_latency_task, cur_tsnap_latency);
1172 		_SUBTYPE(KC_ST_UINT64, struct stackshot_latency_task, pmap_latency);
1173 		_SUBTYPE(KC_ST_UINT64, struct stackshot_latency_task, bsd_proc_ids_latency);
1174 		_SUBTYPE(KC_ST_UINT64, struct stackshot_latency_task, misc_latency);
1175 		_SUBTYPE(KC_ST_UINT64, struct stackshot_latency_task, misc2_latency);
1176 		_SUBTYPE(KC_ST_UINT64, struct stackshot_latency_task, end_latency);
1177 		setup_type_definition(retval, type_id, i, "stackshot_latency_task");
1178 		break;
1179 	}
1180 	case STACKSHOT_KCTYPE_LATENCY_INFO_THREAD: {
1181 		i = 0;
1182 		_SUBTYPE(KC_ST_UINT64, struct stackshot_latency_thread, thread_id);
1183 		_SUBTYPE(KC_ST_UINT64, struct stackshot_latency_thread, cur_thsnap1_latency);
1184 		_SUBTYPE(KC_ST_UINT64, struct stackshot_latency_thread, dispatch_serial_latency);
1185 		_SUBTYPE(KC_ST_UINT64, struct stackshot_latency_thread, dispatch_label_latency);
1186 		_SUBTYPE(KC_ST_UINT64, struct stackshot_latency_thread, cur_thsnap2_latency);
1187 		_SUBTYPE(KC_ST_UINT64, struct stackshot_latency_thread, thread_name_latency);
1188 		_SUBTYPE(KC_ST_UINT64, struct stackshot_latency_thread, sur_times_latency);
1189 		_SUBTYPE(KC_ST_UINT64, struct stackshot_latency_thread, user_stack_latency);
1190 		_SUBTYPE(KC_ST_UINT64, struct stackshot_latency_thread, kernel_stack_latency);
1191 		_SUBTYPE(KC_ST_UINT64, struct stackshot_latency_thread, misc_latency);
1192 		setup_type_definition(retval, type_id, i, "stackshot_latency_thread");
1193 		break;
1194 	}
1195 	case STACKSHOT_KCTYPE_LATENCY_INFO_CPU: {
1196 		i = 0;
1197 		_SUBTYPE(KC_ST_INT32, struct stackshot_latency_cpu, cpu_number);
1198 		_SUBTYPE(KC_ST_INT32, struct stackshot_latency_cpu, cluster_type);
1199 		_SUBTYPE(KC_ST_UINT64, struct stackshot_latency_cpu, init_latency_mt);
1200 		_SUBTYPE(KC_ST_UINT64, struct stackshot_latency_cpu, workqueue_latency_mt);
1201 		_SUBTYPE(KC_ST_UINT64, struct stackshot_latency_cpu, total_latency_mt);
1202 		_SUBTYPE(KC_ST_UINT64, struct stackshot_latency_cpu, total_cycles);
1203 		_SUBTYPE(KC_ST_UINT64, struct stackshot_latency_cpu, total_instrs);
1204 		_SUBTYPE(KC_ST_UINT64, struct stackshot_latency_cpu, tasks_processed);
1205 		_SUBTYPE(KC_ST_UINT64, struct stackshot_latency_cpu, threads_processed);
1206 		_SUBTYPE(KC_ST_UINT64, struct stackshot_latency_cpu, faulting_time_mt);
1207 		_SUBTYPE(KC_ST_UINT64, struct stackshot_latency_cpu, total_buf);
1208 		_SUBTYPE(KC_ST_UINT64, struct stackshot_latency_cpu, intercluster_buf_used);
1209 		setup_type_definition(retval, type_id, i, "stackshot_latency_cpu");
1210 		break;
1211 	}
1212 	case STACKSHOT_KCTYPE_LATENCY_INFO_BUFFER: {
1213 		i = 0;
1214 		_SUBTYPE(KC_ST_INT32, struct stackshot_latency_buffer, cluster_type);
1215 		_SUBTYPE(KC_ST_UINT64, struct stackshot_latency_buffer, size);
1216 		_SUBTYPE(KC_ST_UINT64, struct stackshot_latency_buffer, used);
1217 		_SUBTYPE(KC_ST_UINT64, struct stackshot_latency_buffer, overhead);
1218 		setup_type_definition(retval, type_id, i, "stackshot_latency_buffer");
1219 		break;
1220 	}
1221 	case TASK_CRASHINFO_KERNEL_TRIAGE_INFO_V1: {
1222 		i = 0;
1223 		_SUBTYPE_ARRAY(KC_ST_CHAR, struct kernel_triage_info_v1, triage_string1, MAX_TRIAGE_STRING_LEN);
1224 		_SUBTYPE_ARRAY(KC_ST_CHAR, struct kernel_triage_info_v1, triage_string2, MAX_TRIAGE_STRING_LEN);
1225 		_SUBTYPE_ARRAY(KC_ST_CHAR, struct kernel_triage_info_v1, triage_string3, MAX_TRIAGE_STRING_LEN);
1226 		_SUBTYPE_ARRAY(KC_ST_CHAR, struct kernel_triage_info_v1, triage_string4, MAX_TRIAGE_STRING_LEN);
1227 		_SUBTYPE_ARRAY(KC_ST_CHAR, struct kernel_triage_info_v1, triage_string5, MAX_TRIAGE_STRING_LEN);
1228 		setup_type_definition(retval, type_id, i, "kernel_triage_info_v1");
1229 		break;
1230 	}
1231 	case STACKSHOT_KCTYPE_MTEINFO_CELL: {
1232 		_SUBTYPE(KC_ST_UINT8, struct mte_info_cell, mic_state);
1233 		_SUBTYPE(KC_ST_UINT8, struct mte_info_cell, mic_tagged_count);
1234 		_SUBTYPE(KC_ST_UINT8, struct mte_info_cell, mic_free_count);
1235 		_SUBTYPE(KC_ST_UINT8, struct mte_info_cell, mic_wired_count);
1236 		_SUBTYPE(KC_ST_UINT8, struct mte_info_cell, mic_wired_tagged_count);
1237 		_SUBTYPE(KC_ST_UINT8, struct mte_info_cell, mic_kernel_wired_tagged_count);
1238 		setup_type_definition(retval, type_id, i, "mte_info_cell");
1239 		break;
1240 	}
1241 	default:
1242 		retval = NULL;
1243 		break;
1244 	}
1245 
1246 	assert(retval == NULL || (buffer_size > sizeof(struct kcdata_type_definition) +
1247 	    (retval->kct_num_elements * sizeof(struct kcdata_subtype_descriptor))));
1248 	return retval;
1249 }
1250 
1251 static void
setup_type_definition(struct kcdata_type_definition * d,uint32_t type,uint32_t num_elems,char * name)1252 setup_type_definition(struct kcdata_type_definition * d, uint32_t type, uint32_t num_elems, char * name)
1253 {
1254 	d->kct_type_identifier = type;
1255 	d->kct_num_elements = num_elems;
1256 	memcpy(d->kct_name, name, sizeof(d->kct_name));
1257 	d->kct_name[sizeof(d->kct_name) - 1] = '\0';
1258 }
1259 
1260 static uint32_t
get_kctype_subtype_size(kctype_subtype_t type)1261 get_kctype_subtype_size(kctype_subtype_t type)
1262 {
1263 	switch (type) {
1264 	case KC_ST_CHAR:
1265 	case KC_ST_INT8:
1266 	case KC_ST_UINT8:
1267 		return sizeof(uint8_t);
1268 		break;
1269 	case KC_ST_INT16:
1270 	case KC_ST_UINT16:
1271 		return sizeof(uint16_t);
1272 		break;
1273 	case KC_ST_INT32:
1274 	case KC_ST_UINT32:
1275 		return sizeof(uint32_t);
1276 		break;
1277 	case KC_ST_INT64:
1278 	case KC_ST_UINT64:
1279 		return sizeof(uint64_t);
1280 		break;
1281 
1282 	default:
1283 		assert(0);
1284 		break;
1285 	}
1286 	return 0;
1287 }
1288 
1289 static void
setup_subtype_array_description(kcdata_subtype_descriptor_t desc,kctype_subtype_t type,uint32_t offset,uint32_t count,char * name)1290 setup_subtype_array_description(
1291 	kcdata_subtype_descriptor_t desc, kctype_subtype_t type, uint32_t offset, uint32_t count, char * name)
1292 {
1293 	desc->kcs_flags       = KCS_SUBTYPE_FLAGS_ARRAY;
1294 	desc->kcs_elem_type   = type;
1295 	desc->kcs_elem_offset = offset;
1296 	desc->kcs_elem_size = KCS_SUBTYPE_PACK_SIZE(count, get_kctype_subtype_size(type));
1297 	memcpy(desc->kcs_name, name, sizeof(desc->kcs_name));
1298 	desc->kcs_name[sizeof(desc->kcs_name) - 1] = '\0';
1299 }
1300 
1301 static void
setup_subtype_description(kcdata_subtype_descriptor_t desc,kctype_subtype_t type,uint32_t offset,char * name)1302 setup_subtype_description(kcdata_subtype_descriptor_t desc, kctype_subtype_t type, uint32_t offset, char * name)
1303 {
1304 	desc->kcs_flags       = KCS_SUBTYPE_FLAGS_NONE;
1305 	desc->kcs_elem_type   = type;
1306 	desc->kcs_elem_offset = offset;
1307 	desc->kcs_elem_size = get_kctype_subtype_size(type);
1308 	memcpy(desc->kcs_name, name, sizeof(desc->kcs_name));
1309 	desc->kcs_name[sizeof(desc->kcs_name) - 1] = '\0';
1310 }
1311