1*a1e26a70SApple OSS Distributions#!/usr/bin/env python3 2*a1e26a70SApple OSS Distributionsimport sys 3*a1e26a70SApple OSS Distributionsimport struct 4*a1e26a70SApple OSS Distributionsimport mmap 5*a1e26a70SApple OSS Distributionsimport json 6*a1e26a70SApple OSS Distributionsimport copy 7*a1e26a70SApple OSS Distributionsimport re 8*a1e26a70SApple OSS Distributionsimport base64 9*a1e26a70SApple OSS Distributionsimport argparse 10*a1e26a70SApple OSS Distributionsimport logging 11*a1e26a70SApple OSS Distributionsimport contextlib 12*a1e26a70SApple OSS Distributionsimport zlib 13*a1e26a70SApple OSS Distributionsfrom operator import itemgetter 14*a1e26a70SApple OSS Distributions 15*a1e26a70SApple OSS Distributionslong = int 16*a1e26a70SApple OSS Distributions 17*a1e26a70SApple OSS Distributionsclass Globals(object): 18*a1e26a70SApple OSS Distributions pass 19*a1e26a70SApple OSS DistributionsG = Globals() 20*a1e26a70SApple OSS DistributionsG.accept_incomplete_data = False 21*a1e26a70SApple OSS DistributionsG.data_was_incomplete = False 22*a1e26a70SApple OSS Distributions 23*a1e26a70SApple OSS Distributionskcdata_type_def = { 24*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_INVALID': 0x0, 25*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_STRING_DESC': 0x1, 26*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_UINT32_DESC': 0x2, 27*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_UINT64_DESC': 0x3, 28*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_INT32_DESC': 0x4, 29*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_INT64_DESC': 0x5, 30*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_BINDATA_DESC': 0x6, 31*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_ARRAY': 0x11, 32*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_TYPEDEFINITION': 0x12, 33*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_CONTAINER_BEGIN': 0x13, 34*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_CONTAINER_END': 0x14, 35*a1e26a70SApple OSS Distributions 36*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_ARRAY_PAD0': 0x20, 37*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_ARRAY_PAD1': 0x21, 38*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_ARRAY_PAD2': 0x22, 39*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_ARRAY_PAD3': 0x23, 40*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_ARRAY_PAD4': 0x24, 41*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_ARRAY_PAD5': 0x25, 42*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_ARRAY_PAD6': 0x26, 43*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_ARRAY_PAD7': 0x27, 44*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_ARRAY_PAD8': 0x28, 45*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_ARRAY_PAD9': 0x29, 46*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_ARRAY_PADa': 0x2a, 47*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_ARRAY_PADb': 0x2b, 48*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_ARRAY_PADc': 0x2c, 49*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_ARRAY_PADd': 0x2d, 50*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_ARRAY_PADe': 0x2e, 51*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_ARRAY_PADf': 0x2f, 52*a1e26a70SApple OSS Distributions 53*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_LIBRARY_LOADINFO': 0x30, 54*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_LIBRARY_LOADINFO64': 0x31, 55*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_TIMEBASE': 0x32, 56*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_MACH_ABSOLUTE_TIME': 0x33, 57*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_TIMEVAL': 0x34, 58*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_USECS_SINCE_EPOCH': 0x35, 59*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_PID': 0x36, 60*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_PROCNAME': 0x37, 61*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_NESTED_KCDATA': 0x38, 62*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_LIBRARY_AOTINFO': 0x39, 63*a1e26a70SApple OSS Distributions 64*a1e26a70SApple OSS Distributions 'STACKSHOT_KCCONTAINER_TASK': 0x903, 65*a1e26a70SApple OSS Distributions 'STACKSHOT_KCCONTAINER_THREAD': 0x904, 66*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_DONATING_PIDS': 0x907, 67*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_SHAREDCACHE_LOADINFO': 0x908, 68*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_THREAD_NAME': 0x909, 69*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_KERN_STACKFRAME': 0x90A, 70*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_KERN_STACKFRAME64': 0x90B, 71*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_USER_STACKFRAME': 0x90C, 72*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_USER_STACKFRAME64': 0x90D, 73*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_BOOTARGS': 0x90E, 74*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_OSVERSION': 0x90F, 75*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_KERN_PAGE_SIZE': 0x910, 76*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_JETSAM_LEVEL': 0x911, 77*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_DELTA_SINCE_TIMESTAMP': 0x912, 78*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_KERN_STACKLR': 0x913, 79*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_KERN_STACKLR64': 0x914, 80*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_USER_STACKLR': 0x915, 81*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_USER_STACKLR64': 0x916, 82*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_NONRUNNABLE_TIDS': 0x917, 83*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_NONRUNNABLE_TASKS': 0x918, 84*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_CPU_TIMES': 0x919, 85*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_STACKSHOT_DURATION': 0x91a, 86*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_STACKSHOT_FAULT_STATS': 0x91b, 87*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_KERNELCACHE_LOADINFO': 0x91c, 88*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_THREAD_WAITINFO' : 0x91d, 89*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_THREAD_GROUP_SNAPSHOT' : 0x91e, 90*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_THREAD_GROUP' : 0x91f, 91*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_JETSAM_COALITION_SNAPSHOT' : 0x920, 92*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_JETSAM_COALITION' : 0x921, 93*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_THREAD_POLICY_VERSION': 0x922, 94*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_INSTRS_CYCLES' : 0x923, 95*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_USER_STACKTOP' : 0x924, 96*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_ASID' : 0x925, 97*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_PAGE_TABLES' : 0x926, 98*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_SYS_SHAREDCACHE_LAYOUT' : 0x927, 99*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_THREAD_DISPATCH_QUEUE_LABEL' : 0x928, 100*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_THREAD_TURNSTILEINFO' : 0x929, 101*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_TASK_CPU_ARCHITECTURE' : 0x92a, 102*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_LATENCY_INFO' : 0x92b, 103*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_LATENCY_INFO_TASK' : 0x92c, 104*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_LATENCY_INFO_THREAD' : 0x92d, 105*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_LOADINFO64_TEXT_EXEC' : 0x92e, 106*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_AOTCACHE_LOADINFO' : 0x92f, 107*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_TRANSITIONING_TASK_SNAPSHOT' : 0x930, 108*a1e26a70SApple OSS Distributions 'STACKSHOT_KCCONTAINER_TRANSITIONING_TASK' : 0x931, 109*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_USER_ASYNC_START_INDEX' : 0x932, 110*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_USER_ASYNC_STACKLR64' : 0x933, 111*a1e26a70SApple OSS Distributions 'STACKSHOT_KCCONTAINER_PORTLABEL' : 0x934, 112*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_PORTLABEL' : 0x935, 113*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_PORTLABEL_NAME' : 0x936, 114*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_DYLD_COMPACTINFO' : 0x937, 115*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_SUSPENSION_INFO' : 0x938, 116*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_SUSPENSION_SOURCE' : 0x939, 117*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_TASK_DELTA_SNAPSHOT': 0x940, 118*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_THREAD_DELTA_SNAPSHOT': 0x941, 119*a1e26a70SApple OSS Distributions 'STACKSHOT_KCCONTAINER_SHAREDCACHE' : 0x942, 120*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_SHAREDCACHE_INFO' : 0x943, 121*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_SHAREDCACHE_AOTINFO' : 0x944, 122*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_SHAREDCACHE_ID' : 0x945, 123*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_CODESIGNING_INFO' : 0x946, 124*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_OS_BUILD_VERSION' : 0x947, 125*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_KERN_EXCLAVES_THREADINFO' : 0x948, 126*a1e26a70SApple OSS Distributions 'STACKSHOT_KCCONTAINER_EXCLAVES' : 0x949, 127*a1e26a70SApple OSS Distributions 'STACKSHOT_KCCONTAINER_EXCLAVE_SCRESULT' : 0x94a, 128*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_EXCLAVE_SCRESULT_INFO' : 0x94b, 129*a1e26a70SApple OSS Distributions 'STACKSHOT_KCCONTAINER_EXCLAVE_IPCSTACKENTRY' : 0x94c, 130*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_EXCLAVE_IPCSTACKENTRY_INFO' : 0x94d, 131*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_EXCLAVE_IPCSTACKENTRY_ECSTACK' : 0x94e, 132*a1e26a70SApple OSS Distributions 'STACKSHOT_KCCONTAINER_EXCLAVE_ADDRESSSPACE' : 0x94f, 133*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_EXCLAVE_ADDRESSSPACE_INFO' : 0x950, 134*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_EXCLAVE_ADDRESSSPACE_NAME' : 0x951, 135*a1e26a70SApple OSS Distributions 'STACKSHOT_KCCONTAINER_EXCLAVE_TEXTLAYOUT' : 0x952, 136*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_EXCLAVE_TEXTLAYOUT_INFO' : 0x953, 137*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_EXCLAVE_TEXTLAYOUT_SEGMENTS' : 0x954, 138*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_KERN_EXCLAVES_CRASH_THREADINFO' : 0x955, 139*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_LATENCY_INFO_CPU': 0x956, 140*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_TASK_EXEC_META': 0x957, 141*a1e26a70SApple OSS Distributions 142*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_BUFFER_END': 0xF19158ED, 143*a1e26a70SApple OSS Distributions 144*a1e26a70SApple OSS Distributions 'TASK_CRASHINFO_EXTMODINFO': 0x801, 145*a1e26a70SApple OSS Distributions 'TASK_CRASHINFO_BSDINFOWITHUNIQID': 0x802, 146*a1e26a70SApple OSS Distributions 'TASK_CRASHINFO_TASKDYLD_INFO': 0x803, 147*a1e26a70SApple OSS Distributions 'TASK_CRASHINFO_UUID': 0x804, 148*a1e26a70SApple OSS Distributions 'TASK_CRASHINFO_PID': 0x805, 149*a1e26a70SApple OSS Distributions 'TASK_CRASHINFO_PPID': 0x806, 150*a1e26a70SApple OSS Distributions 151*a1e26a70SApple OSS Distributions # Don't want anyone using this. It's struct rusage from whatever machine generated the data 152*a1e26a70SApple OSS Distributions #'TASK_CRASHINFO_RUSAGE': 0x807, 153*a1e26a70SApple OSS Distributions 'Type_0x807': 0x807, 154*a1e26a70SApple OSS Distributions 155*a1e26a70SApple OSS Distributions 'TASK_CRASHINFO_RUSAGE_INFO': 0x808, 156*a1e26a70SApple OSS Distributions 'TASK_CRASHINFO_PROC_NAME': 0x809, 157*a1e26a70SApple OSS Distributions 'TASK_CRASHINFO_PROC_STARTTIME': 0x80B, 158*a1e26a70SApple OSS Distributions 'TASK_CRASHINFO_USERSTACK': 0x80C, 159*a1e26a70SApple OSS Distributions 'TASK_CRASHINFO_ARGSLEN': 0x80D, 160*a1e26a70SApple OSS Distributions 'TASK_CRASHINFO_EXCEPTION_CODES': 0x80E, 161*a1e26a70SApple OSS Distributions 'TASK_CRASHINFO_PROC_PATH': 0x80F, 162*a1e26a70SApple OSS Distributions 'TASK_CRASHINFO_PROC_CSFLAGS': 0x810, 163*a1e26a70SApple OSS Distributions 'TASK_CRASHINFO_PROC_STATUS': 0x811, 164*a1e26a70SApple OSS Distributions 'TASK_CRASHINFO_UID': 0x812, 165*a1e26a70SApple OSS Distributions 'TASK_CRASHINFO_GID': 0x813, 166*a1e26a70SApple OSS Distributions 'TASK_CRASHINFO_PROC_ARGC': 0x814, 167*a1e26a70SApple OSS Distributions 'TASK_CRASHINFO_PROC_FLAGS': 0x815, 168*a1e26a70SApple OSS Distributions 'TASK_CRASHINFO_CPUTYPE': 0x816, 169*a1e26a70SApple OSS Distributions 'TASK_CRASHINFO_WORKQUEUEINFO': 0x817, 170*a1e26a70SApple OSS Distributions 'TASK_CRASHINFO_RESPONSIBLE_PID': 0x818, 171*a1e26a70SApple OSS Distributions 'TASK_CRASHINFO_DIRTY_FLAGS': 0x819, 172*a1e26a70SApple OSS Distributions 'TASK_CRASHINFO_CRASHED_THREADID': 0x81A, 173*a1e26a70SApple OSS Distributions 'TASK_CRASHINFO_COALITION_ID': 0x81B, 174*a1e26a70SApple OSS Distributions 'TASK_CRASHINFO_JIT_ADDRESS_RANGE': 0x840, 175*a1e26a70SApple OSS Distributions 'TASK_CRASHINFO_MB': 0x841, 176*a1e26a70SApple OSS Distributions 'TASK_CRASHINFO_CS_AUXILIARY_INFO': 0x842, 177*a1e26a70SApple OSS Distributions 'EXIT_REASON_SNAPSHOT': 0x1001, 178*a1e26a70SApple OSS Distributions 'EXIT_REASON_USER_DESC': 0x1002, 179*a1e26a70SApple OSS Distributions 'EXIT_REASON_USER_PAYLOAD': 0x1003, 180*a1e26a70SApple OSS Distributions 'EXIT_REASON_CODESIGNING_INFO': 0x1004, 181*a1e26a70SApple OSS Distributions 'EXIT_REASON_WORKLOOP_ID': 0x1005, 182*a1e26a70SApple OSS Distributions 'EXIT_REASON_DISPATCH_QUEUE_NO': 0x1006, 183*a1e26a70SApple OSS Distributions 'KCDATA_BUFFER_BEGIN_CRASHINFO': 0xDEADF157, 184*a1e26a70SApple OSS Distributions 'KCDATA_BUFFER_BEGIN_DELTA_STACKSHOT': 0xDE17A59A, 185*a1e26a70SApple OSS Distributions 'KCDATA_BUFFER_BEGIN_STACKSHOT': 0x59a25807, 186*a1e26a70SApple OSS Distributions 'KCDATA_BUFFER_BEGIN_COMPRESSED': 0x434f4d50, 187*a1e26a70SApple OSS Distributions 'KCDATA_BUFFER_BEGIN_OS_REASON': 0x53A20900, 188*a1e26a70SApple OSS Distributions 'KCDATA_BUFFER_BEGIN_XNUPOST_CONFIG': 0x1E21C09F 189*a1e26a70SApple OSS Distributions} 190*a1e26a70SApple OSS Distributionskcdata_type_def_rev = dict((v, k) for k, v in iter(kcdata_type_def.items())) 191*a1e26a70SApple OSS Distributions 192*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION = {} 193*a1e26a70SApple OSS Distributions 194*a1e26a70SApple OSS DistributionsKNOWN_TOPLEVEL_CONTAINER_TYPES = () 195*a1e26a70SApple OSS Distributions 196*a1e26a70SApple OSS Distributionsdef enum(**args): 197*a1e26a70SApple OSS Distributions return type('enum', (), args) 198*a1e26a70SApple OSS Distributions 199*a1e26a70SApple OSS Distributions# 200*a1e26a70SApple OSS Distributions# Decode bytes as UTF-8, using surrogateescape if there are invalid UTF-8 201*a1e26a70SApple OSS Distributions# sequences; see PEP-383 202*a1e26a70SApple OSS Distributions# 203*a1e26a70SApple OSS Distributionsdef BytesToString(b): 204*a1e26a70SApple OSS Distributions if isinstance(b, str): 205*a1e26a70SApple OSS Distributions return b 206*a1e26a70SApple OSS Distributions return b.decode('utf-8', errors="surrogateescape") 207*a1e26a70SApple OSS Distributions 208*a1e26a70SApple OSS Distributions# important keys 209*a1e26a70SApple OSS DistributionsSC_SLID_FIRSTMAPPING_KEY = 'sharedCacheSlidFirstMapping' 210*a1e26a70SApple OSS Distributions 211*a1e26a70SApple OSS Distributions# important builtin types 212*a1e26a70SApple OSS DistributionsKCSUBTYPE_TYPE = enum(KC_ST_CHAR=1, KC_ST_INT8=2, KC_ST_UINT8=3, KC_ST_INT16=4, KC_ST_UINT16=5, KC_ST_INT32=6, KC_ST_UINT32=7, KC_ST_INT64=8, KC_ST_UINT64=9) 213*a1e26a70SApple OSS Distributions 214*a1e26a70SApple OSS Distributions 215*a1e26a70SApple OSS DistributionsLEGAL_OLD_STYLE_ARRAY_TYPE_NAMES = ['KCDATA_TYPE_LIBRARY_LOADINFO', 216*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_LIBRARY_LOADINFO64', 217*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_KERN_STACKFRAME', 218*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_USER_STACKFRAME', 219*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_KERN_STACKFRAME64', 220*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_USER_STACKFRAME64', 221*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_DONATING_PIDS', 222*a1e26a70SApple OSS Distributions 'STACKSHOT_KCTYPE_THREAD_DELTA_SNAPSHOT'] 223*a1e26a70SApple OSS Distributions 224*a1e26a70SApple OSS DistributionsKCDATA_FLAGS_STRUCT_PADDING_MASK = 0xf 225*a1e26a70SApple OSS DistributionsKCDATA_FLAGS_STRUCT_HAS_PADDING = 0x80 226*a1e26a70SApple OSS Distributions 227*a1e26a70SApple OSS Distributionsclass KCSubTypeElement(object): 228*a1e26a70SApple OSS Distributions """convert kcdata_subtype_descriptor to """ 229*a1e26a70SApple OSS Distributions _unpack_formats = (None, 'c', 'b', 'B', 'h', 'H', 'i', 'I', 'q', 'Q') 230*a1e26a70SApple OSS Distributions _ctypes = ('Unknown', 'char', 'int8_t', 'uint8_t', 'int16_t', 'uint16_t', 'int32_t', 'uint32_t', 'int64_t', 'uint64_t') 231*a1e26a70SApple OSS Distributions 232*a1e26a70SApple OSS Distributions def __init__(self, st_name, st_type, st_size, st_offset=0, st_flag=0, custom_repr=None): 233*a1e26a70SApple OSS Distributions self.name = st_name 234*a1e26a70SApple OSS Distributions self.offset = st_offset 235*a1e26a70SApple OSS Distributions self.type_id = st_type 236*a1e26a70SApple OSS Distributions if st_type <= 0 or st_type > KCSUBTYPE_TYPE.KC_ST_UINT64: 237*a1e26a70SApple OSS Distributions raise ValueError("Invalid type passed %d" % st_type) 238*a1e26a70SApple OSS Distributions self.unpack_fmt = KCSubTypeElement._unpack_formats[self.type_id] 239*a1e26a70SApple OSS Distributions self.size = st_size 240*a1e26a70SApple OSS Distributions self.totalsize = st_size 241*a1e26a70SApple OSS Distributions self.count = 1 242*a1e26a70SApple OSS Distributions self.is_array_type = False 243*a1e26a70SApple OSS Distributions self.custom_JsonRepr = custom_repr 244*a1e26a70SApple OSS Distributions if (st_flag & 0x1) == 0x1: 245*a1e26a70SApple OSS Distributions self.is_array_type = True 246*a1e26a70SApple OSS Distributions self.size = st_size & 0xffff 247*a1e26a70SApple OSS Distributions self.count = (st_size >> 16) & 0xffff 248*a1e26a70SApple OSS Distributions self.totalsize = self.size * self.count 249*a1e26a70SApple OSS Distributions 250*a1e26a70SApple OSS Distributions @staticmethod 251*a1e26a70SApple OSS Distributions def GetSizeForArray(el_count, el_size): 252*a1e26a70SApple OSS Distributions return ((el_count & 0xffff) << 16) | (el_size & 0xffff) 253*a1e26a70SApple OSS Distributions 254*a1e26a70SApple OSS Distributions @staticmethod 255*a1e26a70SApple OSS Distributions def FromBinaryTypeData(byte_data): 256*a1e26a70SApple OSS Distributions (st_flag, st_type, st_offset, st_size, st_name) = struct.unpack_from('=BBHI32s', byte_data) 257*a1e26a70SApple OSS Distributions st_name = BytesToString(st_name).rstrip('\0') 258*a1e26a70SApple OSS Distributions return KCSubTypeElement(st_name, st_type, st_size, st_offset, st_flag) 259*a1e26a70SApple OSS Distributions 260*a1e26a70SApple OSS Distributions @staticmethod 261*a1e26a70SApple OSS Distributions def FromBasicCtype(st_name, st_type, st_offset=0, legacy_size=None): 262*a1e26a70SApple OSS Distributions if st_type <= 0 or st_type > KCSUBTYPE_TYPE.KC_ST_UINT64: 263*a1e26a70SApple OSS Distributions raise ValueError("Invalid type passed %d" % st_type) 264*a1e26a70SApple OSS Distributions st_size = struct.calcsize(KCSubTypeElement._unpack_formats[st_type]) 265*a1e26a70SApple OSS Distributions st_flag = 0 266*a1e26a70SApple OSS Distributions retval = KCSubTypeElement(st_name, st_type, st_size, st_offset, st_flag, KCSubTypeElement._get_naked_element_value) 267*a1e26a70SApple OSS Distributions if legacy_size: 268*a1e26a70SApple OSS Distributions retval.legacy_size = legacy_size 269*a1e26a70SApple OSS Distributions return retval 270*a1e26a70SApple OSS Distributions 271*a1e26a70SApple OSS Distributions @staticmethod 272*a1e26a70SApple OSS Distributions def FromKCSubTypeElement(other, name_override=''): 273*a1e26a70SApple OSS Distributions _copy = copy.copy(other) 274*a1e26a70SApple OSS Distributions if name_override: 275*a1e26a70SApple OSS Distributions _copy.name = name_override 276*a1e26a70SApple OSS Distributions return copy 277*a1e26a70SApple OSS Distributions 278*a1e26a70SApple OSS Distributions def GetName(self): 279*a1e26a70SApple OSS Distributions return self.name 280*a1e26a70SApple OSS Distributions 281*a1e26a70SApple OSS Distributions def GetTotalSize(self): 282*a1e26a70SApple OSS Distributions return self.totalsize 283*a1e26a70SApple OSS Distributions 284*a1e26a70SApple OSS Distributions def GetValueAsString(self, base_data, array_pos=0): 285*a1e26a70SApple OSS Distributions v = self.GetValue(base_data, array_pos) 286*a1e26a70SApple OSS Distributions if isinstance(v, bytes): 287*a1e26a70SApple OSS Distributions return BytesToString(v) 288*a1e26a70SApple OSS Distributions return str(v) 289*a1e26a70SApple OSS Distributions 290*a1e26a70SApple OSS Distributions def GetValue(self, base_data, array_pos=0): 291*a1e26a70SApple OSS Distributions return struct.unpack_from(self.unpack_fmt, base_data[self.offset + (array_pos * self.size):])[0] 292*a1e26a70SApple OSS Distributions 293*a1e26a70SApple OSS Distributions @staticmethod 294*a1e26a70SApple OSS Distributions def _get_naked_element_value(elementValue, elementName): 295*a1e26a70SApple OSS Distributions return json.dumps(elementValue) 296*a1e26a70SApple OSS Distributions 297*a1e26a70SApple OSS Distributions def __str__(self): 298*a1e26a70SApple OSS Distributions if self.is_array_type: 299*a1e26a70SApple OSS Distributions return '[%d,%d] %s %s[%d];' % (self.offset, self.totalsize, self.GetCTypeDesc(), self.name, self.count) 300*a1e26a70SApple OSS Distributions return '[%d,%d] %s %s;' % (self.offset, self.totalsize, self.GetCTypeDesc(), self.name) 301*a1e26a70SApple OSS Distributions 302*a1e26a70SApple OSS Distributions def __repr__(self): 303*a1e26a70SApple OSS Distributions return str(self) 304*a1e26a70SApple OSS Distributions 305*a1e26a70SApple OSS Distributions def GetCTypeDesc(self): 306*a1e26a70SApple OSS Distributions return KCSubTypeElement._ctypes[self.type_id] 307*a1e26a70SApple OSS Distributions 308*a1e26a70SApple OSS Distributions def GetStringRepr(self, base_data): 309*a1e26a70SApple OSS Distributions if not self.is_array_type: 310*a1e26a70SApple OSS Distributions return self.GetValueAsString(base_data) 311*a1e26a70SApple OSS Distributions if self.type_id == KCSUBTYPE_TYPE.KC_ST_CHAR: 312*a1e26a70SApple OSS Distributions str_len = self.count 313*a1e26a70SApple OSS Distributions if len(base_data) < str_len: 314*a1e26a70SApple OSS Distributions str_len = len(base_data) 315*a1e26a70SApple OSS Distributions str_arr = [] 316*a1e26a70SApple OSS Distributions for i in range(str_len): 317*a1e26a70SApple OSS Distributions _v = self.GetValue(base_data, i) 318*a1e26a70SApple OSS Distributions if ord(_v) == 0: 319*a1e26a70SApple OSS Distributions break 320*a1e26a70SApple OSS Distributions str_arr.append(self.GetValueAsString(base_data, i)) 321*a1e26a70SApple OSS Distributions return json.dumps(''.join(str_arr)) 322*a1e26a70SApple OSS Distributions 323*a1e26a70SApple OSS Distributions count = self.count 324*a1e26a70SApple OSS Distributions if count > len(base_data)//self.size: 325*a1e26a70SApple OSS Distributions count = len(base_data)//self.size 326*a1e26a70SApple OSS Distributions 327*a1e26a70SApple OSS Distributions o = '[' + ','.join([self.GetValueAsString(base_data, i) for i in range(count)]) + ']' 328*a1e26a70SApple OSS Distributions 329*a1e26a70SApple OSS Distributions return o 330*a1e26a70SApple OSS Distributions 331*a1e26a70SApple OSS Distributions def GetJsonRepr(self, base_data, flags=0): 332*a1e26a70SApple OSS Distributions if (flags & (KCDATA_FLAGS_STRUCT_HAS_PADDING | KCDATA_FLAGS_STRUCT_PADDING_MASK)) != 0: 333*a1e26a70SApple OSS Distributions padding = (flags & KCDATA_FLAGS_STRUCT_PADDING_MASK) 334*a1e26a70SApple OSS Distributions if padding: 335*a1e26a70SApple OSS Distributions base_data = base_data[:-padding] 336*a1e26a70SApple OSS Distributions if self.custom_JsonRepr: 337*a1e26a70SApple OSS Distributions if self.is_array_type: 338*a1e26a70SApple OSS Distributions e_data = [self.GetValue(base_data, i) for i in range(self.count)] 339*a1e26a70SApple OSS Distributions else: 340*a1e26a70SApple OSS Distributions e_data = self.GetValue(base_data) 341*a1e26a70SApple OSS Distributions return self.custom_JsonRepr(e_data, self.name) 342*a1e26a70SApple OSS Distributions return self.GetStringRepr(base_data) 343*a1e26a70SApple OSS Distributions 344*a1e26a70SApple OSS Distributions def sizeof(self): 345*a1e26a70SApple OSS Distributions return self.totalsize 346*a1e26a70SApple OSS Distributions 347*a1e26a70SApple OSS Distributions def ShouldSkip(self, data): 348*a1e26a70SApple OSS Distributions return len(data) < self.offset + self.totalsize 349*a1e26a70SApple OSS Distributions 350*a1e26a70SApple OSS Distributions def ShouldMerge(self): 351*a1e26a70SApple OSS Distributions return False 352*a1e26a70SApple OSS Distributions 353*a1e26a70SApple OSS Distributions 354*a1e26a70SApple OSS Distributionsclass KCTypeDescription(object): 355*a1e26a70SApple OSS Distributions def __init__(self, t_type_id, t_elements=[], t_name='anon', custom_repr=None, legacy_size=None, merge=False, naked=False): 356*a1e26a70SApple OSS Distributions self.type_id = t_type_id 357*a1e26a70SApple OSS Distributions self.elements = t_elements 358*a1e26a70SApple OSS Distributions self.name = t_name 359*a1e26a70SApple OSS Distributions self.totalsize = 0 360*a1e26a70SApple OSS Distributions self.custom_JsonRepr = custom_repr 361*a1e26a70SApple OSS Distributions if legacy_size: 362*a1e26a70SApple OSS Distributions self.legacy_size = legacy_size 363*a1e26a70SApple OSS Distributions self.merge = merge 364*a1e26a70SApple OSS Distributions self.naked = naked 365*a1e26a70SApple OSS Distributions for e in self.elements: 366*a1e26a70SApple OSS Distributions self.totalsize += e.GetTotalSize() 367*a1e26a70SApple OSS Distributions 368*a1e26a70SApple OSS Distributions def ValidateData(self, base_data): 369*a1e26a70SApple OSS Distributions if len(base_data) >= self.totalsize: 370*a1e26a70SApple OSS Distributions return True 371*a1e26a70SApple OSS Distributions return False 372*a1e26a70SApple OSS Distributions 373*a1e26a70SApple OSS Distributions def GetTypeID(self): 374*a1e26a70SApple OSS Distributions return self.type_id 375*a1e26a70SApple OSS Distributions 376*a1e26a70SApple OSS Distributions def GetName(self): 377*a1e26a70SApple OSS Distributions return self.name 378*a1e26a70SApple OSS Distributions 379*a1e26a70SApple OSS Distributions def __str__(self): 380*a1e26a70SApple OSS Distributions o = '%s {\n\t' % self.name + "\n\t".join([str(e) for e in self.elements]) + '\n};' 381*a1e26a70SApple OSS Distributions return o 382*a1e26a70SApple OSS Distributions 383*a1e26a70SApple OSS Distributions @staticmethod 384*a1e26a70SApple OSS Distributions def FromKCTypeDescription(other, t_type_id, t_name): 385*a1e26a70SApple OSS Distributions retval = KCTypeDescription(t_type_id, other.elements, t_name, other.custom_JsonRepr, 386*a1e26a70SApple OSS Distributions legacy_size=getattr(other, 'legacy_size', None)) 387*a1e26a70SApple OSS Distributions return retval 388*a1e26a70SApple OSS Distributions 389*a1e26a70SApple OSS Distributions def ShouldMerge(self): 390*a1e26a70SApple OSS Distributions return self.merge 391*a1e26a70SApple OSS Distributions 392*a1e26a70SApple OSS Distributions def GetJsonRepr(self, base_data, flags): 393*a1e26a70SApple OSS Distributions if (flags & (KCDATA_FLAGS_STRUCT_HAS_PADDING | KCDATA_FLAGS_STRUCT_PADDING_MASK)) != 0: 394*a1e26a70SApple OSS Distributions padding = (flags & KCDATA_FLAGS_STRUCT_PADDING_MASK) 395*a1e26a70SApple OSS Distributions if padding: 396*a1e26a70SApple OSS Distributions base_data = base_data[:-padding] 397*a1e26a70SApple OSS Distributions elif hasattr(self, 'legacy_size') and len(base_data) == self.legacy_size + ((-self.legacy_size) & 0xf): 398*a1e26a70SApple OSS Distributions base_data = base_data[:self.legacy_size] 399*a1e26a70SApple OSS Distributions if self.custom_JsonRepr: 400*a1e26a70SApple OSS Distributions return self.custom_JsonRepr([e.GetValue(base_data) for e in self.elements]) 401*a1e26a70SApple OSS Distributions if self.naked: 402*a1e26a70SApple OSS Distributions o = ", ".join([e.GetJsonRepr(base_data) for e in self.elements if not e.ShouldSkip(base_data)]) 403*a1e26a70SApple OSS Distributions else: 404*a1e26a70SApple OSS Distributions o = ", ".join(['"%s": %s' % (e.GetName(), e.GetJsonRepr(base_data)) for e in self.elements if not e.ShouldSkip(base_data)]) 405*a1e26a70SApple OSS Distributions if not self.merge: 406*a1e26a70SApple OSS Distributions o = '{' + o + '}' 407*a1e26a70SApple OSS Distributions return o 408*a1e26a70SApple OSS Distributions 409*a1e26a70SApple OSS Distributions def sizeof(self): 410*a1e26a70SApple OSS Distributions return max(st.totalsize + st.offset for st in self.elements) 411*a1e26a70SApple OSS Distributions 412*a1e26a70SApple OSS Distributions 413*a1e26a70SApple OSS Distributionsdef GetTypeNameForKey(k): 414*a1e26a70SApple OSS Distributions retval = "0x%x" % k 415*a1e26a70SApple OSS Distributions if k in KNOWN_TYPES_COLLECTION: 416*a1e26a70SApple OSS Distributions retval = KNOWN_TYPES_COLLECTION[k].GetName() 417*a1e26a70SApple OSS Distributions elif k in kcdata_type_def_rev: 418*a1e26a70SApple OSS Distributions retval = kcdata_type_def_rev[k] 419*a1e26a70SApple OSS Distributions return retval 420*a1e26a70SApple OSS Distributions 421*a1e26a70SApple OSS Distributions 422*a1e26a70SApple OSS Distributionsdef GetTypeForName(n): 423*a1e26a70SApple OSS Distributions ret = 0 424*a1e26a70SApple OSS Distributions if n in kcdata_type_def: 425*a1e26a70SApple OSS Distributions ret = kcdata_type_def[n] 426*a1e26a70SApple OSS Distributions return ret 427*a1e26a70SApple OSS Distributions 428*a1e26a70SApple OSS Distributions 429*a1e26a70SApple OSS DistributionsLEGAL_OLD_STYLE_ARRAY_TYPES = list(map(GetTypeForName, LEGAL_OLD_STYLE_ARRAY_TYPE_NAMES)) 430*a1e26a70SApple OSS Distributions 431*a1e26a70SApple OSS Distributionskcdata_type_def_rev[GetTypeForName('KCDATA_BUFFER_BEGIN_STACKSHOT')] = 'kcdata_stackshot' 432*a1e26a70SApple OSS Distributionskcdata_type_def_rev[GetTypeForName('KCDATA_BUFFER_BEGIN_DELTA_STACKSHOT')] = 'kcdata_delta_stackshot' 433*a1e26a70SApple OSS Distributionskcdata_type_def_rev[GetTypeForName('KCDATA_BUFFER_BEGIN_CRASHINFO')] = 'kcdata_crashinfo' 434*a1e26a70SApple OSS Distributionskcdata_type_def_rev[GetTypeForName('KCDATA_BUFFER_BEGIN_OS_REASON')] = 'kcdata_reason' 435*a1e26a70SApple OSS Distributionskcdata_type_def_rev[GetTypeForName('STACKSHOT_KCCONTAINER_TASK')] = 'task_snapshots' 436*a1e26a70SApple OSS Distributionskcdata_type_def_rev[GetTypeForName('STACKSHOT_KCCONTAINER_TRANSITIONING_TASK')] = 'transitioning_task_snapshots' 437*a1e26a70SApple OSS Distributionskcdata_type_def_rev[GetTypeForName('STACKSHOT_KCCONTAINER_THREAD')] = 'thread_snapshots' 438*a1e26a70SApple OSS Distributionskcdata_type_def_rev[GetTypeForName('STACKSHOT_KCCONTAINER_PORTLABEL')] = 'portlabels' 439*a1e26a70SApple OSS Distributionskcdata_type_def_rev[GetTypeForName('STACKSHOT_KCCONTAINER_SHAREDCACHE')] = 'shared_caches' 440*a1e26a70SApple OSS Distributionskcdata_type_def_rev[GetTypeForName('KCDATA_BUFFER_BEGIN_XNUPOST_CONFIG')] = 'xnupost_testconfig' 441*a1e26a70SApple OSS Distributionskcdata_type_def_rev[GetTypeForName('STACKSHOT_KCCONTAINER_EXCLAVES')] = 'threads_exclave' 442*a1e26a70SApple OSS Distributionskcdata_type_def_rev[GetTypeForName('STACKSHOT_KCCONTAINER_EXCLAVE_SCRESULT')] = 'thread_exclave' 443*a1e26a70SApple OSS Distributionskcdata_type_def_rev[GetTypeForName('STACKSHOT_KCCONTAINER_EXCLAVE_IPCSTACKENTRY')] = 'exclave_ipcstackentry' 444*a1e26a70SApple OSS Distributionskcdata_type_def_rev[GetTypeForName('STACKSHOT_KCCONTAINER_EXCLAVE_ADDRESSSPACE')] = 'exclave_addressspace' 445*a1e26a70SApple OSS Distributionskcdata_type_def_rev[GetTypeForName('STACKSHOT_KCCONTAINER_EXCLAVE_TEXTLAYOUT')] = 'exclave_textlayout' 446*a1e26a70SApple OSS Distributions 447*a1e26a70SApple OSS Distributionsclass Indent(object): 448*a1e26a70SApple OSS Distributions def __init__(self): 449*a1e26a70SApple OSS Distributions self.n = 0 450*a1e26a70SApple OSS Distributions def __call__(self, end=False): 451*a1e26a70SApple OSS Distributions if end: 452*a1e26a70SApple OSS Distributions return " " * (self.n-4) 453*a1e26a70SApple OSS Distributions else: 454*a1e26a70SApple OSS Distributions return " " * self.n 455*a1e26a70SApple OSS Distributions @contextlib.contextmanager 456*a1e26a70SApple OSS Distributions def indent(self): 457*a1e26a70SApple OSS Distributions self.n += 4 458*a1e26a70SApple OSS Distributions try: 459*a1e26a70SApple OSS Distributions yield 460*a1e26a70SApple OSS Distributions finally: 461*a1e26a70SApple OSS Distributions self.n -= 4 462*a1e26a70SApple OSS Distributions 463*a1e26a70SApple OSS DistributionsINDENT = Indent() 464*a1e26a70SApple OSS Distributions 465*a1e26a70SApple OSS Distributionsclass KCObject(object): 466*a1e26a70SApple OSS Distributions 467*a1e26a70SApple OSS Distributions def __init__(self, type_code, data, offset, flags=0): 468*a1e26a70SApple OSS Distributions 469*a1e26a70SApple OSS Distributions self.i_type = type_code 470*a1e26a70SApple OSS Distributions self.i_data = data 471*a1e26a70SApple OSS Distributions self.offset = offset 472*a1e26a70SApple OSS Distributions self.i_size = len(data) 473*a1e26a70SApple OSS Distributions self.i_flags = flags 474*a1e26a70SApple OSS Distributions self.obj_collection = [] 475*a1e26a70SApple OSS Distributions self.obj = {} 476*a1e26a70SApple OSS Distributions self.is_container_type = False 477*a1e26a70SApple OSS Distributions self.is_array_type = False 478*a1e26a70SApple OSS Distributions self.is_naked_type = False 479*a1e26a70SApple OSS Distributions self.nested_kcdata = None 480*a1e26a70SApple OSS Distributions self.i_name = GetTypeNameForKey(type_code) 481*a1e26a70SApple OSS Distributions 482*a1e26a70SApple OSS Distributions self.ParseData() 483*a1e26a70SApple OSS Distributions 484*a1e26a70SApple OSS Distributions if self.i_type == GetTypeForName('KCDATA_TYPE_CONTAINER_BEGIN'): 485*a1e26a70SApple OSS Distributions self.__class__ = KCContainerObject 486*a1e26a70SApple OSS Distributions elif self.i_type == GetTypeForName('KCDATA_BUFFER_BEGIN_COMPRESSED'): 487*a1e26a70SApple OSS Distributions self.__class__ = KCCompressedBufferObject 488*a1e26a70SApple OSS Distributions elif self.i_type in KNOWN_TOPLEVEL_CONTAINER_TYPES: 489*a1e26a70SApple OSS Distributions self.__class__ = KCBufferObject 490*a1e26a70SApple OSS Distributions 491*a1e26a70SApple OSS Distributions self.InitAfterParse() 492*a1e26a70SApple OSS Distributions 493*a1e26a70SApple OSS Distributions def __str__(self): 494*a1e26a70SApple OSS Distributions return "<KCObject at 0x%x>" % self.offset 495*a1e26a70SApple OSS Distributions 496*a1e26a70SApple OSS Distributions def InitAfterParse(self): 497*a1e26a70SApple OSS Distributions pass 498*a1e26a70SApple OSS Distributions 499*a1e26a70SApple OSS Distributions @staticmethod 500*a1e26a70SApple OSS Distributions def FromKCItem(kcitem): 501*a1e26a70SApple OSS Distributions return KCObject(kcitem.i_type, kcitem.i_data, kcitem.i_offset, kcitem.i_flags) 502*a1e26a70SApple OSS Distributions 503*a1e26a70SApple OSS Distributions def IsContainerEnd(self): 504*a1e26a70SApple OSS Distributions return self.i_type == GetTypeForName('KCDATA_TYPE_CONTAINER_END') 505*a1e26a70SApple OSS Distributions 506*a1e26a70SApple OSS Distributions def IsBufferEnd(self): 507*a1e26a70SApple OSS Distributions return self.i_type == GetTypeForName('KCDATA_TYPE_BUFFER_END') 508*a1e26a70SApple OSS Distributions 509*a1e26a70SApple OSS Distributions def IsArray(self): 510*a1e26a70SApple OSS Distributions return self.is_array_type 511*a1e26a70SApple OSS Distributions 512*a1e26a70SApple OSS Distributions def ShouldMerge(self): 513*a1e26a70SApple OSS Distributions if self.nested_kcdata: 514*a1e26a70SApple OSS Distributions return True 515*a1e26a70SApple OSS Distributions elif not self.is_array_type and self.i_type in KNOWN_TYPES_COLLECTION: 516*a1e26a70SApple OSS Distributions return KNOWN_TYPES_COLLECTION[self.i_type].ShouldMerge() 517*a1e26a70SApple OSS Distributions else: 518*a1e26a70SApple OSS Distributions return False 519*a1e26a70SApple OSS Distributions 520*a1e26a70SApple OSS Distributions def GetJsonRepr(self): 521*a1e26a70SApple OSS Distributions if self.is_array_type: 522*a1e26a70SApple OSS Distributions return '[' + ', '.join([i.GetJsonRepr() for i in self.obj_collection]) + ']' 523*a1e26a70SApple OSS Distributions if self.i_type in KNOWN_TYPES_COLLECTION: 524*a1e26a70SApple OSS Distributions return KNOWN_TYPES_COLLECTION[self.i_type].GetJsonRepr(self.i_data, self.i_flags) 525*a1e26a70SApple OSS Distributions if self.is_naked_type: 526*a1e26a70SApple OSS Distributions return json.dumps(self.obj) 527*a1e26a70SApple OSS Distributions if self.nested_kcdata: 528*a1e26a70SApple OSS Distributions return self.nested_kcdata.GetJsonRepr() 529*a1e26a70SApple OSS Distributions 530*a1e26a70SApple OSS Distributions raise NotImplementedError("Broken GetJsonRepr implementation") 531*a1e26a70SApple OSS Distributions 532*a1e26a70SApple OSS Distributions def ParseData(self): 533*a1e26a70SApple OSS Distributions 534*a1e26a70SApple OSS Distributions logging.info(self.i_type) 535*a1e26a70SApple OSS Distributions if self.i_type == GetTypeForName('KCDATA_TYPE_CONTAINER_BEGIN'): 536*a1e26a70SApple OSS Distributions self.obj['uniqID'] = self.i_flags 537*a1e26a70SApple OSS Distributions self.i_name = str(self.obj['uniqID']) 538*a1e26a70SApple OSS Distributions self.obj['typeID'] = struct.unpack_from('I', self.i_data)[0] 539*a1e26a70SApple OSS Distributions logging.info("0x%08x: %sCONTAINER: %s(%x)" % (self.offset, INDENT(), GetTypeNameForKey(self.obj['typeID']), self.i_flags)) 540*a1e26a70SApple OSS Distributions 541*a1e26a70SApple OSS Distributions elif self.i_type in (KNOWN_TOPLEVEL_CONTAINER_TYPES): 542*a1e26a70SApple OSS Distributions self.obj['uniqID'] = self.i_name 543*a1e26a70SApple OSS Distributions self.obj['typeID'] = self.i_type 544*a1e26a70SApple OSS Distributions logging.info("0x%08x: %s%s" % (self.offset, INDENT(), self.i_name)) 545*a1e26a70SApple OSS Distributions 546*a1e26a70SApple OSS Distributions elif self.i_type == GetTypeForName('KCDATA_TYPE_CONTAINER_END'): 547*a1e26a70SApple OSS Distributions self.obj['uniqID'] = self.i_flags 548*a1e26a70SApple OSS Distributions logging.info("0x%08x: %sEND" % (self.offset, INDENT(end=True))) 549*a1e26a70SApple OSS Distributions 550*a1e26a70SApple OSS Distributions elif self.i_type == GetTypeForName('KCDATA_TYPE_BUFFER_END'): 551*a1e26a70SApple OSS Distributions self.obj = '' 552*a1e26a70SApple OSS Distributions logging.info("0x%08x: %sEND_BUFFER" % (self.offset, INDENT(end=True))) 553*a1e26a70SApple OSS Distributions 554*a1e26a70SApple OSS Distributions elif self.i_type == GetTypeForName('KCDATA_TYPE_UINT32_DESC'): 555*a1e26a70SApple OSS Distributions self.is_naked_type = True 556*a1e26a70SApple OSS Distributions u_d = struct.unpack_from('32sI', self.i_data) 557*a1e26a70SApple OSS Distributions self.i_name = BytesToString(u_d[0]).rstrip('\0') 558*a1e26a70SApple OSS Distributions self.obj = u_d[1] 559*a1e26a70SApple OSS Distributions logging.info("0x%08x: %s%s" % (self.offset, INDENT(), self.i_name)) 560*a1e26a70SApple OSS Distributions 561*a1e26a70SApple OSS Distributions elif self.i_type == GetTypeForName('KCDATA_TYPE_UINT64_DESC'): 562*a1e26a70SApple OSS Distributions self.is_naked_type = True 563*a1e26a70SApple OSS Distributions u_d = struct.unpack_from('32sQ', self.i_data) 564*a1e26a70SApple OSS Distributions self.i_name = BytesToString(u_d[0]).rstrip('\0') 565*a1e26a70SApple OSS Distributions self.obj = u_d[1] 566*a1e26a70SApple OSS Distributions logging.info("0x%08x: %s%s" % (self.offset, INDENT(), self.i_name)) 567*a1e26a70SApple OSS Distributions 568*a1e26a70SApple OSS Distributions elif self.i_type == GetTypeForName('KCDATA_TYPE_TYPEDEFINITION'): 569*a1e26a70SApple OSS Distributions self.is_naked_type = True 570*a1e26a70SApple OSS Distributions u_d = struct.unpack_from('II32s', self.i_data) 571*a1e26a70SApple OSS Distributions self.obj['name'] = BytesToString(u_d[2]).split(chr(0))[0] 572*a1e26a70SApple OSS Distributions self.i_name = "typedef[%s]" % self.obj['name'] 573*a1e26a70SApple OSS Distributions self.obj['typeID'] = u_d[0] 574*a1e26a70SApple OSS Distributions self.obj['numOfFields'] = u_d[1] 575*a1e26a70SApple OSS Distributions element_arr = [] 576*a1e26a70SApple OSS Distributions for i in range(u_d[1]): 577*a1e26a70SApple OSS Distributions e = KCSubTypeElement.FromBinaryTypeData(self.i_data[40+(i*40):]) 578*a1e26a70SApple OSS Distributions element_arr.append(e) 579*a1e26a70SApple OSS Distributions type_desc = KCTypeDescription(u_d[0], element_arr, self.obj['name']) 580*a1e26a70SApple OSS Distributions self.obj['fields'] = [str(e) for e in element_arr] 581*a1e26a70SApple OSS Distributions KNOWN_TYPES_COLLECTION[type_desc.GetTypeID()] = type_desc 582*a1e26a70SApple OSS Distributions logging.info("0x%08x: %s%s" % (self.offset, INDENT(), self.i_name)) 583*a1e26a70SApple OSS Distributions 584*a1e26a70SApple OSS Distributions elif self.i_type == GetTypeForName('KCDATA_TYPE_ARRAY'): 585*a1e26a70SApple OSS Distributions self.is_array_type = True 586*a1e26a70SApple OSS Distributions e_t = (self.i_flags >> 32) & 0xffffffff 587*a1e26a70SApple OSS Distributions if e_t not in LEGAL_OLD_STYLE_ARRAY_TYPES: 588*a1e26a70SApple OSS Distributions raise Exception("illegal old-style array type: %s (0x%x)" % (GetTypeNameForKey(e_t), e_t)) 589*a1e26a70SApple OSS Distributions e_c = self.i_flags & 0xffffffff 590*a1e26a70SApple OSS Distributions e_s = KNOWN_TYPES_COLLECTION[e_t].legacy_size 591*a1e26a70SApple OSS Distributions if e_s * e_c > self.i_size: 592*a1e26a70SApple OSS Distributions raise Exception("array too small for its count") 593*a1e26a70SApple OSS Distributions self.obj['typeID'] = e_t 594*a1e26a70SApple OSS Distributions self.i_name = GetTypeNameForKey(e_t) 595*a1e26a70SApple OSS Distributions self.i_type = e_t 596*a1e26a70SApple OSS Distributions self.obj['numOfElements'] = e_c 597*a1e26a70SApple OSS Distributions self.obj['sizeOfElement'] = e_s 598*a1e26a70SApple OSS Distributions logging.info("0x%08x: %sARRAY: %s" % (self.offset, INDENT(), self.i_name)) 599*a1e26a70SApple OSS Distributions #populate the array here by recursive creation of KCObject 600*a1e26a70SApple OSS Distributions with INDENT.indent(): 601*a1e26a70SApple OSS Distributions for _i in range(e_c): 602*a1e26a70SApple OSS Distributions _o = KCObject(e_t, self.i_data[(_i * e_s):(_i * e_s) + e_s], self.offset + _i*e_s) 603*a1e26a70SApple OSS Distributions self.obj_collection.append(_o) 604*a1e26a70SApple OSS Distributions 605*a1e26a70SApple OSS Distributions elif self.i_type >= GetTypeForName('KCDATA_TYPE_ARRAY_PAD0') and self.i_type <= GetTypeForName('KCDATA_TYPE_ARRAY_PADf'): 606*a1e26a70SApple OSS Distributions self.is_array_type = True 607*a1e26a70SApple OSS Distributions e_t = (self.i_flags >> 32) & 0xffffffff 608*a1e26a70SApple OSS Distributions e_c = self.i_flags & 0xffffffff 609*a1e26a70SApple OSS Distributions e_s = (self.i_size - (self.i_type & 0xf)) // e_c if e_c != 0 else None 610*a1e26a70SApple OSS Distributions self.obj['typeID'] = e_t 611*a1e26a70SApple OSS Distributions self.i_name = GetTypeNameForKey(e_t) 612*a1e26a70SApple OSS Distributions self.i_type = e_t 613*a1e26a70SApple OSS Distributions self.obj['numOfElements'] = e_c 614*a1e26a70SApple OSS Distributions self.obj['sizeOfElement'] = e_s 615*a1e26a70SApple OSS Distributions logging.info("0x%08x: %sARRAY: %s" % (self.offset, INDENT(), self.i_name)) 616*a1e26a70SApple OSS Distributions #populate the array here by recursive creation of KCObject 617*a1e26a70SApple OSS Distributions with INDENT.indent(): 618*a1e26a70SApple OSS Distributions for _i in range(e_c): 619*a1e26a70SApple OSS Distributions _o = KCObject(e_t, self.i_data[(_i * e_s):(_i * e_s) + e_s], self.offset + _i*e_s) 620*a1e26a70SApple OSS Distributions self.obj_collection.append(_o) 621*a1e26a70SApple OSS Distributions 622*a1e26a70SApple OSS Distributions elif self.i_type == GetTypeForName('KCDATA_TYPE_NESTED_KCDATA'): 623*a1e26a70SApple OSS Distributions logging.info("0x%08x: %sNESTED_KCDATA" % (self.offset, INDENT())) 624*a1e26a70SApple OSS Distributions with INDENT.indent(): 625*a1e26a70SApple OSS Distributions nested_iterator = kcdata_item_iterator(self.i_data[:self.i_size]) 626*a1e26a70SApple OSS Distributions nested_buffer = KCObject.FromKCItem(next(nested_iterator)) 627*a1e26a70SApple OSS Distributions if not isinstance(nested_buffer, KCBufferObject): 628*a1e26a70SApple OSS Distributions raise Exception("nested buffer isn't a KCBufferObject") 629*a1e26a70SApple OSS Distributions nested_buffer.ReadItems(nested_iterator) 630*a1e26a70SApple OSS Distributions self.nested_kcdata = nested_buffer 631*a1e26a70SApple OSS Distributions 632*a1e26a70SApple OSS Distributions elif self.i_type in KNOWN_TYPES_COLLECTION: 633*a1e26a70SApple OSS Distributions self.i_name = KNOWN_TYPES_COLLECTION[self.i_type].GetName() 634*a1e26a70SApple OSS Distributions self.is_naked_type = True 635*a1e26a70SApple OSS Distributions logging.info("0x%08x: %s%s" % (self.offset, INDENT(), self.i_name)) 636*a1e26a70SApple OSS Distributions else: 637*a1e26a70SApple OSS Distributions self.is_naked_type = True 638*a1e26a70SApple OSS Distributions #self.obj = "data of len %d" % len(self.i_data) 639*a1e26a70SApple OSS Distributions #self.obj = ''.join(["%x" % ki for ki in struct.unpack('%dB' % len(self.i_data), self.i_data)]) 640*a1e26a70SApple OSS Distributions if isinstance(self.i_data, str): 641*a1e26a70SApple OSS Distributions self.obj = list(map(ord, BytesToString(self.i_data))) 642*a1e26a70SApple OSS Distributions else: 643*a1e26a70SApple OSS Distributions self.obj = [i for i in self.i_data] 644*a1e26a70SApple OSS Distributions logging.info("0x%08x: %s%s" % (self.offset, INDENT(), self.i_name)) 645*a1e26a70SApple OSS Distributions 646*a1e26a70SApple OSS Distributions 647*a1e26a70SApple OSS Distributionsclass KCContainerObject(KCObject): 648*a1e26a70SApple OSS Distributions def __init__(self, *args, **kwargs): 649*a1e26a70SApple OSS Distributions assert False 650*a1e26a70SApple OSS Distributions 651*a1e26a70SApple OSS Distributions def InitAfterParse(self): 652*a1e26a70SApple OSS Distributions self.obj_container_dict = {} 653*a1e26a70SApple OSS Distributions self.obj_nested_objs = {} 654*a1e26a70SApple OSS Distributions 655*a1e26a70SApple OSS Distributions def ShouldMerge(self): 656*a1e26a70SApple OSS Distributions return True 657*a1e26a70SApple OSS Distributions 658*a1e26a70SApple OSS Distributions def GetJsonRepr(self): 659*a1e26a70SApple OSS Distributions # o = '"%s"' % self.obj['uniqID'] + ' : { "typeID" : %d ,' % self.obj['typeID'] 660*a1e26a70SApple OSS Distributions o = '"%s"' % self.obj['uniqID'] + ' : { ' 661*a1e26a70SApple OSS Distributions for (k, v) in self.obj_container_dict.items(): 662*a1e26a70SApple OSS Distributions if v.ShouldMerge(): 663*a1e26a70SApple OSS Distributions o += v.GetJsonRepr() + "," 664*a1e26a70SApple OSS Distributions else: 665*a1e26a70SApple OSS Distributions o += ' "%s" : ' % k + v.GetJsonRepr() + "," 666*a1e26a70SApple OSS Distributions 667*a1e26a70SApple OSS Distributions for (k, v) in self.obj_nested_objs.items(): 668*a1e26a70SApple OSS Distributions o += '"%s" : {' % k + ",".join([vi.GetJsonRepr() for vi in v.values()]) + "} ," 669*a1e26a70SApple OSS Distributions 670*a1e26a70SApple OSS Distributions o = o.rstrip(',') + "}" 671*a1e26a70SApple OSS Distributions 672*a1e26a70SApple OSS Distributions return o 673*a1e26a70SApple OSS Distributions 674*a1e26a70SApple OSS Distributions def AddObject(self, kco): 675*a1e26a70SApple OSS Distributions assert not kco.IsContainerEnd() 676*a1e26a70SApple OSS Distributions if isinstance(kco, KCContainerObject): 677*a1e26a70SApple OSS Distributions type_name = GetTypeNameForKey(kco.obj['typeID']) 678*a1e26a70SApple OSS Distributions if type_name not in self.obj_nested_objs: 679*a1e26a70SApple OSS Distributions self.obj_nested_objs[type_name] = {} 680*a1e26a70SApple OSS Distributions self.obj_nested_objs[type_name][kco.i_name] = kco 681*a1e26a70SApple OSS Distributions return 682*a1e26a70SApple OSS Distributions if kco.i_name in self.obj_container_dict: 683*a1e26a70SApple OSS Distributions if kco.IsArray() and self.obj_container_dict[kco.i_name].IsArray(): 684*a1e26a70SApple OSS Distributions self.obj_container_dict[kco.i_name].obj_collection.extend( kco.obj_collection ) 685*a1e26a70SApple OSS Distributions else: 686*a1e26a70SApple OSS Distributions self.obj_container_dict[kco.i_name] = kco 687*a1e26a70SApple OSS Distributions 688*a1e26a70SApple OSS Distributions def IsEndMarker(self, o): 689*a1e26a70SApple OSS Distributions if not o.IsContainerEnd(): 690*a1e26a70SApple OSS Distributions return False 691*a1e26a70SApple OSS Distributions if o.i_flags != self.i_flags: 692*a1e26a70SApple OSS Distributions raise Exception("container end marker doesn't match") 693*a1e26a70SApple OSS Distributions return True 694*a1e26a70SApple OSS Distributions 695*a1e26a70SApple OSS Distributions no_end_message = "could not find container end marker" 696*a1e26a70SApple OSS Distributions 697*a1e26a70SApple OSS Distributions def ReadItems(self, iterator): 698*a1e26a70SApple OSS Distributions found_end = False 699*a1e26a70SApple OSS Distributions with INDENT.indent(): 700*a1e26a70SApple OSS Distributions for i in iterator: 701*a1e26a70SApple OSS Distributions o = KCObject.FromKCItem(i) 702*a1e26a70SApple OSS Distributions if self.IsEndMarker(o): 703*a1e26a70SApple OSS Distributions found_end = True 704*a1e26a70SApple OSS Distributions break 705*a1e26a70SApple OSS Distributions if o.IsBufferEnd(): 706*a1e26a70SApple OSS Distributions break 707*a1e26a70SApple OSS Distributions if isinstance(o, KCContainerObject): 708*a1e26a70SApple OSS Distributions o.ReadItems(iterator) 709*a1e26a70SApple OSS Distributions self.AddObject(o) 710*a1e26a70SApple OSS Distributions if not found_end: 711*a1e26a70SApple OSS Distributions if G.accept_incomplete_data: 712*a1e26a70SApple OSS Distributions if not G.data_was_incomplete: 713*a1e26a70SApple OSS Distributions print("kcdata.py WARNING: data is incomplete!", file=sys.stderr) 714*a1e26a70SApple OSS Distributions G.data_was_incomplete = True 715*a1e26a70SApple OSS Distributions else: 716*a1e26a70SApple OSS Distributions raise Exception(self.no_end_message) 717*a1e26a70SApple OSS Distributions 718*a1e26a70SApple OSS Distributions 719*a1e26a70SApple OSS Distributions 720*a1e26a70SApple OSS Distributionsclass KCBufferObject(KCContainerObject): 721*a1e26a70SApple OSS Distributions 722*a1e26a70SApple OSS Distributions def IsEndMarker(self,o): 723*a1e26a70SApple OSS Distributions if o.IsContainerEnd(): 724*a1e26a70SApple OSS Distributions raise Exception("container end marker at the toplevel") 725*a1e26a70SApple OSS Distributions return o.IsBufferEnd() 726*a1e26a70SApple OSS Distributions 727*a1e26a70SApple OSS Distributions no_end_message = "could not find buffer end marker" 728*a1e26a70SApple OSS Distributions 729*a1e26a70SApple OSS Distributionsclass KCCompressedBufferObject(KCContainerObject): 730*a1e26a70SApple OSS Distributions 731*a1e26a70SApple OSS Distributions def ReadItems(self, iterator): 732*a1e26a70SApple OSS Distributions self.header = dict() 733*a1e26a70SApple OSS Distributions with INDENT.indent(): 734*a1e26a70SApple OSS Distributions for i in iterator: 735*a1e26a70SApple OSS Distributions o = KCObject.FromKCItem(i) 736*a1e26a70SApple OSS Distributions if self.IsEndMarker(o): 737*a1e26a70SApple OSS Distributions self.compressed_type = o.i_type 738*a1e26a70SApple OSS Distributions self.blob_start = o.offset + 16 739*a1e26a70SApple OSS Distributions break 740*a1e26a70SApple OSS Distributions o.ParseData() 741*a1e26a70SApple OSS Distributions self.header[o.i_name] = o.obj 742*a1e26a70SApple OSS Distributions 743*a1e26a70SApple OSS Distributions def IsEndMarker(self, o): 744*a1e26a70SApple OSS Distributions return o.i_type in KNOWN_TOPLEVEL_CONTAINER_TYPES 745*a1e26a70SApple OSS Distributions 746*a1e26a70SApple OSS Distributions def GetCompressedBlob(self, data): 747*a1e26a70SApple OSS Distributions if self.header['kcd_c_type'] != 1: 748*a1e26a70SApple OSS Distributions raise NotImplementedError 749*a1e26a70SApple OSS Distributions blob = data[self.blob_start:self.blob_start+self.header['kcd_c_totalout']] 750*a1e26a70SApple OSS Distributions if len(blob) != self.header['kcd_c_totalout']: 751*a1e26a70SApple OSS Distributions raise ValueError 752*a1e26a70SApple OSS Distributions return blob 753*a1e26a70SApple OSS Distributions 754*a1e26a70SApple OSS Distributions def Decompress(self, data): 755*a1e26a70SApple OSS Distributions start_marker = struct.pack('<IIII', self.compressed_type, 0, 0, 0) 756*a1e26a70SApple OSS Distributions end_marker = struct.pack('<IIII', GetTypeForName('KCDATA_TYPE_BUFFER_END'), 0, 0, 0) 757*a1e26a70SApple OSS Distributions decompressed = zlib.decompress(self.GetCompressedBlob(data)) 758*a1e26a70SApple OSS Distributions if len(decompressed) != self.header['kcd_c_totalin']: 759*a1e26a70SApple OSS Distributions raise ValueError("length of decompressed: %d vs expected %d" % (len(decompressed), self.header['kcd_c_totalin'])) 760*a1e26a70SApple OSS Distributions alignbytes = b'\x00' * (-len(decompressed) % 16) 761*a1e26a70SApple OSS Distributions return start_marker + decompressed + alignbytes + end_marker 762*a1e26a70SApple OSS Distributions 763*a1e26a70SApple OSS Distributions 764*a1e26a70SApple OSS Distributionsclass KCData_item: 765*a1e26a70SApple OSS Distributions """ a basic kcdata_item type object. 766*a1e26a70SApple OSS Distributions """ 767*a1e26a70SApple OSS Distributions header_size = 16 # (uint32_t + uint32_t + uint64_t) 768*a1e26a70SApple OSS Distributions 769*a1e26a70SApple OSS Distributions def __init__(self, barray, pos=0): 770*a1e26a70SApple OSS Distributions """ create an object by parsing data from bytes array 771*a1e26a70SApple OSS Distributions returns : obj - if data is readable 772*a1e26a70SApple OSS Distributions raises ValueError if something is not ok. 773*a1e26a70SApple OSS Distributions """ 774*a1e26a70SApple OSS Distributions self.i_type = struct.unpack('I', barray[pos:pos+4])[0] # int.from_bytes(barray[pos:pos+4]) 775*a1e26a70SApple OSS Distributions self.i_size = struct.unpack('I', barray[pos+4:pos+8])[0] # int.from_bytes(barray[pos+4:pos+8]) 776*a1e26a70SApple OSS Distributions self.i_flags = struct.unpack('Q', barray[pos+8:pos+16])[0] # int.from_bytes(barray[pos+8:pos+16]) 777*a1e26a70SApple OSS Distributions self.i_data = barray[pos+16: (pos + 16 + self.i_size)] 778*a1e26a70SApple OSS Distributions self.i_offset = pos 779*a1e26a70SApple OSS Distributions 780*a1e26a70SApple OSS Distributions def __len__(self): 781*a1e26a70SApple OSS Distributions return self.i_size + KCData_item.header_size 782*a1e26a70SApple OSS Distributions 783*a1e26a70SApple OSS Distributions def GetHeaderDescription(self): 784*a1e26a70SApple OSS Distributions outs = "type: 0x%x size: 0x%x flags: 0x%x (%s)" % (self.i_type, self.i_size, self.i_flags, GetTypeNameForKey(self.i_type)) 785*a1e26a70SApple OSS Distributions if self.i_offset is not None: 786*a1e26a70SApple OSS Distributions outs = "pos: 0x%x" % self.i_offset + outs 787*a1e26a70SApple OSS Distributions return outs 788*a1e26a70SApple OSS Distributions 789*a1e26a70SApple OSS Distributions def __str__(self): 790*a1e26a70SApple OSS Distributions return self.GetHeaderDescription() 791*a1e26a70SApple OSS Distributions 792*a1e26a70SApple OSS Distributionsdef kcdata_item_iterator(data): 793*a1e26a70SApple OSS Distributions file_len = len(data) 794*a1e26a70SApple OSS Distributions curpos = 0 795*a1e26a70SApple OSS Distributions while curpos < file_len: 796*a1e26a70SApple OSS Distributions item = KCData_item(data, curpos) 797*a1e26a70SApple OSS Distributions yield item 798*a1e26a70SApple OSS Distributions curpos += len(item) 799*a1e26a70SApple OSS Distributions 800*a1e26a70SApple OSS Distributionsdef _get_data_element(elementValues): 801*a1e26a70SApple OSS Distributions return json.dumps(elementValues[-1]) 802*a1e26a70SApple OSS Distributions 803*a1e26a70SApple OSS DistributionsKNOWN_TOPLEVEL_CONTAINER_TYPES = list(map(GetTypeForName, ('KCDATA_BUFFER_BEGIN_COMPRESSED', 'KCDATA_BUFFER_BEGIN_CRASHINFO', 'KCDATA_BUFFER_BEGIN_STACKSHOT', 'KCDATA_BUFFER_BEGIN_DELTA_STACKSHOT', 'KCDATA_BUFFER_BEGIN_OS_REASON','KCDATA_BUFFER_BEGIN_XNUPOST_CONFIG'))) 804*a1e26a70SApple OSS Distributions 805*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('KCDATA_TYPE_UINT32_DESC')] = KCTypeDescription(GetTypeForName('KCDATA_TYPE_UINT32_DESC'), ( 806*a1e26a70SApple OSS Distributions KCSubTypeElement('desc', KCSUBTYPE_TYPE.KC_ST_CHAR, KCSubTypeElement.GetSizeForArray(32, 1), 0, 1), 807*a1e26a70SApple OSS Distributions KCSubTypeElement('data', KCSUBTYPE_TYPE.KC_ST_UINT32, 4, 32, 0) 808*a1e26a70SApple OSS Distributions), 809*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_UINT32_DESC', 810*a1e26a70SApple OSS Distributions _get_data_element 811*a1e26a70SApple OSS Distributions) 812*a1e26a70SApple OSS Distributions 813*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('KCDATA_TYPE_UINT64_DESC')] = KCTypeDescription(GetTypeForName('KCDATA_TYPE_UINT64_DESC'), ( 814*a1e26a70SApple OSS Distributions KCSubTypeElement('desc', KCSUBTYPE_TYPE.KC_ST_CHAR, KCSubTypeElement.GetSizeForArray(32, 1), 0, 1), 815*a1e26a70SApple OSS Distributions KCSubTypeElement('data', KCSUBTYPE_TYPE.KC_ST_UINT64, 8, 32, 0) 816*a1e26a70SApple OSS Distributions), 817*a1e26a70SApple OSS Distributions 'KCDATA_TYPE_UINT64_DESC', 818*a1e26a70SApple OSS Distributions _get_data_element 819*a1e26a70SApple OSS Distributions) 820*a1e26a70SApple OSS Distributions 821*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('KCDATA_TYPE_TIMEBASE')] = KCTypeDescription(GetTypeForName('KCDATA_TYPE_TIMEBASE'), ( 822*a1e26a70SApple OSS Distributions KCSubTypeElement('numer', KCSUBTYPE_TYPE.KC_ST_UINT32, 4, 0, 0), 823*a1e26a70SApple OSS Distributions KCSubTypeElement('denom', KCSUBTYPE_TYPE.KC_ST_UINT32, 4, 4, 0) 824*a1e26a70SApple OSS Distributions), 825*a1e26a70SApple OSS Distributions 'mach_timebase_info' 826*a1e26a70SApple OSS Distributions) 827*a1e26a70SApple OSS Distributions 828*a1e26a70SApple OSS Distributions 829*a1e26a70SApple OSS DistributionsSTACKSHOT_IO_NUM_PRIORITIES = 4 830*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[0x901] = KCTypeDescription(0x901, ( 831*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ss_disk_reads_count', KCSUBTYPE_TYPE.KC_ST_UINT64, 0), 832*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ss_disk_reads_size', KCSUBTYPE_TYPE.KC_ST_UINT64, 8), 833*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ss_disk_writes_count', KCSUBTYPE_TYPE.KC_ST_UINT64, 16), 834*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ss_disk_writes_size', KCSUBTYPE_TYPE.KC_ST_UINT64, 24), 835*a1e26a70SApple OSS Distributions KCSubTypeElement('ss_io_priority_count', KCSUBTYPE_TYPE.KC_ST_UINT64, KCSubTypeElement.GetSizeForArray(STACKSHOT_IO_NUM_PRIORITIES, 8), 32, 1), 836*a1e26a70SApple OSS Distributions KCSubTypeElement('ss_io_priority_size', KCSUBTYPE_TYPE.KC_ST_UINT64, KCSubTypeElement.GetSizeForArray(STACKSHOT_IO_NUM_PRIORITIES, 8), 32 + (STACKSHOT_IO_NUM_PRIORITIES * 8), 1), 837*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ss_paging_count', KCSUBTYPE_TYPE.KC_ST_UINT64, 32 + 2 * (STACKSHOT_IO_NUM_PRIORITIES * 8)), 838*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ss_paging_size', KCSUBTYPE_TYPE.KC_ST_UINT64, 40 + 2 * (STACKSHOT_IO_NUM_PRIORITIES * 8)), 839*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ss_non_paging_count', KCSUBTYPE_TYPE.KC_ST_UINT64, 48 + 2 * (STACKSHOT_IO_NUM_PRIORITIES * 8)), 840*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ss_non_paging_size', KCSUBTYPE_TYPE.KC_ST_UINT64, 56 + 2 * (STACKSHOT_IO_NUM_PRIORITIES * 8)), 841*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ss_data_count', KCSUBTYPE_TYPE.KC_ST_UINT64, 64 + 2 * (STACKSHOT_IO_NUM_PRIORITIES * 8)), 842*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ss_data_size', KCSUBTYPE_TYPE.KC_ST_UINT64, 72 + 2 * (STACKSHOT_IO_NUM_PRIORITIES * 8)), 843*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ss_metadata_count', KCSUBTYPE_TYPE.KC_ST_UINT64, 80 + 2 * (STACKSHOT_IO_NUM_PRIORITIES * 8)), 844*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ss_metadata_size', KCSUBTYPE_TYPE.KC_ST_UINT64, 88 + 2 * (STACKSHOT_IO_NUM_PRIORITIES * 8)) 845*a1e26a70SApple OSS Distributions), 846*a1e26a70SApple OSS Distributions 'io_statistics' 847*a1e26a70SApple OSS Distributions) 848*a1e26a70SApple OSS Distributions 849*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[0x902] = KCTypeDescription(0x902, ( 850*a1e26a70SApple OSS Distributions KCSubTypeElement('snapshot_magic', KCSUBTYPE_TYPE.KC_ST_UINT32, 4, 4 * 0, 0), 851*a1e26a70SApple OSS Distributions KCSubTypeElement('free_pages', KCSUBTYPE_TYPE.KC_ST_UINT32, 4, 4 * 1, 0), 852*a1e26a70SApple OSS Distributions KCSubTypeElement('active_pages', KCSUBTYPE_TYPE.KC_ST_UINT32, 4, 4 * 2, 0), 853*a1e26a70SApple OSS Distributions KCSubTypeElement('inactive_pages', KCSUBTYPE_TYPE.KC_ST_UINT32, 4, 4 * 3, 0), 854*a1e26a70SApple OSS Distributions KCSubTypeElement('purgeable_pages', KCSUBTYPE_TYPE.KC_ST_UINT32, 4, 4 * 4, 0), 855*a1e26a70SApple OSS Distributions KCSubTypeElement('wired_pages', KCSUBTYPE_TYPE.KC_ST_UINT32, 4, 4 * 5, 0), 856*a1e26a70SApple OSS Distributions KCSubTypeElement('speculative_pages', KCSUBTYPE_TYPE.KC_ST_UINT32, 4, 4 * 6, 0), 857*a1e26a70SApple OSS Distributions KCSubTypeElement('throttled_pages', KCSUBTYPE_TYPE.KC_ST_UINT32, 4, 4 * 7, 0), 858*a1e26a70SApple OSS Distributions KCSubTypeElement('filebacked_pages', KCSUBTYPE_TYPE.KC_ST_UINT32, 4, 4 * 8, 0), 859*a1e26a70SApple OSS Distributions KCSubTypeElement('compressions', KCSUBTYPE_TYPE.KC_ST_UINT32, 4, 4 * 9, 0), 860*a1e26a70SApple OSS Distributions KCSubTypeElement('decompressions', KCSUBTYPE_TYPE.KC_ST_UINT32, 4, 4 * 10, 0), 861*a1e26a70SApple OSS Distributions KCSubTypeElement('compressor_size', KCSUBTYPE_TYPE.KC_ST_UINT32, 4, 4 * 11, 0), 862*a1e26a70SApple OSS Distributions KCSubTypeElement('busy_buffer_count', KCSUBTYPE_TYPE.KC_ST_INT32, 4, 4 * 12, 0), 863*a1e26a70SApple OSS Distributions KCSubTypeElement('pages_wanted', KCSUBTYPE_TYPE.KC_ST_UINT32, 4, 4 * 13, 0), 864*a1e26a70SApple OSS Distributions KCSubTypeElement('pages_reclaimed', KCSUBTYPE_TYPE.KC_ST_UINT32, 4, 4 * 14, 0), 865*a1e26a70SApple OSS Distributions KCSubTypeElement('pages_wanted_reclaimed_valid', KCSUBTYPE_TYPE.KC_ST_UINT8, 1, 4 * 15, 0) 866*a1e26a70SApple OSS Distributions), 867*a1e26a70SApple OSS Distributions 'mem_and_io_snapshot' 868*a1e26a70SApple OSS Distributions) 869*a1e26a70SApple OSS Distributions 870*a1e26a70SApple OSS Distributions 871*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[0x930] = KCTypeDescription(0x930, ( 872*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tts_unique_pid', KCSUBTYPE_TYPE.KC_ST_UINT64, 0), 873*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tts_ss_flags', KCSUBTYPE_TYPE.KC_ST_UINT64, 8), 874*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tts_transition_type', KCSUBTYPE_TYPE.KC_ST_UINT64, 16), 875*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tts_pid', KCSUBTYPE_TYPE.KC_ST_INT32, 24), 876*a1e26a70SApple OSS Distributions KCSubTypeElement('tts_p_comm', KCSUBTYPE_TYPE.KC_ST_CHAR, KCSubTypeElement.GetSizeForArray(32, 1), 28, 1) 877*a1e26a70SApple OSS Distributions), 878*a1e26a70SApple OSS Distributions 'transitioning_task_snapshot' 879*a1e26a70SApple OSS Distributions) 880*a1e26a70SApple OSS Distributions 881*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[0x905] = KCTypeDescription(0x905, ( 882*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ts_unique_pid', KCSUBTYPE_TYPE.KC_ST_UINT64, 0), 883*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ts_ss_flags', KCSUBTYPE_TYPE.KC_ST_UINT64, 8), 884*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ts_user_time_in_terminated_thre', KCSUBTYPE_TYPE.KC_ST_UINT64, 16), 885*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ts_system_time_in_terminated_th', KCSUBTYPE_TYPE.KC_ST_UINT64, 24), 886*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ts_p_start_sec', KCSUBTYPE_TYPE.KC_ST_UINT64, 32), 887*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ts_task_size', KCSUBTYPE_TYPE.KC_ST_UINT64, 40), 888*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ts_max_resident_size', KCSUBTYPE_TYPE.KC_ST_UINT64, 48), 889*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ts_suspend_count', KCSUBTYPE_TYPE.KC_ST_UINT32, 56), 890*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ts_faults', KCSUBTYPE_TYPE.KC_ST_UINT32, 60), 891*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ts_pageins', KCSUBTYPE_TYPE.KC_ST_UINT32, 64), 892*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ts_cow_faults', KCSUBTYPE_TYPE.KC_ST_UINT32, 68), 893*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ts_was_throttled', KCSUBTYPE_TYPE.KC_ST_UINT32, 72), 894*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ts_did_throttle', KCSUBTYPE_TYPE.KC_ST_UINT32, 76), 895*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ts_latency_qos', KCSUBTYPE_TYPE.KC_ST_UINT32, 80), 896*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ts_pid', KCSUBTYPE_TYPE.KC_ST_INT32, 84), 897*a1e26a70SApple OSS Distributions KCSubTypeElement('ts_p_comm', KCSUBTYPE_TYPE.KC_ST_CHAR, KCSubTypeElement.GetSizeForArray(32, 1), 88, 1) 898*a1e26a70SApple OSS Distributions), 899*a1e26a70SApple OSS Distributions 'task_snapshot' 900*a1e26a70SApple OSS Distributions) 901*a1e26a70SApple OSS Distributions 902*a1e26a70SApple OSS Distributions 903*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[0x946] = KCTypeDescription(0x946, ( 904*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('csflags', KCSUBTYPE_TYPE.KC_ST_UINT64, 0), 905*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('cs_trust_level', KCSUBTYPE_TYPE.KC_ST_UINT32, 8), 906*a1e26a70SApple OSS Distributions ), 907*a1e26a70SApple OSS Distributions 'stackshot_task_codesigning_info' 908*a1e26a70SApple OSS Distributions) 909*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[0x906] = KCTypeDescription(0x906, ( 910*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ths_thread_id', KCSUBTYPE_TYPE.KC_ST_UINT64, 0), 911*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ths_wait_event', KCSUBTYPE_TYPE.KC_ST_UINT64, 8), 912*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ths_continuation', KCSUBTYPE_TYPE.KC_ST_UINT64, 16), 913*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ths_total_syscalls', KCSUBTYPE_TYPE.KC_ST_UINT64, 24), 914*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ths_voucher_identifier', KCSUBTYPE_TYPE.KC_ST_UINT64, 32), 915*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ths_dqserialnum', KCSUBTYPE_TYPE.KC_ST_UINT64, 40), 916*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ths_user_time', KCSUBTYPE_TYPE.KC_ST_UINT64, 48), 917*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ths_sys_time', KCSUBTYPE_TYPE.KC_ST_UINT64, 56), 918*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ths_ss_flags', KCSUBTYPE_TYPE.KC_ST_UINT64, 64), 919*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ths_last_run_time', KCSUBTYPE_TYPE.KC_ST_UINT64, 72), 920*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ths_last_made_runnable_time', KCSUBTYPE_TYPE.KC_ST_UINT64, 80), 921*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ths_state', KCSUBTYPE_TYPE.KC_ST_UINT32, 88), 922*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ths_sched_flags', KCSUBTYPE_TYPE.KC_ST_UINT32, 92), 923*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ths_base_priority', KCSUBTYPE_TYPE.KC_ST_INT16, 96), 924*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ths_sched_priority', KCSUBTYPE_TYPE.KC_ST_INT16, 98), 925*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ths_eqos', KCSUBTYPE_TYPE.KC_ST_UINT8, 100), 926*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ths_rqos', KCSUBTYPE_TYPE.KC_ST_UINT8, 101), 927*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ths_rqos_override', KCSUBTYPE_TYPE.KC_ST_UINT8, 102), 928*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ths_io_tier', KCSUBTYPE_TYPE.KC_ST_UINT8, 103), 929*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ths_thread_t', KCSUBTYPE_TYPE.KC_ST_UINT64, 104), 930*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ths_requested_policy', KCSUBTYPE_TYPE.KC_ST_UINT64, 112), 931*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ths_effective_policy', KCSUBTYPE_TYPE.KC_ST_UINT64, 120), 932*a1e26a70SApple OSS Distributions), 933*a1e26a70SApple OSS Distributions 'thread_snapshot', 934*a1e26a70SApple OSS Distributions legacy_size = 0x68 935*a1e26a70SApple OSS Distributions) 936*a1e26a70SApple OSS Distributions 937*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_THREAD_DISPATCH_QUEUE_LABEL')] = KCSubTypeElement('dispatch_queue_label', KCSUBTYPE_TYPE.KC_ST_CHAR, 938*a1e26a70SApple OSS Distributions KCSubTypeElement.GetSizeForArray(64, 1), 0, 1) 939*a1e26a70SApple OSS Distributions 940*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_THREAD_DELTA_SNAPSHOT')] = KCTypeDescription(GetTypeForName('STACKSHOT_KCTYPE_THREAD_DELTA_SNAPSHOT'), ( 941*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tds_thread_id', KCSUBTYPE_TYPE.KC_ST_UINT64, 0), 942*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tds_voucher_identifier', KCSUBTYPE_TYPE.KC_ST_UINT64, 8), 943*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tds_ss_flags', KCSUBTYPE_TYPE.KC_ST_UINT64, 16), 944*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tds_last_made_runnable_time', KCSUBTYPE_TYPE.KC_ST_UINT64, 24), 945*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tds_state', KCSUBTYPE_TYPE.KC_ST_UINT32, 32), 946*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tds_sched_flags', KCSUBTYPE_TYPE.KC_ST_UINT32, 36), 947*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tds_base_priority', KCSUBTYPE_TYPE.KC_ST_INT16, 40), 948*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tds_sched_priority', KCSUBTYPE_TYPE.KC_ST_INT16, 42), 949*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tds_eqos', KCSUBTYPE_TYPE.KC_ST_UINT8, 44), 950*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tds_rqos', KCSUBTYPE_TYPE.KC_ST_UINT8, 45), 951*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tds_rqos_override', KCSUBTYPE_TYPE.KC_ST_UINT8, 46), 952*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tds_io_tier', KCSUBTYPE_TYPE.KC_ST_UINT8, 47), 953*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tds_requested_policy', KCSUBTYPE_TYPE.KC_ST_UINT64, 48), 954*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tds_effective_policy', KCSUBTYPE_TYPE.KC_ST_UINT64, 56), 955*a1e26a70SApple OSS Distributions), 956*a1e26a70SApple OSS Distributions 'thread_delta_snapshot', 957*a1e26a70SApple OSS Distributions legacy_size = 48 958*a1e26a70SApple OSS Distributions) 959*a1e26a70SApple OSS Distributions 960*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_TASK_DELTA_SNAPSHOT')] = KCTypeDescription(GetTypeForName('STACKSHOT_KCTYPE_TASK_DELTA_SNAPSHOT'), ( 961*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tds_unique_pid', KCSUBTYPE_TYPE.KC_ST_UINT64, 0), 962*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tds_ss_flags', KCSUBTYPE_TYPE.KC_ST_UINT64, 8), 963*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tds_user_time_in_terminated_thr', KCSUBTYPE_TYPE.KC_ST_UINT64, 16), 964*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tds_system_time_in_terminated_t', KCSUBTYPE_TYPE.KC_ST_UINT64, 24), 965*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tds_task_size', KCSUBTYPE_TYPE.KC_ST_UINT64, 32), 966*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tds_max_resident_size', KCSUBTYPE_TYPE.KC_ST_UINT64, 40), 967*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tds_suspend_count', KCSUBTYPE_TYPE.KC_ST_UINT32, 48), 968*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tds_faults', KCSUBTYPE_TYPE.KC_ST_UINT32, 52), 969*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tds_pageins', KCSUBTYPE_TYPE.KC_ST_UINT32, 56), 970*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tds_cow_faults', KCSUBTYPE_TYPE.KC_ST_UINT32, 60), 971*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tds_was_throttled', KCSUBTYPE_TYPE.KC_ST_UINT32, 64), 972*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tds_did_throttle', KCSUBTYPE_TYPE.KC_ST_UINT32, 68), 973*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tds_latency_qos', KCSUBTYPE_TYPE.KC_ST_UINT32, 72), 974*a1e26a70SApple OSS Distributions), 975*a1e26a70SApple OSS Distributions 'task_delta_snapshot' 976*a1e26a70SApple OSS Distributions) 977*a1e26a70SApple OSS Distributions 978*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_TASK_EXEC_META')] = KCTypeDescription(GetTypeForName('STACKSHOT_KCTYPE_TASK_EXEC_META'), ( 979*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tem_flags', KCSUBTYPE_TYPE.KC_ST_UINT64, 0), 980*a1e26a70SApple OSS Distributions), 981*a1e26a70SApple OSS Distributions 'task_exec_meta' 982*a1e26a70SApple OSS Distributions) 983*a1e26a70SApple OSS Distributions 984*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_THREAD_NAME')] = KCSubTypeElement('pth_name', KCSUBTYPE_TYPE.KC_ST_CHAR, KCSubTypeElement.GetSizeForArray(64, 1), 0, 1) 985*a1e26a70SApple OSS Distributions 986*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_SYS_SHAREDCACHE_LAYOUT')] = KCTypeDescription(GetTypeForName('STACKSHOT_KCTYPE_SYS_SHAREDCACHE_LAYOUT'), ( 987*a1e26a70SApple OSS Distributions KCSubTypeElement('imageLoadAddress', KCSUBTYPE_TYPE.KC_ST_UINT64, 8, 0, 0), 988*a1e26a70SApple OSS Distributions KCSubTypeElement('imageUUID', KCSUBTYPE_TYPE.KC_ST_UINT8, KCSubTypeElement.GetSizeForArray(16, 1), 8, 1) 989*a1e26a70SApple OSS Distributions), 990*a1e26a70SApple OSS Distributions 'system_shared_cache_layout' 991*a1e26a70SApple OSS Distributions) 992*a1e26a70SApple OSS Distributions 993*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('KCDATA_TYPE_LIBRARY_LOADINFO64')] = KCTypeDescription(GetTypeForName('KCDATA_TYPE_LIBRARY_LOADINFO64'), ( 994*a1e26a70SApple OSS Distributions KCSubTypeElement('imageLoadAddress', KCSUBTYPE_TYPE.KC_ST_UINT64, 8, 0, 0), 995*a1e26a70SApple OSS Distributions KCSubTypeElement('imageUUID', KCSUBTYPE_TYPE.KC_ST_UINT8, KCSubTypeElement.GetSizeForArray(16, 1), 8, 1) 996*a1e26a70SApple OSS Distributions), 997*a1e26a70SApple OSS Distributions 'dyld_load_info', 998*a1e26a70SApple OSS Distributions legacy_size = 24 999*a1e26a70SApple OSS Distributions) 1000*a1e26a70SApple OSS Distributions 1001*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('KCDATA_TYPE_LIBRARY_LOADINFO')] = KCTypeDescription(GetTypeForName('KCDATA_TYPE_LIBRARY_LOADINFO'), ( 1002*a1e26a70SApple OSS Distributions KCSubTypeElement('imageLoadAddress', KCSUBTYPE_TYPE.KC_ST_UINT32, 4, 0, 0), 1003*a1e26a70SApple OSS Distributions KCSubTypeElement('imageUUID', KCSUBTYPE_TYPE.KC_ST_UINT8, KCSubTypeElement.GetSizeForArray(16, 1), 4, 1) 1004*a1e26a70SApple OSS Distributions), 1005*a1e26a70SApple OSS Distributions 'dyld_load_info', 1006*a1e26a70SApple OSS Distributions legacy_size = 20 1007*a1e26a70SApple OSS Distributions) 1008*a1e26a70SApple OSS Distributions 1009*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_LOADINFO64_TEXT_EXEC')] = KCTypeDescription(GetTypeForName('STACKSHOT_KCTYPE_LOADINFO64_TEXT_EXEC'), ( 1010*a1e26a70SApple OSS Distributions KCSubTypeElement('imageLoadAddress', KCSUBTYPE_TYPE.KC_ST_UINT64, 8, 0, 0), 1011*a1e26a70SApple OSS Distributions KCSubTypeElement('imageUUID', KCSUBTYPE_TYPE.KC_ST_UINT8, KCSubTypeElement.GetSizeForArray(16, 1), 8, 1), 1012*a1e26a70SApple OSS Distributions), 1013*a1e26a70SApple OSS Distributions 'dyld_load_info_text_exec' 1014*a1e26a70SApple OSS Distributions) 1015*a1e26a70SApple OSS Distributions 1016*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_AOTCACHE_LOADINFO')] = KCTypeDescription(GetTypeForName('STACKSHOT_KCTYPE_AOTCACHE_LOADINFO'), ( 1017*a1e26a70SApple OSS Distributions KCSubTypeElement('x86SlidBaseAddress', KCSUBTYPE_TYPE.KC_ST_UINT64, 8, 0, 0), 1018*a1e26a70SApple OSS Distributions KCSubTypeElement('x86UUID', KCSUBTYPE_TYPE.KC_ST_UINT8, KCSubTypeElement.GetSizeForArray(16, 1), 8, 1), 1019*a1e26a70SApple OSS Distributions KCSubTypeElement('aotSlidBaseAddress', KCSUBTYPE_TYPE.KC_ST_UINT64, 8, 24, 0), 1020*a1e26a70SApple OSS Distributions KCSubTypeElement('aotUUID', KCSUBTYPE_TYPE.KC_ST_UINT8, KCSubTypeElement.GetSizeForArray(16, 1), 32, 1), 1021*a1e26a70SApple OSS Distributions), 1022*a1e26a70SApple OSS Distributions 'dyld_aot_cache_uuid_info' 1023*a1e26a70SApple OSS Distributions) 1024*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_SHAREDCACHE_AOTINFO')] = KNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_AOTCACHE_LOADINFO')] 1025*a1e26a70SApple OSS Distributions 1026*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_SHAREDCACHE_LOADINFO')] = KCTypeDescription(GetTypeForName('STACKSHOT_KCTYPE_SHAREDCACHE_LOADINFO'), ( 1027*a1e26a70SApple OSS Distributions KCSubTypeElement('imageLoadAddress', KCSUBTYPE_TYPE.KC_ST_UINT64, 8, 0, 0), 1028*a1e26a70SApple OSS Distributions KCSubTypeElement('imageUUID', KCSUBTYPE_TYPE.KC_ST_UINT8, KCSubTypeElement.GetSizeForArray(16, 1), 8, 1), 1029*a1e26a70SApple OSS Distributions KCSubTypeElement('imageSlidBaseAddress', KCSUBTYPE_TYPE.KC_ST_UINT64, 8, 24, 0), 1030*a1e26a70SApple OSS Distributions KCSubTypeElement('sharedCacheSlidFirstMapping', KCSUBTYPE_TYPE.KC_ST_UINT64, 8, 32, 0), 1031*a1e26a70SApple OSS Distributions), 1032*a1e26a70SApple OSS Distributions 'shared_cache_dyld_load_info', 1033*a1e26a70SApple OSS Distributions legacy_size = 0x18 1034*a1e26a70SApple OSS Distributions) 1035*a1e26a70SApple OSS Distributions 1036*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_SHAREDCACHE_INFO')] = KCTypeDescription(GetTypeForName('STACKSHOT_KCTYPE_SHAREDCACHE_INFO'), ( 1037*a1e26a70SApple OSS Distributions KCSubTypeElement('sharedCacheSlide', KCSUBTYPE_TYPE.KC_ST_UINT64, 8, 0, 0), 1038*a1e26a70SApple OSS Distributions KCSubTypeElement('sharedCacheUUID', KCSUBTYPE_TYPE.KC_ST_UINT8, KCSubTypeElement.GetSizeForArray(16, 1), 8, 1), 1039*a1e26a70SApple OSS Distributions KCSubTypeElement('sharedCacheUnreliableSlidBaseAd', KCSUBTYPE_TYPE.KC_ST_UINT64, 8, 24, 0), 1040*a1e26a70SApple OSS Distributions KCSubTypeElement('sharedCacheSlidFirstMapping', KCSUBTYPE_TYPE.KC_ST_UINT64, 8, 32, 0), 1041*a1e26a70SApple OSS Distributions KCSubTypeElement('sharedCacheID', KCSUBTYPE_TYPE.KC_ST_UINT32, 4, 40, 0), 1042*a1e26a70SApple OSS Distributions KCSubTypeElement('sharedCacheFlags', KCSUBTYPE_TYPE.KC_ST_UINT32, 4, 44, 0), 1043*a1e26a70SApple OSS Distributions), 1044*a1e26a70SApple OSS Distributions 'shared_cache_dyld_load_info', 1045*a1e26a70SApple OSS Distributions) 1046*a1e26a70SApple OSS Distributions 1047*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_KERNELCACHE_LOADINFO')] = KCTypeDescription(GetTypeForName('STACKSHOT_KCTYPE_KERNELCACHE_LOADINFO'), ( 1048*a1e26a70SApple OSS Distributions KCSubTypeElement('imageLoadAddress', KCSUBTYPE_TYPE.KC_ST_UINT64, 8, 0, 0), 1049*a1e26a70SApple OSS Distributions KCSubTypeElement('imageUUID', KCSUBTYPE_TYPE.KC_ST_UINT8, KCSubTypeElement.GetSizeForArray(16, 1), 8, 1), 1050*a1e26a70SApple OSS Distributions), 1051*a1e26a70SApple OSS Distributions 'kernelcache_load_info' 1052*a1e26a70SApple OSS Distributions) 1053*a1e26a70SApple OSS Distributions 1054*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_SHAREDCACHE_ID')] = KCSubTypeElement('sharedCacheID', KCSUBTYPE_TYPE.KC_ST_UINT32, 4, 0, 0, KCSubTypeElement._get_naked_element_value) 1055*a1e26a70SApple OSS Distributions 1056*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[0x33] = KCSubTypeElement('mach_absolute_time', KCSUBTYPE_TYPE.KC_ST_UINT64, 8, 0, 0, KCSubTypeElement._get_naked_element_value) 1057*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[0x907] = KCSubTypeElement.FromBasicCtype('donating_pids', KCSUBTYPE_TYPE.KC_ST_INT32, legacy_size=4) 1058*a1e26a70SApple OSS Distributions 1059*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('KCDATA_TYPE_USECS_SINCE_EPOCH')] = KCSubTypeElement('usecs_since_epoch', KCSUBTYPE_TYPE.KC_ST_UINT64, 8, 0, 0, KCSubTypeElement._get_naked_element_value) 1060*a1e26a70SApple OSS Distributions 1061*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_KERN_STACKFRAME')] = KCTypeDescription(GetTypeForName('STACKSHOT_KCTYPE_KERN_STACKFRAME'), ( 1062*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('lr', KCSUBTYPE_TYPE.KC_ST_UINT32), 1063*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('sp', KCSUBTYPE_TYPE.KC_ST_UINT32, 4) 1064*a1e26a70SApple OSS Distributions), 1065*a1e26a70SApple OSS Distributions 'kernel_stack_frames', 1066*a1e26a70SApple OSS Distributions legacy_size = 8 1067*a1e26a70SApple OSS Distributions) 1068*a1e26a70SApple OSS Distributions 1069*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_KERN_STACKLR')] = KCTypeDescription(GetTypeForName('STACKSHOT_KCTYPE_KERN_STACKLR'), ( 1070*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('lr', KCSUBTYPE_TYPE.KC_ST_UINT32), 1071*a1e26a70SApple OSS Distributions), 1072*a1e26a70SApple OSS Distributions 'kernel_stack_frames' 1073*a1e26a70SApple OSS Distributions) 1074*a1e26a70SApple OSS Distributions 1075*a1e26a70SApple OSS Distributions 1076*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_USER_STACKFRAME')] = KCTypeDescription.FromKCTypeDescription( 1077*a1e26a70SApple OSS Distributions KNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_KERN_STACKFRAME')], 1078*a1e26a70SApple OSS Distributions GetTypeForName('STACKSHOT_KCTYPE_USER_STACKFRAME'), 1079*a1e26a70SApple OSS Distributions 'user_stack_frames' 1080*a1e26a70SApple OSS Distributions) 1081*a1e26a70SApple OSS Distributions 1082*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_USER_STACKLR')] = KCTypeDescription.FromKCTypeDescription( 1083*a1e26a70SApple OSS Distributions KNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_KERN_STACKLR')], 1084*a1e26a70SApple OSS Distributions GetTypeForName('STACKSHOT_KCTYPE_USER_STACKLR'), 1085*a1e26a70SApple OSS Distributions 'user_stack_frames' 1086*a1e26a70SApple OSS Distributions) 1087*a1e26a70SApple OSS Distributions 1088*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_KERN_STACKFRAME64')] = KCTypeDescription(GetTypeForName('STACKSHOT_KCTYPE_KERN_STACKFRAME64'), ( 1089*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('lr', KCSUBTYPE_TYPE.KC_ST_UINT64), 1090*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('sp', KCSUBTYPE_TYPE.KC_ST_UINT64, 8) 1091*a1e26a70SApple OSS Distributions), 1092*a1e26a70SApple OSS Distributions 'kernel_stack_frames', 1093*a1e26a70SApple OSS Distributions legacy_size = 16 1094*a1e26a70SApple OSS Distributions) 1095*a1e26a70SApple OSS Distributions 1096*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_USER_STACKFRAME64')] = KCTypeDescription.FromKCTypeDescription( 1097*a1e26a70SApple OSS Distributions KNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_KERN_STACKFRAME64')], 1098*a1e26a70SApple OSS Distributions GetTypeForName('STACKSHOT_KCTYPE_USER_STACKFRAME64'), 1099*a1e26a70SApple OSS Distributions 'user_stack_frames' 1100*a1e26a70SApple OSS Distributions) 1101*a1e26a70SApple OSS Distributions 1102*a1e26a70SApple OSS Distributions 1103*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_KERN_STACKLR64')] = KCTypeDescription(GetTypeForName('STACKSHOT_KCTYPE_KERN_STACKLR64'), ( 1104*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('lr', KCSUBTYPE_TYPE.KC_ST_UINT64), 1105*a1e26a70SApple OSS Distributions), 1106*a1e26a70SApple OSS Distributions 'kernel_stack_frames' 1107*a1e26a70SApple OSS Distributions) 1108*a1e26a70SApple OSS Distributions 1109*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_USER_STACKLR64')] = KCTypeDescription.FromKCTypeDescription( 1110*a1e26a70SApple OSS Distributions KNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_KERN_STACKLR64')], 1111*a1e26a70SApple OSS Distributions GetTypeForName('STACKSHOT_KCTYPE_USER_STACKLR64'), 1112*a1e26a70SApple OSS Distributions 'user_stack_frames' 1113*a1e26a70SApple OSS Distributions) 1114*a1e26a70SApple OSS Distributions 1115*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_USER_ASYNC_START_INDEX')] = KCSubTypeElement.FromBasicCtype('user_async_start_index', KCSUBTYPE_TYPE.KC_ST_UINT32) 1116*a1e26a70SApple OSS Distributions 1117*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_USER_ASYNC_STACKLR64')] = KCTypeDescription.FromKCTypeDescription( 1118*a1e26a70SApple OSS Distributions KNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_KERN_STACKLR64')], 1119*a1e26a70SApple OSS Distributions GetTypeForName('STACKSHOT_KCTYPE_USER_ASYNC_STACKLR64'), 1120*a1e26a70SApple OSS Distributions 'user_async_stack_frames' 1121*a1e26a70SApple OSS Distributions) 1122*a1e26a70SApple OSS Distributions 1123*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_NONRUNNABLE_TIDS')] = KCSubTypeElement.FromBasicCtype('nonrunnable_threads', KCSUBTYPE_TYPE.KC_ST_INT64) 1124*a1e26a70SApple OSS Distributions 1125*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_NONRUNNABLE_TASKS')] = KCSubTypeElement.FromBasicCtype('nonrunnable_tasks', KCSUBTYPE_TYPE.KC_ST_INT64) 1126*a1e26a70SApple OSS Distributions 1127*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_OSVERSION')] = KCSubTypeElement('osversion', KCSUBTYPE_TYPE.KC_ST_CHAR, 1128*a1e26a70SApple OSS Distributions KCSubTypeElement.GetSizeForArray(256, 1), 0, 1) 1129*a1e26a70SApple OSS Distributions 1130*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_BOOTARGS')] = KCSubTypeElement('boot_args', KCSUBTYPE_TYPE.KC_ST_CHAR, 1131*a1e26a70SApple OSS Distributions KCSubTypeElement.GetSizeForArray(256, 1), 0, 1) 1132*a1e26a70SApple OSS Distributions 1133*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_KERN_PAGE_SIZE')] = KCSubTypeElement('kernel_page_size', KCSUBTYPE_TYPE.KC_ST_UINT32, 4, 0, 0, KCSubTypeElement._get_naked_element_value) 1134*a1e26a70SApple OSS Distributions 1135*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_THREAD_POLICY_VERSION')] = KCSubTypeElement('thread_policy_version', KCSUBTYPE_TYPE.KC_ST_UINT32, 4, 0, 0, KCSubTypeElement._get_naked_element_value) 1136*a1e26a70SApple OSS Distributions 1137*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_JETSAM_LEVEL')] = KCSubTypeElement('jetsam_level', KCSUBTYPE_TYPE.KC_ST_UINT32, 4, 0, 0, KCSubTypeElement._get_naked_element_value) 1138*a1e26a70SApple OSS Distributions 1139*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_DELTA_SINCE_TIMESTAMP')] = KCSubTypeElement("stackshot_delta_since_timestamp", KCSUBTYPE_TYPE.KC_ST_UINT64, 8, 0, 0, KCSubTypeElement._get_naked_element_value) 1140*a1e26a70SApple OSS Distributions 1141*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_STACKSHOT_FAULT_STATS')] = KCTypeDescription(GetTypeForName('STACKSHOT_KCTYPE_STACKSHOT_FAULT_STATS'), 1142*a1e26a70SApple OSS Distributions ( 1143*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('sfs_pages_faulted_in', KCSUBTYPE_TYPE.KC_ST_UINT32, 0), 1144*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('sfs_time_spent_faulting', KCSUBTYPE_TYPE.KC_ST_UINT64, 4), 1145*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('sfs_system_max_fault_time', KCSUBTYPE_TYPE.KC_ST_UINT64, 12), 1146*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('sfs_stopped_faulting', KCSUBTYPE_TYPE.KC_ST_UINT8, 20) 1147*a1e26a70SApple OSS Distributions ), 1148*a1e26a70SApple OSS Distributions 'stackshot_fault_stats') 1149*a1e26a70SApple OSS Distributions 1150*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_THREAD_WAITINFO')] = KCTypeDescription(GetTypeForName('STACKSHOT_KCTYPE_THREAD_WAITINFO'), 1151*a1e26a70SApple OSS Distributions ( 1152*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('owner', KCSUBTYPE_TYPE.KC_ST_UINT64, 0), 1153*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('waiter', KCSUBTYPE_TYPE.KC_ST_UINT64, 8), 1154*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('context', KCSUBTYPE_TYPE.KC_ST_UINT64, 16), 1155*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('wait_type', KCSUBTYPE_TYPE.KC_ST_UINT8, 24), 1156*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('portlabel_id', KCSUBTYPE_TYPE.KC_ST_INT16, 25), 1157*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('wait_flags', KCSUBTYPE_TYPE.KC_ST_INT32, 27) 1158*a1e26a70SApple OSS Distributions ), 1159*a1e26a70SApple OSS Distributions 'thread_waitinfo') 1160*a1e26a70SApple OSS Distributions 1161*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_THREAD_TURNSTILEINFO')] = KCTypeDescription(GetTypeForName('STACKSHOT_KCTYPE_THREAD_TURNSTILEINFO'), 1162*a1e26a70SApple OSS Distributions ( 1163*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('waiter', KCSUBTYPE_TYPE.KC_ST_UINT64, 0), 1164*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('turnstile_context', KCSUBTYPE_TYPE.KC_ST_UINT64, 8), 1165*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('turnstile_priority', KCSUBTYPE_TYPE.KC_ST_UINT8, 16), 1166*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('number_of_hops', KCSUBTYPE_TYPE.KC_ST_UINT8, 17), 1167*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('turnstile_flags', KCSUBTYPE_TYPE.KC_ST_UINT64, 18), 1168*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('portlabel_id', KCSUBTYPE_TYPE.KC_ST_INT16, 26), 1169*a1e26a70SApple OSS Distributions ), 1170*a1e26a70SApple OSS Distributions 'thread_turnstileinfo') 1171*a1e26a70SApple OSS Distributions 1172*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_PORTLABEL')] = KCTypeDescription(GetTypeForName('STACKSHOT_KCTYPE_PORTLABEL'), 1173*a1e26a70SApple OSS Distributions ( 1174*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('portlabel_id', KCSUBTYPE_TYPE.KC_ST_INT16, 0), 1175*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('portlabel_flags', KCSUBTYPE_TYPE.KC_ST_UINT16, 2), 1176*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('portlabel_domain', KCSUBTYPE_TYPE.KC_ST_UINT8, 4), 1177*a1e26a70SApple OSS Distributions ), 1178*a1e26a70SApple OSS Distributions 'portlabel_info', merge=True) 1179*a1e26a70SApple OSS Distributions 1180*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_PORTLABEL_NAME')] = ( 1181*a1e26a70SApple OSS Distributions KCSubTypeElement("portlabel_name", KCSUBTYPE_TYPE.KC_ST_CHAR, KCSubTypeElement.GetSizeForArray(-1, 1), 0, 1)) 1182*a1e26a70SApple OSS Distributions 1183*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_THREAD_GROUP_SNAPSHOT')] = KCTypeDescription(GetTypeForName('STACKSHOT_KCTYPE_THREAD_GROUP'), 1184*a1e26a70SApple OSS Distributions ( 1185*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tgs_id', KCSUBTYPE_TYPE.KC_ST_UINT64, 0), 1186*a1e26a70SApple OSS Distributions KCSubTypeElement('tgs_name', KCSUBTYPE_TYPE.KC_ST_CHAR, KCSubTypeElement.GetSizeForArray(16, 1), 1187*a1e26a70SApple OSS Distributions 8, 1), 1188*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tgs_flags', KCSUBTYPE_TYPE.KC_ST_UINT64, 24), 1189*a1e26a70SApple OSS Distributions ), 1190*a1e26a70SApple OSS Distributions 'thread_group_snapshot') 1191*a1e26a70SApple OSS Distributions 1192*a1e26a70SApple OSS Distributions 1193*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_THREAD_GROUP')] = KCSubTypeElement('thread_group', KCSUBTYPE_TYPE.KC_ST_UINT64, 8, 0, 0, KCSubTypeElement._get_naked_element_value) 1194*a1e26a70SApple OSS Distributions 1195*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_JETSAM_COALITION_SNAPSHOT')] = KCTypeDescription(GetTypeForName('STACKSHOT_KCTYPE_JETSAM_COALITION_SNAPSHOT'), 1196*a1e26a70SApple OSS Distributions ( 1197*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('jcs_id', KCSUBTYPE_TYPE.KC_ST_UINT64, 0), 1198*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('jcs_flags', KCSUBTYPE_TYPE.KC_ST_UINT64, 8), 1199*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('jcs_thread_group', KCSUBTYPE_TYPE.KC_ST_UINT64, 16), 1200*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('jcs_leader_task_uniqueid', KCSUBTYPE_TYPE.KC_ST_UINT64, 24) 1201*a1e26a70SApple OSS Distributions ), 1202*a1e26a70SApple OSS Distributions 'jetsam_coalition_snapshot') 1203*a1e26a70SApple OSS Distributions 1204*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_JETSAM_COALITION')] = KCSubTypeElement('jetsam_coalition', KCSUBTYPE_TYPE.KC_ST_UINT64, 8, 0, 0, KCSubTypeElement._get_naked_element_value) 1205*a1e26a70SApple OSS Distributions 1206*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_INSTRS_CYCLES')] = KCTypeDescription(GetTypeForName('STACKSHOT_KCTYPE_INSTRS_CYCLES'), 1207*a1e26a70SApple OSS Distributions ( 1208*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ics_instructions', KCSUBTYPE_TYPE.KC_ST_UINT64, 0), 1209*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ics_cycles', KCSUBTYPE_TYPE.KC_ST_UINT64, 8), 1210*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ics_p_instructions', KCSUBTYPE_TYPE.KC_ST_UINT64, 16), 1211*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ics_p_cycles', KCSUBTYPE_TYPE.KC_ST_UINT64, 24), 1212*a1e26a70SApple OSS Distributions ), 1213*a1e26a70SApple OSS Distributions 'instrs_cycles_snapshot') 1214*a1e26a70SApple OSS Distributions 1215*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_TASK_CPU_ARCHITECTURE')] = KCTypeDescription(GetTypeForName('STACKSHOT_KCTYPE_TASK_CPU_ARCHITECTURE'), 1216*a1e26a70SApple OSS Distributions ( 1217*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('cputype', KCSUBTYPE_TYPE.KC_ST_INT32, 0), 1218*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('cpusubtype', KCSUBTYPE_TYPE.KC_ST_INT32, 4) 1219*a1e26a70SApple OSS Distributions ), 1220*a1e26a70SApple OSS Distributions 'task_cpu_architecture') 1221*a1e26a70SApple OSS Distributions 1222*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_LATENCY_INFO')] = KCTypeDescription(GetTypeForName('STACKSHOT_KCTYPE_LATENCY_INFO'), 1223*a1e26a70SApple OSS Distributions ( 1224*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('latency_version', KCSUBTYPE_TYPE.KC_ST_UINT64, 0), 1225*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('setup_latency', KCSUBTYPE_TYPE.KC_ST_UINT64, 8), 1226*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('total_task_iteration_latency', KCSUBTYPE_TYPE.KC_ST_UINT64, 16), 1227*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('total_terminated_task_iteration', KCSUBTYPE_TYPE.KC_ST_UINT64, 24), 1228*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('task_queue_building_latency_mt', KCSUBTYPE_TYPE.KC_ST_UINT64, 32), 1229*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('terminated_task_queue_building_latency_mt', KCSUBTYPE_TYPE.KC_ST_UINT64, 40), 1230*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('cpu_wait_latency_mt', KCSUBTYPE_TYPE.KC_ST_INT32, 48), 1231*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('calling_cpu_number', KCSUBTYPE_TYPE.KC_ST_INT32, 56), 1232*a1e26a70SApple OSS Distributions ), 1233*a1e26a70SApple OSS Distributions 'stackshot_latency_collection') 1234*a1e26a70SApple OSS Distributions 1235*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_LATENCY_INFO_CPU')] = KCTypeDescription(GetTypeForName('STACKSHOT_LATENCY_INFO_CPU'), 1236*a1e26a70SApple OSS Distributions ( 1237*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('cpu_number', KCSUBTYPE_TYPE.KC_ST_INT32, 0), 1238*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('cluster_type', KCSUBTYPE_TYPE.KC_ST_INT32, 4), 1239*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('init_latency_mt', KCSUBTYPE_TYPE.KC_ST_UINT64, 8), 1240*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('workqueue_latency_mt', KCSUBTYPE_TYPE.KC_ST_UINT64, 16), 1241*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('total_latency_mt', KCSUBTYPE_TYPE.KC_ST_UINT64, 24), 1242*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('total_cycles', KCSUBTYPE_TYPE.KC_ST_UINT64, 32), 1243*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('total_instrs', KCSUBTYPE_TYPE.KC_ST_UINT64, 40), 1244*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tasks_processed', KCSUBTYPE_TYPE.KC_ST_UINT64, 48), 1245*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('threads_processed', KCSUBTYPE_TYPE.KC_ST_UINT64, 56), 1246*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('faulting_time_mt', KCSUBTYPE_TYPE.KC_ST_UINT64, 64), 1247*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('total_buf', KCSUBTYPE_TYPE.KC_ST_UINT64, 72), 1248*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('intercluster_buf_used', KCSUBTYPE_TYPE.KC_ST_UINT64, 80), 1249*a1e26a70SApple OSS Distributions ), 1250*a1e26a70SApple OSS Distributions 'stackshot_latency_cpu') 1251*a1e26a70SApple OSS Distributions 1252*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_LATENCY_INFO_TASK')] = KCTypeDescription(GetTypeForName('STACKSHOT_KCTYPE_LATENCY_INFO_TASK'), 1253*a1e26a70SApple OSS Distributions ( 1254*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('task_uniqueid', KCSUBTYPE_TYPE.KC_ST_UINT64, 0), 1255*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('setup_latency', KCSUBTYPE_TYPE.KC_ST_UINT64, 8), 1256*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('task_thread_count_loop_latency', KCSUBTYPE_TYPE.KC_ST_UINT64, 16), 1257*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('task_thread_data_loop_latency', KCSUBTYPE_TYPE.KC_ST_UINT64, 24), 1258*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('cur_tsnap_latency', KCSUBTYPE_TYPE.KC_ST_UINT64, 32), 1259*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('pmap_latency', KCSUBTYPE_TYPE.KC_ST_UINT64, 40), 1260*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('bsd_proc_ids_latency', KCSUBTYPE_TYPE.KC_ST_UINT64, 48), 1261*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('misc_latency', KCSUBTYPE_TYPE.KC_ST_UINT64, 56), 1262*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('misc2_latency', KCSUBTYPE_TYPE.KC_ST_UINT64, 64), 1263*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('end_latency', KCSUBTYPE_TYPE.KC_ST_UINT64, 72) 1264*a1e26a70SApple OSS Distributions ), 1265*a1e26a70SApple OSS Distributions 'stackshot_latency_task') 1266*a1e26a70SApple OSS Distributions 1267*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_LATENCY_INFO_THREAD')] = KCTypeDescription(GetTypeForName('STACKSHOT_KCTYPE_LATENCY_INFO_THREAD'), 1268*a1e26a70SApple OSS Distributions ( 1269*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('thread_id', KCSUBTYPE_TYPE.KC_ST_UINT64, 0), 1270*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('cur_thsnap1_latency', KCSUBTYPE_TYPE.KC_ST_UINT64, 8), 1271*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('dispatch_serial_latency', KCSUBTYPE_TYPE.KC_ST_UINT64, 16), 1272*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('dispatch_label_latency', KCSUBTYPE_TYPE.KC_ST_UINT64, 24), 1273*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('cur_thsnap2_latency', KCSUBTYPE_TYPE.KC_ST_UINT64, 32), 1274*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('thread_name_latency', KCSUBTYPE_TYPE.KC_ST_UINT64, 40), 1275*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('sur_times_latency', KCSUBTYPE_TYPE.KC_ST_UINT64, 48), 1276*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('user_stack_latency', KCSUBTYPE_TYPE.KC_ST_UINT64, 56), 1277*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('kernel_stack_latency', KCSUBTYPE_TYPE.KC_ST_UINT64, 64), 1278*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('misc_latency', KCSUBTYPE_TYPE.KC_ST_UINT64, 72), 1279*a1e26a70SApple OSS Distributions ), 1280*a1e26a70SApple OSS Distributions 'stackshot_latency_thread') 1281*a1e26a70SApple OSS Distributions 1282*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_THREAD_NAME')] = KCSubTypeElement('pth_name', KCSUBTYPE_TYPE.KC_ST_CHAR, KCSubTypeElement.GetSizeForArray(64, 1), 0, 1) 1283*a1e26a70SApple OSS Distributions 1284*a1e26a70SApple OSS Distributionsdef set_type(name, *args): 1285*a1e26a70SApple OSS Distributions typ = GetTypeForName(name) 1286*a1e26a70SApple OSS Distributions KNOWN_TYPES_COLLECTION[typ] = KCTypeDescription(GetTypeForName(typ), *args) 1287*a1e26a70SApple OSS Distributions 1288*a1e26a70SApple OSS Distributions 1289*a1e26a70SApple OSS Distributionsset_type('STACKSHOT_KCTYPE_USER_STACKTOP', 1290*a1e26a70SApple OSS Distributions ( 1291*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('sp', KCSUBTYPE_TYPE.KC_ST_UINT64, 0), 1292*a1e26a70SApple OSS Distributions KCSubTypeElement('stack_contents', KCSUBTYPE_TYPE.KC_ST_UINT8, KCSubTypeElement.GetSizeForArray(8, 1), 8, 1), 1293*a1e26a70SApple OSS Distributions ), 1294*a1e26a70SApple OSS Distributions 'user_stacktop') 1295*a1e26a70SApple OSS Distributions 1296*a1e26a70SApple OSS Distributions#KNOWN_TYPES_COLLECTION[0x907] = KCSubTypeElement('donating_pids', KCSUBTYPE_TYPE.KC_ST_UINT32, 4, 0, 0, KCSubTypeElement._get_naked_element_value) 1297*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('TASK_CRASHINFO_PID')] = KCSubTypeElement('pid', KCSUBTYPE_TYPE.KC_ST_INT32, 4, 0, 0) 1298*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('TASK_CRASHINFO_PPID')] = KCSubTypeElement('ppid', KCSUBTYPE_TYPE.KC_ST_INT32, 4, 0, 0) 1299*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('TASK_CRASHINFO_PROC_NAME')] = KCSubTypeElement('p_comm', KCSUBTYPE_TYPE.KC_ST_CHAR, 1300*a1e26a70SApple OSS Distributions KCSubTypeElement.GetSizeForArray(32, 1), 0, 1) 1301*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('TASK_CRASHINFO_USERSTACK')] = KCSubTypeElement('userstack_ptr', KCSUBTYPE_TYPE.KC_ST_UINT64, 8, 0, 0) 1302*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('TASK_CRASHINFO_ARGSLEN')] = KCSubTypeElement('p_argslen', KCSUBTYPE_TYPE.KC_ST_INT32, 4, 0, 0) 1303*a1e26a70SApple OSS Distributions 1304*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('TASK_CRASHINFO_PROC_PATH')] = KCSubTypeElement('p_path', KCSUBTYPE_TYPE.KC_ST_CHAR, 1305*a1e26a70SApple OSS Distributions KCSubTypeElement.GetSizeForArray(1024, 1), 0, 1) 1306*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('TASK_CRASHINFO_PROC_CSFLAGS')] = KCSubTypeElement('p_csflags', KCSUBTYPE_TYPE.KC_ST_INT32, 4, 0, 0) 1307*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('TASK_CRASHINFO_UID')] = KCSubTypeElement('uid', KCSUBTYPE_TYPE.KC_ST_INT32, 4, 0, 0) 1308*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('TASK_CRASHINFO_GID')] = KCSubTypeElement('gid', KCSUBTYPE_TYPE.KC_ST_INT32, 4, 0, 0) 1309*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('TASK_CRASHINFO_PROC_ARGC')] = KCSubTypeElement('argc', KCSUBTYPE_TYPE.KC_ST_INT32, 4, 0, 0) 1310*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('TASK_CRASHINFO_PROC_FLAGS')] = KCSubTypeElement('p_flags', KCSUBTYPE_TYPE.KC_ST_INT32, 4, 0, 0) 1311*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('TASK_CRASHINFO_CPUTYPE')] = KCSubTypeElement('cputype', KCSUBTYPE_TYPE.KC_ST_INT32, 4, 0, 0) 1312*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('TASK_CRASHINFO_RESPONSIBLE_PID')] = KCSubTypeElement('responsible_pid', KCSUBTYPE_TYPE.KC_ST_INT32, 4, 0, 0) 1313*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('TASK_CRASHINFO_DIRTY_FLAGS')] = KCSubTypeElement('dirty_flags', KCSUBTYPE_TYPE.KC_ST_INT32, 4, 0, 0) 1314*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('TASK_CRASHINFO_CRASHED_THREADID')] = KCSubTypeElement('crashed_threadid', KCSUBTYPE_TYPE.KC_ST_UINT64, 8, 0, 0) 1315*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('TASK_CRASHINFO_COALITION_ID')] = KCSubTypeElement('coalition_id', KCSUBTYPE_TYPE.KC_ST_UINT64, 8, 0, 0) 1316*a1e26a70SApple OSS Distributions 1317*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('TASK_CRASHINFO_PROC_STATUS')] = KCSubTypeElement('p_status', KCSUBTYPE_TYPE.KC_ST_UINT8, 1, 0, 0) 1318*a1e26a70SApple OSS Distributions 1319*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('TASK_CRASHINFO_BSDINFOWITHUNIQID')] = KCTypeDescription(GetTypeForName('TASK_CRASHINFO_BSDINFOWITHUNIQID'), 1320*a1e26a70SApple OSS Distributions ( KCSubTypeElement('p_uuid', KCSUBTYPE_TYPE.KC_ST_UINT8, KCSubTypeElement.GetSizeForArray(16, 1), 0, 1), 1321*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('p_uniqueid', KCSUBTYPE_TYPE.KC_ST_UINT64, 16), 1322*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('p_puniqueid', KCSUBTYPE_TYPE.KC_ST_UINT64, 24) 1323*a1e26a70SApple OSS Distributions ), 1324*a1e26a70SApple OSS Distributions 'proc_uniqidentifierinfo') 1325*a1e26a70SApple OSS Distributions 1326*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('TASK_CRASHINFO_EXCEPTION_CODES')] = ( 1327*a1e26a70SApple OSS Distributions KCTypeDescription(GetTypeForName('TASK_CRASHINFO_EXCEPTION_CODES'), 1328*a1e26a70SApple OSS Distributions (KCSubTypeElement.FromBasicCtype('code_0', KCSUBTYPE_TYPE.KC_ST_UINT64, 0), 1329*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('code_1', KCSUBTYPE_TYPE.KC_ST_UINT64, 8)), 1330*a1e26a70SApple OSS Distributions 'mach_exception_data_t')) 1331*a1e26a70SApple OSS Distributions 1332*a1e26a70SApple OSS Distributions 1333*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('TASK_CRASHINFO_PROC_STARTTIME')] = ( 1334*a1e26a70SApple OSS Distributions KCTypeDescription(GetTypeForName('TASK_CRASHINFO_PROC_STARTTIME'), 1335*a1e26a70SApple OSS Distributions (KCSubTypeElement.FromBasicCtype('tv_sec', KCSUBTYPE_TYPE.KC_ST_UINT64, 0), 1336*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tv_usec', KCSUBTYPE_TYPE.KC_ST_UINT64, 8)), 1337*a1e26a70SApple OSS Distributions 'proc_starttime')) 1338*a1e26a70SApple OSS Distributions 1339*a1e26a70SApple OSS Distributions 1340*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('TASK_CRASHINFO_RUSAGE_INFO')] = KCTypeDescription(GetTypeForName('TASK_CRASHINFO_RUSAGE_INFO'), 1341*a1e26a70SApple OSS Distributions ( 1342*a1e26a70SApple OSS Distributions KCSubTypeElement('ri_uuid', KCSUBTYPE_TYPE.KC_ST_UINT8, KCSubTypeElement.GetSizeForArray(16, 1), 0, 1), 1343*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ri_user_time', KCSUBTYPE_TYPE.KC_ST_UINT64, 16), 1344*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ri_system_time', KCSUBTYPE_TYPE.KC_ST_UINT64, 24), 1345*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ri_pkg_idle_wkups', KCSUBTYPE_TYPE.KC_ST_UINT64, 32), 1346*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ri_interrupt_wkups', KCSUBTYPE_TYPE.KC_ST_UINT64, 40), 1347*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ri_pageins', KCSUBTYPE_TYPE.KC_ST_UINT64, 48), 1348*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ri_wired_size', KCSUBTYPE_TYPE.KC_ST_UINT64, 56), 1349*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ri_resident_size', KCSUBTYPE_TYPE.KC_ST_UINT64, 64), 1350*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ri_phys_footprint', KCSUBTYPE_TYPE.KC_ST_UINT64, 72), 1351*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ri_proc_start_abstime', KCSUBTYPE_TYPE.KC_ST_UINT64, 80), 1352*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ri_proc_exit_abstime', KCSUBTYPE_TYPE.KC_ST_UINT64, 88), 1353*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ri_child_user_time', KCSUBTYPE_TYPE.KC_ST_UINT64, 96), 1354*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ri_child_system_time', KCSUBTYPE_TYPE.KC_ST_UINT64, 104), 1355*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ri_child_pkg_idle_wkups', KCSUBTYPE_TYPE.KC_ST_UINT64, 112), 1356*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ri_child_interrupt_wkups', KCSUBTYPE_TYPE.KC_ST_UINT64, 120), 1357*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ri_child_pageins', KCSUBTYPE_TYPE.KC_ST_UINT64, 128), 1358*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ri_child_elapsed_abstime', KCSUBTYPE_TYPE.KC_ST_UINT64, 136), 1359*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ri_diskio_bytesread', KCSUBTYPE_TYPE.KC_ST_UINT64, 144), 1360*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ri_diskio_byteswritten', KCSUBTYPE_TYPE.KC_ST_UINT64, 152), 1361*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ri_cpu_time_qos_default', KCSUBTYPE_TYPE.KC_ST_UINT64, 160), 1362*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ri_cpu_time_qos_maintenance', KCSUBTYPE_TYPE.KC_ST_UINT64, 168), 1363*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ri_cpu_time_qos_background', KCSUBTYPE_TYPE.KC_ST_UINT64, 176), 1364*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ri_cpu_time_qos_utility', KCSUBTYPE_TYPE.KC_ST_UINT64, 184), 1365*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ri_cpu_time_qos_legacy', KCSUBTYPE_TYPE.KC_ST_UINT64, 192), 1366*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ri_cpu_time_qos_user_initiated', KCSUBTYPE_TYPE.KC_ST_UINT64, 200), 1367*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ri_cpu_time_qos_user_interactiv', KCSUBTYPE_TYPE.KC_ST_UINT64, 208), 1368*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ri_billed_system_time', KCSUBTYPE_TYPE.KC_ST_UINT64, 216), 1369*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ri_serviced_system_time', KCSUBTYPE_TYPE.KC_ST_UINT64, 224) 1370*a1e26a70SApple OSS Distributions ), 1371*a1e26a70SApple OSS Distributions 'rusage_info') 1372*a1e26a70SApple OSS Distributions 1373*a1e26a70SApple OSS Distributions#The sizes for these need to be kept in sync with 1374*a1e26a70SApple OSS Distributions#MAX_CRASHINFO_SIGNING_ID_LEN, MAX_CRASHINFO_TEAM_ID_LEN 1375*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('TASK_CRASHINFO_CS_SIGNING_ID')] = KCSubTypeElement('cs_signing_id', KCSUBTYPE_TYPE.KC_ST_CHAR, 1376*a1e26a70SApple OSS Distributions KCSubTypeElement.GetSizeForArray(64, 1), 0, 1) 1377*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('TASK_CRASHINFO_CS_TEAM_ID')] = KCSubTypeElement('cs_team_id', KCSUBTYPE_TYPE.KC_ST_CHAR, 1378*a1e26a70SApple OSS Distributions KCSubTypeElement.GetSizeForArray(32, 1), 0, 1) 1379*a1e26a70SApple OSS Distributions 1380*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('TASK_CRASHINFO_CS_VALIDATION_CATEGORY')] = KCSubTypeElement('cs_validation_category', KCSUBTYPE_TYPE.KC_ST_UINT32, 4, 0, 0) 1381*a1e26a70SApple OSS Distributions 1382*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('TASK_CRASHINFO_CS_TRUST_LEVEL')] = KCSubTypeElement('cs_trust_level', KCSUBTYPE_TYPE.KC_ST_UINT32, 4, 0, 0) 1383*a1e26a70SApple OSS Distributions 1384*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('TASK_CRASHINFO_JIT_ADDRESS_RANGE')] = KCTypeDescription(GetTypeForName('TASK_CRASHINFO_JIT_ADDRESS_RANGE'), 1385*a1e26a70SApple OSS Distributions ( 1386*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('start_address', KCSUBTYPE_TYPE.KC_ST_UINT64, 0), 1387*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('end_address', KCSUBTYPE_TYPE.KC_ST_UINT64, 8), 1388*a1e26a70SApple OSS Distributions ), 'jit_address_range') 1389*a1e26a70SApple OSS Distributions 1390*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('TASK_CRASHINFO_MB')] = KCTypeDescription(GetTypeForName('TASK_CRASHINFO_MB'), 1391*a1e26a70SApple OSS Distributions ( 1392*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('start_address', KCSUBTYPE_TYPE.KC_ST_UINT64, 0), 1393*a1e26a70SApple OSS Distributions KCSubTypeElement('data', KCSUBTYPE_TYPE.KC_ST_UINT64, KCSubTypeElement.GetSizeForArray(64, 64), 8, 0), 1394*a1e26a70SApple OSS Distributions ) 1395*a1e26a70SApple OSS Distributions) 1396*a1e26a70SApple OSS Distributions 1397*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('TASK_CRASHINFO_CS_AUXILIARY_INFO')] = KCSubTypeElement('cs_auxiliary_info', KCSUBTYPE_TYPE.KC_ST_UINT64, 8, 0, 0) 1398*a1e26a70SApple OSS Distributions 1399*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_CPU_TIMES')] = KCTypeDescription(GetTypeForName('STACKSHOT_KCTYPE_CPU_TIMES'), 1400*a1e26a70SApple OSS Distributions ( 1401*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('user_usec', KCSUBTYPE_TYPE.KC_ST_UINT64, 0), 1402*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('system_usec', KCSUBTYPE_TYPE.KC_ST_UINT64, 8), 1403*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('runnable_usec', KCSUBTYPE_TYPE.KC_ST_UINT64, 16), 1404*a1e26a70SApple OSS Distributions ), 'cpu_times') 1405*a1e26a70SApple OSS Distributions 1406*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_STACKSHOT_DURATION')] = KCTypeDescription(GetTypeForName('STACKSHOT_KCTYPE_STACKSHOT_DURATION'), 1407*a1e26a70SApple OSS Distributions ( 1408*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('stackshot_duration', KCSUBTYPE_TYPE.KC_ST_UINT64, 0), 1409*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('stackshot_duration_outer', KCSUBTYPE_TYPE.KC_ST_UINT64, 8), 1410*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('stackshot_duration_prior', KCSUBTYPE_TYPE.KC_ST_UINT64, 16), 1411*a1e26a70SApple OSS Distributions ), 'stackshot_duration', merge=True 1412*a1e26a70SApple OSS Distributions) 1413*a1e26a70SApple OSS Distributions 1414*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('KCDATA_TYPE_PROCNAME')] = ( 1415*a1e26a70SApple OSS Distributions KCSubTypeElement("proc_name", KCSUBTYPE_TYPE.KC_ST_CHAR, KCSubTypeElement.GetSizeForArray(-1, 1), 0, 1)) 1416*a1e26a70SApple OSS Distributions 1417*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('KCDATA_TYPE_PID')] = ( 1418*a1e26a70SApple OSS Distributions KCSubTypeElement('pid', KCSUBTYPE_TYPE.KC_ST_INT32, 4, 0, 0)) 1419*a1e26a70SApple OSS Distributions 1420*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('KCDATA_TYPE_LIBRARY_AOTINFO')] = KCTypeDescription(GetTypeForName('KCDATA_TYPE_LIBRARY_AOTINFO'), 1421*a1e26a70SApple OSS Distributions ( 1422*a1e26a70SApple OSS Distributions KCSubTypeElement('x86LoadAddress', KCSUBTYPE_TYPE.KC_ST_UINT64, 8, 0, 0), 1423*a1e26a70SApple OSS Distributions KCSubTypeElement('aotLoadAddress', KCSUBTYPE_TYPE.KC_ST_UINT64, 8, 8, 0), 1424*a1e26a70SApple OSS Distributions KCSubTypeElement('aotImageSize', KCSUBTYPE_TYPE.KC_ST_UINT64, 8, 16, 0), 1425*a1e26a70SApple OSS Distributions KCSubTypeElement('aotImageKey', KCSUBTYPE_TYPE.KC_ST_UINT8, KCSubTypeElement.GetSizeForArray(32, 1), 24, 1), 1426*a1e26a70SApple OSS Distributions ), 'dyld_aot_info') 1427*a1e26a70SApple OSS Distributions 1428*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('EXIT_REASON_SNAPSHOT')] = KCTypeDescription(GetTypeForName('EXIT_REASON_SNAPSHOT'), 1429*a1e26a70SApple OSS Distributions ( 1430*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ers_namespace', KCSUBTYPE_TYPE.KC_ST_UINT32, 0), 1431*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ers_code', KCSUBTYPE_TYPE.KC_ST_UINT64, 4), 1432*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ers_flags', KCSUBTYPE_TYPE.KC_ST_UINT64, 12), 1433*a1e26a70SApple OSS Distributions ), 'exit_reason_basic_info') 1434*a1e26a70SApple OSS Distributions 1435*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('EXIT_REASON_USER_DESC')] = ( 1436*a1e26a70SApple OSS Distributions KCSubTypeElement("exit_reason_user_description", KCSUBTYPE_TYPE.KC_ST_CHAR, KCSubTypeElement.GetSizeForArray(-1, 1), 0, 1)) 1437*a1e26a70SApple OSS Distributions 1438*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('EXIT_REASON_USER_PAYLOAD')] = KCSubTypeElement('exit_reason_user_payload', 1439*a1e26a70SApple OSS Distributions KCSUBTYPE_TYPE.KC_ST_UINT8, KCSubTypeElement.GetSizeForArray(-1, 1), 0, 1) 1440*a1e26a70SApple OSS Distributions 1441*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('EXIT_REASON_CODESIGNING_INFO')] = KCTypeDescription(GetTypeForName('EXIT_REASON_CODESIGNING_INFO'), 1442*a1e26a70SApple OSS Distributions ( 1443*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ceri_virt_addr', KCSUBTYPE_TYPE.KC_ST_UINT64, 0), 1444*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ceri_file_offset', KCSUBTYPE_TYPE.KC_ST_UINT64, 8), 1445*a1e26a70SApple OSS Distributions KCSubTypeElement("ceri_pathname", KCSUBTYPE_TYPE.KC_ST_CHAR, KCSubTypeElement.GetSizeForArray(1024, 1), 16, 1), 1446*a1e26a70SApple OSS Distributions KCSubTypeElement("ceri_filename", KCSUBTYPE_TYPE.KC_ST_CHAR, KCSubTypeElement.GetSizeForArray(1024, 1), 1040, 1), 1447*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ceri_codesig_modtime_secs', KCSUBTYPE_TYPE.KC_ST_UINT64, 2064), 1448*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ceri_codesig_modtime_nsecs', KCSUBTYPE_TYPE.KC_ST_UINT64, 2072), 1449*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ceri_page_modtime_secs', KCSUBTYPE_TYPE.KC_ST_UINT64, 2080), 1450*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ceri_page_modtime_nsecs', KCSUBTYPE_TYPE.KC_ST_UINT64, 2088), 1451*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ceri_path_truncated', KCSUBTYPE_TYPE.KC_ST_UINT8, 2096), 1452*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ceri_object_codesigned', KCSUBTYPE_TYPE.KC_ST_UINT8, 2097), 1453*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ceri_page_codesig_validated', KCSUBTYPE_TYPE.KC_ST_UINT8, 2098), 1454*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ceri_page_codesig_tainted', KCSUBTYPE_TYPE.KC_ST_UINT8, 2099), 1455*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ceri_page_codesig_nx', KCSUBTYPE_TYPE.KC_ST_UINT8, 2100), 1456*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ceri_page_wpmapped', KCSUBTYPE_TYPE.KC_ST_UINT8, 2101), 1457*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ceri_page_slid', KCSUBTYPE_TYPE.KC_ST_UINT8, 2102), 1458*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ceri_page_dirty', KCSUBTYPE_TYPE.KC_ST_UINT8, 2103), 1459*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('ceri_page_shadow_depth', KCSUBTYPE_TYPE.KC_ST_UINT32, 2104), 1460*a1e26a70SApple OSS Distributions ), 'exit_reason_codesigning_info') 1461*a1e26a70SApple OSS Distributions 1462*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('EXIT_REASON_WORKLOOP_ID')] = ( 1463*a1e26a70SApple OSS Distributions KCSubTypeElement('exit_reason_workloop_id', KCSUBTYPE_TYPE.KC_ST_UINT64, 8, 0, 0, KCSubTypeElement._get_naked_element_value)) 1464*a1e26a70SApple OSS Distributions 1465*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('EXIT_REASON_DISPATCH_QUEUE_NO')] = ( 1466*a1e26a70SApple OSS Distributions KCSubTypeElement('exit_reason_dispatch_queue_no', KCSUBTYPE_TYPE.KC_ST_UINT64, 8, 0, 0, KCSubTypeElement._get_naked_element_value)) 1467*a1e26a70SApple OSS Distributions 1468*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_ASID')] = ( 1469*a1e26a70SApple OSS Distributions KCSubTypeElement('ts_asid', KCSUBTYPE_TYPE.KC_ST_UINT32, 4, 0, 0)) 1470*a1e26a70SApple OSS Distributions 1471*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_PAGE_TABLES')] = KCTypeDescription(GetTypeForName('STACKSHOT_KCTYPE_PAGE_TABLES'), ( 1472*a1e26a70SApple OSS Distributions KCSubTypeElement(None, KCSUBTYPE_TYPE.KC_ST_UINT64, 8, 0, 0, KCSubTypeElement._get_naked_element_value), ), 1473*a1e26a70SApple OSS Distributions 'ts_pagetable', 1474*a1e26a70SApple OSS Distributions merge=True, 1475*a1e26a70SApple OSS Distributions naked=True 1476*a1e26a70SApple OSS Distributions) 1477*a1e26a70SApple OSS Distributions 1478*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_SUSPENSION_INFO')] = KCTypeDescription(GetTypeForName('STACKSHOT_KCTYPE_SUSPENSION_INFO'), ( 1479*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tss_last_start', KCSUBTYPE_TYPE.KC_ST_UINT64, 0), 1480*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tss_last_end', KCSUBTYPE_TYPE.KC_ST_UINT64, 8), 1481*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tss_count', KCSUBTYPE_TYPE.KC_ST_UINT64, 16), 1482*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tss_duration', KCSUBTYPE_TYPE.KC_ST_UINT64, 24), 1483*a1e26a70SApple OSS Distributions), 'suspension_info') 1484*a1e26a70SApple OSS Distributions 1485*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_SUSPENSION_SOURCE')] = KCTypeDescription(GetTypeForName('STACKSHOT_KCTYPE_SUSPENSION_SOURCE'), ( 1486*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tss_time', KCSUBTYPE_TYPE.KC_ST_UINT64, 0), 1487*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tss_tid', KCSUBTYPE_TYPE.KC_ST_UINT64, 8), 1488*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tss_pid', KCSUBTYPE_TYPE.KC_ST_INT32, 16), 1489*a1e26a70SApple OSS Distributions KCSubTypeElement('tss_procname', KCSUBTYPE_TYPE.KC_ST_CHAR, KCSubTypeElement.GetSizeForArray(65, 1), 20, 1) 1490*a1e26a70SApple OSS Distributions), 'suspension_source') 1491*a1e26a70SApple OSS Distributions 1492*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_OS_BUILD_VERSION')] = KCSubTypeElement('os_build_version', KCSUBTYPE_TYPE.KC_ST_CHAR, 1493*a1e26a70SApple OSS Distributions KCSubTypeElement.GetSizeForArray(256, 1), 0, 1) 1494*a1e26a70SApple OSS Distributions 1495*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_KERN_EXCLAVES_THREADINFO')] = KCTypeDescription(GetTypeForName('STACKSHOT_KCTYPE_KERN_EXCLAVES_THREADINFO'), 1496*a1e26a70SApple OSS Distributions ( 1497*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tei_scid', KCSUBTYPE_TYPE.KC_ST_UINT64, 0), 1498*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tei_thread_offset', KCSUBTYPE_TYPE.KC_ST_UINT32, 8), 1499*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('tei_flags', KCSUBTYPE_TYPE.KC_ST_UINT32, 12), 1500*a1e26a70SApple OSS Distributions ), 'exclaves_thread_info') 1501*a1e26a70SApple OSS Distributions 1502*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_EXCLAVE_SCRESULT_INFO')] = KCTypeDescription(GetTypeForName('STACKSHOT_KCTYPE_EXCLAVE_SCRESULT_INFO'), 1503*a1e26a70SApple OSS Distributions ( 1504*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('esc_id', KCSUBTYPE_TYPE.KC_ST_UINT64, 0), 1505*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('esc_flags', KCSUBTYPE_TYPE.KC_ST_UINT64, 8), 1506*a1e26a70SApple OSS Distributions ), 'exclave_scresult_info') 1507*a1e26a70SApple OSS Distributions 1508*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_EXCLAVE_IPCSTACKENTRY_INFO')] = KCTypeDescription(GetTypeForName('STACKSHOT_KCTYPE_EXCLAVE_IPCSTACKENTRY_INFO'), 1509*a1e26a70SApple OSS Distributions ( 1510*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('eise_asid', KCSUBTYPE_TYPE.KC_ST_UINT64, 0), 1511*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('eise_tnid', KCSUBTYPE_TYPE.KC_ST_UINT64, 8), 1512*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('eise_invocationid', KCSUBTYPE_TYPE.KC_ST_UINT64, 16), 1513*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('eise_flags', KCSUBTYPE_TYPE.KC_ST_UINT64, 24), 1514*a1e26a70SApple OSS Distributions ), 'exclave_ipcstackentry_info') 1515*a1e26a70SApple OSS Distributions 1516*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_EXCLAVE_IPCSTACKENTRY_ECSTACK')] = KCTypeDescription(GetTypeForName('STACKSHOT_KCTYPE_EXCLAVE_IPCSTACKENTRY_ECSTACK'), 1517*a1e26a70SApple OSS Distributions ( 1518*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('lr', KCSUBTYPE_TYPE.KC_ST_UINT64, 0), 1519*a1e26a70SApple OSS Distributions ), 'secure_ecstack_entry') 1520*a1e26a70SApple OSS Distributions 1521*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_EXCLAVE_ADDRESSSPACE_INFO')] = KCTypeDescription(GetTypeForName('STACKSHOT_KCTYPE_EXCLAVE_ADDRESSSPACE_INFO'), 1522*a1e26a70SApple OSS Distributions ( 1523*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('eas_id', KCSUBTYPE_TYPE.KC_ST_UINT64, 0), 1524*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('eas_flags', KCSUBTYPE_TYPE.KC_ST_UINT64, 8), 1525*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('eas_layoutid', KCSUBTYPE_TYPE.KC_ST_UINT64, 16), 1526*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('eas_slide', KCSUBTYPE_TYPE.KC_ST_UINT64, 24), 1527*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('eas_asroot', KCSUBTYPE_TYPE.KC_ST_UINT64, 32), 1528*a1e26a70SApple OSS Distributions ), 'exclave_addressspace_info') 1529*a1e26a70SApple OSS Distributions 1530*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_EXCLAVE_ADDRESSSPACE_NAME')] = KCSubTypeElement('exclave_addressspace_name', KCSUBTYPE_TYPE.KC_ST_CHAR, KCSubTypeElement.GetSizeForArray(64, 1), 0, 1) 1531*a1e26a70SApple OSS Distributions 1532*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_EXCLAVE_TEXTLAYOUT_INFO')] = KCTypeDescription(GetTypeForName('STACKSHOT_KCTYPE_EXCLAVE_TEXTLAYOUT_INFO'), 1533*a1e26a70SApple OSS Distributions ( 1534*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('layout_id', KCSUBTYPE_TYPE.KC_ST_UINT64, 0), 1535*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('etl_flags', KCSUBTYPE_TYPE.KC_ST_UINT64, 8), 1536*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('sharedcache_index', KCSUBTYPE_TYPE.KC_ST_UINT32, 16), 1537*a1e26a70SApple OSS Distributions ), 'exclave_textlayout_info') 1538*a1e26a70SApple OSS Distributions 1539*a1e26a70SApple OSS DistributionsKNOWN_TYPES_COLLECTION[GetTypeForName('STACKSHOT_KCTYPE_EXCLAVE_TEXTLAYOUT_SEGMENTS')] = KCTypeDescription(GetTypeForName('STACKSHOT_KCTYPE_EXCLAVE_TEXTLAYOUT_SEGMENTS'), 1540*a1e26a70SApple OSS Distributions ( 1541*a1e26a70SApple OSS Distributions KCSubTypeElement('layoutSegment_uuid', KCSUBTYPE_TYPE.KC_ST_UINT8, KCSubTypeElement.GetSizeForArray(16, 1), 0, 1), 1542*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('layoutSegment_loadAddress', KCSUBTYPE_TYPE.KC_ST_UINT64, 16), 1543*a1e26a70SApple OSS Distributions KCSubTypeElement.FromBasicCtype('layoutSegment_rawLoadAddress', KCSUBTYPE_TYPE.KC_ST_UINT64, 24), 1544*a1e26a70SApple OSS Distributions ), 'exclave_textlayout_segments') 1545*a1e26a70SApple OSS Distributions 1546*a1e26a70SApple OSS Distributionsdef GetSecondsFromMATime(mat, tb): 1547*a1e26a70SApple OSS Distributions return (float(long(mat) * tb['numer']) / tb['denom']) / 1e9 1548*a1e26a70SApple OSS Distributions 1549*a1e26a70SApple OSS Distributionsdef GetLongForAddress(address): 1550*a1e26a70SApple OSS Distributions if isinstance(address, str): 1551*a1e26a70SApple OSS Distributions if '0x' in address.lower(): 1552*a1e26a70SApple OSS Distributions address = long(address, 16) 1553*a1e26a70SApple OSS Distributions else: 1554*a1e26a70SApple OSS Distributions address = long(address) 1555*a1e26a70SApple OSS Distributions return address 1556*a1e26a70SApple OSS Distributions 1557*a1e26a70SApple OSS Distributionsdef FindLibraryForAddress(liblist, address): 1558*a1e26a70SApple OSS Distributions current_lib = None 1559*a1e26a70SApple OSS Distributions for l in liblist: 1560*a1e26a70SApple OSS Distributions l_addr = GetLongForAddress(l[1]) 1561*a1e26a70SApple OSS Distributions if address >= l_addr: 1562*a1e26a70SApple OSS Distributions current_lib = l 1563*a1e26a70SApple OSS Distributions return current_lib 1564*a1e26a70SApple OSS Distributions 1565*a1e26a70SApple OSS Distributionsdef FindIndexOfLibInCatalog(catalog, lib): 1566*a1e26a70SApple OSS Distributions index = None 1567*a1e26a70SApple OSS Distributions i = 0 1568*a1e26a70SApple OSS Distributions for l in catalog: 1569*a1e26a70SApple OSS Distributions if l[0] == lib[0] and l[1] == lib[1]: 1570*a1e26a70SApple OSS Distributions index = i 1571*a1e26a70SApple OSS Distributions break 1572*a1e26a70SApple OSS Distributions i += 1 1573*a1e26a70SApple OSS Distributions 1574*a1e26a70SApple OSS Distributions if index is None: 1575*a1e26a70SApple OSS Distributions catalog.append(lib) 1576*a1e26a70SApple OSS Distributions index = len(catalog) - 1 1577*a1e26a70SApple OSS Distributions 1578*a1e26a70SApple OSS Distributions return index 1579*a1e26a70SApple OSS Distributions 1580*a1e26a70SApple OSS Distributionsdef GetOffsetOfAddressForLib(lib, address): 1581*a1e26a70SApple OSS Distributions return (address - GetLongForAddress(lib[1])) 1582*a1e26a70SApple OSS Distributions 1583*a1e26a70SApple OSS Distributionsdef GetSymbolInfoForFrame(catalog, liblist, address): 1584*a1e26a70SApple OSS Distributions address = GetLongForAddress(address) 1585*a1e26a70SApple OSS Distributions lib = FindLibraryForAddress(liblist, address) 1586*a1e26a70SApple OSS Distributions if not lib: 1587*a1e26a70SApple OSS Distributions lib = ["00000000000000000000000000000000",0,"A"] 1588*a1e26a70SApple OSS Distributions offset = GetOffsetOfAddressForLib(lib, address) 1589*a1e26a70SApple OSS Distributions index = FindIndexOfLibInCatalog(catalog, lib) 1590*a1e26a70SApple OSS Distributions return [index, offset] 1591*a1e26a70SApple OSS Distributions 1592*a1e26a70SApple OSS Distributionsdef GetStateDescription(s): 1593*a1e26a70SApple OSS Distributions retval = [] 1594*a1e26a70SApple OSS Distributions TH_WAIT = 0x01 1595*a1e26a70SApple OSS Distributions TH_SUSP = 0x02 1596*a1e26a70SApple OSS Distributions TH_RUN = 0x04 1597*a1e26a70SApple OSS Distributions TH_UNINT = 0x08 1598*a1e26a70SApple OSS Distributions TH_TERMINATE = 0x10 1599*a1e26a70SApple OSS Distributions TH_TERMINATE2 = 0x20 1600*a1e26a70SApple OSS Distributions TH_WAIT_REPORT = 0x40 1601*a1e26a70SApple OSS Distributions TH_IDLE = 0x80 1602*a1e26a70SApple OSS Distributions if (s & TH_WAIT): 1603*a1e26a70SApple OSS Distributions retval.append("TH_WAIT") 1604*a1e26a70SApple OSS Distributions if (s & TH_SUSP): 1605*a1e26a70SApple OSS Distributions retval.append("TH_SUSP") 1606*a1e26a70SApple OSS Distributions if (s & TH_RUN): 1607*a1e26a70SApple OSS Distributions retval.append("TH_RUN") 1608*a1e26a70SApple OSS Distributions if (s & TH_UNINT): 1609*a1e26a70SApple OSS Distributions retval.append("TH_UNINT") 1610*a1e26a70SApple OSS Distributions if (s & TH_TERMINATE): 1611*a1e26a70SApple OSS Distributions retval.append("TH_TERMINATE") 1612*a1e26a70SApple OSS Distributions if (s & TH_TERMINATE2): 1613*a1e26a70SApple OSS Distributions retval.append("TH_TERMINATE2") 1614*a1e26a70SApple OSS Distributions if (s & TH_WAIT_REPORT): 1615*a1e26a70SApple OSS Distributions retval.append("TH_WAIT_REPORT") 1616*a1e26a70SApple OSS Distributions if (s & TH_IDLE): 1617*a1e26a70SApple OSS Distributions retval.append("TH_IDLE") 1618*a1e26a70SApple OSS Distributions return retval 1619*a1e26a70SApple OSS Distributions 1620*a1e26a70SApple OSS Distributions 1621*a1e26a70SApple OSS Distributionsdef format_uuid(elementValues): 1622*a1e26a70SApple OSS Distributions # sometimes we get string like "25A926D8-F742-3E5E..." 1623*a1e26a70SApple OSS Distributions if isinstance(elementValues, str): 1624*a1e26a70SApple OSS Distributions return elementValues 1625*a1e26a70SApple OSS Distributions return ''.join("%02x" % i for i in elementValues) 1626*a1e26a70SApple OSS Distributions 1627*a1e26a70SApple OSS DistributionskThreadWaitNone = 0x00 1628*a1e26a70SApple OSS DistributionskThreadWaitKernelMutex = 0x01 1629*a1e26a70SApple OSS DistributionskThreadWaitPortReceive = 0x02 1630*a1e26a70SApple OSS DistributionskThreadWaitPortSetReceive = 0x03 1631*a1e26a70SApple OSS DistributionskThreadWaitPortSend = 0x04 1632*a1e26a70SApple OSS DistributionskThreadWaitPortSendInTransit = 0x05 1633*a1e26a70SApple OSS DistributionskThreadWaitSemaphore = 0x06 1634*a1e26a70SApple OSS DistributionskThreadWaitKernelRWLockRead = 0x07 1635*a1e26a70SApple OSS DistributionskThreadWaitKernelRWLockWrite = 0x08 1636*a1e26a70SApple OSS DistributionskThreadWaitKernelRWLockUpgrade = 0x09 1637*a1e26a70SApple OSS DistributionskThreadWaitUserLock = 0x0a 1638*a1e26a70SApple OSS DistributionskThreadWaitPThreadMutex = 0x0b 1639*a1e26a70SApple OSS DistributionskThreadWaitPThreadRWLockRead = 0x0c 1640*a1e26a70SApple OSS DistributionskThreadWaitPThreadRWLockWrite = 0x0d 1641*a1e26a70SApple OSS DistributionskThreadWaitPThreadCondVar = 0x0e 1642*a1e26a70SApple OSS DistributionskThreadWaitParkedWorkQueue = 0x0f 1643*a1e26a70SApple OSS DistributionskThreadWaitWorkloopSyncWait = 0x10 1644*a1e26a70SApple OSS DistributionskThreadWaitOnProcess = 0x11 1645*a1e26a70SApple OSS DistributionskThreadWaitSleepWithInheritor = 0x12 1646*a1e26a70SApple OSS DistributionskThreadWaitEventlink = 0x13 1647*a1e26a70SApple OSS DistributionskThreadWaitCompressor = 0x14 1648*a1e26a70SApple OSS DistributionskThreadWaitParkedBoundWorkQueue = 0x15 1649*a1e26a70SApple OSS DistributionskThreadWaitPageBusy = 0x16 1650*a1e26a70SApple OSS DistributionskThreadWaitPagerInit = 0x17 1651*a1e26a70SApple OSS DistributionskThreadWaitPagerReady = 0x18 1652*a1e26a70SApple OSS DistributionskThreadWaitPagingActivity = 0x19 1653*a1e26a70SApple OSS DistributionskThreadWaitMappingInProgress = 0x1a 1654*a1e26a70SApple OSS DistributionskThreadWaitMemoryBlocked = 0x1b 1655*a1e26a70SApple OSS DistributionskThreadWaitPagingInProgress = 0x1c 1656*a1e26a70SApple OSS DistributionskThreadWaitPageInThrottle = 0x1d 1657*a1e26a70SApple OSS DistributionskThreadWaitExclaveCore = 0x1e 1658*a1e26a70SApple OSS DistributionskThreadWaitExclaveKit = 0x1f 1659*a1e26a70SApple OSS Distributions 1660*a1e26a70SApple OSS Distributions 1661*a1e26a70SApple OSS DistributionsUINT64_MAX = 0xffffffffffffffff 1662*a1e26a70SApple OSS DistributionsSTACKSHOT_WAITOWNER_KERNEL = (UINT64_MAX - 1) 1663*a1e26a70SApple OSS DistributionsSTACKSHOT_WAITOWNER_PORT_LOCKED = (UINT64_MAX - 2) 1664*a1e26a70SApple OSS DistributionsSTACKSHOT_WAITOWNER_PSET_LOCKED = (UINT64_MAX - 3) 1665*a1e26a70SApple OSS DistributionsSTACKSHOT_WAITOWNER_INTRANSIT = (UINT64_MAX - 4) 1666*a1e26a70SApple OSS DistributionsSTACKSHOT_WAITOWNER_MTXSPIN = (UINT64_MAX - 5) 1667*a1e26a70SApple OSS DistributionsSTACKSHOT_WAITOWNER_THREQUESTED = (UINT64_MAX - 6) 1668*a1e26a70SApple OSS DistributionsSTACKSHOT_WAITOWNER_SUSPENDED = (UINT64_MAX - 7) 1669*a1e26a70SApple OSS Distributions 1670*a1e26a70SApple OSS DistributionsSTACKSHOT_TURNSTILE_STATUS_UNKNOWN = 0x01 1671*a1e26a70SApple OSS DistributionsSTACKSHOT_TURNSTILE_STATUS_LOCKED_WAITQ = 0x02 1672*a1e26a70SApple OSS DistributionsSTACKSHOT_TURNSTILE_STATUS_WORKQUEUE = 0x04 1673*a1e26a70SApple OSS DistributionsSTACKSHOT_TURNSTILE_STATUS_THREAD = 0x08 1674*a1e26a70SApple OSS DistributionsSTACKSHOT_TURNSTILE_STATUS_BLOCKED_ON_TASK = 0x10 1675*a1e26a70SApple OSS DistributionsSTACKSHOT_TURNSTILE_STATUS_HELD_IPLOCK = 0x20 1676*a1e26a70SApple OSS DistributionsSTACKSHOT_TURNSTILE_STATUS_SENDPORT = 0x40 1677*a1e26a70SApple OSS DistributionsSTACKSHOT_TURNSTILE_STATUS_RECEIVEPORT = 0x80 1678*a1e26a70SApple OSS Distributions 1679*a1e26a70SApple OSS Distributions# 1680*a1e26a70SApple OSS Distributions# These come from xpc_domain_type_t in <xpc/launch_private.h> 1681*a1e26a70SApple OSS DistributionsPORTLABEL_DOMAINS = { 1682*a1e26a70SApple OSS Distributions 1: 'system', # XPC_DOMAIN_SYSTEM 1683*a1e26a70SApple OSS Distributions 2: 'user', # XPC_DOMAIN_USER 1684*a1e26a70SApple OSS Distributions 5: 'pid', # XPC_DOMAIN_PID 1685*a1e26a70SApple OSS Distributions 7: 'port', # XPC_DOMAIN_PORT 1686*a1e26a70SApple OSS Distributions} 1687*a1e26a70SApple OSS Distributionsdef portlabel_domain(x): 1688*a1e26a70SApple OSS Distributions if x is None: 1689*a1e26a70SApple OSS Distributions return "unknown" 1690*a1e26a70SApple OSS Distributions return PORTLABEL_DOMAINS.get(x, "unknown.{}".format(x)) 1691*a1e26a70SApple OSS Distributions 1692*a1e26a70SApple OSS DistributionsSTACKSHOT_WAITINFO_FLAGS_SPECIALREPLY = 0x1 1693*a1e26a70SApple OSS DistributionsSTACKSHOT_PORTLABEL_THROTTLED = 0x2 1694*a1e26a70SApple OSS Distributions 1695*a1e26a70SApple OSS Distributionsdef portThrottledSuffix(portlabel_flags): 1696*a1e26a70SApple OSS Distributions if (portlabel_flags & STACKSHOT_PORTLABEL_THROTTLED): 1697*a1e26a70SApple OSS Distributions return " (service port throttled by launchd)" 1698*a1e26a70SApple OSS Distributions else: 1699*a1e26a70SApple OSS Distributions return "" 1700*a1e26a70SApple OSS Distributions 1701*a1e26a70SApple OSS Distributionsdef formatPortLabelID(portlabel_id, portlabels): 1702*a1e26a70SApple OSS Distributions portlabel = {} 1703*a1e26a70SApple OSS Distributions if portlabel_id > 0: 1704*a1e26a70SApple OSS Distributions if portlabels is not None: 1705*a1e26a70SApple OSS Distributions portlabel = portlabels.get(str(portlabel_id), {}) 1706*a1e26a70SApple OSS Distributions portlabel_name = portlabel_domain(portlabel.get('portlabel_domain')) + " " 1707*a1e26a70SApple OSS Distributions portlabel_name += portlabel.get("portlabel_name", "!!!unknown, ID {} !!!".format(portlabel_id)) 1708*a1e26a70SApple OSS Distributions return " {" + portlabel_name + portThrottledSuffix(portlabel.get('portlabel_flags', 0)) + "}" 1709*a1e26a70SApple OSS Distributions if portlabel_id < 0: 1710*a1e26a70SApple OSS Distributions return " {labeled, info truncated" + portThrottledSuffix(portlabel.get('portlabel_flags', 0)) + "}" 1711*a1e26a70SApple OSS Distributions return "" 1712*a1e26a70SApple OSS Distributions 1713*a1e26a70SApple OSS Distributionsdef formatWaitInfo(info, wantHex, portlabels): 1714*a1e26a70SApple OSS Distributions base='#x' if wantHex else 'd' 1715*a1e26a70SApple OSS Distributions s = 'thread {0:{base}}: '.format(info['waiter'], base=base) 1716*a1e26a70SApple OSS Distributions type = info['wait_type'] 1717*a1e26a70SApple OSS Distributions context = info['context'] 1718*a1e26a70SApple OSS Distributions owner = info['owner'] 1719*a1e26a70SApple OSS Distributions ownerThread = "{0:{base}}".format(owner, base=base) 1720*a1e26a70SApple OSS Distributions portlabel_id = info.get('portlabel_id', 0) 1721*a1e26a70SApple OSS Distributions flags = info.get('wait_flags', 0) 1722*a1e26a70SApple OSS Distributions 1723*a1e26a70SApple OSS Distributions if type == kThreadWaitKernelMutex: 1724*a1e26a70SApple OSS Distributions s += 'kernel mutex %x' % context 1725*a1e26a70SApple OSS Distributions if owner == STACKSHOT_WAITOWNER_MTXSPIN: 1726*a1e26a70SApple OSS Distributions s += " in spin mode" 1727*a1e26a70SApple OSS Distributions elif owner: 1728*a1e26a70SApple OSS Distributions s += " owned by thread %s" % ownerThread 1729*a1e26a70SApple OSS Distributions else: 1730*a1e26a70SApple OSS Distributions s += "with unknown owner" 1731*a1e26a70SApple OSS Distributions elif type == kThreadWaitPortReceive: 1732*a1e26a70SApple OSS Distributions s += "mach_msg receive on " 1733*a1e26a70SApple OSS Distributions if flags & STACKSHOT_WAITINFO_FLAGS_SPECIALREPLY: 1734*a1e26a70SApple OSS Distributions s += "REPLY " 1735*a1e26a70SApple OSS Distributions flags = flags - STACKSHOT_WAITINFO_FLAGS_SPECIALREPLY 1736*a1e26a70SApple OSS Distributions if owner == STACKSHOT_WAITOWNER_PORT_LOCKED: 1737*a1e26a70SApple OSS Distributions s += "locked port %x" % context 1738*a1e26a70SApple OSS Distributions elif owner == STACKSHOT_WAITOWNER_INTRANSIT: 1739*a1e26a70SApple OSS Distributions s += "intransit port %x" % context 1740*a1e26a70SApple OSS Distributions elif owner: 1741*a1e26a70SApple OSS Distributions s += "port %x name %x" % (context, owner) 1742*a1e26a70SApple OSS Distributions else: 1743*a1e26a70SApple OSS Distributions s += "port %x" % context 1744*a1e26a70SApple OSS Distributions elif type == kThreadWaitPortSetReceive: 1745*a1e26a70SApple OSS Distributions if owner == STACKSHOT_WAITOWNER_PSET_LOCKED: 1746*a1e26a70SApple OSS Distributions s += "mach_msg receive on locked port set %x" % context 1747*a1e26a70SApple OSS Distributions else: 1748*a1e26a70SApple OSS Distributions s += "mach_msg receive on port set %x" % context 1749*a1e26a70SApple OSS Distributions elif type == kThreadWaitPortSend: 1750*a1e26a70SApple OSS Distributions s += "mach_msg send on " 1751*a1e26a70SApple OSS Distributions if owner == STACKSHOT_WAITOWNER_PORT_LOCKED: 1752*a1e26a70SApple OSS Distributions s += "locked port %x" % context 1753*a1e26a70SApple OSS Distributions elif owner == STACKSHOT_WAITOWNER_INTRANSIT: 1754*a1e26a70SApple OSS Distributions s += "intransit port %x" % context 1755*a1e26a70SApple OSS Distributions elif owner == STACKSHOT_WAITOWNER_KERNEL: 1756*a1e26a70SApple OSS Distributions s += "port %x owned by kernel" % context 1757*a1e26a70SApple OSS Distributions elif owner: 1758*a1e26a70SApple OSS Distributions s += "port %x owned by pid %d" % (context, owner) 1759*a1e26a70SApple OSS Distributions else: 1760*a1e26a70SApple OSS Distributions s += "port %x with unknown owner" % context 1761*a1e26a70SApple OSS Distributions elif type == kThreadWaitPortSendInTransit: 1762*a1e26a70SApple OSS Distributions s += "mach_msg send on port %x in transit to " % context 1763*a1e26a70SApple OSS Distributions if owner: 1764*a1e26a70SApple OSS Distributions s += "port %x" % owner 1765*a1e26a70SApple OSS Distributions else: 1766*a1e26a70SApple OSS Distributions s += "unknown port" 1767*a1e26a70SApple OSS Distributions elif type == kThreadWaitSemaphore: 1768*a1e26a70SApple OSS Distributions s += "semaphore port %x " % context 1769*a1e26a70SApple OSS Distributions if owner: 1770*a1e26a70SApple OSS Distributions s += "owned by pid %d" % owner 1771*a1e26a70SApple OSS Distributions else: 1772*a1e26a70SApple OSS Distributions s += "with unknown owner" 1773*a1e26a70SApple OSS Distributions elif type == kThreadWaitKernelRWLockRead: 1774*a1e26a70SApple OSS Distributions s += "krwlock %x for reading" % context 1775*a1e26a70SApple OSS Distributions if owner: 1776*a1e26a70SApple OSS Distributions s += " owned by thread %s" % ownerThread 1777*a1e26a70SApple OSS Distributions elif type == kThreadWaitKernelRWLockWrite: 1778*a1e26a70SApple OSS Distributions s += "krwlock %x for writing" % context 1779*a1e26a70SApple OSS Distributions if owner: 1780*a1e26a70SApple OSS Distributions s += " owned by thread %s" % ownerThread 1781*a1e26a70SApple OSS Distributions elif type == kThreadWaitKernelRWLockUpgrade: 1782*a1e26a70SApple OSS Distributions s += "krwlock %x for upgrading" % context 1783*a1e26a70SApple OSS Distributions if owner: 1784*a1e26a70SApple OSS Distributions s += " owned by thread %s" % ownerThread 1785*a1e26a70SApple OSS Distributions elif type == kThreadWaitUserLock: 1786*a1e26a70SApple OSS Distributions if owner: 1787*a1e26a70SApple OSS Distributions s += "unfair lock %x owned by thread %s" % (context, ownerThread) 1788*a1e26a70SApple OSS Distributions else: 1789*a1e26a70SApple OSS Distributions s += "spin lock %x" % context 1790*a1e26a70SApple OSS Distributions elif type == kThreadWaitPThreadMutex: 1791*a1e26a70SApple OSS Distributions s += "pthread mutex %x" % context 1792*a1e26a70SApple OSS Distributions if owner: 1793*a1e26a70SApple OSS Distributions s += " owned by thread %s" % ownerThread 1794*a1e26a70SApple OSS Distributions else: 1795*a1e26a70SApple OSS Distributions s += " with unknown owner" 1796*a1e26a70SApple OSS Distributions elif type == kThreadWaitPThreadRWLockRead: 1797*a1e26a70SApple OSS Distributions s += "pthread rwlock %x for reading" % context 1798*a1e26a70SApple OSS Distributions elif type == kThreadWaitPThreadRWLockWrite: 1799*a1e26a70SApple OSS Distributions s += "pthread rwlock %x for writing" % context 1800*a1e26a70SApple OSS Distributions elif type == kThreadWaitPThreadCondVar: 1801*a1e26a70SApple OSS Distributions s += "pthread condvar %x" % context 1802*a1e26a70SApple OSS Distributions elif type == kThreadWaitWorkloopSyncWait: 1803*a1e26a70SApple OSS Distributions s += "workloop sync wait" 1804*a1e26a70SApple OSS Distributions if owner == STACKSHOT_WAITOWNER_SUSPENDED: 1805*a1e26a70SApple OSS Distributions s += ", suspended" 1806*a1e26a70SApple OSS Distributions elif owner == STACKSHOT_WAITOWNER_THREQUESTED: 1807*a1e26a70SApple OSS Distributions s += ", thread requested" 1808*a1e26a70SApple OSS Distributions elif owner != 0: 1809*a1e26a70SApple OSS Distributions s += ", owned by thread %s" % ownerThread 1810*a1e26a70SApple OSS Distributions else: 1811*a1e26a70SApple OSS Distributions s += ", unknown owner" 1812*a1e26a70SApple OSS Distributions s += ", workloop id %x" % context 1813*a1e26a70SApple OSS Distributions elif type == kThreadWaitOnProcess: 1814*a1e26a70SApple OSS Distributions if owner == 2**64-1: 1815*a1e26a70SApple OSS Distributions s += "waitpid, for any children" 1816*a1e26a70SApple OSS Distributions elif 2**32 <= owner and owner < 2**64-1: 1817*a1e26a70SApple OSS Distributions s += "waitpid, for process group %d" % abs(owner - 2**64) 1818*a1e26a70SApple OSS Distributions else: 1819*a1e26a70SApple OSS Distributions s += "waitpid, for pid %d" % owner 1820*a1e26a70SApple OSS Distributions elif type == kThreadWaitSleepWithInheritor: 1821*a1e26a70SApple OSS Distributions if owner == 0: 1822*a1e26a70SApple OSS Distributions s += "turnstile, held waitq" 1823*a1e26a70SApple OSS Distributions else: 1824*a1e26a70SApple OSS Distributions s += "turnstile, pushing thread %s" % ownerThread 1825*a1e26a70SApple OSS Distributions elif type == kThreadWaitEventlink: 1826*a1e26a70SApple OSS Distributions if owner == 0: 1827*a1e26a70SApple OSS Distributions s += "eventlink, held waitq" 1828*a1e26a70SApple OSS Distributions else: 1829*a1e26a70SApple OSS Distributions s += "eventlink, signaled by thread %s" % ownerThread 1830*a1e26a70SApple OSS Distributions elif type == kThreadWaitCompressor: 1831*a1e26a70SApple OSS Distributions s += "in compressor segment %x, busy for thread %s" % (context, ownerThread) 1832*a1e26a70SApple OSS Distributions elif type == kThreadWaitExclaveCore: 1833*a1e26a70SApple OSS Distributions if owner == 0: 1834*a1e26a70SApple OSS Distributions s += "exclavecore wait, id 0x%x" % context 1835*a1e26a70SApple OSS Distributions else: 1836*a1e26a70SApple OSS Distributions s += "exclavecore wait, id 0x%x, owner thread %s" % (context, ownerThread) 1837*a1e26a70SApple OSS Distributions elif type == kThreadWaitExclaveKit: 1838*a1e26a70SApple OSS Distributions if owner == 0: 1839*a1e26a70SApple OSS Distributions s += "exclavekit wait, id 0x%x" % context 1840*a1e26a70SApple OSS Distributions else: 1841*a1e26a70SApple OSS Distributions s += "exclavekit wait, id 0x%x, owner thread %s" % (context, ownerThread) 1842*a1e26a70SApple OSS Distributions elif type == kThreadWaitPageBusy: 1843*a1e26a70SApple OSS Distributions s += f"busy page 0x{context:x}" 1844*a1e26a70SApple OSS Distributions elif type == kThreadWaitPagerInit: 1845*a1e26a70SApple OSS Distributions s += f"pager initialization for vm object 0x{context:x}" 1846*a1e26a70SApple OSS Distributions elif type == kThreadWaitPagerReady: 1847*a1e26a70SApple OSS Distributions s += f"pager ready for vm object 0x{context:x}" 1848*a1e26a70SApple OSS Distributions elif type == kThreadWaitPagingActivity: 1849*a1e26a70SApple OSS Distributions s += f"paging/activity in progress for vm object 0x{context:x}" 1850*a1e26a70SApple OSS Distributions elif type == kThreadWaitMappingInProgress: 1851*a1e26a70SApple OSS Distributions s += f"mapping in progress for vm object 0x{context:x}" 1852*a1e26a70SApple OSS Distributions elif type == kThreadWaitMemoryBlocked: 1853*a1e26a70SApple OSS Distributions s += f"blocked vm object 0x{context:x}" 1854*a1e26a70SApple OSS Distributions elif type == kThreadWaitPagingInProgress: 1855*a1e26a70SApple OSS Distributions s += f"paging in progress for vm object 0x{context:x}" 1856*a1e26a70SApple OSS Distributions elif type == kThreadWaitPageInThrottle: 1857*a1e26a70SApple OSS Distributions s += f"throttled vm object 0x{context:x}" 1858*a1e26a70SApple OSS Distributions else: 1859*a1e26a70SApple OSS Distributions s += "unknown type %d (owner %s, context %x)" % (type, ownerThread, context) 1860*a1e26a70SApple OSS Distributions 1861*a1e26a70SApple OSS Distributions s += formatPortLabelID(portlabel_id, portlabels) 1862*a1e26a70SApple OSS Distributions 1863*a1e26a70SApple OSS Distributions if flags != 0: 1864*a1e26a70SApple OSS Distributions s += "flags {}".format(hex(flags)) 1865*a1e26a70SApple OSS Distributions return s 1866*a1e26a70SApple OSS Distributions 1867*a1e26a70SApple OSS Distributionsdef formatTurnstileInfo(ti, wi_portlabel_id, portlabels): 1868*a1e26a70SApple OSS Distributions if ti is None: 1869*a1e26a70SApple OSS Distributions return " [no turnstile]" 1870*a1e26a70SApple OSS Distributions 1871*a1e26a70SApple OSS Distributions ts_flags = int(ti['turnstile_flags']) 1872*a1e26a70SApple OSS Distributions ctx = int(ti['turnstile_context']) 1873*a1e26a70SApple OSS Distributions hop = int(ti['number_of_hops']) 1874*a1e26a70SApple OSS Distributions prio = int(ti['turnstile_priority']) 1875*a1e26a70SApple OSS Distributions portlabel_id = ti.get("portlabel_id", 0) 1876*a1e26a70SApple OSS Distributions 1877*a1e26a70SApple OSS Distributions portlabel_summary = "" 1878*a1e26a70SApple OSS Distributions if portlabel_id != 0 and portlabel_id != wi_portlabel_id: 1879*a1e26a70SApple OSS Distributions portlabel_summary += formatPortLabelID(portlabel_id, portlabels) 1880*a1e26a70SApple OSS Distributions 1881*a1e26a70SApple OSS Distributions if ts_flags & STACKSHOT_TURNSTILE_STATUS_HELD_IPLOCK: 1882*a1e26a70SApple OSS Distributions return " [turnstile blocked on task, but ip_lock was held]" + portlabel_summary 1883*a1e26a70SApple OSS Distributions if ts_flags & STACKSHOT_TURNSTILE_STATUS_BLOCKED_ON_TASK: 1884*a1e26a70SApple OSS Distributions return " [turnstile blocked on task pid %d, hops: %d, priority: %d]%s" % (ctx, hop, prio, portlabel_summary) 1885*a1e26a70SApple OSS Distributions if ts_flags & STACKSHOT_TURNSTILE_STATUS_LOCKED_WAITQ: 1886*a1e26a70SApple OSS Distributions return " [turnstile was in process of being updated]" + portlabel_summary 1887*a1e26a70SApple OSS Distributions if ts_flags & STACKSHOT_TURNSTILE_STATUS_WORKQUEUE: 1888*a1e26a70SApple OSS Distributions return " [blocked on workqueue: 0x%x, hops: %x, priority: %d]%s" % (ctx, hop, prio, portlabel_summary) 1889*a1e26a70SApple OSS Distributions if ts_flags & STACKSHOT_TURNSTILE_STATUS_THREAD: 1890*a1e26a70SApple OSS Distributions return " [blocked on: %d, hops: %x, priority: %d]%s" % (ctx, hop, prio, portlabel_summary) 1891*a1e26a70SApple OSS Distributions if ts_flags & STACKSHOT_TURNSTILE_STATUS_UNKNOWN: 1892*a1e26a70SApple OSS Distributions return " [turnstile with unknown inheritor]" + portlabel_summary 1893*a1e26a70SApple OSS Distributions 1894*a1e26a70SApple OSS Distributions return " [unknown turnstile status!]" + portlabel_summary 1895*a1e26a70SApple OSS Distributions 1896*a1e26a70SApple OSS Distributionsdef formatWaitInfoWithTurnstiles(waitinfos, tsinfos, portlabels): 1897*a1e26a70SApple OSS Distributions wis_tis = [] 1898*a1e26a70SApple OSS Distributions for w in waitinfos: 1899*a1e26a70SApple OSS Distributions found_pair = False 1900*a1e26a70SApple OSS Distributions for t in tsinfos: 1901*a1e26a70SApple OSS Distributions if int(w['waiter']) == int(t['waiter']): 1902*a1e26a70SApple OSS Distributions wis_tis.append((w, t)) 1903*a1e26a70SApple OSS Distributions found_pair = True 1904*a1e26a70SApple OSS Distributions break 1905*a1e26a70SApple OSS Distributions if not found_pair: 1906*a1e26a70SApple OSS Distributions wis_tis.append((w, None)) 1907*a1e26a70SApple OSS Distributions 1908*a1e26a70SApple OSS Distributions return [formatWaitInfo(wi, False, portlabels) + formatTurnstileInfo(ti, wi.get('portlabel_id', 0), portlabels) for (wi, ti) in wis_tis] 1909*a1e26a70SApple OSS Distributions 1910*a1e26a70SApple OSS Distributions 1911*a1e26a70SApple OSS Distributionsdef FindTextLayout(text_layouts, text_layout_id): 1912*a1e26a70SApple OSS Distributions for layout in text_layouts.values(): 1913*a1e26a70SApple OSS Distributions if layout['exclave_textlayout_info']['layout_id'] == text_layout_id: 1914*a1e26a70SApple OSS Distributions return layout 1915*a1e26a70SApple OSS Distributions return None 1916*a1e26a70SApple OSS Distributions 1917*a1e26a70SApple OSS Distributionsdef BinaryImagesFromExclavesLayout(textlayout): 1918*a1e26a70SApple OSS Distributions flags = textlayout['exclave_textlayout_info']['etl_flags'] 1919*a1e26a70SApple OSS Distributions sharedCacheIndex = textlayout['exclave_textlayout_info'].get('sharedcache_index', 0xffffffff) 1920*a1e26a70SApple OSS Distributions layouts = [ [format_uuid(layout['layoutSegment_uuid']), layout['layoutSegment_loadAddress'], 'P'] for layout in textlayout['exclave_textlayout_segments'] ] 1921*a1e26a70SApple OSS Distributions # 0x4 == kExclaveTextLayoutHasSharedCache 1922*a1e26a70SApple OSS Distributions if ((flags & 0x4) != 0 and sharedCacheIndex < len(layouts)): 1923*a1e26a70SApple OSS Distributions layouts[sharedCacheIndex][2] = "S" 1924*a1e26a70SApple OSS Distributions layouts.sort(key=itemgetter(1)) 1925*a1e26a70SApple OSS Distributions return layouts 1926*a1e26a70SApple OSS Distributions 1927*a1e26a70SApple OSS Distributionsdef GetExclaveLibs(text_layouts, text_layout_id): 1928*a1e26a70SApple OSS Distributions textlayout = text_layouts.get(str(text_layout_id)) 1929*a1e26a70SApple OSS Distributions 1930*a1e26a70SApple OSS Distributions # This fallback is needed to preserve compatibility with kcdata generated before rdar://123838752 1931*a1e26a70SApple OSS Distributions # FindTextLayout function should be removed in future 1932*a1e26a70SApple OSS Distributions if not textlayout or textlayout['exclave_textlayout_info']['layout_id'] != text_layout_id: 1933*a1e26a70SApple OSS Distributions textlayout = FindTextLayout(text_layouts, text_layout_id) 1934*a1e26a70SApple OSS Distributions 1935*a1e26a70SApple OSS Distributions return BinaryImagesFromExclavesLayout(textlayout) 1936*a1e26a70SApple OSS Distributions 1937*a1e26a70SApple OSS Distributions# kcdata is json at path 'kcdata_stackshot/threads_exclave/0' 1938*a1e26a70SApple OSS Distributionsdef GetEASFrames(AllImageCatalog, kcdata, ipc_entry, notes, scid): 1939*a1e26a70SApple OSS Distributions info = ipc_entry['exclave_ipcstackentry_info'] 1940*a1e26a70SApple OSS Distributions asid = info['eise_asid'] 1941*a1e26a70SApple OSS Distributions 1942*a1e26a70SApple OSS Distributions address_spaces = kcdata.get('exclave_addressspace') 1943*a1e26a70SApple OSS Distributions if not address_spaces: 1944*a1e26a70SApple OSS Distributions notes.warn("PID ${PID} TID ${TID} SCID %d Missing address spaces info" % scid) 1945*a1e26a70SApple OSS Distributions return [] 1946*a1e26a70SApple OSS Distributions as_info = address_spaces.get(str(asid)) 1947*a1e26a70SApple OSS Distributions if not as_info: 1948*a1e26a70SApple OSS Distributions notes.warn("PID ${PID} TID ${TID} SCID %d Missing address space info for ASID 0x%x" % (scid, asid)) 1949*a1e26a70SApple OSS Distributions return [] 1950*a1e26a70SApple OSS Distributions text_layout_id = as_info['exclave_addressspace_info']['eas_layoutid'] 1951*a1e26a70SApple OSS Distributions addr_space_name = as_info['exclave_addressspace_name'] 1952*a1e26a70SApple OSS Distributions 1953*a1e26a70SApple OSS Distributions exclave_libs = GetExclaveLibs(kcdata['exclave_textlayout'], text_layout_id) 1954*a1e26a70SApple OSS Distributions 1955*a1e26a70SApple OSS Distributions frames = [] 1956*a1e26a70SApple OSS Distributions stack = ipc_entry.get('secure_ecstack_entry', []) 1957*a1e26a70SApple OSS Distributions for stack_item in stack: 1958*a1e26a70SApple OSS Distributions lr = GetLongForAddress(stack_item['lr']) 1959*a1e26a70SApple OSS Distributions # this is a buggy value of unknown origin 1960*a1e26a70SApple OSS Distributions # rdar://123508690 (Some Exclave Stackshot frames ends with invalid value 0xFFFF000000000000) 1961*a1e26a70SApple OSS Distributions if lr == 0xFFFF000000000000: 1962*a1e26a70SApple OSS Distributions continue 1963*a1e26a70SApple OSS Distributions frames.append(GetSymbolInfoForFrame(AllImageCatalog, exclave_libs, lr)) 1964*a1e26a70SApple OSS Distributions 1965*a1e26a70SApple OSS Distributions if frames: 1966*a1e26a70SApple OSS Distributions frame_info = "frames %d to %d" % (notes.offset, notes.offset + len(frames) - 1) 1967*a1e26a70SApple OSS Distributions else: 1968*a1e26a70SApple OSS Distributions frame_info = "no frames" 1969*a1e26a70SApple OSS Distributions notes.info("PID ${PID} TID ${TID} SCID %d ASID 0x%x has address space name '%s' (%s)" % (scid, asid, addr_space_name, frame_info)) 1970*a1e26a70SApple OSS Distributions notes.addToOffset(len(frames)) 1971*a1e26a70SApple OSS Distributions return frames 1972*a1e26a70SApple OSS Distributions 1973*a1e26a70SApple OSS Distributions 1974*a1e26a70SApple OSS Distributionsdef GetExclavesFrames(AllImageCatalog, json, scid, notes): 1975*a1e26a70SApple OSS Distributions kcdata = json['kcdata_stackshot'] 1976*a1e26a70SApple OSS Distributions threads_exclave = kcdata.get('threads_exclave') 1977*a1e26a70SApple OSS Distributions if not threads_exclave: 1978*a1e26a70SApple OSS Distributions notes.warn("PID ${PID} TID ${TID} no threads_exclave info found, skipping exclaves frames") 1979*a1e26a70SApple OSS Distributions return [] 1980*a1e26a70SApple OSS Distributions 1981*a1e26a70SApple OSS Distributions exclaves_content = threads_exclave.get('0') 1982*a1e26a70SApple OSS Distributions if not exclaves_content: 1983*a1e26a70SApple OSS Distributions notes.warn("PID ${PID} TID ${TID} threads_exclave data not found, skipping exclaves frames") 1984*a1e26a70SApple OSS Distributions return [] 1985*a1e26a70SApple OSS Distributions 1986*a1e26a70SApple OSS Distributions threads_info = exclaves_content.get('thread_exclave') 1987*a1e26a70SApple OSS Distributions if not threads_info: 1988*a1e26a70SApple OSS Distributions notes.warn("PID ${PID} TID ${TID} no thread_exclave info found, skipping exclaves frames") 1989*a1e26a70SApple OSS Distributions return [] 1990*a1e26a70SApple OSS Distributions 1991*a1e26a70SApple OSS Distributions scid_info = threads_info.get(str(scid)) 1992*a1e26a70SApple OSS Distributions if not scid_info: 1993*a1e26a70SApple OSS Distributions notes.warn("PID ${PID} TID ${TID} no exclaves info available for SCID %d, skipping exclaves frames" % scid) 1994*a1e26a70SApple OSS Distributions return [] 1995*a1e26a70SApple OSS Distributions 1996*a1e26a70SApple OSS Distributions frames = [] 1997*a1e26a70SApple OSS Distributions 1998*a1e26a70SApple OSS Distributions ipc_stack = scid_info.get("exclave_ipcstackentry") 1999*a1e26a70SApple OSS Distributions if not ipc_stack: 2000*a1e26a70SApple OSS Distributions notes.info("\nPID ${PID} TID ${TID} SCID %d IPC chain is missing" % scid) 2001*a1e26a70SApple OSS Distributions return [] 2002*a1e26a70SApple OSS Distributions notes.info("\nPID ${PID} TID ${TID} SCID %d has IPC chain with %d items:" % (scid, len(ipc_stack))) 2003*a1e26a70SApple OSS Distributions for i in reversed(range(len(ipc_stack))): 2004*a1e26a70SApple OSS Distributions ipc_entry = ipc_stack[str(i)] 2005*a1e26a70SApple OSS Distributions entry_frames = GetEASFrames(AllImageCatalog, exclaves_content, ipc_entry, notes, scid) 2006*a1e26a70SApple OSS Distributions frames.extend(entry_frames) 2007*a1e26a70SApple OSS Distributions 2008*a1e26a70SApple OSS Distributions return frames 2009*a1e26a70SApple OSS Distributions 2010*a1e26a70SApple OSS Distributions 2011*a1e26a70SApple OSS Distributionsdef InsertExclavesFrames(AllImageCatalog, json, thdata, notes, kernel_frames): 2012*a1e26a70SApple OSS Distributions thread_info = thdata.get('exclaves_thread_info') 2013*a1e26a70SApple OSS Distributions if not thread_info: 2014*a1e26a70SApple OSS Distributions # this is not exclave thread 2015*a1e26a70SApple OSS Distributions return 2016*a1e26a70SApple OSS Distributions 2017*a1e26a70SApple OSS Distributions scid = thread_info["tei_scid"] 2018*a1e26a70SApple OSS Distributions offset = thread_info["tei_thread_offset"] 2019*a1e26a70SApple OSS Distributions notes.offset = offset 2020*a1e26a70SApple OSS Distributions 2021*a1e26a70SApple OSS Distributions exclaves_frames = GetExclavesFrames(AllImageCatalog, json, scid, notes) 2022*a1e26a70SApple OSS Distributions 2023*a1e26a70SApple OSS Distributions # insert exclaves frames to offset 2024*a1e26a70SApple OSS Distributions for i in range(len(exclaves_frames)): 2025*a1e26a70SApple OSS Distributions kernel_frames.insert(offset + i, exclaves_frames[i]) 2026*a1e26a70SApple OSS Distributions 2027*a1e26a70SApple OSS Distributionsclass NotesBuilder: 2028*a1e26a70SApple OSS Distributions 2029*a1e26a70SApple OSS Distributions notes = [] 2030*a1e26a70SApple OSS Distributions pid = None 2031*a1e26a70SApple OSS Distributions tis = None 2032*a1e26a70SApple OSS Distributions offset = 0 2033*a1e26a70SApple OSS Distributions 2034*a1e26a70SApple OSS Distributions def __init__(self, pid, tid): 2035*a1e26a70SApple OSS Distributions self.pid = pid 2036*a1e26a70SApple OSS Distributions self.tid = tid 2037*a1e26a70SApple OSS Distributions self.notes = [] 2038*a1e26a70SApple OSS Distributions self.offset = 0 # offset of next IPC stack in kernel stack 2039*a1e26a70SApple OSS Distributions 2040*a1e26a70SApple OSS Distributions # Replace ${PID} with a PID and ${TID} with TID and add newline 2041*a1e26a70SApple OSS Distributions def format(self, note): 2042*a1e26a70SApple OSS Distributions note = note.replace('${PID}', str(self.pid)) 2043*a1e26a70SApple OSS Distributions note = note.replace('${TID}', str(self.tid)) 2044*a1e26a70SApple OSS Distributions return note + '\n' 2045*a1e26a70SApple OSS Distributions 2046*a1e26a70SApple OSS Distributions def warn(self, note): 2047*a1e26a70SApple OSS Distributions note = self.format(note) 2048*a1e26a70SApple OSS Distributions sys.stdout.write(note) 2049*a1e26a70SApple OSS Distributions self.notes.append(note) 2050*a1e26a70SApple OSS Distributions 2051*a1e26a70SApple OSS Distributions def info(self, note): 2052*a1e26a70SApple OSS Distributions note = self.format(note) 2053*a1e26a70SApple OSS Distributions self.notes.append(note) 2054*a1e26a70SApple OSS Distributions 2055*a1e26a70SApple OSS Distributions def isEmpty(self): 2056*a1e26a70SApple OSS Distributions return len(self.notes) == 0 2057*a1e26a70SApple OSS Distributions 2058*a1e26a70SApple OSS Distributions def text(self): 2059*a1e26a70SApple OSS Distributions return ''.join(self.notes) 2060*a1e26a70SApple OSS Distributions 2061*a1e26a70SApple OSS Distributions def addToOffset(self, frame_count): 2062*a1e26a70SApple OSS Distributions self.offset += frame_count 2063*a1e26a70SApple OSS Distributions 2064*a1e26a70SApple OSS Distributionsdef SaveStackshotReport(j, outfile_name, incomplete): 2065*a1e26a70SApple OSS Distributions import time 2066*a1e26a70SApple OSS Distributions ss = j.get('kcdata_stackshot') 2067*a1e26a70SApple OSS Distributions if not ss: 2068*a1e26a70SApple OSS Distributions print("No KCDATA_BUFFER_BEGIN_STACKSHOT object found. Skipping writing report.") 2069*a1e26a70SApple OSS Distributions return 2070*a1e26a70SApple OSS Distributions 2071*a1e26a70SApple OSS Distributions timestamp = ss.get('usecs_since_epoch') 2072*a1e26a70SApple OSS Distributions try: 2073*a1e26a70SApple OSS Distributions timestamp = time.strftime("%Y-%m-%d %H:%M:%S +0000",time.gmtime(timestamp // 1000000 if timestamp else None)) 2074*a1e26a70SApple OSS Distributions except ValueError as e: 2075*a1e26a70SApple OSS Distributions print("couldn't convert timestamp:", str(e)) 2076*a1e26a70SApple OSS Distributions timestamp = None 2077*a1e26a70SApple OSS Distributions 2078*a1e26a70SApple OSS Distributions os_version = ss.get('osversion', 'Unknown') 2079*a1e26a70SApple OSS Distributions timebase = ss.get('mach_timebase_info', {"denom": 1, "numer": 1}) 2080*a1e26a70SApple OSS Distributions 2081*a1e26a70SApple OSS Distributions sc_note = None 2082*a1e26a70SApple OSS Distributions extra_note = None 2083*a1e26a70SApple OSS Distributions dsc_common = None 2084*a1e26a70SApple OSS Distributions shared_cache_info = ss.get('shared_cache_dyld_load_info') 2085*a1e26a70SApple OSS Distributions if shared_cache_info: 2086*a1e26a70SApple OSS Distributions shared_cache_base_addr = shared_cache_info['imageSlidBaseAddress'] 2087*a1e26a70SApple OSS Distributions # If we have a slidFirstMapping and it's >= base_address, use that. 2088*a1e26a70SApple OSS Distributions # 2089*a1e26a70SApple OSS Distributions # Otherwise we're processing a stackshot from before the slidFirstMapping 2090*a1e26a70SApple OSS Distributions # field was introduced and corrected. On ARM the SlidBaseAddress is the 2091*a1e26a70SApple OSS Distributions # same, but on x86 it's off by 0x20000000. We use 'X86_64' in the 2092*a1e26a70SApple OSS Distributions # kernel version string plus checking kern_page_size == 4k' as 2093*a1e26a70SApple OSS Distributions # proxy for x86_64, and only adjust SlidBaseAddress if the unslid 2094*a1e26a70SApple OSS Distributions # address is precisely the expected incorrect value. 2095*a1e26a70SApple OSS Distributions # 2096*a1e26a70SApple OSS Distributions is_intel = ('X86_64' in ss.get('osversion', "") and 2097*a1e26a70SApple OSS Distributions ss.get('kernel_page_size', 0) == 4096) 2098*a1e26a70SApple OSS Distributions slidFirstMapping = shared_cache_info.get(SC_SLID_FIRSTMAPPING_KEY, -1) 2099*a1e26a70SApple OSS Distributions if slidFirstMapping >= shared_cache_base_addr: 2100*a1e26a70SApple OSS Distributions shared_cache_base_addr = slidFirstMapping 2101*a1e26a70SApple OSS Distributions sc_note = "base-accurate" 2102*a1e26a70SApple OSS Distributions 2103*a1e26a70SApple OSS Distributions elif is_intel: 2104*a1e26a70SApple OSS Distributions sc_slide = shared_cache_info['imageLoadAddress'] 2105*a1e26a70SApple OSS Distributions if (shared_cache_base_addr - sc_slide) == 0x7fff00000000: 2106*a1e26a70SApple OSS Distributions shared_cache_base_addr += 0x20000000 2107*a1e26a70SApple OSS Distributions sc_note = "base-x86-adjusted" 2108*a1e26a70SApple OSS Distributions extra_note = "Shared cache base adjusted for x86. " 2109*a1e26a70SApple OSS Distributions else: 2110*a1e26a70SApple OSS Distributions sc_note = "base-x86-unknown" 2111*a1e26a70SApple OSS Distributions 2112*a1e26a70SApple OSS Distributions dsc_common = [format_uuid(shared_cache_info['imageUUID']), 2113*a1e26a70SApple OSS Distributions shared_cache_base_addr, "S" ] 2114*a1e26a70SApple OSS Distributions print("Shared cache UUID found from the binary data is <%s> " % str(dsc_common[0])) 2115*a1e26a70SApple OSS Distributions 2116*a1e26a70SApple OSS Distributions dsc_layout = ss.get('system_shared_cache_layout') 2117*a1e26a70SApple OSS Distributions 2118*a1e26a70SApple OSS Distributions dsc_libs = [] 2119*a1e26a70SApple OSS Distributions if dsc_layout: 2120*a1e26a70SApple OSS Distributions print("Found in memory system shared cache layout with {} images".format(len(dsc_layout))) 2121*a1e26a70SApple OSS Distributions slide = ss.get('shared_cache_dyld_load_info')['imageLoadAddress'] 2122*a1e26a70SApple OSS Distributions 2123*a1e26a70SApple OSS Distributions for image in dsc_layout: 2124*a1e26a70SApple OSS Distributions dsc_libs.append([format_uuid(image['imageUUID']), image['imageLoadAddress'] + slide, "C"]) 2125*a1e26a70SApple OSS Distributions 2126*a1e26a70SApple OSS Distributions AllImageCatalog = [] 2127*a1e26a70SApple OSS Distributions obj = {} 2128*a1e26a70SApple OSS Distributions obj["kernel"] = os_version 2129*a1e26a70SApple OSS Distributions if timestamp is not None: 2130*a1e26a70SApple OSS Distributions obj["date"] = timestamp 2131*a1e26a70SApple OSS Distributions obj["reason"] = "kernel panic stackshot" 2132*a1e26a70SApple OSS Distributions obj["incident"] = "ABCDEFGH-1234-56IJ-789K-0LMNOPQRSTUV" 2133*a1e26a70SApple OSS Distributions obj["crashReporterKey"] = "12ab34cd45aabbccdd6712ab34cd45aabbccdd67" 2134*a1e26a70SApple OSS Distributions obj["bootArgs"] = ss.get('boot_args','') 2135*a1e26a70SApple OSS Distributions obj["frontmostPids"] = [0] 2136*a1e26a70SApple OSS Distributions obj["exception"] = "0xDEADF157" 2137*a1e26a70SApple OSS Distributions obj["processByPid"] = {} 2138*a1e26a70SApple OSS Distributions if sc_note is not None: 2139*a1e26a70SApple OSS Distributions obj["sharedCacheNote"] = sc_note 2140*a1e26a70SApple OSS Distributions 2141*a1e26a70SApple OSS Distributions if incomplete: 2142*a1e26a70SApple OSS Distributions obj["reason"] = "!!!INCOMPLETE!!! kernel panic stackshot" 2143*a1e26a70SApple OSS Distributions obj["notes"] = "Generated by xnu kcdata.py from incomplete data! Some information is missing! " 2144*a1e26a70SApple OSS Distributions else: 2145*a1e26a70SApple OSS Distributions obj["notes"] = "Generated by xnu kcdata.py. " 2146*a1e26a70SApple OSS Distributions 2147*a1e26a70SApple OSS Distributions if extra_note is not None: 2148*a1e26a70SApple OSS Distributions obj["notes"] = obj["notes"] + extra_note 2149*a1e26a70SApple OSS Distributions 2150*a1e26a70SApple OSS Distributions processByPid = obj["processByPid"] 2151*a1e26a70SApple OSS Distributions ssplist = ss.get('task_snapshots', {}) 2152*a1e26a70SApple OSS Distributions ssplist.update(ss.get('transitioning_task_snapshots', {})) 2153*a1e26a70SApple OSS Distributions kern_load_info = [] 2154*a1e26a70SApple OSS Distributions if "0" in ssplist: 2155*a1e26a70SApple OSS Distributions kc_uuid = ssplist["0"].get('kernelcache_load_info', None) 2156*a1e26a70SApple OSS Distributions if kc_uuid: 2157*a1e26a70SApple OSS Distributions kernelcache_uuid = [format_uuid(kc_uuid['imageUUID']), kc_uuid['imageLoadAddress'], "U" ] 2158*a1e26a70SApple OSS Distributions kern_load_info.append(kernelcache_uuid) 2159*a1e26a70SApple OSS Distributions 2160*a1e26a70SApple OSS Distributions kl_infos = ssplist["0"].get("dyld_load_info", []) 2161*a1e26a70SApple OSS Distributions for dlinfo in kl_infos: 2162*a1e26a70SApple OSS Distributions kern_load_info.append([format_uuid(dlinfo['imageUUID']), dlinfo['imageLoadAddress'], "K"]) 2163*a1e26a70SApple OSS Distributions 2164*a1e26a70SApple OSS Distributions kl_infos_text_exec = ssplist["0"].get("dyld_load_info_text_exec", []) 2165*a1e26a70SApple OSS Distributions for dlinfo in kl_infos_text_exec: 2166*a1e26a70SApple OSS Distributions kern_load_info.append([format_uuid(dlinfo['imageUUID']), dlinfo['imageLoadAddress'], "T"]) 2167*a1e26a70SApple OSS Distributions 2168*a1e26a70SApple OSS Distributions for pid,piddata in sorted(ssplist.items()): 2169*a1e26a70SApple OSS Distributions processByPid[str(pid)] = {} 2170*a1e26a70SApple OSS Distributions tsnap = processByPid[str(pid)] 2171*a1e26a70SApple OSS Distributions pr_lib_dsc = dsc_common 2172*a1e26a70SApple OSS Distributions 2173*a1e26a70SApple OSS Distributions # see if there's an alternate shared cache 2174*a1e26a70SApple OSS Distributions scd = piddata.get('shared_cache_dyld_load_info') 2175*a1e26a70SApple OSS Distributions if scd is not None: 2176*a1e26a70SApple OSS Distributions if 'imageSlidBaseAddress' not in scd: 2177*a1e26a70SApple OSS Distributions print("Specific task shared cache format does not include slid shared cache base address. Skipping writing report.") 2178*a1e26a70SApple OSS Distributions return 2179*a1e26a70SApple OSS Distributions 2180*a1e26a70SApple OSS Distributions scd_uuid = format_uuid(scd['imageUUID']) 2181*a1e26a70SApple OSS Distributions scd_base_addr = scd['imageSlidBaseAddress'] 2182*a1e26a70SApple OSS Distributions pr_lib_dsc = [scd_uuid, scd_base_addr, "S"] 2183*a1e26a70SApple OSS Distributions 2184*a1e26a70SApple OSS Distributions pr_libs = [] 2185*a1e26a70SApple OSS Distributions if len(dsc_libs) == 0 and pr_lib_dsc: 2186*a1e26a70SApple OSS Distributions pr_libs.append(pr_lib_dsc) 2187*a1e26a70SApple OSS Distributions _lib_type = "P" 2188*a1e26a70SApple OSS Distributions if int(pid) == 0: 2189*a1e26a70SApple OSS Distributions _lib_type = "K" 2190*a1e26a70SApple OSS Distributions pr_libs = [] 2191*a1e26a70SApple OSS Distributions else: 2192*a1e26a70SApple OSS Distributions for dlinfo in piddata.get('dyld_load_info',[]): 2193*a1e26a70SApple OSS Distributions pr_libs.append([format_uuid(dlinfo['imageUUID']), dlinfo['imageLoadAddress'], _lib_type]) 2194*a1e26a70SApple OSS Distributions 2195*a1e26a70SApple OSS Distributions pr_libs.extend(kern_load_info) 2196*a1e26a70SApple OSS Distributions pr_libs.extend(dsc_libs) 2197*a1e26a70SApple OSS Distributions 2198*a1e26a70SApple OSS Distributions if 'jit_address_range' in piddata: 2199*a1e26a70SApple OSS Distributions address_range = piddata.get('jit_address_range', {}) 2200*a1e26a70SApple OSS Distributions tsnap['jitStartAddress'] = address_range['start_address'] 2201*a1e26a70SApple OSS Distributions tsnap['jitEndAddress'] = address_range['end_address'] 2202*a1e26a70SApple OSS Distributions pr_libs.append([format_uuid("00000000000000000000000000000000"), tsnap['jitStartAddress'] , "J"]) 2203*a1e26a70SApple OSS Distributions pr_libs.sort(key=itemgetter(1)) 2204*a1e26a70SApple OSS Distributions ttsnap = piddata.get('transitioning_task_snapshot', None) 2205*a1e26a70SApple OSS Distributions if ttsnap is not None: 2206*a1e26a70SApple OSS Distributions # Transitioning task snapshots have "tts_" prefixes; change them to 2207*a1e26a70SApple OSS Distributions # "ts_". 2208*a1e26a70SApple OSS Distributions ttsnap = { key[1:] : value for key,value in ttsnap.items() } 2209*a1e26a70SApple OSS Distributions # Add a note to let people know 2210*a1e26a70SApple OSS Distributions obj["notes"] = obj["notes"] + "PID {} is a transitioning (exiting) task. ".format(pid) 2211*a1e26a70SApple OSS Distributions tasksnap = piddata.get('task_snapshot', ttsnap) 2212*a1e26a70SApple OSS Distributions if tasksnap is None: 2213*a1e26a70SApple OSS Distributions continue 2214*a1e26a70SApple OSS Distributions tsnap["pid"] = tasksnap["ts_pid"] 2215*a1e26a70SApple OSS Distributions if 'ts_asid' in piddata: 2216*a1e26a70SApple OSS Distributions tsnap["asid"] = piddata["ts_asid"] 2217*a1e26a70SApple OSS Distributions 2218*a1e26a70SApple OSS Distributions if 'ts_pagetable' in piddata: 2219*a1e26a70SApple OSS Distributions pagetables = [] 2220*a1e26a70SApple OSS Distributions for tte in piddata["ts_pagetable"]: 2221*a1e26a70SApple OSS Distributions pagetables.append(tte) 2222*a1e26a70SApple OSS Distributions tsnap["pageTables"] = pagetables 2223*a1e26a70SApple OSS Distributions 2224*a1e26a70SApple OSS Distributions # Some fields are missing from transitioning_task snapshots. 2225*a1e26a70SApple OSS Distributions if ttsnap is None: 2226*a1e26a70SApple OSS Distributions tsnap["residentMemoryBytes"] = tasksnap["ts_task_size"] 2227*a1e26a70SApple OSS Distributions tsnap["timesDidThrottle"] = tasksnap["ts_did_throttle"] 2228*a1e26a70SApple OSS Distributions tsnap["systemTimeTask"] = GetSecondsFromMATime(tasksnap["ts_system_time_in_terminated_th"], timebase) 2229*a1e26a70SApple OSS Distributions tsnap["pageIns"] = tasksnap["ts_pageins"] 2230*a1e26a70SApple OSS Distributions tsnap["pageFaults"] = tasksnap["ts_faults"] 2231*a1e26a70SApple OSS Distributions tsnap["userTimeTask"] = GetSecondsFromMATime(tasksnap["ts_user_time_in_terminated_thre"], timebase) 2232*a1e26a70SApple OSS Distributions tsnap["procname"] = tasksnap["ts_p_comm"] 2233*a1e26a70SApple OSS Distributions if ttsnap is None: 2234*a1e26a70SApple OSS Distributions tsnap["copyOnWriteFaults"] = tasksnap["ts_cow_faults"] 2235*a1e26a70SApple OSS Distributions tsnap["timesThrottled"] = tasksnap["ts_was_throttled"] 2236*a1e26a70SApple OSS Distributions tsnap["threadById"] = {} 2237*a1e26a70SApple OSS Distributions threadByID = tsnap["threadById"] 2238*a1e26a70SApple OSS Distributions thlist = piddata.get('thread_snapshots', {}) 2239*a1e26a70SApple OSS Distributions for tid,thdata in sorted(thlist.items()): 2240*a1e26a70SApple OSS Distributions threadByID[str(tid)] = {} 2241*a1e26a70SApple OSS Distributions thsnap = threadByID[str(tid)] 2242*a1e26a70SApple OSS Distributions if "thread_snapshot" not in thdata: 2243*a1e26a70SApple OSS Distributions print("Found broken thread state for thread ID: %s." % tid) 2244*a1e26a70SApple OSS Distributions break 2245*a1e26a70SApple OSS Distributions threadsnap = thdata["thread_snapshot"] 2246*a1e26a70SApple OSS Distributions thsnap["userTime"] = GetSecondsFromMATime(threadsnap["ths_user_time"], timebase) 2247*a1e26a70SApple OSS Distributions thsnap["id"] = threadsnap["ths_thread_id"] 2248*a1e26a70SApple OSS Distributions thsnap["basePriority"] = threadsnap["ths_base_priority"] 2249*a1e26a70SApple OSS Distributions thsnap["systemTime"] = GetSecondsFromMATime(threadsnap["ths_sys_time"], timebase) 2250*a1e26a70SApple OSS Distributions thsnap["schedPriority"] = threadsnap["ths_sched_priority"] 2251*a1e26a70SApple OSS Distributions thsnap["state"] = GetStateDescription(threadsnap['ths_state']) 2252*a1e26a70SApple OSS Distributions thsnap["qosEffective"] = threadsnap["ths_eqos"] 2253*a1e26a70SApple OSS Distributions thsnap["qosRequested"] = threadsnap["ths_rqos"] 2254*a1e26a70SApple OSS Distributions 2255*a1e26a70SApple OSS Distributions if "pth_name" in thdata: 2256*a1e26a70SApple OSS Distributions thsnap["name"] = thdata["pth_name"] 2257*a1e26a70SApple OSS Distributions 2258*a1e26a70SApple OSS Distributions if threadsnap['ths_continuation']: 2259*a1e26a70SApple OSS Distributions thsnap["continuation"] = GetSymbolInfoForFrame(AllImageCatalog, pr_libs, threadsnap['ths_continuation']) 2260*a1e26a70SApple OSS Distributions if "kernel_stack_frames" in thdata: 2261*a1e26a70SApple OSS Distributions kuserframes = [] 2262*a1e26a70SApple OSS Distributions for f in thdata["kernel_stack_frames"]: 2263*a1e26a70SApple OSS Distributions kuserframes.append(GetSymbolInfoForFrame(AllImageCatalog, pr_libs, f['lr'])) 2264*a1e26a70SApple OSS Distributions notesBuilder = NotesBuilder(tsnap['pid'], tid) 2265*a1e26a70SApple OSS Distributions InsertExclavesFrames(AllImageCatalog, j, thdata, notesBuilder, kuserframes) 2266*a1e26a70SApple OSS Distributions if not notesBuilder.isEmpty(): 2267*a1e26a70SApple OSS Distributions obj['notes'] += notesBuilder.text() 2268*a1e26a70SApple OSS Distributions thsnap["kernelFrames"] = kuserframes 2269*a1e26a70SApple OSS Distributions 2270*a1e26a70SApple OSS Distributions if "user_stack_frames" in thdata: 2271*a1e26a70SApple OSS Distributions uframes = [] 2272*a1e26a70SApple OSS Distributions for f in thdata["user_stack_frames"]: 2273*a1e26a70SApple OSS Distributions uframes.append(GetSymbolInfoForFrame(AllImageCatalog, pr_libs, f['lr'])) 2274*a1e26a70SApple OSS Distributions thsnap["userFrames"] = uframes 2275*a1e26a70SApple OSS Distributions 2276*a1e26a70SApple OSS Distributions if "user_stacktop" in thdata: 2277*a1e26a70SApple OSS Distributions (address,) = struct.unpack("<Q", struct.pack("B"*8, *thdata["user_stacktop"]["stack_contents"])) 2278*a1e26a70SApple OSS Distributions thsnap["userStacktop"] = GetSymbolInfoForFrame(AllImageCatalog, pr_libs, address) 2279*a1e26a70SApple OSS Distributions 2280*a1e26a70SApple OSS Distributions if threadsnap['ths_wait_event']: 2281*a1e26a70SApple OSS Distributions thsnap["waitEvent"] = GetSymbolInfoForFrame(AllImageCatalog, pr_libs, threadsnap['ths_wait_event']) 2282*a1e26a70SApple OSS Distributions 2283*a1e26a70SApple OSS Distributions if 'thread_waitinfo' in piddata and 'thread_turnstileinfo' in piddata: 2284*a1e26a70SApple OSS Distributions tsnap['waitInfo'] = formatWaitInfoWithTurnstiles(piddata['thread_waitinfo'], piddata['thread_turnstileinfo'], piddata.get('portlabels', None)) 2285*a1e26a70SApple OSS Distributions elif 'thread_waitinfo' in piddata: 2286*a1e26a70SApple OSS Distributions portlabels = ss.get('portlabels', None) 2287*a1e26a70SApple OSS Distributions tsnap['waitInfo'] = [formatWaitInfo(x, False, portlabels) for x in piddata['thread_waitinfo']] 2288*a1e26a70SApple OSS Distributions if 'stackshot_task_codesigning_info' in piddata: 2289*a1e26a70SApple OSS Distributions csinfo = piddata.get('stackshot_task_codesigning_info', {}) 2290*a1e26a70SApple OSS Distributions tsnap['csFlags'] = csinfo['csflags'] 2291*a1e26a70SApple OSS Distributions tsnap['csTrustLevel'] = csinfo['cs_trust_level'] 2292*a1e26a70SApple OSS Distributions if 'suspension_info' in piddata: 2293*a1e26a70SApple OSS Distributions suspinfo = piddata.get('suspension_info', {}) 2294*a1e26a70SApple OSS Distributions tsnap['suspension_count'] = suspinfo['tss_count'] 2295*a1e26a70SApple OSS Distributions tsnap['suspension_duration_secs'] = GetSecondsFromMATime(suspinfo['tss_duration'], timebase) 2296*a1e26a70SApple OSS Distributions tsnap['suspension_last_start'] = GetSecondsFromMATime(suspinfo['tss_last_start'], timebase) 2297*a1e26a70SApple OSS Distributions tsnap['suspension_last_end'] = GetSecondsFromMATime(suspinfo['tss_last_end'], timebase) 2298*a1e26a70SApple OSS Distributions 2299*a1e26a70SApple OSS Distributions suspsources = piddata.get('suspension_source', []) 2300*a1e26a70SApple OSS Distributions suspension_sources = [] 2301*a1e26a70SApple OSS Distributions for source in filter(lambda x: x['tss_time'] != 0, suspsources): 2302*a1e26a70SApple OSS Distributions suspension_sources.append({ 2303*a1e26a70SApple OSS Distributions 'suspension_time': GetSecondsFromMATime(source['tss_time'], timebase), 2304*a1e26a70SApple OSS Distributions 'suspension_tid': source['tss_tid'], 2305*a1e26a70SApple OSS Distributions 'suspension_pid': source['tss_pid'], 2306*a1e26a70SApple OSS Distributions 'suspension_procname': source['tss_procname'], 2307*a1e26a70SApple OSS Distributions }) 2308*a1e26a70SApple OSS Distributions 2309*a1e26a70SApple OSS Distributions tsnap['suspension_sources'] = suspension_sources 2310*a1e26a70SApple OSS Distributions # check if process is currently suspended 2311*a1e26a70SApple OSS Distributions if tsnap['suspension_last_start'] > tsnap['suspension_last_end']: 2312*a1e26a70SApple OSS Distributions obj['notes'] += "\nPID {} ({}) is currently suspended (count: {}, total duration: {:.4f}s, last_start: {:.4f}, last_end: {:.4f}) - recent suspensions are:\n".format(pid, tsnap['procname'], tsnap['suspension_count'], tsnap['suspension_duration_secs'], tsnap['suspension_last_start'], tsnap['suspension_last_end']) 2313*a1e26a70SApple OSS Distributions for source in suspension_sources: 2314*a1e26a70SApple OSS Distributions obj['notes'] += "From PID {} TID {} ({}) - at {}\n".format(source['suspension_pid'], source['suspension_tid'], source['suspension_procname'], source['suspension_time']) 2315*a1e26a70SApple OSS Distributions 2316*a1e26a70SApple OSS Distributions obj['binaryImages'] = AllImageCatalog 2317*a1e26a70SApple OSS Distributions if outfile_name == '-': 2318*a1e26a70SApple OSS Distributions fh = sys.stdout 2319*a1e26a70SApple OSS Distributions else: 2320*a1e26a70SApple OSS Distributions fh = open(outfile_name, "w") 2321*a1e26a70SApple OSS Distributions 2322*a1e26a70SApple OSS Distributions header = {} 2323*a1e26a70SApple OSS Distributions header['bug_type'] = 288 2324*a1e26a70SApple OSS Distributions if timestamp is not None: 2325*a1e26a70SApple OSS Distributions header['timestamp'] = timestamp 2326*a1e26a70SApple OSS Distributions header['os_version'] = os_version 2327*a1e26a70SApple OSS Distributions fh.write(json.dumps(header, sort_keys=True)) 2328*a1e26a70SApple OSS Distributions fh.write("\n") 2329*a1e26a70SApple OSS Distributions 2330*a1e26a70SApple OSS Distributions fh.write(json.dumps(obj, sort_keys=True, indent=2, separators=(',', ': '))) 2331*a1e26a70SApple OSS Distributions fh.close() 2332*a1e26a70SApple OSS Distributions 2333*a1e26a70SApple OSS Distributions 2334*a1e26a70SApple OSS Distributions@contextlib.contextmanager 2335*a1e26a70SApple OSS Distributionsdef data_from_stream(stream): 2336*a1e26a70SApple OSS Distributions try: 2337*a1e26a70SApple OSS Distributions fmap = mmap.mmap(stream.fileno(), 0, mmap.MAP_SHARED, mmap.PROT_READ) 2338*a1e26a70SApple OSS Distributions except Exception: 2339*a1e26a70SApple OSS Distributions yield stream.buffer.read() 2340*a1e26a70SApple OSS Distributions else: 2341*a1e26a70SApple OSS Distributions try: 2342*a1e26a70SApple OSS Distributions yield fmap 2343*a1e26a70SApple OSS Distributions finally: 2344*a1e26a70SApple OSS Distributions fmap.close() 2345*a1e26a70SApple OSS Distributions 2346*a1e26a70SApple OSS Distributionsdef iterate_kcdatas(kcdata_file): 2347*a1e26a70SApple OSS Distributions with data_from_stream(kcdata_file) as data: 2348*a1e26a70SApple OSS Distributions iterator = kcdata_item_iterator(data) 2349*a1e26a70SApple OSS Distributions kcdata_buffer = KCObject.FromKCItem(next(iterator)) 2350*a1e26a70SApple OSS Distributions 2351*a1e26a70SApple OSS Distributions if isinstance(kcdata_buffer, KCCompressedBufferObject): 2352*a1e26a70SApple OSS Distributions kcdata_buffer.ReadItems(iterator) 2353*a1e26a70SApple OSS Distributions decompressed = kcdata_buffer.Decompress(data) 2354*a1e26a70SApple OSS Distributions iterator = kcdata_item_iterator(decompressed) 2355*a1e26a70SApple OSS Distributions kcdata_buffer = KCObject.FromKCItem(next(iterator)) 2356*a1e26a70SApple OSS Distributions 2357*a1e26a70SApple OSS Distributions if not isinstance(kcdata_buffer, KCBufferObject): 2358*a1e26a70SApple OSS Distributions # ktrace stackshot chunk 2359*a1e26a70SApple OSS Distributions iterator = kcdata_item_iterator(data[16:]) 2360*a1e26a70SApple OSS Distributions kcdata_buffer = KCObject.FromKCItem(next(iterator)) 2361*a1e26a70SApple OSS Distributions 2362*a1e26a70SApple OSS Distributions if not isinstance(kcdata_buffer, KCBufferObject): 2363*a1e26a70SApple OSS Distributions try: 2364*a1e26a70SApple OSS Distributions decoded = base64.b64decode(data) 2365*a1e26a70SApple OSS Distributions except Exception: 2366*a1e26a70SApple OSS Distributions pass 2367*a1e26a70SApple OSS Distributions else: 2368*a1e26a70SApple OSS Distributions iterator = kcdata_item_iterator(decoded) 2369*a1e26a70SApple OSS Distributions kcdata_buffer = KCObject.FromKCItem(next(iterator)) 2370*a1e26a70SApple OSS Distributions if not isinstance(kcdata_buffer, KCBufferObject): 2371*a1e26a70SApple OSS Distributions import gzip 2372*a1e26a70SApple OSS Distributions from io import BytesIO 2373*a1e26a70SApple OSS Distributions try: 2374*a1e26a70SApple OSS Distributions decompressed = gzip.GzipFile(fileobj=BytesIO(data[:])).read() 2375*a1e26a70SApple OSS Distributions except Exception: 2376*a1e26a70SApple OSS Distributions pass 2377*a1e26a70SApple OSS Distributions else: 2378*a1e26a70SApple OSS Distributions iterator = kcdata_item_iterator(decompressed) 2379*a1e26a70SApple OSS Distributions kcdata_buffer = KCObject.FromKCItem(next(iterator)) 2380*a1e26a70SApple OSS Distributions 2381*a1e26a70SApple OSS Distributions if not isinstance(kcdata_buffer, KCBufferObject): 2382*a1e26a70SApple OSS Distributions raise Exception("unknown file type") 2383*a1e26a70SApple OSS Distributions 2384*a1e26a70SApple OSS Distributions 2385*a1e26a70SApple OSS Distributions kcdata_buffer.ReadItems(iterator) 2386*a1e26a70SApple OSS Distributions yield kcdata_buffer 2387*a1e26a70SApple OSS Distributions 2388*a1e26a70SApple OSS Distributions for magic in iterator: 2389*a1e26a70SApple OSS Distributions kcdata_buffer = KCObject.FromKCItem(magic) 2390*a1e26a70SApple OSS Distributions if kcdata_buffer.i_type == 0: 2391*a1e26a70SApple OSS Distributions continue 2392*a1e26a70SApple OSS Distributions if not isinstance(kcdata_buffer, KCBufferObject): 2393*a1e26a70SApple OSS Distributions raise Exception("unknown file type") 2394*a1e26a70SApple OSS Distributions kcdata_buffer.ReadItems(iterator) 2395*a1e26a70SApple OSS Distributions yield kcdata_buffer 2396*a1e26a70SApple OSS Distributions 2397*a1e26a70SApple OSS Distributions# 2398*a1e26a70SApple OSS Distributions# Values for various flag fields. Each entry's key is the key seen in the 2399*a1e26a70SApple OSS Distributions# processed kcdata, the value is an array of bits, from low (0x1) to high, with 2400*a1e26a70SApple OSS Distributions# either a string flag name or None for unused holes. 2401*a1e26a70SApple OSS Distributions# 2402*a1e26a70SApple OSS Distributions# Only put flags in here which are stable - this is run against stackshots 2403*a1e26a70SApple OSS Distributions# of all different versions. For anything unstable, we'll need a decoder ring 2404*a1e26a70SApple OSS Distributions# added to the stackshot. 2405*a1e26a70SApple OSS Distributions# 2406*a1e26a70SApple OSS DistributionsPRETTIFY_FLAGS = { 2407*a1e26a70SApple OSS Distributions 'jcs_flags': [ 2408*a1e26a70SApple OSS Distributions 'kCoalitionTermRequested', 2409*a1e26a70SApple OSS Distributions 'kCoalitionTerminated', 2410*a1e26a70SApple OSS Distributions 'kCoalitionReaped', 2411*a1e26a70SApple OSS Distributions 'kCoalitionPrivileged', 2412*a1e26a70SApple OSS Distributions ], 2413*a1e26a70SApple OSS Distributions 'sharedCacheFlags': [ 2414*a1e26a70SApple OSS Distributions 'kSharedCacheSystemPrimary', 2415*a1e26a70SApple OSS Distributions 'kSharedCacheDriverkit' 2416*a1e26a70SApple OSS Distributions 'kSharedCacheAOT', 2417*a1e26a70SApple OSS Distributions ], 2418*a1e26a70SApple OSS Distributions 'stackshot_in_flags': [ # STACKSHOT_*, also stackshot_out_flags 2419*a1e26a70SApple OSS Distributions 'get_dq', 2420*a1e26a70SApple OSS Distributions 'save_loadinfo', 2421*a1e26a70SApple OSS Distributions 'get_global_mem_stats', 2422*a1e26a70SApple OSS Distributions 'save_kext_loadinfo', 2423*a1e26a70SApple OSS Distributions None, 2424*a1e26a70SApple OSS Distributions None, 2425*a1e26a70SApple OSS Distributions None, 2426*a1e26a70SApple OSS Distributions None, 2427*a1e26a70SApple OSS Distributions 'active_kernel_threads_only', 2428*a1e26a70SApple OSS Distributions 'get_boot_profile', 2429*a1e26a70SApple OSS Distributions 'do_compress', 2430*a1e26a70SApple OSS Distributions None, 2431*a1e26a70SApple OSS Distributions None, 2432*a1e26a70SApple OSS Distributions 'save_imp_donation_pids', 2433*a1e26a70SApple OSS Distributions 'save_in_kernel_buffer', 2434*a1e26a70SApple OSS Distributions 'retrieve_existing_buffer', 2435*a1e26a70SApple OSS Distributions 'kcdata_format', 2436*a1e26a70SApple OSS Distributions 'enable_bt_faulting', 2437*a1e26a70SApple OSS Distributions 'collect_delta_snapshot', 2438*a1e26a70SApple OSS Distributions 'collect_sharedcache_layout', 2439*a1e26a70SApple OSS Distributions 'trylock', 2440*a1e26a70SApple OSS Distributions 'enable_uuid_faulting', 2441*a1e26a70SApple OSS Distributions 'from_panic', 2442*a1e26a70SApple OSS Distributions 'no_io_stats', 2443*a1e26a70SApple OSS Distributions 'thread_waitinfo', 2444*a1e26a70SApple OSS Distributions 'thread_group', 2445*a1e26a70SApple OSS Distributions 'save_jetsam_coalitions', 2446*a1e26a70SApple OSS Distributions 'instrs_cycles', 2447*a1e26a70SApple OSS Distributions 'asid', 2448*a1e26a70SApple OSS Distributions 'page_tables', 2449*a1e26a70SApple OSS Distributions 'disable_latency_info', 2450*a1e26a70SApple OSS Distributions 'save_dyld_compactinfo', 2451*a1e26a70SApple OSS Distributions 'include_driver_threads_in_kernel', 2452*a1e26a70SApple OSS Distributions 'exclaves', 2453*a1e26a70SApple OSS Distributions ], 2454*a1e26a70SApple OSS Distributions 'system_state_flags': [ 2455*a1e26a70SApple OSS Distributions 'kUser64_p', 2456*a1e26a70SApple OSS Distributions 'kKern64_p', 2457*a1e26a70SApple OSS Distributions ], 2458*a1e26a70SApple OSS Distributions 'tgs_flags': [ 2459*a1e26a70SApple OSS Distributions 'kThreadGroupEfficient', 2460*a1e26a70SApple OSS Distributions 'kThreadGroupApplication', 2461*a1e26a70SApple OSS Distributions 'kThreadGroupCritical', 2462*a1e26a70SApple OSS Distributions 'kThreadGroupBestEffort', 2463*a1e26a70SApple OSS Distributions None, 2464*a1e26a70SApple OSS Distributions None, 2465*a1e26a70SApple OSS Distributions None, 2466*a1e26a70SApple OSS Distributions None, 2467*a1e26a70SApple OSS Distributions 'kThreadGroupUIApplication', 2468*a1e26a70SApple OSS Distributions 'kThreadGroupManaged', 2469*a1e26a70SApple OSS Distributions 'kThreadGroupStrictTimers', 2470*a1e26a70SApple OSS Distributions ], 2471*a1e26a70SApple OSS Distributions 'ths_ss_flags': [ 2472*a1e26a70SApple OSS Distributions 'kUser64_p', 2473*a1e26a70SApple OSS Distributions 'kKern64_p', 2474*a1e26a70SApple OSS Distributions 'kHasDispatchSerial', 2475*a1e26a70SApple OSS Distributions 'kStacksPCOnly', 2476*a1e26a70SApple OSS Distributions 'kThreadDarwinBG', 2477*a1e26a70SApple OSS Distributions 'kThreadIOPassive', 2478*a1e26a70SApple OSS Distributions 'kThreadSuspended', 2479*a1e26a70SApple OSS Distributions 'kThreadTruncatedBT', 2480*a1e26a70SApple OSS Distributions 'kGlobalForcedIdle', 2481*a1e26a70SApple OSS Distributions 'kThreadFaultedBT', 2482*a1e26a70SApple OSS Distributions 'kThreadTriedFaultBT', 2483*a1e26a70SApple OSS Distributions 'kThreadOnCore', 2484*a1e26a70SApple OSS Distributions 'kThreadIdleWorker', 2485*a1e26a70SApple OSS Distributions 'kThreadMain', 2486*a1e26a70SApple OSS Distributions 'kThreadTruncKernBT', 2487*a1e26a70SApple OSS Distributions 'kThreadTruncUserBT', 2488*a1e26a70SApple OSS Distributions 'kThreadTruncUserAsyncBT', 2489*a1e26a70SApple OSS Distributions 'kThreadExclaveRPCActive', 2490*a1e26a70SApple OSS Distributions 'kThreadExclaveUpcallActive', 2491*a1e26a70SApple OSS Distributions 'kThreadExclaveSchedulerRequest', 2492*a1e26a70SApple OSS Distributions ], 2493*a1e26a70SApple OSS Distributions 'ths_state': [ 2494*a1e26a70SApple OSS Distributions 'TH_WAIT', 2495*a1e26a70SApple OSS Distributions 'TH_SUSP', 2496*a1e26a70SApple OSS Distributions 'TH_RUN', 2497*a1e26a70SApple OSS Distributions 'TH_UNINT', 2498*a1e26a70SApple OSS Distributions 'TH_TERMINATE', 2499*a1e26a70SApple OSS Distributions 'TH_TERMINATE2', 2500*a1e26a70SApple OSS Distributions 'TH_WAIT_REPORT', 2501*a1e26a70SApple OSS Distributions 'TH_IDLE', 2502*a1e26a70SApple OSS Distributions ], 2503*a1e26a70SApple OSS Distributions 'ts_ss_flags': [ 2504*a1e26a70SApple OSS Distributions 'kUser64_p', 2505*a1e26a70SApple OSS Distributions 'kKern64_p', 2506*a1e26a70SApple OSS Distributions 'kTaskRsrcFlagged', 2507*a1e26a70SApple OSS Distributions 'kTerminatedSnapshot', 2508*a1e26a70SApple OSS Distributions 'kPidSuspended', 2509*a1e26a70SApple OSS Distributions 'kFrozen', 2510*a1e26a70SApple OSS Distributions 'kTaskDarwinBG', 2511*a1e26a70SApple OSS Distributions 'kTaskExtDarwinBG', 2512*a1e26a70SApple OSS Distributions 'kTaskVisVisible', 2513*a1e26a70SApple OSS Distributions 'kTaskVisNonvisible', 2514*a1e26a70SApple OSS Distributions 'kTaskIsForeground', 2515*a1e26a70SApple OSS Distributions 'kTaskIsBoosted', 2516*a1e26a70SApple OSS Distributions 'kTaskIsSuppressed', 2517*a1e26a70SApple OSS Distributions 'kTaskIsTimerThrottled', 2518*a1e26a70SApple OSS Distributions 'kTaskIsImpDonor', 2519*a1e26a70SApple OSS Distributions 'kTaskIsLiveImpDonor', 2520*a1e26a70SApple OSS Distributions 'kTaskIsDirty', 2521*a1e26a70SApple OSS Distributions 'kTaskWqExceededConstrainedThreadLimit', 2522*a1e26a70SApple OSS Distributions 'kTaskWqExceededTotalThreadLimit', 2523*a1e26a70SApple OSS Distributions 'kTaskWqFlagsAvailable', 2524*a1e26a70SApple OSS Distributions 'kTaskUUIDInfoFaultedIn', 2525*a1e26a70SApple OSS Distributions 'kTaskUUIDInfoMissing', 2526*a1e26a70SApple OSS Distributions 'kTaskUUIDInfoTriedFault', 2527*a1e26a70SApple OSS Distributions 'kTaskSharedRegionInfoUnavailable', 2528*a1e26a70SApple OSS Distributions 'kTaskTALEngaged', 2529*a1e26a70SApple OSS Distributions None, 2530*a1e26a70SApple OSS Distributions 'kTaskIsDirtyTracked', 2531*a1e26a70SApple OSS Distributions 'kTaskAllowIdleExit', 2532*a1e26a70SApple OSS Distributions 'kTaskIsTranslated', 2533*a1e26a70SApple OSS Distributions 'kTaskSharedRegionNone', 2534*a1e26a70SApple OSS Distributions 'kTaskSharedRegionSystem', 2535*a1e26a70SApple OSS Distributions 'kTaskSharedRegionOther', 2536*a1e26a70SApple OSS Distributions 'kTaskDyldCompactInfoNone', 2537*a1e26a70SApple OSS Distributions 'kTaskDyldCompactInfoTooBig', 2538*a1e26a70SApple OSS Distributions 'kTaskDyldCompactInfoFaultedIn', 2539*a1e26a70SApple OSS Distributions 'kTaskDyldCompactInfoMissing', 2540*a1e26a70SApple OSS Distributions 'kTaskDyldCompactInfoTriedFault', 2541*a1e26a70SApple OSS Distributions 'kTaskWqExceededCooperativeThreadLimit', 2542*a1e26a70SApple OSS Distributions 'kTaskWqExceededActiveConstrainedThreadLimit', 2543*a1e26a70SApple OSS Distributions ], 2544*a1e26a70SApple OSS Distributions 'turnstile_flags': [ 2545*a1e26a70SApple OSS Distributions 'turnstile_status_unknown', 2546*a1e26a70SApple OSS Distributions 'turnstile_status_locked_waitq', 2547*a1e26a70SApple OSS Distributions 'turnstile_status_workqueue', 2548*a1e26a70SApple OSS Distributions 'turnstile_status_thread', 2549*a1e26a70SApple OSS Distributions 'turnstile_status_blocked_on_task', 2550*a1e26a70SApple OSS Distributions 'turnstile_status_held_iplock', 2551*a1e26a70SApple OSS Distributions ], 2552*a1e26a70SApple OSS Distributions 'portlabel_flags': [ 2553*a1e26a70SApple OSS Distributions 'label_read_failed', 2554*a1e26a70SApple OSS Distributions 'service_throttled', 2555*a1e26a70SApple OSS Distributions ], 2556*a1e26a70SApple OSS Distributions 'esc_flags': [ 2557*a1e26a70SApple OSS Distributions 'kExclaveScresultHaveIPCStack', 2558*a1e26a70SApple OSS Distributions ], 2559*a1e26a70SApple OSS Distributions 'eise_flags': [ 2560*a1e26a70SApple OSS Distributions 'kExclaveIpcStackEntryHaveInvocationID', 2561*a1e26a70SApple OSS Distributions 'kExclaveIpcStackEntryHaveStack', 2562*a1e26a70SApple OSS Distributions ], 2563*a1e26a70SApple OSS Distributions 'eas_flags': [ 2564*a1e26a70SApple OSS Distributions 'kExclaveAddressSpaceHaveSlide', 2565*a1e26a70SApple OSS Distributions ], 2566*a1e26a70SApple OSS Distributions 'etl_flags': [ 2567*a1e26a70SApple OSS Distributions 'kExclaveTextLayoutLoadAddressesSynthetic', 2568*a1e26a70SApple OSS Distributions 'kExclaveTextLayoutLoadAddressesUnslid', 2569*a1e26a70SApple OSS Distributions 'kExclaveTextLayoutHasSharedCache', 2570*a1e26a70SApple OSS Distributions ], 2571*a1e26a70SApple OSS Distributions} 2572*a1e26a70SApple OSS DistributionsPRETTIFY_FLAGS['stackshot_out_flags'] = PRETTIFY_FLAGS['stackshot_in_flags'] 2573*a1e26a70SApple OSS DistributionsPRETTIFY_FLAGS['tts_ss_flags'] = PRETTIFY_FLAGS['ts_ss_flags'] 2574*a1e26a70SApple OSS Distributions 2575*a1e26a70SApple OSS Distributions# Fields which should never be hexified 2576*a1e26a70SApple OSS DistributionsPRETTIFY_DONTHEX = { 2577*a1e26a70SApple OSS Distributions 'stackshot_in_pid': True, 2578*a1e26a70SApple OSS Distributions 'tts_pid': True, 2579*a1e26a70SApple OSS Distributions 'ts_pid': True, 2580*a1e26a70SApple OSS Distributions 'donating_pids': True, 2581*a1e26a70SApple OSS Distributions 'ppid': True, 2582*a1e26a70SApple OSS Distributions} 2583*a1e26a70SApple OSS Distributions 2584*a1e26a70SApple OSS Distributions# Only hex() the value if it is multiple digits 2585*a1e26a70SApple OSS Distributionsdef prettify_hex(v): 2586*a1e26a70SApple OSS Distributions if v < -9 or v > 9: 2587*a1e26a70SApple OSS Distributions return hex(v) 2588*a1e26a70SApple OSS Distributions return str(v) 2589*a1e26a70SApple OSS Distributions 2590*a1e26a70SApple OSS Distributionsdef prettify_flags(v, flags): 2591*a1e26a70SApple OSS Distributions output="" 2592*a1e26a70SApple OSS Distributions seen = 0 2593*a1e26a70SApple OSS Distributions if v == 0: 2594*a1e26a70SApple OSS Distributions return "0" 2595*a1e26a70SApple OSS Distributions for (s, n) in zip(range(len(flags)),flags): 2596*a1e26a70SApple OSS Distributions if n is None: 2597*a1e26a70SApple OSS Distributions continue 2598*a1e26a70SApple OSS Distributions if (v & (2 ** s)): 2599*a1e26a70SApple OSS Distributions output += "|" + n 2600*a1e26a70SApple OSS Distributions seen |= 2 ** s 2601*a1e26a70SApple OSS Distributions if output == "": 2602*a1e26a70SApple OSS Distributions return prettify_hex(v) 2603*a1e26a70SApple OSS Distributions rest = (v & ~seen) 2604*a1e26a70SApple OSS Distributions if (rest != 0): 2605*a1e26a70SApple OSS Distributions output += "|" + prettify_hex(rest) 2606*a1e26a70SApple OSS Distributions return prettify_hex(v) + " (" + output[1:] + ")" 2607*a1e26a70SApple OSS Distributions 2608*a1e26a70SApple OSS Distributionsdef prettify_core(data, mosthex, key, portlabels): 2609*a1e26a70SApple OSS Distributions if key == 'stack_contents': 2610*a1e26a70SApple OSS Distributions (address,) = struct.unpack("<Q", struct.pack("B"*8, *data)) 2611*a1e26a70SApple OSS Distributions return '0x%X' % address 2612*a1e26a70SApple OSS Distributions 2613*a1e26a70SApple OSS Distributions elif isinstance(data, list): 2614*a1e26a70SApple OSS Distributions if 'uuid' in key.lower() and len(data) == 16: 2615*a1e26a70SApple OSS Distributions return '%02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X' % tuple(data) 2616*a1e26a70SApple OSS Distributions 2617*a1e26a70SApple OSS Distributions return [prettify_core(x, mosthex, key, portlabels) for x in data] 2618*a1e26a70SApple OSS Distributions 2619*a1e26a70SApple OSS Distributions elif key == 'thread_waitinfo': 2620*a1e26a70SApple OSS Distributions return formatWaitInfo(data, mosthex, portlabels) 2621*a1e26a70SApple OSS Distributions 2622*a1e26a70SApple OSS Distributions elif isinstance(data, dict): 2623*a1e26a70SApple OSS Distributions if 'portlabels' in data: 2624*a1e26a70SApple OSS Distributions portlabels = data['portlabels'] 2625*a1e26a70SApple OSS Distributions newdata = dict() 2626*a1e26a70SApple OSS Distributions for key, value in data.items(): 2627*a1e26a70SApple OSS Distributions if mosthex and key != 'task_snapshots' and len(key) > 0 and key.isnumeric(): 2628*a1e26a70SApple OSS Distributions key = prettify_hex(int(key)) 2629*a1e26a70SApple OSS Distributions newdata[key] = prettify_core(value, mosthex, key, portlabels) 2630*a1e26a70SApple OSS Distributions return newdata 2631*a1e26a70SApple OSS Distributions 2632*a1e26a70SApple OSS Distributions elif 'address' in key.lower() and isinstance(data, (int, long)): 2633*a1e26a70SApple OSS Distributions return '0x%X' % data 2634*a1e26a70SApple OSS Distributions elif key == 'lr' or key == SC_SLID_FIRSTMAPPING_KEY: 2635*a1e26a70SApple OSS Distributions return '0x%X' % data 2636*a1e26a70SApple OSS Distributions elif key in PRETTIFY_FLAGS and isinstance(data, (int, long)): 2637*a1e26a70SApple OSS Distributions return prettify_flags(data, PRETTIFY_FLAGS[key]) 2638*a1e26a70SApple OSS Distributions elif key.endswith('_flags') and isinstance(data, (int, long)): 2639*a1e26a70SApple OSS Distributions return prettify_hex(data) 2640*a1e26a70SApple OSS Distributions 2641*a1e26a70SApple OSS Distributions elif mosthex and not PRETTIFY_DONTHEX.get(key, False): 2642*a1e26a70SApple OSS Distributions if isinstance(data, (int, long)): 2643*a1e26a70SApple OSS Distributions return prettify_hex(data) 2644*a1e26a70SApple OSS Distributions elif isinstance(data, str) and len(data) > 0 and data.isnumeric(): 2645*a1e26a70SApple OSS Distributions return prettify_hex(int(data)) 2646*a1e26a70SApple OSS Distributions return data 2647*a1e26a70SApple OSS Distributions 2648*a1e26a70SApple OSS Distributions else: 2649*a1e26a70SApple OSS Distributions return data 2650*a1e26a70SApple OSS Distributions 2651*a1e26a70SApple OSS Distributionsdef prettify(data, mosthex): 2652*a1e26a70SApple OSS Distributions return prettify_core(data, mosthex, "", None) 2653*a1e26a70SApple OSS Distributions 2654*a1e26a70SApple OSS Distributions# N.B.: This is called directly from `xnu.py` for `panicdata -S XXX.ips`'s implementation. 2655*a1e26a70SApple OSS Distributionsdef decode_kcdata_file(kcdata_file, stackshot_file, multiple=False, prettyhex=False, pretty=False, output_as_plist=False): 2656*a1e26a70SApple OSS Distributions for i,kcdata_buffer in enumerate(iterate_kcdatas(kcdata_file)): 2657*a1e26a70SApple OSS Distributions if i > 0 and not multiple: 2658*a1e26a70SApple OSS Distributions break 2659*a1e26a70SApple OSS Distributions 2660*a1e26a70SApple OSS Distributions str_data = "{" + kcdata_buffer.GetJsonRepr() + "}" 2661*a1e26a70SApple OSS Distributions str_data = str_data.replace("\t", " ") 2662*a1e26a70SApple OSS Distributions 2663*a1e26a70SApple OSS Distributions try: 2664*a1e26a70SApple OSS Distributions json_obj = json.loads(str_data) 2665*a1e26a70SApple OSS Distributions except Exception: 2666*a1e26a70SApple OSS Distributions print("JSON reparsing failed! Printing string data!\n", file=sys.stderr) 2667*a1e26a70SApple OSS Distributions import textwrap 2668*a1e26a70SApple OSS Distributions print(textwrap.fill(str_data, 100)) 2669*a1e26a70SApple OSS Distributions raise 2670*a1e26a70SApple OSS Distributions 2671*a1e26a70SApple OSS Distributions if prettyhex: 2672*a1e26a70SApple OSS Distributions json_obj = prettify(json_obj, True) 2673*a1e26a70SApple OSS Distributions elif pretty: 2674*a1e26a70SApple OSS Distributions json_obj = prettify(json_obj, False) 2675*a1e26a70SApple OSS Distributions 2676*a1e26a70SApple OSS Distributions if stackshot_file: 2677*a1e26a70SApple OSS Distributions SaveStackshotReport(json_obj, stackshot_file, G.data_was_incomplete) 2678*a1e26a70SApple OSS Distributions elif output_as_plist: 2679*a1e26a70SApple OSS Distributions import Foundation 2680*a1e26a70SApple OSS Distributions plist = Foundation.NSPropertyListSerialization.dataWithPropertyList_format_options_error_( 2681*a1e26a70SApple OSS Distributions json_obj, Foundation.NSPropertyListXMLFormat_v1_0, 0, None)[0].bytes().tobytes() 2682*a1e26a70SApple OSS Distributions #sigh. on some pythons long integers are getting output with L's in the plist. 2683*a1e26a70SApple OSS Distributions plist = re.sub(r'^(\s*<integer>\d+)L(</integer>\s*)$', r"\1\2", BytesToString(plist), flags=re.MULTILINE) 2684*a1e26a70SApple OSS Distributions print(plist,) 2685*a1e26a70SApple OSS Distributions else: 2686*a1e26a70SApple OSS Distributions print(json.dumps(json_obj, sort_keys=True, indent=4, separators=(',', ': '))) 2687*a1e26a70SApple OSS Distributions 2688*a1e26a70SApple OSS Distributionsif __name__ == '__main__': 2689*a1e26a70SApple OSS Distributions parser = argparse.ArgumentParser(description="Decode a kcdata binary file.") 2690*a1e26a70SApple OSS Distributions parser.add_argument("-l", "--listtypes", action="store_true", required=False, default=False, 2691*a1e26a70SApple OSS Distributions help="List all known types", 2692*a1e26a70SApple OSS Distributions dest="list_known_types") 2693*a1e26a70SApple OSS Distributions 2694*a1e26a70SApple OSS Distributions parser.add_argument("-s", "--stackshot", required=False, default=False, 2695*a1e26a70SApple OSS Distributions help="Generate a stackshot report file", 2696*a1e26a70SApple OSS Distributions dest="stackshot_file") 2697*a1e26a70SApple OSS Distributions 2698*a1e26a70SApple OSS Distributions parser.add_argument("--multiple", help="look for multiple stackshots in a single file", action='store_true') 2699*a1e26a70SApple OSS Distributions 2700*a1e26a70SApple OSS Distributions parser.add_argument("-p", "--plist", required=False, default=False, 2701*a1e26a70SApple OSS Distributions help="output as plist", action="store_true") 2702*a1e26a70SApple OSS Distributions 2703*a1e26a70SApple OSS Distributions parser.add_argument("-S", "--sdk", required=False, default="", help="sdk property passed to xcrun command to find the required tools. Default is empty string.", dest="sdk") 2704*a1e26a70SApple OSS Distributions parser.add_argument("-P", "--pretty", default=False, action='store_true', help="make the output a little more human readable") 2705*a1e26a70SApple OSS Distributions parser.add_argument("-X", "--prettyhex", default=False, action='store_true', help="make the output a little more human readable, and print most things as hex") 2706*a1e26a70SApple OSS Distributions parser.add_argument("--incomplete", action='store_true', help="accept incomplete data") 2707*a1e26a70SApple OSS Distributions parser.add_argument("kcdata_file", type=argparse.FileType('r'), help="Path to a kcdata binary file.") 2708*a1e26a70SApple OSS Distributions 2709*a1e26a70SApple OSS Distributions class VerboseAction(argparse.Action): 2710*a1e26a70SApple OSS Distributions def __call__(self, parser, namespace, values, option_string=None): 2711*a1e26a70SApple OSS Distributions logging.basicConfig(level=logging.INFO, stream=sys.stderr, format='%(message)s') 2712*a1e26a70SApple OSS Distributions parser.add_argument('-v', "--verbose", action=VerboseAction, nargs=0) 2713*a1e26a70SApple OSS Distributions 2714*a1e26a70SApple OSS Distributions args = parser.parse_args() 2715*a1e26a70SApple OSS Distributions 2716*a1e26a70SApple OSS Distributions if args.multiple and args.stackshot_file: 2717*a1e26a70SApple OSS Distributions raise NotImplementedError 2718*a1e26a70SApple OSS Distributions 2719*a1e26a70SApple OSS Distributions if args.pretty and args.stackshot_file: 2720*a1e26a70SApple OSS Distributions raise NotImplementedError 2721*a1e26a70SApple OSS Distributions 2722*a1e26a70SApple OSS Distributions if args.list_known_types: 2723*a1e26a70SApple OSS Distributions for (n, t) in KNOWN_TYPES_COLLECTION.items(): 2724*a1e26a70SApple OSS Distributions print("%d : %s " % (n, str(t))) 2725*a1e26a70SApple OSS Distributions sys.exit(1) 2726*a1e26a70SApple OSS Distributions 2727*a1e26a70SApple OSS Distributions if args.incomplete or args.stackshot_file: 2728*a1e26a70SApple OSS Distributions G.accept_incomplete_data = True 2729*a1e26a70SApple OSS Distributions 2730*a1e26a70SApple OSS Distributions decode_kcdata_file(args.kcdata_file, args.stackshot_file, args.multiple, args.prettyhex, args.pretty, args.plist) 2731