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