xref: /xnu-11215.41.3/tools/lldbmacros/bank.py (revision 33de042d024d46de5ff4e89f2471de6608e37fa4)
1from xnu import *
2from utils import *
3
4
5@lldb_type_summary(['bank_element', 'bank_element_t'])
6@header("{0: <20s} {1: <16s} {2: <16s} {3: <16s} {4: <20s} {5: <20s}".format("bank_element", "type", "ref_count", "sync", "task", "process_name"))
7def GetBankElementSummary(bank_element):
8    """ Summarizes the bank element
9        params: bank_element = value of the object of type bank_element_t
10        returns: String with summary of the type.
11    """
12    format_str = "{0: <#020x} {1: <16s} {2: <16d} {3: <16d}"
13
14    if bank_element.be_type == 0:
15      out_string = format_str.format(bank_element, "BANK_TASK", unsigned(bank_element.be_refs), unsigned(bank_element.be_made))
16    else:
17      out_string = format_str.format(bank_element, "BANK_ACCOUNT", unsigned(bank_element.be_refs), unsigned(bank_element.be_made))
18
19    #if DEVELOPMENT
20    format_str = "{0: <#020x} {1: <20s}"
21    if hasattr(bank_element, 'be_task'):
22      out_string += " " + format_str.format(bank_element.be_task, GetProcNameForTask(bank_element.be_task))
23    #endif
24
25    return out_string
26
27
28@lldb_type_summary(['bank_task', 'bank_task_t'])
29@header("{0: <20s} {1: <16s} {2: <20s} {3: <16s} {4: <16s} {5: <16s} {6: <16s} {7: <16s} {8: <20s} {9: <20s}".format("bank_task", "pid", "ledger", "ref_count", "sync", "persona id", "uid", "gid", "task", "process_name"))
30def GetBankTaskSummary(bank_task):
31    """ Summarizes the bank task
32        params: bank_task = value of the object of type bank_task_t
33        returns: String with summary of the type.
34    """
35
36    format_str = "{0: <#020x} {1: <16d} {2: <#020x} {3: <16d} {4: <16d} {5: <16d} {6: <16d} {7: <16d}"
37    out_string = format_str.format(bank_task, bank_task.bt_proc_persona.pid, bank_task.bt_ledger, unsigned(bank_task.bt_elem.be_refs), unsigned(bank_task.bt_elem.be_made), bank_task.bt_proc_persona.persona_id, bank_task.bt_proc_persona.uid, bank_task.bt_proc_persona.gid)
38
39    #if DEVELOPMENT
40    format_str = "{0: <#020x} {1: <20s}"
41    if hasattr(bank_task.bt_elem, 'be_task'):
42      out_string += " " + format_str.format(bank_task.bt_elem.be_task, GetProcNameForTask(bank_task.bt_elem.be_task))
43    #endif
44    return out_string
45
46
47@lldb_type_summary(['bank_account', 'bank_account_t'])
48@header("{0: <20s} {1: <16s} {2: <16s} {3: <16s} {4: <16s} {5: <20s} {6: <16s} {7: <16s} {8: <20s} {9: <20s} {10: <20s} {11: <20s}".format("bank_account", "holder_pid", "merchant_pid", "secure_orig", "proximal_pid", "chit_ledger", "ref_count", "sync", "holder_task", "holder_process", "merchant_task", "merchant_process"))
49def GetBankAccountSummary(bank_account):
50    """ Summarizes the bank account
51        params: bank_task = value of the object of type bank_account_t
52        returns: String with summary of the type.
53    """
54
55    format_str = "{0: <#020x} {1: <16d} {2: <16d} {3: <16d} {4: <16d} {5: <#020x} {6: <16d} {7: <16d}"
56    out_string = format_str.format(bank_account, bank_account.ba_holder.bt_proc_persona.pid, bank_account.ba_merchant.bt_proc_persona.pid, bank_account.ba_secureoriginator.bt_proc_persona.pid, bank_account.ba_proximateprocess.bt_proc_persona.pid,bank_account.ba_bill, unsigned(bank_account.ba_elem.be_refs), unsigned(bank_account.ba_elem.be_made))
57
58    #if DEVELOPMENT
59    format_str = "{0: <#020x} {1: <20s}"
60    if hasattr(bank_account.ba_holder.bt_elem, 'be_task'):
61      out_string += " " + format_str.format(bank_account.ba_holder.bt_elem.be_task, GetProcNameForTask(bank_account.ba_holder.bt_elem.be_task))
62    if hasattr(bank_account.ba_merchant.bt_elem, 'be_task'):
63      out_string += " " + format_str.format(bank_account.ba_merchant.bt_elem.be_task, GetProcNameForTask(bank_account.ba_merchant.bt_elem.be_task))
64    #endif
65    return out_string
66
67
68# Macro: showbankaccountstopay
69@lldb_command('showbankaccountstopay')
70def ShowBankAccountsToPay(cmd_args=None, cmd_options={}):
71    """ show a list of merchant bank tasks for a bank_task object.
72        Usage: (lldb)showbankaccountstopay <bank_task_t>
73    """
74    if not cmd_args:
75      raise ArgumentError("Please provide arguments")
76
77    bank_task = kern.GetValueFromAddress(cmd_args[0], 'bank_task_t')
78    print(GetBankTaskSummary.header)
79    print(GetBankTaskSummary(bank_task))
80    print("List of Accounts to Pay.")
81    header_str = GetBankAccountSummary.header
82    print(header_str)
83
84    for bank_account in IterateQueue(bank_task.bt_accounts_to_pay, 'bank_account_t', 'ba_next_acc_to_pay'):
85      print(GetBankAccountSummary(bank_account))
86    return
87# EndMacro: showbankaccountstopay
88
89
90# Macro: showbankaccountstocharge
91@lldb_command('showbankaccountstocharge')
92def ShowBankAccountsToCharge(cmd_args=None, cmd_options={}):
93    """ show a list of holder bank tasks for a bank_task object.
94        Usage: (lldb)showbankaccountstocharge <bank_task_t>
95    """
96    if not cmd_args:
97      raise ArgumentError("Please provide arguments")
98
99    bank_task = kern.GetValueFromAddress(cmd_args[0], 'bank_task_t')
100    print(GetBankTaskSummary.header)
101    print(GetBankTaskSummary(bank_task))
102    print("List of Accounts to Charge.")
103    header_str = GetBankAccountSummary.header
104    print(header_str)
105
106    for bank_account in IterateQueue(bank_task.bt_accounts_to_charge, 'bank_account_t', 'ba_next_acc_to_charge'):
107      print(GetBankAccountSummary(bank_account))
108    return
109# EndMacro: showbankaccountstocharge
110
111
112#if DEVELOPMENT
113
114# Macro: showallbanktasklist
115@lldb_command('showallbanktasklist')
116def ShowAllBankTaskList(cmd_args=None, cmd_options={}):
117    """ A DEVELOPMENT macro that walks the list of all allocated bank_task objects
118        and prints them.
119        usage: (lldb) showallbanktasklist
120    """
121    if not hasattr(kern.globals, 'bank_tasks_list'):
122      print("It seems you are running a build of kernel that does not have the list of all bank_tasks_list.")
123      return False
124    print(GetBankTaskSummary.header)
125    for bank_task in IterateQueue(kern.globals.bank_tasks_list, 'bank_task_t', 'bt_global_elt'):
126      print(GetBankTaskSummary(bank_task))
127    return True
128# EndMacro showallbanktasklist
129
130
131# Macro: showallbankaccountlist
132@lldb_command('showallbankaccountlist')
133def ShowAllBankAccountList(cmd_args=None, cmd_options={}):
134    """ A DEVELOPMENT macro that walks the list of all allocated bank_account objects
135        and prints them.
136        usage: (lldb) showallbankaccountlist
137    """
138    if not hasattr(kern.globals, 'bank_accounts_list'):
139      print("It seems you are running a build of kernel that does not have the list of all bank_accounts_list.")
140      return False
141    print(GetBankAccountSummary.header)
142    for bank_account in IterateQueue(kern.globals.bank_accounts_list, 'bank_account_t', 'ba_global_elt'):
143      print(GetBankAccountSummary(bank_account))
144    return True
145# EndMacro showallbankaccountlist
146#endif
147