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