1*43a90889SApple OSS Distributions""" Please make sure you read the README file COMPLETELY BEFORE reading anything below. 2*43a90889SApple OSS Distributions It is very critical that you read coding guidelines in Section E in README file. 3*43a90889SApple OSS Distributions""" 4*43a90889SApple OSS Distributionsfrom process import GetProcFromTask 5*43a90889SApple OSS Distributionsfrom utils import Cast, GetEnumName 6*43a90889SApple OSS Distributionsfrom core.kernelcore import IterateLinkageChain 7*43a90889SApple OSS Distributionsfrom core.cvalue import addressof 8*43a90889SApple OSS Distributionsfrom core.standard import VT, ArgumentError 9*43a90889SApple OSS Distributionsfrom core.configuration import config, vHUMAN 10*43a90889SApple OSS Distributionsfrom xnu import kern, header, lldb_command, lldb_type_summary 11*43a90889SApple OSS Distributions 12*43a90889SApple OSS Distributions 13*43a90889SApple OSS Distributions@header(f"{'Task': <20s} {'PID': <8s} {'Name': <30s} {'Conclave': <20s} {'Conclave name': <60s} {'State': <15s}") 14*43a90889SApple OSS Distributionsdef GetAllConclavesSummary(t): 15*43a90889SApple OSS Distributions """ Summarizes the important fields regarding to conclaves. 16*43a90889SApple OSS Distributions params: task: value - value object representing a task in kernel 17*43a90889SApple OSS Distributions returns: str - summary of all conclaves 18*43a90889SApple OSS Distributions """ 19*43a90889SApple OSS Distributions out_str = f"{t:<#20x}" 20*43a90889SApple OSS Distributions 21*43a90889SApple OSS Distributions proc = GetProcFromTask(t) 22*43a90889SApple OSS Distributions p_pid = proc.p_pid if proc is not None else "" 23*43a90889SApple OSS Distributions p_comm = proc.p_comm if proc is not None else "" 24*43a90889SApple OSS Distributions 25*43a90889SApple OSS Distributions resource = Cast(t.conclave, 'exclaves_resource_t *') 26*43a90889SApple OSS Distributions state = GetEnumName('conclave_state_t', resource.r_conclave.c_state, 'CONCLAVE_S_') 27*43a90889SApple OSS Distributions 28*43a90889SApple OSS Distributions out_str += f"{p_pid:<8} {p_comm:<30s}" f"{t.conclave:<#20x} {resource.r_name:<60s} {state:<15s}" 29*43a90889SApple OSS Distributions 30*43a90889SApple OSS Distributions return out_str 31*43a90889SApple OSS Distributions 32*43a90889SApple OSS Distributions 33*43a90889SApple OSS Distributions# Macro: showallconclaves 34*43a90889SApple OSS Distributions@lldb_command('showallconclaves', fancy=True) 35*43a90889SApple OSS Distributionsdef ShowAllConclaves(cmd_args=None, cmd_options={}, O=None): 36*43a90889SApple OSS Distributions """ Iterate over all the tasks and show the tasks that have conclaves attached to them. 37*43a90889SApple OSS Distributions 38*43a90889SApple OSS Distributions Usage: showallconclaves 39*43a90889SApple OSS Distributions """ 40*43a90889SApple OSS Distributions 41*43a90889SApple OSS Distributions with O.table(GetAllConclavesSummary.header): 42*43a90889SApple OSS Distributions for t in kern.tasks: 43*43a90889SApple OSS Distributions if not hasattr(t, 'conclave'): 44*43a90889SApple OSS Distributions print("The system does not support exclaves") 45*43a90889SApple OSS Distributions return 46*43a90889SApple OSS Distributions if t.conclave: 47*43a90889SApple OSS Distributions print(GetAllConclavesSummary(t)) 48*43a90889SApple OSS Distributions# EndMacro: showallconclaves 49*43a90889SApple OSS Distributions 50*43a90889SApple OSS Distributions 51*43a90889SApple OSS Distributions# Macro: showexclavesresourcetable 52*43a90889SApple OSS Distributions@lldb_command('showexclavesresourcetable', "D:") 53*43a90889SApple OSS Distributionsdef ShowExclavesResourceTable(cmd_args=None, cmd_options={}): 54*43a90889SApple OSS Distributions """ Print all resources in all domains the roottable contains 55*43a90889SApple OSS Distributions 56*43a90889SApple OSS Distributions Usage: showexclavesresourcetable [-D <domain>] 57*43a90889SApple OSS Distributions -D domain : the name of the domain. e.g. "com.apple.kernel" 58*43a90889SApple OSS Distributions """ 59*43a90889SApple OSS Distributions 60*43a90889SApple OSS Distributions domain_tbl = kern.GetGlobalVariable('root_table') 61*43a90889SApple OSS Distributions try: 62*43a90889SApple OSS Distributions domain_heads = Cast(domain_tbl.t_buckets, 'queue_chain_t *') 63*43a90889SApple OSS Distributions except AttributeError: 64*43a90889SApple OSS Distributions print("The system does not support exclaves") 65*43a90889SApple OSS Distributions return 66*43a90889SApple OSS Distributions 67*43a90889SApple OSS Distributions for domain_idx in range(int(domain_tbl.t_buckets_count)): 68*43a90889SApple OSS Distributions for elem in IterateLinkageChain(addressof(domain_heads[domain_idx]), 'table_item_t *', 'i_chain'): 69*43a90889SApple OSS Distributions domain = Cast(elem.i_value, 'exclaves_resource_domain_t *') 70*43a90889SApple OSS Distributions 71*43a90889SApple OSS Distributions if "-D" in cmd_options: 72*43a90889SApple OSS Distributions if str(domain.d_name) != cmd_options['-D']: 73*43a90889SApple OSS Distributions continue 74*43a90889SApple OSS Distributions 75*43a90889SApple OSS Distributions tbl_loc = Cast(domain.d_table_name, 'queue_chain_t *') 76*43a90889SApple OSS Distributions entry_tbl = Cast(tbl_loc, 'table_t *') 77*43a90889SApple OSS Distributions 78*43a90889SApple OSS Distributions d_name_ = f"{VT.Bold}{str(domain.d_name)}{VT.EndBold}" 79*43a90889SApple OSS Distributions out = ( 80*43a90889SApple OSS Distributions f"domain:{domain:<#x} d_name:{d_name_} " 81*43a90889SApple OSS Distributions f"d_table_name:{domain.d_table_name:<#x} d_table_id:{domain.d_table_id:<#x}" 82*43a90889SApple OSS Distributions ) 83*43a90889SApple OSS Distributions 84*43a90889SApple OSS Distributions if config['verbosity'] > vHUMAN : 85*43a90889SApple OSS Distributions out = f"domain-{domain_idx} " + out 86*43a90889SApple OSS Distributions print(f"\n{out}") 87*43a90889SApple OSS Distributions print("---------------------------------------------------------------") 88*43a90889SApple OSS Distributions 89*43a90889SApple OSS Distributions out = f"{'Entry':<5s} {'Resource': <20s} {'Name':<60s} {'Type':<25s} {'Id':<9s} {'Port':<20s} {'Connected':<10s}" 90*43a90889SApple OSS Distributions if config['verbosity'] > vHUMAN : 91*43a90889SApple OSS Distributions out += f"{'Elem': <19s} {'i_key': <19s} {'Len': <3s} {'i_value': <19s}" 92*43a90889SApple OSS Distributions print(out) 93*43a90889SApple OSS Distributions 94*43a90889SApple OSS Distributions entry_heads = Cast(entry_tbl.t_buckets, 'queue_chain_t *') 95*43a90889SApple OSS Distributions for entry_idx in range(int(entry_tbl.t_buckets_count)): 96*43a90889SApple OSS Distributions for elem in IterateLinkageChain(entry_heads[entry_idx], 'table_item_t *', 'i_chain'): 97*43a90889SApple OSS Distributions resource = Cast(elem.i_key, 'exclaves_resource_t *') 98*43a90889SApple OSS Distributions 99*43a90889SApple OSS Distributions state = GetEnumName('conclave_state_t', resource.r_conclave.c_state, 'CONCLAVE_S_') 100*43a90889SApple OSS Distributions r_type = GetEnumName('xnuproxy_resourcetype_s', resource.r_type, 'XNUPROXY_RESOURCETYPE_') 101*43a90889SApple OSS Distributions connected = "yes" if resource.r_connected else "no" 102*43a90889SApple OSS Distributions 103*43a90889SApple OSS Distributions out = ( 104*43a90889SApple OSS Distributions f"{entry_idx:<5} {resource:<#20x} {resource.r_name:<60s} {r_type:<25s} " 105*43a90889SApple OSS Distributions f"{resource.r_id:<#9x} {resource.r_port:<#20x} {connected:<10s}" 106*43a90889SApple OSS Distributions ) 107*43a90889SApple OSS Distributions if config['verbosity'] > vHUMAN : 108*43a90889SApple OSS Distributions out += f"{elem:<#19x} {elem.i_key:<#19x} {elem.i_key_len:<3} {elem.i_value:<#19x}" 109*43a90889SApple OSS Distributions print(out) 110*43a90889SApple OSS Distributions# EndMacro: showexclavesresourcetable 111*43a90889SApple OSS Distributions 112*43a90889SApple OSS Distributions@lldb_type_summary(['esync_t']) 113*43a90889SApple OSS Distributions@header("{0: <20s} {1: <10s} {2: <20s} {3: <20s}".format("esync_t", "id", "policy", "turnstile")) 114*43a90889SApple OSS Distributionsdef GetEsyncSummary(esync): 115*43a90889SApple OSS Distributions """ Summarizes esync data structure 116*43a90889SApple OSS Distributions params: esync: value - value object representing esync structure 117*43a90889SApple OSS Distributions returns: str - summary of the esync object 118*43a90889SApple OSS Distributions """ 119*43a90889SApple OSS Distributions format_string = "{0: <#020x} {1: <#010x} {2: <20s} {3: <#20x}" 120*43a90889SApple OSS Distributions return format_string.format(esync, esync.es_id, GetEnumName('esync_policy_t', esync.es_policy), esync.es_turnstile) 121*43a90889SApple OSS Distributions 122*43a90889SApple OSS Distributions@lldb_command('showesynctable', fancy=True) 123*43a90889SApple OSS Distributionsdef ShowESyncTable(cmd_args=None, cmd_options={}, O=None): 124*43a90889SApple OSS Distributions """ Display info about the specified epoch sync table 125*43a90889SApple OSS Distributions Usage: showesynctable <ht_t>|<ht_t *> 126*43a90889SApple OSS Distributions Example: showesynctable &exclaves_queue_ht 127*43a90889SApple OSS Distributions """ 128*43a90889SApple OSS Distributions 129*43a90889SApple OSS Distributions if cmd_args is None or len(cmd_args) == 0: 130*43a90889SApple OSS Distributions raise ArgumentError("No arguments passed.") 131*43a90889SApple OSS Distributions 132*43a90889SApple OSS Distributions try: 133*43a90889SApple OSS Distributions table = kern.GetValueAsType(cmd_args[0], 'ht_t') 134*43a90889SApple OSS Distributions bucket = Cast(table.ht_bucket, 'ht_bucket_t *') 135*43a90889SApple OSS Distributions except: 136*43a90889SApple OSS Distributions table = kern.GetValueFromAddress(cmd_args[0], "ht_t *") 137*43a90889SApple OSS Distributions bucket = Cast(table.ht_bucket, 'ht_bucket_t *') 138*43a90889SApple OSS Distributions 139*43a90889SApple OSS Distributions with O.table(GetEsyncSummary.header, indent=True): 140*43a90889SApple OSS Distributions for idx in range(int(table.ht_size)): 141*43a90889SApple OSS Distributions for elem in IterateLinkageChain(addressof(bucket[idx].htb_head), 'esync_t *', 'es_link'): 142*43a90889SApple OSS Distributions print(GetEsyncSummary(elem)) 143*43a90889SApple OSS Distributions 144*43a90889SApple OSS Distributions return 145