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