1*f6217f89SApple OSS Distributionsfrom xnu import * 2*f6217f89SApple OSS Distributions 3*f6217f89SApple OSS Distributions@lldb_command('showmicrostackshot', 'O:', fancy=True) 4*f6217f89SApple OSS Distributionsdef show_microstackshot(cmd_args=None, cmd_options={}, O=None): 5*f6217f89SApple OSS Distributions """ 6*f6217f89SApple OSS Distributions Show information about the microstackshot subsystem. 7*f6217f89SApple OSS Distributions 8*f6217f89SApple OSS Distributions Usage: (lldb) showmicrostackshot [-O <offset>] 9*f6217f89SApple OSS Distributions """ 10*f6217f89SApple OSS Distributions 11*f6217f89SApple OSS Distributions metadata = kern.GetGlobalVariable('telemetry_metadata') 12*f6217f89SApple OSS Distributions print('metadata:') 13*f6217f89SApple OSS Distributions print('{:>12s}: {}'.format('generation', metadata.tm_generation)) 14*f6217f89SApple OSS Distributions print('{:>12s}: {}'.format('samples', metadata.tm_samples_recorded)) 15*f6217f89SApple OSS Distributions print('{:>12s}: {}'.format('skips', metadata.tm_samples_skipped)) 16*f6217f89SApple OSS Distributions print('{:>12s}: {}'.format('source', metadata.tm_source)) 17*f6217f89SApple OSS Distributions print('{:>12s}: {}'.format('period', metadata.tm_period)) 18*f6217f89SApple OSS Distributions 19*f6217f89SApple OSS Distributions kern_ring = kern.GetGlobalVariable("_telemetry_kernel_ring") 20*f6217f89SApple OSS Distributions print() 21*f6217f89SApple OSS Distributions print('kernel ringbuffer:') 22*f6217f89SApple OSS Distributions print('{:>12s}: {}'.format('capacity', kern_ring.mr_capacity)) 23*f6217f89SApple OSS Distributions print('{:>12s}: {}'.format('head', kern_ring.mr_head_tail.mrht_head)) 24*f6217f89SApple OSS Distributions print('{:>12s}: {}'.format('tail', kern_ring.mr_head_tail.mrht_tail)) 25*f6217f89SApple OSS Distributions print('{:>12s}: {}'.format('available', (kern_ring.mr_head_tail.mrht_tail - kern_ring.mr_head_tail.mrht_head) % kern_ring.mr_capacity)) 26*f6217f89SApple OSS Distributions 27*f6217f89SApple OSS Distributions if kern_ring.mr_head_tail.mrht_tail & 0x3 != 0: 28*f6217f89SApple OSS Distributions print('tail is not aligned') 29*f6217f89SApple OSS Distributions return 30*f6217f89SApple OSS Distributions 31*f6217f89SApple OSS Distributions print() 32*f6217f89SApple OSS Distributions print('kernel samples:') 33*f6217f89SApple OSS Distributions base_kern_text = kern.GetGlobalVariable('vm_kernel_stext') 34*f6217f89SApple OSS Distributions 35*f6217f89SApple OSS Distributions next_record = unsigned(cmd_options.get('-O') or kern_ring.mr_head_tail.mrht_tail) 36*f6217f89SApple OSS Distributions print(next_record) 37*f6217f89SApple OSS Distributions while (kern_ring.mr_head_tail.mrht_head - next_record) > 0: 38*f6217f89SApple OSS Distributions next_record_ptr = kern_ring.mr_buffer + (next_record % kern_ring.mr_capacity) 39*f6217f89SApple OSS Distributions next_sample = kern.GetValueFromAddress(next_record_ptr, 'struct _telemetry_kernel_sample *') 40*f6217f89SApple OSS Distributions if next_sample.tks_magic != xnudefines.TKS_MAGIC: 41*f6217f89SApple OSS Distributions print('magic value for sample at position {} is {}, not {}'.format( 42*f6217f89SApple OSS Distributions next_record % kern_ring.mr_capacity, next_sample.tks_magic, 43*f6217f89SApple OSS Distributions xnudefines.TKS_MAGIC)) 44*f6217f89SApple OSS Distributions break 45*f6217f89SApple OSS Distributions print('{}.{:09d}: @{} thread 0x{:x} on CPU {}:'.format(next_sample.tks_time_secs, 46*f6217f89SApple OSS Distributions next_sample.tks_time_usecs * 1000, next_record, next_sample.tks_thread_id, 47*f6217f89SApple OSS Distributions next_sample.tks_cpu)) 48*f6217f89SApple OSS Distributions call_stack_size = unsigned(next_sample.tks_call_stack_size) 49*f6217f89SApple OSS Distributions next_record += sizeof('struct _telemetry_kernel_sample') + call_stack_size 50*f6217f89SApple OSS Distributions call_stack = Cast(addressof(next_sample[1]), 'uint32_t *') 51*f6217f89SApple OSS Distributions for i in range(call_stack_size // 4): 52*f6217f89SApple OSS Distributions if call_stack[i] == 0: 53*f6217f89SApple OSS Distributions continue 54*f6217f89SApple OSS Distributions addr = base_kern_text + call_stack[i] 55*f6217f89SApple OSS Distributions syms = kern.SymbolicateFromAddress(addr) 56*f6217f89SApple OSS Distributions name = syms[0].GetName() if syms else '... try showkmodaddr ...' 57*f6217f89SApple OSS Distributions print('\t0x{:16x} ({})'.format(addr, name)) 58*f6217f89SApple OSS Distributions 59*f6217f89SApple OSS Distributions print('end at {}'.format(next_record)) 60