xref: /xnu-10063.121.3/tools/lldbmacros/sysreg.py (revision 2c2f96dc2b9a4408a43d3150ae9c105355ca3daa)
1*2c2f96dcSApple OSS Distributions""" Please make sure you read the README file COMPLETELY BEFORE reading anything below.
2*2c2f96dcSApple OSS Distributions    It is very critical that you read coding guidelines in Section E in README file.
3*2c2f96dcSApple OSS Distributions
4*2c2f96dcSApple OSS Distributions    Note for adding new register support:
5*2c2f96dcSApple OSS Distributions
6*2c2f96dcSApple OSS Distributions    1. Add target register to "supported registers" in the docstring of DecodeSysreg
7*2c2f96dcSApple OSS Distributions    2. Populate _SYSREG_TO_DECODE_FUNC_MAP with your implementation, optionally using
8*2c2f96dcSApple OSS Distributions       _SYSREG_TO_DOCNAME_MAP
9*2c2f96dcSApple OSS Distributions    3. Populate _SUPPORTED_SYSREGS list with target register
10*2c2f96dcSApple OSS Distributions
11*2c2f96dcSApple OSS Distributions"""
12*2c2f96dcSApple OSS Distributionsfrom xnu import *
13*2c2f96dcSApple OSS Distributionsimport os
14*2c2f96dcSApple OSS Distributionsimport sys
15*2c2f96dcSApple OSS Distributionsimport xml.etree.ElementTree as ET
16*2c2f96dcSApple OSS Distributions
17*2c2f96dcSApple OSS DistributionsGREEN = '\033[0;32m'
18*2c2f96dcSApple OSS DistributionsRED   = '\033[0;31m'
19*2c2f96dcSApple OSS DistributionsNC    = '\033[0m'
20*2c2f96dcSApple OSS Distributions
21*2c2f96dcSApple OSS Distributions_SUPPORTED_SYSREGS = ['ESR_EL1']
22*2c2f96dcSApple OSS Distributions
23*2c2f96dcSApple OSS Distributions_SYSREG_DOC_PATH = os.path.dirname(os.path.abspath(__file__)) + '/sysregdoc/'
24*2c2f96dcSApple OSS Distributions
25*2c2f96dcSApple OSS Distributions_SYSREG_TO_DOCNAME_MAP = {
26*2c2f96dcSApple OSS Distributions    'ESR_EL1': 'AArch64-esr_el1.xml'
27*2c2f96dcSApple OSS Distributions}
28*2c2f96dcSApple OSS Distributions
29*2c2f96dcSApple OSS Distributions## Actual definition at the bottom of the file
30*2c2f96dcSApple OSS Distributions_SYSREG_TO_DECODE_FUNC_MAP = None
31*2c2f96dcSApple OSS Distributions
32*2c2f96dcSApple OSS Distributions# Macro: decode_sysreg
33*2c2f96dcSApple OSS Distributions@lldb_command('decode_sysreg')
34*2c2f96dcSApple OSS Distributionsdef DecodeSysreg(cmd_args=None):
35*2c2f96dcSApple OSS Distributions    """ Print out human-understandable explanation of a system register value
36*2c2f96dcSApple OSS Distributions        usage: decode_sysreg <sysreg> <value>
37*2c2f96dcSApple OSS Distributions        example: decode_sysreg esr_el1 0x96000021
38*2c2f96dcSApple OSS Distributions
39*2c2f96dcSApple OSS Distributions        supported registers:
40*2c2f96dcSApple OSS Distributions        ESR_EL1
41*2c2f96dcSApple OSS Distributions    """
42*2c2f96dcSApple OSS Distributions
43*2c2f96dcSApple OSS Distributions    ## For now, require exactly 2 arguments
44*2c2f96dcSApple OSS Distributions    if not cmd_args or len(cmd_args) != 2:
45*2c2f96dcSApple OSS Distributions        raise ArgumentError("Missing arguments.")
46*2c2f96dcSApple OSS Distributions
47*2c2f96dcSApple OSS Distributions    reg_name = cmd_args[0].upper()
48*2c2f96dcSApple OSS Distributions    reg_value = int(cmd_args[1], 0)
49*2c2f96dcSApple OSS Distributions
50*2c2f96dcSApple OSS Distributions    if reg_name not in _SUPPORTED_SYSREGS:
51*2c2f96dcSApple OSS Distributions        raise ArgumentError("{} is not supported".format(reg_name))
52*2c2f96dcSApple OSS Distributions
53*2c2f96dcSApple OSS Distributions    _SYSREG_TO_DECODE_FUNC_MAP[reg_name](reg_value)
54*2c2f96dcSApple OSS Distributions# EndMacro: decode_sysreg
55*2c2f96dcSApple OSS Distributions
56*2c2f96dcSApple OSS Distributions
57*2c2f96dcSApple OSS Distributionslldb_alias('decode_esr', 'decode_sysreg esr_el1')
58*2c2f96dcSApple OSS Distributions
59*2c2f96dcSApple OSS Distributions
60*2c2f96dcSApple OSS Distributionsdef PrintEsrEl1Explanation(regval):
61*2c2f96dcSApple OSS Distributions    """ Print out a detailed explanation of regval regarded as the value of
62*2c2f96dcSApple OSS Distributions        ESR_EL1, by parsing ARM machine readable specification
63*2c2f96dcSApple OSS Distributions    """
64*2c2f96dcSApple OSS Distributions    xmlfilename = _SYSREG_DOC_PATH + _SYSREG_TO_DOCNAME_MAP['ESR_EL1']
65*2c2f96dcSApple OSS Distributions    tree = ET.parse(xmlfilename)
66*2c2f96dcSApple OSS Distributions    root = tree.getroot()
67*2c2f96dcSApple OSS Distributions
68*2c2f96dcSApple OSS Distributions    ec = (regval >> 26) & ((1 << 6) - 1)
69*2c2f96dcSApple OSS Distributions    ecstring = '0b{:06b}'.format(ec)
70*2c2f96dcSApple OSS Distributions
71*2c2f96dcSApple OSS Distributions    print(_Colorify(VT.Green, 'EC == ' + ecstring))
72*2c2f96dcSApple OSS Distributions
73*2c2f96dcSApple OSS Distributions    ecxpath = './registers/register/reg_fieldsets/fields/field[@id="EC_31_26"]/field_values/field_value_instance[field_value="{}"]/field_value_description//para'.format(ecstring)
74*2c2f96dcSApple OSS Distributions    ec_desc_paras = root.findall(ecxpath)
75*2c2f96dcSApple OSS Distributions
76*2c2f96dcSApple OSS Distributions    if ec_desc_paras is None or len(ec_desc_paras) == 0:
77*2c2f96dcSApple OSS Distributions        print('EC not defined.')
78*2c2f96dcSApple OSS Distributions        print('\r\n')
79*2c2f96dcSApple OSS Distributions
80*2c2f96dcSApple OSS Distributions    for para in ec_desc_paras:
81*2c2f96dcSApple OSS Distributions        sys.stdout.write(para.text)
82*2c2f96dcSApple OSS Distributions        for child in para:
83*2c2f96dcSApple OSS Distributions            sys.stdout.write(_GetParaChildrenStr(child))
84*2c2f96dcSApple OSS Distributions            sys.stdout.write(child.tail)
85*2c2f96dcSApple OSS Distributions        print('\r\n')
86*2c2f96dcSApple OSS Distributions        print('\r\n')
87*2c2f96dcSApple OSS Distributions
88*2c2f96dcSApple OSS Distributions    iss = regval & ((1 << 25) - 1);
89*2c2f96dcSApple OSS Distributions    issstring = '0x{:07x}'.format(iss)
90*2c2f96dcSApple OSS Distributions    print(_Colorify(VT.Green, 'ISS == ' + issstring))
91*2c2f96dcSApple OSS Distributions    print('\r\n')
92*2c2f96dcSApple OSS Distributions
93*2c2f96dcSApple OSS Distributions    iss_condition_xpath = './registers/register/reg_fieldsets/fields/field[@id="EC_31_26"]/field_values/field_value_instance[field_value="{}"]/field_value_links_to'.format(ecstring)
94*2c2f96dcSApple OSS Distributions    iss_condition = root.find(iss_condition_xpath)
95*2c2f96dcSApple OSS Distributions    iss_condition_str = iss_condition.attrib['linked_field_condition']
96*2c2f96dcSApple OSS Distributions
97*2c2f96dcSApple OSS Distributions    iss_fields_xpath = './registers/register/reg_fieldsets/fields/field[@id="ISS_24_0"]/partial_fieldset/fields[fields_instance="{}"]//field'.format(iss_condition_str)
98*2c2f96dcSApple OSS Distributions    iss_fields = root.findall(iss_fields_xpath)
99*2c2f96dcSApple OSS Distributions
100*2c2f96dcSApple OSS Distributions    for field in iss_fields:
101*2c2f96dcSApple OSS Distributions        _PrintEsrIssField(field, regval)
102*2c2f96dcSApple OSS Distributions
103*2c2f96dcSApple OSS Distributions
104*2c2f96dcSApple OSS Distributionsdef _GetParaChildrenStr(elem):
105*2c2f96dcSApple OSS Distributions    """ Convert child tags of <para> element into text for printing
106*2c2f96dcSApple OSS Distributions    """
107*2c2f96dcSApple OSS Distributions
108*2c2f96dcSApple OSS Distributions    if elem.tag == 'binarynumber':
109*2c2f96dcSApple OSS Distributions        return elem.text
110*2c2f96dcSApple OSS Distributions    if elem.tag == 'arm-defined-word':
111*2c2f96dcSApple OSS Distributions        return elem.text
112*2c2f96dcSApple OSS Distributions    elif elem.tag == 'xref':
113*2c2f96dcSApple OSS Distributions        return elem.attrib['browsertext']
114*2c2f96dcSApple OSS Distributions    elif elem.tag == 'register_link':
115*2c2f96dcSApple OSS Distributions        return elem.text
116*2c2f96dcSApple OSS Distributions    else:
117*2c2f96dcSApple OSS Distributions        return _Colorify(VT.Red, '*unsupported text*')
118*2c2f96dcSApple OSS Distributions
119*2c2f96dcSApple OSS Distributions
120*2c2f96dcSApple OSS Distributionsdef _PrintEsrIssField(elem, regval):
121*2c2f96dcSApple OSS Distributions    """ Print detailed explanation of the ISS field of ESR
122*2c2f96dcSApple OSS Distributions    """
123*2c2f96dcSApple OSS Distributions
124*2c2f96dcSApple OSS Distributions    field_name_str = elem.find('field_name').text
125*2c2f96dcSApple OSS Distributions    field_msb = int(elem.find('field_msb').text)
126*2c2f96dcSApple OSS Distributions    field_lsb = int(elem.find('field_lsb').text)
127*2c2f96dcSApple OSS Distributions    fd_before_paras = elem.findall('./field_description[@order="before"]//para')
128*2c2f96dcSApple OSS Distributions    fd_after_paras = elem.findall('./field_description[@order="after"]//para')
129*2c2f96dcSApple OSS Distributions
130*2c2f96dcSApple OSS Distributions    field_bits = field_msb - field_lsb + 1
131*2c2f96dcSApple OSS Distributions    field_value = (regval >> field_lsb) & ((1 << field_bits) - 1)
132*2c2f96dcSApple OSS Distributions    field_value_string = ('0b{:0' + '{}'.format(field_bits) + 'b}').format(field_value)
133*2c2f96dcSApple OSS Distributions
134*2c2f96dcSApple OSS Distributions    print(_Colorify(VT.Green, _GetIndentedString(2, field_name_str) + ' == ' + field_value_string))
135*2c2f96dcSApple OSS Distributions
136*2c2f96dcSApple OSS Distributions    fv_desc_paras = elem.findall('./field_values/field_value_instance[field_value="{}"]/field_value_description//para'.format(field_value_string))
137*2c2f96dcSApple OSS Distributions
138*2c2f96dcSApple OSS Distributions    if fv_desc_paras and len(fv_desc_paras):
139*2c2f96dcSApple OSS Distributions        for para in fv_desc_paras:
140*2c2f96dcSApple OSS Distributions            sys.stdout.write(_GetIndentedString(2, ''))
141*2c2f96dcSApple OSS Distributions            sys.stdout.write(para.text)
142*2c2f96dcSApple OSS Distributions            for child in para:
143*2c2f96dcSApple OSS Distributions                sys.stdout.write(_GetParaChildrenStr(child))
144*2c2f96dcSApple OSS Distributions                sys.stdout.write((child.tail))
145*2c2f96dcSApple OSS Distributions        print('\r\n')
146*2c2f96dcSApple OSS Distributions        print('\r\n')
147*2c2f96dcSApple OSS Distributions    else:
148*2c2f96dcSApple OSS Distributions        print(_Colorify(VT.Red, _GetIndentedString(2, '(No matching value, dumping out full description)')))
149*2c2f96dcSApple OSS Distributions        for para in fd_before_paras:
150*2c2f96dcSApple OSS Distributions            sys.stdout.write(_GetIndentedString(2, ''))
151*2c2f96dcSApple OSS Distributions            sys.stdout.write(para.text)
152*2c2f96dcSApple OSS Distributions            for child in para:
153*2c2f96dcSApple OSS Distributions                sys.stdout.write(_GetParaChildrenStr(child))
154*2c2f96dcSApple OSS Distributions                sys.stdout.write(child.tail)
155*2c2f96dcSApple OSS Distributions            print('\r\n')
156*2c2f96dcSApple OSS Distributions            print('\r\n')
157*2c2f96dcSApple OSS Distributions
158*2c2f96dcSApple OSS Distributions        ## Dump all possible values
159*2c2f96dcSApple OSS Distributions        all_field_values = elem.findall('./field_values/field_value_instance//field_value')
160*2c2f96dcSApple OSS Distributions        all_field_values_str = [fv.text for fv in all_field_values]
161*2c2f96dcSApple OSS Distributions        if all_field_values_str != []:
162*2c2f96dcSApple OSS Distributions            print(_GetIndentedString(2, ', '.join(all_field_values_str)))
163*2c2f96dcSApple OSS Distributions
164*2c2f96dcSApple OSS Distributions        for para in fd_after_paras:
165*2c2f96dcSApple OSS Distributions            sys.stdout.write(_GetIndentedString(2, ''))
166*2c2f96dcSApple OSS Distributions            sys.stdout.write(para.text)
167*2c2f96dcSApple OSS Distributions            for child in para:
168*2c2f96dcSApple OSS Distributions                sys.stdout.write(_GetParaChildrenStr(child))
169*2c2f96dcSApple OSS Distributions                sys.stdout.write(child.tail)
170*2c2f96dcSApple OSS Distributions            print('\r\n')
171*2c2f96dcSApple OSS Distributions            print('\r\n')
172*2c2f96dcSApple OSS Distributions
173*2c2f96dcSApple OSS Distributions
174*2c2f96dcSApple OSS Distributionsdef _GetIndentedString(indentation, msg):
175*2c2f96dcSApple OSS Distributions    """ Return `msg` indented by `indentation` number of spaces
176*2c2f96dcSApple OSS Distributions    """
177*2c2f96dcSApple OSS Distributions    return ' ' * indentation + msg
178*2c2f96dcSApple OSS Distributions
179*2c2f96dcSApple OSS Distributions
180*2c2f96dcSApple OSS Distributionsdef _Colorify(color, msg):
181*2c2f96dcSApple OSS Distributions    """ Return `msg` enclosed by color codes
182*2c2f96dcSApple OSS Distributions    """
183*2c2f96dcSApple OSS Distributions    return color + msg + VT.Reset
184*2c2f96dcSApple OSS Distributions
185*2c2f96dcSApple OSS Distributions
186*2c2f96dcSApple OSS Distributions_SYSREG_TO_DECODE_FUNC_MAP = {
187*2c2f96dcSApple OSS Distributions    'ESR_EL1': PrintEsrEl1Explanation
188*2c2f96dcSApple OSS Distributions}
189