xref: /xnu-11417.140.69/tools/lldbmacros/exclaves.py (revision 43a90889846e00bfb5cf1d255cdc0a701a1e05a4)
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