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