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