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}