xref: /xnu-8796.101.5/tools/lldbmacros/ulock.py (revision aca3beaa3dfbd42498b42c5e5ce20a938e6554e5)
1*aca3beaaSApple OSS Distributionsfrom __future__ import absolute_import, print_function
2*aca3beaaSApple OSS Distributions
3*aca3beaaSApple OSS Distributionsfrom builtins import range
4*aca3beaaSApple OSS Distributions
5*aca3beaaSApple OSS Distributionsfrom xnu import *
6*aca3beaaSApple OSS Distributionsfrom scheduler import GetRecentTimestamp
7*aca3beaaSApple OSS Distributionsimport xnudefines
8*aca3beaaSApple OSS Distributions
9*aca3beaaSApple OSS Distributionsulock_types = {
10*aca3beaaSApple OSS Distributions    1: "COMPARE_AND_WAIT",
11*aca3beaaSApple OSS Distributions    2: "UNFAIR_LOCK",
12*aca3beaaSApple OSS Distributions    3: "UNFAIR_LOCK64_SHARED",
13*aca3beaaSApple OSS Distributions    4: "COMPARE_AND_WAIT64",
14*aca3beaaSApple OSS Distributions    5: "COMPARE_AND_WAIT64_SHARED"
15*aca3beaaSApple OSS Distributions}
16*aca3beaaSApple OSS Distributions
17*aca3beaaSApple OSS Distributions@header("{:<20s} {:<20s} {:<20s} {:<10s} {:<20s} {:<20s} {:<20s}".format(
18*aca3beaaSApple OSS Distributions    'ull_t', 'kind', 'addr/obj', 'pid/offs', 'owner', 'turnstile', 'waiters'))
19*aca3beaaSApple OSS Distributionsdef GetUlockSummary(ull):
20*aca3beaaSApple OSS Distributions    code = int(ull.ull_opcode)
21*aca3beaaSApple OSS Distributions    if code in ulock_types:
22*aca3beaaSApple OSS Distributions        ull_type = ulock_types[code]
23*aca3beaaSApple OSS Distributions    else:
24*aca3beaaSApple OSS Distributions        ull_type = "{:#x}".format(code)
25*aca3beaaSApple OSS Distributions
26*aca3beaaSApple OSS Distributions    s = "{ull: <#20x} {ull_type: <20s}".format(ull=ull, ull_type=ull_type)
27*aca3beaaSApple OSS Distributions    ulk=ull.ull_key
28*aca3beaaSApple OSS Distributions    if int(ulk.ulk_key_type) == 1:
29*aca3beaaSApple OSS Distributions        s += " {ulk.ulk_addr: <#20x} {ulk.ulk_pid: <10d}".format(ulk=ulk)
30*aca3beaaSApple OSS Distributions    elif int(ulk.ulk_key_type) == 2:
31*aca3beaaSApple OSS Distributions        s += " {ulk.ulk_object: <#20x} {ulk.ulk_offset: <10d}".format(ulk=ulk)
32*aca3beaaSApple OSS Distributions    else:
33*aca3beaaSApple OSS Distributions        s += " {:<20s} {:<10s}".format("", "")
34*aca3beaaSApple OSS Distributions
35*aca3beaaSApple OSS Distributions    return s + " {ull.ull_owner: <#20x} {ull.ull_turnstile: <#20x} {ull.ull_nwaiters: >7d}".format(ull=ull)
36*aca3beaaSApple OSS Distributions
37*aca3beaaSApple OSS Distributions@lldb_command('showallulocks', fancy=True)
38*aca3beaaSApple OSS Distributionsdef ShowAllUlocks(cmd_args=None, cmd_options={}, O=None):
39*aca3beaaSApple OSS Distributions    """ Display a summary of all the ulocks in the system
40*aca3beaaSApple OSS Distributions
41*aca3beaaSApple OSS Distributions        usage: showallulocks
42*aca3beaaSApple OSS Distributions    """
43*aca3beaaSApple OSS Distributions
44*aca3beaaSApple OSS Distributions    with O.table(GetUlockSummary.header):
45*aca3beaaSApple OSS Distributions        count = kern.globals.ull_hash_buckets;
46*aca3beaaSApple OSS Distributions        buckets = kern.globals.ull_bucket
47*aca3beaaSApple OSS Distributions        for i in range(0, count):
48*aca3beaaSApple OSS Distributions            for ull in IterateLinkageChain(addressof(buckets[i].ulb_head), 'ull_t *', 'ull_hash_link'):
49*aca3beaaSApple OSS Distributions                print(GetUlockSummary(ull))
50