diff options
| -rw-r--r-- | miasm/arch/aarch64/arch.py | 30 | ||||
| -rw-r--r-- | miasm/arch/aarch64/regs.py | 133 | ||||
| -rw-r--r-- | miasm/arch/aarch64/sem.py | 837 | ||||
| -rw-r--r-- | test/arch/aarch64/arch.py | 12 |
4 files changed, 991 insertions, 21 deletions
diff --git a/miasm/arch/aarch64/arch.py b/miasm/arch/aarch64/arch.py index 768f1b03..57aa95da 100644 --- a/miasm/arch/aarch64/arch.py +++ b/miasm/arch/aarch64/arch.py @@ -1743,6 +1743,31 @@ uimm7 = bs(l=7, cls=(aarch64_uint64_noarg,), fname="imm", order=-1) uimm8 = bs(l=8, cls=(aarch64_uint64,), fname="imm", order=-1) +class op0_value(aarch64_uint64): + def decode(self, v): + v = v & self.lmask + v = self.decodeval(v) + v += 2 + e = self.int2expr(v) + if not e: + return False + self.expr = e + return True + + def encode(self): + v = self.expr2int(self.expr) + if v is None: + return False + v -= 2 + v = self.encodeval(v) + if v is False: + return False + if v > self.lmask: + return False + self.value = v + return True + +op0 = bs(l=1, cls=(op0_value, aarch64_arg), fname="op0") op1 = bs(l=3, cls=(aarch64_uint64, aarch64_arg), fname="op1") op2 = bs(l=3, cls=(aarch64_uint64, aarch64_arg), fname="op2") @@ -2133,8 +2158,9 @@ aarch64op("smc", [bs('11010100'), bs('000'), uimm16, bs('000'), bs('11')], [uimm # msr p.631 msr_name = {'MSR': 0b0, 'MRS': 0b1} bs_msr_name = bs_name(l=1, name=msr_name) -aarch64op("mrs", [bs('1101010100'), bs('1'), bs('1'), bs('1'), op1, crn, crm, op2, rt64], [rt64, op1, crn, crm, op2]) -aarch64op("msr", [bs('1101010100'), bs('0'), bs('1'), bs('1'), op1, crn, crm, op2, rt64], [op1, crn, crm, op2, rt64]) +aarch64op("mrs", [bs('1101010100'), bs('1'), bs('1'), op0, op1, crn, crm, op2, rt64], [rt64, op0, op1, crn, crm, op2]) +aarch64op("msr", [bs('1101010100'), bs('0'), bs('1'), op0, op1, crn, crm, op2, rt64], [op0, op1, crn, crm, op2, rt64]) + # load/store exclusive p.140 aarch64op("stxr", [bs('1'), sf, bs('001000'), bs('0'), bs('0'), bs('0'), rs32, bs('0'), bs('11111'), rn64_deref_nooff, rt], [rs32, rt, rn64_deref_nooff]) diff --git a/miasm/arch/aarch64/regs.py b/miasm/arch/aarch64/regs.py index 2732323f..7d19b113 100644 --- a/miasm/arch/aarch64/regs.py +++ b/miasm/arch/aarch64/regs.py @@ -25,7 +25,7 @@ gpregsz64_str = ["X%d" % i for i in range(0x1e)] + ["LR", "XZR"] gpregsz64_expr, gpregsz64_init, gpregsz64_info = gen_regs( gpregsz64_str, globals(), 64) -cr_str = ["c%d" % i for i in range(0xf)] +cr_str = ["c%d" % i for i in range(0x10)] cr_expr, cr_init, cr_info = gen_regs(cr_str, globals(), 32) @@ -45,6 +45,94 @@ simd128_str = ["Q%d" % i for i in range(0x20)] simd128_expr, simd128_init, simd128_info = gen_regs( simd128_str, globals(), 128) +sysregs_str = ['ACTLR_EL1', 'ACTLR_EL2', 'ACTLR_EL3', 'AFSR0_EL1', + 'AFSR0_EL2', 'AFSR0_EL3', 'AFSR1_EL1', 'AFSR1_EL2', 'AFSR1_EL3', + 'AIDR_EL1', 'AMAIR_EL1', 'AMAIR_EL2', 'AMAIR_EL3', 'AMCFGR_EL0', + 'AMCG1IDR_EL0', 'AMCGCR_EL0', 'AMCNTENCLR0_EL0', 'AMCNTENCLR1_EL0', + 'AMCNTENSET0_EL0', 'AMCNTENSET1_EL0', 'AMCR_EL0'] + \ + ['AMEVCNTR%d%d_EL0' % (i, j) for i in range(2) for j in range(16)] + \ + ['AMEVCNTVOFF%d%d_EL2' % (i, j) for i in range(2) for j in range(16)] + \ + ['AMEVTYPER%d%d_EL0' % (i, j) for i in range(2) for j in range(16)] + \ + ['AMUSERENR_EL0', 'APDAKeyHi_EL1', 'APDAKeyLo_EL1', 'APDBKeyHi_EL1', + 'APDBKeyLo_EL1', 'APGAKeyHi_EL1', 'APGAKeyLo_EL1', 'APIAKeyHi_EL1', + 'APIAKeyLo_EL1', 'APIBKeyHi_EL1', 'APIBKeyLo_EL1', 'CCSIDR2_EL1', + 'CCSIDR_EL1', 'CLIDR_EL1', 'CNTFRQ_EL0', 'CNTHCTL_EL2', + 'CNTHPS_CTL_EL2', 'CNTHPS_CVAL_EL2', 'CNTHPS_TVAL_EL2', 'CNTHP_CTL_EL2', + 'CNTHP_CVAL_EL2', 'CNTHP_TVAL_EL2', 'CNTHVS_CTL_EL2', 'CNTHVS_CVAL_EL2', + 'CNTHVS_TVAL_EL2', 'CNTHV_CTL_EL2', 'CNTHV_CVAL_EL2', 'CNTHV_TVAL_EL2', + 'CNTKCTL_EL1', 'CNTPCTSS_EL0', 'CNTPCT_EL0', 'CNTPOFF_EL2', + 'CNTPS_CTL_EL1', 'CNTPS_CVAL_EL1', 'CNTPS_TVAL_EL1', 'CNTP_CTL_EL0', + 'CNTP_CVAL_EL0', 'CNTP_TVAL_EL0', 'CNTVCTSS_EL0', 'CNTVCT_EL0', + 'CNTVOFF_EL2', 'CNTV_CTL_EL0', 'CNTV_CVAL_EL0', 'CNTV_TVAL_EL0', + 'CONTEXTIDR_EL1', 'CONTEXTIDR_EL2', 'CPACR_EL1', 'CPTR_EL2', + 'CPTR_EL3', 'CSSELR_EL1', 'CTR_EL0', 'DACR32_EL2', 'DBGAUTHSTATUS_EL1'] + \ + ['DBGBCR%d_EL1' % i for i in range(16)] + \ + ['DBGBVR%d_EL1' % i for i in range(16)] + \ + ['DBGCLAIMCLR_EL1', 'DBGCLAIMSET_EL1', 'DBGDTRRX_EL0', 'DBGDTRTX_EL0', + 'DBGDTR_EL0', 'DBGPRCR_EL1', 'DBGVCR32_EL2'] + \ + ['DBGWCR%d_EL1' % i for i in range(16)] + \ + ['DBGWVR%d_EL1' % i for i in range(16)] + \ + ['DCZID_EL0', 'DISR_EL1', 'ELR_EL1', 'ERRIDR_EL1', + 'ERRSELR_EL1','ERXADDR_EL1', 'ERXCTLR_EL1', 'ERXFR_EL1', + 'ERXMISC0_EL1', 'ERXMISC1_EL1', 'ERXMISC2_EL1', 'ERXMISC3_EL1', + 'ERXPFGCDN_EL1', 'ERXPFGCTL_EL1', 'ERXPFGF_EL1', 'ERXSTATUS_EL1', + 'ESR_EL1', 'ESR_EL2', 'ESR_EL3', 'FAR_EL1', + 'FAR_EL2', 'FAR_EL3', 'FPEXC32_EL2', 'HACR_EL2', + 'HAFGRTR_EL2', 'HCR_EL2', 'HDFGRTR_EL2', 'HDFGWTR_EL2', + 'HFGITR_EL2', 'HFGRTR_EL2', 'HFGWTR_EL2', 'HPFAR_EL2', + 'HSTR_EL2', 'ICC_AP0R0_EL1', 'ICC_AP0R1_EL1', 'ICC_AP0R2_EL1', + 'ICC_AP0R3_EL1', 'ICC_AP1R0_EL1', 'ICC_AP1R1_EL1', 'ICC_AP1R2_EL1', + 'ICC_AP1R3_EL1', 'ICC_ASGI1R_EL1', 'ICC_BPR0_EL1', 'ICC_BPR1_EL1', + 'ICC_CTLR_EL1', 'ICC_CTLR_EL3', 'ICC_DIR_EL1', 'ICC_EOIR0_EL1', + 'ICC_EOIR1_EL1', 'ICC_HPPIR0_EL1', 'ICC_HPPIR1_EL1', 'ICC_IAR0_EL1', + 'ICC_IAR1_EL1', 'ICC_IGRPEN0_EL1', 'ICC_IGRPEN1_EL1', 'ICC_IGRPEN1_EL3', + 'ICC_PMR_EL1', 'ICC_RPR_EL1', 'ICC_SGI0R_EL1', 'ICC_SGI1R_EL1', + 'ICC_SRE_EL1', 'ICC_SRE_EL2', 'ICC_SRE_EL3', 'ICH_AP0R0_EL2', + 'ICH_AP0R1_EL2', 'ICH_AP0R2_EL2', 'ICH_AP0R3_EL2', 'ICH_AP1R0_EL2', + 'ICH_AP1R1_EL2', 'ICH_AP1R2_EL2', 'ICH_AP1R3_EL2', 'ICH_EISR_EL2', + 'ICH_ELRSR_EL2', 'ICH_HCR_EL2'] + \ + ['ICH_LR%d_EL2' % i for i in range(16)] + \ + ['ICH_MISR_EL2', 'ICH_VMCR_EL2', 'ICH_VTR_EL2', 'ID_AA64AFR0_EL1', + 'ID_AA64AFR1_EL1', 'ID_AA64DFR0_EL1', 'ID_AA64DFR1_EL1', 'ID_AA64ISAR0_EL1', + 'ID_AA64ISAR1_EL1', 'ID_AA64MMFR0_EL1','ID_AA64MMFR1_EL1', 'ID_AA64MMFR2_EL1', + 'ID_AA64PFR0_EL1', 'ID_AA64PFR1_EL1', 'ID_AA64ZFR0_EL1', 'ID_AFR0_EL1', + 'ID_DFR0_EL1', 'ID_ISAR0_EL1', 'ID_ISAR1_EL1', 'ID_ISAR2_EL1', + 'ID_ISAR3_EL1', 'ID_ISAR4_EL1', 'ID_ISAR5_EL1', 'ID_MMFR0_EL1', + 'ID_MMFR1_EL1', 'ID_MMFR2_EL1', 'ID_MMFR3_EL1', 'ID_MMFR4_EL1', + 'ID_MMFR5_EL1', 'ID_PFR0_EL1', 'ID_PFR1_EL1', 'ID_PFR2_EL1', + 'IFSR32_EL2', 'ISR_EL1', 'LORC_EL1', 'LOREA_EL1', + 'LORID_EL1', 'LORN_EL1', 'LORSA_EL1', 'MAIR_EL1', + 'MAIR_EL2', 'MAIR_EL3', 'MDCCINT_EL1', 'MDCCSR_EL0', + 'MDCR_EL2', 'MDCR_EL3', 'MDRAR_EL1', 'MDSCR_EL1', + 'MIDR_EL1', 'MPIDR_EL1', 'MVFR0_EL1', 'MVFR1_EL1', + 'MVFR2_EL1', 'OSDLR_EL1', 'OSDTRRX_EL1', 'OSDTRTX_EL1', + 'OSECCR_EL1', 'OSLAR_EL1', 'OSLSR_EL1', 'PAR_EL1', + 'PMBIDR_EL1', 'PMBLIMITR_EL1', 'PMBPTR_EL1', 'PMBSR_EL1', + 'PMCCFILTR_EL0', 'PMCCNTR_EL0', 'PMCEID0_EL0', 'PMCEID1_EL0', + 'PMCNTENCLR_EL0', 'PMCNTENSET_EL0', 'PMCR_EL0'] + \ + ['PMEVCNTR%d_EL0' % i for i in range(32)] + \ + ['PMEVTYPER%d_EL0' % i for i in range(32)] + \ + ['PMINTENCLR_EL1', 'PMINTENSET_EL1', 'PMMIR_EL1', 'PMOVSCLR_EL0', + 'PMOVSSET_EL0', 'PMSCR_EL1', 'PMSCR_EL2', 'PMSELR_EL0', + 'PMSEVFR_EL1', 'PMSFCR_EL1', 'PMSICR_EL1', 'PMSIDR_EL1', + 'PMSIRR_EL1', 'PMSLATFR_EL1', 'PMSWINC_EL0', 'PMUSERENR_EL0', + 'PMXEVCNTR_EL0', 'PMXEVTYPER_EL0', 'REVIDR_EL1', 'RMR_EL1', + 'RMR_EL2', 'RMR_EL3', 'RVBAR_EL1', 'RVBAR_EL2', + 'RVBAR_EL3', 'SCRLR_EL1', 'SCR_EL3', 'SCTLR_EL1', + 'SCTLR_EL2', 'SCTLR_EL3', 'SDER32_EL2', 'SDER32_EL3', + 'SPSR_EL1', 'TCR_EL1', 'TCR_EL2', 'TCR_EL3', + 'TPIDRRO_EL0', 'TPIDR_EL0', 'TPIDR_EL1', 'TPIDR_EL2', + 'TPIDR_EL3', 'TRFCR_EL1', 'TRFCR_EL2', 'TTBR0_EL1', + 'TTBR0_EL2', 'TTBR0_EL3', 'TTBR1_EL1', 'VBAR_EL1', + 'VBAR_EL2', 'VBAR_EL3', 'VDISR_EL2', 'VMPIDR_EL2', + 'VNCR_EL2', 'VPIDR_EL2', 'VSESR_EL2', 'VSTCR_EL2', + 'VSTTBR_EL2', 'VTCR_EL2', 'VTTBR_EL2', 'ZCR_EL1', + 'ZCR_EL2', 'ZCR_EL3', 'ELR_EL2', 'ELR_EL3', + 'FPCR', 'FPSR', 'SP_EL0', 'SP_EL1', + 'SP_EL2', 'SPSR_abt', 'SPSR_EL2', + 'SPSR_EL3', 'SPSR_fiq', 'SPSR_irq', 'SPSR_und', + 'DLR_EL0', 'DSPSR_EL0'] +sysregs_expr, sysregs_init, sysregs_info = gen_regs(sysregs_str, globals(), 64) PC, _ = gen_reg("PC", 64) WZR, _ = gen_reg("WZR", 32) @@ -59,15 +147,53 @@ reg_nf = 'nf' reg_of = 'of' reg_cf = 'cf' +reg_df = 'df' +reg_af = 'af' +reg_iff = 'if' +reg_ff = 'ff' + +reg_cur_el = 'cur_el' +reg_dit = 'dit' +reg_pan = 'pan' +reg_spsel = 'spsel' +reg_ssbs = 'ssbs' +reg_tco = 'tco' +reg_uao = 'uao' + zf = ExprId(reg_zf, size=1) nf = ExprId(reg_nf, size=1) of = ExprId(reg_of, size=1) cf = ExprId(reg_cf, size=1) +df = ExprId(reg_df, size=1) +af = ExprId(reg_af, size=1) +iff = ExprId(reg_iff, size=1) +ff = ExprId(reg_ff, size=1) + +cur_el = ExprId(reg_cur_el, size=2) +dit = ExprId(reg_dit, size=1) +pan = ExprId(reg_pan, size=1) +spsel = ExprId(reg_spsel, size=1) +ssbs = ExprId(reg_ssbs, size=1) +tco = ExprId(reg_tco, size=1) +uao = ExprId(reg_uao, size=1) + + zf_init = ExprId("zf_init", size=1) nf_init = ExprId("nf_init", size=1) of_init = ExprId("of_init", size=1) cf_init = ExprId("cf_init", size=1) +df_init = ExprId("df_init", size=1) +af_init = ExprId("af_init", size=1) +iff_init = ExprId("if_init", size=1) +ff_init = ExprId("ff_init", size=1) +cur_el_init = ExprId("cur_el_init", size=2) +dit_init = ExprId("dit_init", size=1) +pan_init = ExprId("pan_init", size=1) +spsel_init = ExprId("spsel_init", size=1) +ssbs_init = ExprId("ssbs_init", size=1) +tco_init = ExprId("tco_init", size=1) +uao_init = ExprId("uao_init", size=1) all_regs_ids = [ @@ -98,8 +224,9 @@ all_regs_ids = [ WZR, XZR, zf, nf, of, cf, - -] + df, af, iff, ff, + cur_el, dit, pan, spsel, ssbs, tco, uao, +] + sysregs_expr all_regs_ids_no_alias = all_regs_ids diff --git a/miasm/arch/aarch64/sem.py b/miasm/arch/aarch64/sem.py index 2761aed4..915cd02e 100644 --- a/miasm/arch/aarch64/sem.py +++ b/miasm/arch/aarch64/sem.py @@ -9,6 +9,733 @@ from miasm.arch.aarch64.regs import * from miasm.core.sembuilder import SemBuilder from miasm.jitter.csts import EXCEPT_DIV_BY_ZERO, EXCEPT_INT_XX +# System register for ARM64-A 8.6 +system_regs = { + # op0 op1 crn crm op2 + (2, 0, 0, 0, 2): OSDTRRX_EL1, + + (2, 0, 0, 2, 0): MDCCINT_EL1, + (2, 0, 0, 2, 2): MDSCR_EL1, + + (2, 0, 0, 3, 2): OSDTRTX_EL1, + + (2, 0, 0, 6, 2): OSECCR_EL1, + + (2, 0, 0, 0, 4): DBGBVR0_EL1, + (2, 0, 0, 1, 4): DBGBVR1_EL1, + (2, 0, 0, 2, 4): DBGBVR2_EL1, + (2, 0, 0, 3, 4): DBGBVR3_EL1, + (2, 0, 0, 4, 4): DBGBVR4_EL1, + (2, 0, 0, 5, 4): DBGBVR5_EL1, + (2, 0, 0, 6, 4): DBGBVR6_EL1, + (2, 0, 0, 7, 4): DBGBVR7_EL1, + (2, 0, 0, 8, 4): DBGBVR8_EL1, + (2, 0, 0, 9, 4): DBGBVR9_EL1, + (2, 0, 0, 10, 4): DBGBVR10_EL1, + (2, 0, 0, 11, 4): DBGBVR11_EL1, + (2, 0, 0, 12, 4): DBGBVR12_EL1, + (2, 0, 0, 13, 4): DBGBVR13_EL1, + (2, 0, 0, 14, 4): DBGBVR14_EL1, + (2, 0, 0, 15, 4): DBGBVR15_EL1, + + (2, 0, 0, 0, 5): DBGBCR0_EL1, + (2, 0, 0, 1, 5): DBGBCR1_EL1, + (2, 0, 0, 2, 5): DBGBCR2_EL1, + (2, 0, 0, 3, 5): DBGBCR3_EL1, + (2, 0, 0, 4, 5): DBGBCR4_EL1, + (2, 0, 0, 5, 5): DBGBCR5_EL1, + (2, 0, 0, 6, 5): DBGBCR6_EL1, + (2, 0, 0, 7, 5): DBGBCR7_EL1, + (2, 0, 0, 8, 5): DBGBCR8_EL1, + (2, 0, 0, 9, 5): DBGBCR9_EL1, + (2, 0, 0, 10, 5): DBGBCR10_EL1, + (2, 0, 0, 11, 5): DBGBCR11_EL1, + (2, 0, 0, 12, 5): DBGBCR12_EL1, + (2, 0, 0, 13, 5): DBGBCR13_EL1, + (2, 0, 0, 14, 5): DBGBCR14_EL1, + (2, 0, 0, 15, 5): DBGBCR15_EL1, + + (2, 0, 0, 0, 6): DBGWVR0_EL1, + (2, 0, 0, 1, 6): DBGWVR1_EL1, + (2, 0, 0, 2, 6): DBGWVR2_EL1, + (2, 0, 0, 3, 6): DBGWVR3_EL1, + (2, 0, 0, 4, 6): DBGWVR4_EL1, + (2, 0, 0, 5, 6): DBGWVR5_EL1, + (2, 0, 0, 6, 6): DBGWVR6_EL1, + (2, 0, 0, 7, 6): DBGWVR7_EL1, + (2, 0, 0, 8, 6): DBGWVR8_EL1, + (2, 0, 0, 9, 6): DBGWVR9_EL1, + (2, 0, 0, 10, 6): DBGWVR10_EL1, + (2, 0, 0, 11, 6): DBGWVR11_EL1, + (2, 0, 0, 12, 6): DBGWVR12_EL1, + (2, 0, 0, 13, 6): DBGWVR13_EL1, + (2, 0, 0, 14, 6): DBGWVR14_EL1, + (2, 0, 0, 15, 6): DBGWVR15_EL1, + + (2, 0, 0, 0, 7): DBGWCR0_EL1, + (2, 0, 0, 1, 7): DBGWCR1_EL1, + (2, 0, 0, 2, 7): DBGWCR2_EL1, + (2, 0, 0, 3, 7): DBGWCR3_EL1, + (2, 0, 0, 4, 7): DBGWCR4_EL1, + (2, 0, 0, 5, 7): DBGWCR5_EL1, + (2, 0, 0, 6, 7): DBGWCR6_EL1, + (2, 0, 0, 7, 7): DBGWCR7_EL1, + (2, 0, 0, 8, 7): DBGWCR8_EL1, + (2, 0, 0, 9, 7): DBGWCR9_EL1, + (2, 0, 0, 10, 7): DBGWCR10_EL1, + (2, 0, 0, 11, 7): DBGWCR11_EL1, + (2, 0, 0, 12, 7): DBGWCR12_EL1, + (2, 0, 0, 13, 7): DBGWCR13_EL1, + (2, 0, 0, 14, 7): DBGWCR14_EL1, + (2, 0, 0, 15, 7): DBGWCR15_EL1, + + (2, 0, 1, 0, 0): MDRAR_EL1, + (2, 0, 1, 0, 4): OSLAR_EL1, + + (2, 0, 1, 1, 4): OSLSR_EL1, + + (2, 0, 1, 3, 4): OSDLR_EL1, + + (2, 0, 1, 4, 4): DBGPRCR_EL1, + + (2, 0, 7, 8, 6): DBGCLAIMSET_EL1, + + (2, 0, 7, 9, 6): DBGCLAIMCLR_EL1, + + (2, 0, 7, 14, 6): DBGAUTHSTATUS_EL1, + + (2, 3, 0, 1, 0): MDCCSR_EL0, + + (2, 3, 0, 4, 0): DBGDTR_EL0, + + (2, 3, 0, 5, 0): DBGDTRRX_EL0, + (2, 3, 0, 5, 1): DBGDTRTX_EL0, + + (2, 4, 0, 7, 0): DBGVCR32_EL2, + + (3, 0, 0, 0, 0): MIDR_EL1, + (3, 0, 0, 0, 5): MPIDR_EL1, + (3, 0, 0, 0, 6): REVIDR_EL1, + + (3, 0, 0, 1, 0): ID_PFR0_EL1, + (3, 0, 0, 1, 1): ID_PFR1_EL1, + (3, 0, 0, 1, 2): ID_DFR0_EL1, + (3, 0, 0, 1, 3): ID_AFR0_EL1, + (3, 0, 0, 1, 4): ID_MMFR0_EL1, + (3, 0, 0, 1, 5): ID_MMFR1_EL1, + (3, 0, 0, 1, 6): ID_MMFR2_EL1, + (3, 0, 0, 1, 7): ID_MMFR3_EL1, + + (3, 0, 0, 2, 0): ID_ISAR0_EL1, + (3, 0, 0, 2, 1): ID_ISAR1_EL1, + (3, 0, 0, 2, 2): ID_ISAR2_EL1, + (3, 0, 0, 2, 3): ID_ISAR3_EL1, + (3, 0, 0, 2, 4): ID_ISAR4_EL1, + (3, 0, 0, 2, 5): ID_ISAR5_EL1, + (3, 0, 0, 2, 6): ID_MMFR4_EL1, + + (3, 0, 0, 3, 0): MVFR0_EL1, + (3, 0, 0, 3, 1): MVFR1_EL1, + (3, 0, 0, 3, 2): MVFR2_EL1, + (3, 0, 0, 3, 4): ID_PFR2_EL1, + (3, 0, 0, 3, 6): ID_MMFR5_EL1, + + (3, 0, 0, 4, 0): ID_AA64PFR0_EL1, + (3, 0, 0, 4, 1): ID_AA64PFR1_EL1, + (3, 0, 0, 4, 4): ID_AA64ZFR0_EL1, + + (3, 0, 0, 5, 0): ID_AA64DFR0_EL1, + (3, 0, 0, 5, 1): ID_AA64DFR1_EL1, + (3, 0, 0, 5, 4): ID_AA64AFR0_EL1, + (3, 0, 0, 5, 5): ID_AA64AFR1_EL1, + + (3, 0, 0, 6, 0): ID_AA64ISAR0_EL1, + (3, 0, 0, 6, 1): ID_AA64ISAR1_EL1, + + (3, 0, 0, 7, 0): ID_AA64MMFR0_EL1, + (3, 0, 0, 7, 1): ID_AA64MMFR1_EL1, + (3, 0, 0, 7, 2): ID_AA64MMFR2_EL1, + + (3, 0, 1, 0, 0): SCRLR_EL1, + (3, 0, 1, 0, 1): ACTLR_EL1, + (3, 0, 1, 0, 2): CPACR_EL1, + + (3, 0, 1, 2, 0): ZCR_EL1, + (3, 0, 1, 2, 1): TRFCR_EL1, + + (3, 0, 2, 0, 0): TTBR0_EL1, + (3, 0, 2, 0, 1): TTBR1_EL1, + (3, 0, 2, 0, 2): TCR_EL1, + + (3, 0, 2, 1, 0): APIAKeyLo_EL1, + (3, 0, 2, 1, 1): APIAKeyHi_EL1, + (3, 0, 2, 1, 2): APIBKeyLo_EL1, + (3, 0, 2, 1, 3): APIBKeyHi_EL1, + + (3, 0, 2, 2, 0): APDAKeyLo_EL1, + (3, 0, 2, 2, 1): APDAKeyHi_EL1, + (3, 0, 2, 2, 2): APDBKeyLo_EL1, + (3, 0, 2, 2, 3): APDBKeyHi_EL1, + + (3, 0, 2, 3, 0): APGAKeyLo_EL1, + (3, 0, 2, 3, 1): APGAKeyHi_EL1, + + (3, 0, 4, 1, 0): SP_EL0, + (3, 0, 4, 6, 0): ICC_PMR_EL1, # Alias ICV_PMR_EL1 + + (3, 0, 5, 1, 0): AFSR0_EL1, + (3, 0, 5, 1, 1): AFSR1_EL1, + + (3, 0, 5, 2, 0): ESR_EL1, + + (3, 0, 5, 3, 0): ERRIDR_EL1, + (3, 0, 5, 3, 1): ERRSELR_EL1, + + (3, 0, 5, 4, 0): ERXFR_EL1, + (3, 0, 5, 4, 1): ERXCTLR_EL1, + (3, 0, 5, 4, 2): ERXSTATUS_EL1, + (3, 0, 5, 4, 3): ERXADDR_EL1, + (3, 0, 5, 4, 4): ERXPFGF_EL1, + (3, 0, 5, 4, 5): ERXPFGCTL_EL1, + (3, 0, 5, 4, 6): ERXPFGCDN_EL1, + + (3, 0, 5, 5, 0): ERXMISC0_EL1, + (3, 0, 5, 5, 1): ERXMISC1_EL1, + (3, 0, 5, 5, 2): ERXMISC2_EL1, + (3, 0, 5, 5, 3): ERXMISC3_EL1, + + (3, 0, 6, 0, 0): FAR_EL1, + + (3, 0, 7, 4, 0): PAR_EL1, + + (3, 0, 9, 9, 0): PMSCR_EL1, + (3, 0, 9, 9, 2): PMSICR_EL1, + (3, 0, 9, 9, 3): PMSIRR_EL1, + (3, 0, 9, 9, 4): PMSFCR_EL1, + (3, 0, 9, 9, 5): PMSEVFR_EL1, + (3, 0, 9, 9, 6): PMSLATFR_EL1, + (3, 0, 9, 9, 7): PMSIDR_EL1, + + (3, 0, 9, 10, 0): PMBLIMITR_EL1, + (3, 0, 9, 10, 1): PMBPTR_EL1, + (3, 0, 9, 10, 3): PMBSR_EL1, + (3, 0, 9, 10, 7): PMBIDR_EL1, + + (3, 0, 9, 14, 1): PMINTENSET_EL1, + (3, 0, 9, 14, 2): PMINTENCLR_EL1, + (3, 0, 9, 14, 6): PMMIR_EL1, + + (3, 0, 10, 2, 0): MAIR_EL1, + + (3, 0, 10, 3, 0): AMAIR_EL1, + + (3, 0, 10, 4, 0): LORSA_EL1, + (3, 0, 10, 4, 1): LOREA_EL1, + (3, 0, 10, 4, 2): LORN_EL1, + (3, 0, 10, 4, 3): LORC_EL1, + (3, 0, 10, 4, 7): LORID_EL1, + + (3, 0, 12, 0, 0): VBAR_EL1, + (3, 0, 12, 0, 1): RVBAR_EL1, + (3, 0, 12, 0, 2): RMR_EL1, + + (3, 0, 12, 1, 0): ISR_EL1, + (3, 0, 12, 1, 1): DISR_EL1, + + (3, 0, 12, 8, 0): ICC_IAR0_EL1, # Alias ICV_IAR0_EL1 + (3, 0, 12, 8, 1): ICC_EOIR0_EL1, # Alias ICV_EOIR0_EL1 + (3, 0, 12, 8, 2): ICC_HPPIR0_EL1, # Alias ICV_HPPIR0_EL1 + (3, 0, 12, 8, 3): ICC_BPR0_EL1, # Alias ICV_BPR0_EL1 + (3, 0, 12, 8, 4): ICC_AP0R0_EL1, # Alias ICV_AP0R0_EL1 + (3, 0, 12, 8, 5): ICC_AP0R1_EL1, # Alias ICV_AP0R1_EL1 + (3, 0, 12, 8, 6): ICC_AP0R2_EL1, # Alias ICV_AP0R2_EL1 + (3, 0, 12, 8, 7): ICC_AP0R3_EL1, # Alias ICV_AP0R3_EL1 + + (3, 0, 12, 9, 0): ICC_AP1R0_EL1, # Alias ICV_AP1R0_EL1 + (3, 0, 12, 9, 1): ICC_AP1R1_EL1, # Alias ICV_AP1R1_EL1 + (3, 0, 12, 9, 2): ICC_AP1R2_EL1, # Alias ICV_AP1R2_EL1 + (3, 0, 12, 9, 3): ICC_AP1R3_EL1, # Alias ICV_AP1R3_EL1 + + (3, 0, 12, 11, 1): ICC_DIR_EL1, # Alias ICV_DIR_EL1 + (3, 0, 12, 11, 3): ICC_RPR_EL1, # Alias ICV_RPR_EL1 + (3, 0, 12, 11, 5): ICC_SGI1R_EL1, + (3, 0, 12, 11, 6): ICC_ASGI1R_EL1, + (3, 0, 12, 11, 7): ICC_SGI0R_EL1, + + (3, 0, 12, 12, 0): ICC_IAR1_EL1, # Alias ICV_IAR1_EL1 + (3, 0, 12, 12, 1): ICC_EOIR1_EL1, # Alias ICV_EOIR1_EL1 + (3, 0, 12, 12, 2): ICC_HPPIR1_EL1, # Alias ICV_HPPIR1_EL1 + (3, 0, 12, 12, 3): ICC_BPR1_EL1, # Alias ICV_BPR1_EL1 + (3, 0, 12, 12, 4): ICC_CTLR_EL1, # Alias ICV_CTLR_EL1 + (3, 0, 12, 12, 5): ICC_SRE_EL1, + (3, 0, 12, 12, 6): ICC_IGRPEN0_EL1, # Alias ICV_IGRPEN0_EL1 + (3, 0, 12, 12, 7): ICC_IGRPEN1_EL1, # Alias ICV_IGRPEN1_EL1 + + (3, 0, 13, 0, 1): CONTEXTIDR_EL1, + (3, 0, 13, 0, 4): TPIDR_EL1, + + (3, 0, 14, 1, 0): CNTKCTL_EL1, + + (3, 1, 0, 0, 0): CCSIDR_EL1, + (3, 1, 0, 0, 1): CLIDR_EL1, + (3, 1, 0, 0, 2): CCSIDR2_EL1, + (3, 1, 0, 0, 7): AIDR_EL1, + + (3, 2, 0, 0, 0): CSSELR_EL1, + (3, 0, 0, 0, 1): CTR_EL0, + + (3, 3, 0, 0, 7): DCZID_EL0, + + (3, 3, 4, 4, 0): FPCR, + (3, 3, 4, 4, 1): FPSR, + + (3, 3, 4, 5, 0): DSPSR_EL0, + (3, 3, 4, 5, 1): DLR_EL0, + + (3, 4, 4, 0, 0): SPSR_EL2, + (3, 4 ,4, 0, 1): ELR_EL2, + + (3, 4, 4, 1, 0): SP_EL1, + + (3, 4, 4, 3, 0): SPSR_irq, + (3, 4, 4, 3, 1): SPSR_abt, + (3, 4, 4, 3, 2): SPSR_und, + (3, 4, 4, 3, 3): SPSR_fiq, + + (3, 3, 9, 12, 0): PMCR_EL0, + (3, 3, 9, 12, 1): PMCNTENSET_EL0, + (3, 3, 9, 12, 2): PMCNTENCLR_EL0, + (3, 3, 9, 12, 3): PMOVSCLR_EL0, + (3, 3, 9, 12, 4): PMSWINC_EL0, + (3, 3, 9, 12, 5): PMSELR_EL0, + (3, 3, 9, 12, 6): PMCEID0_EL0, + (3, 3, 9, 12, 7): PMCEID1_EL0, + + (3, 3, 9, 13, 0): PMCCNTR_EL0, + (3, 3, 9, 13, 1): PMXEVTYPER_EL0, + (3, 3, 9, 13, 2): PMXEVCNTR_EL0, + + (3, 3, 9, 14, 0): PMUSERENR_EL0, + (3, 3, 9, 14, 3): PMOVSSET_EL0, + + (3, 3, 13, 0, 2): TPIDR_EL0, + (3, 3, 13, 0, 3): TPIDRRO_EL0, + + (3, 3, 13, 2, 0): AMCR_EL0, + (3, 3, 13, 2, 1): AMCFGR_EL0, + (3, 3, 13, 2, 2): AMCGCR_EL0, + (3, 3, 13, 2, 3): AMUSERENR_EL0, + (3, 3, 13, 2, 4): AMCNTENCLR0_EL0, + (3, 3, 13, 2, 5): AMCNTENSET0_EL0, + (3, 3, 13, 2, 6): AMCG1IDR_EL0, + + (3, 3, 13, 3, 0): AMCNTENCLR1_EL0, + (3, 3, 13, 3, 1): AMCNTENSET1_EL0, + + (3, 3, 13, 4, 0): AMEVCNTR00_EL0, + (3, 3, 13, 4, 1): AMEVCNTR01_EL0, + (3, 3, 13, 4, 2): AMEVCNTR02_EL0, + (3, 3, 13, 4, 3): AMEVCNTR03_EL0, + (3, 3, 13, 4, 4): AMEVCNTR04_EL0, + (3, 3, 13, 4, 5): AMEVCNTR05_EL0, + (3, 3, 13, 4, 6): AMEVCNTR06_EL0, + (3, 3, 13, 4, 7): AMEVCNTR07_EL0, + + (3, 3, 13, 5, 0): AMEVCNTR08_EL0, + (3, 3, 13, 5, 1): AMEVCNTR09_EL0, + (3, 3, 13, 5, 2): AMEVCNTR010_EL0, + (3, 3, 13, 5, 3): AMEVCNTR011_EL0, + (3, 3, 13, 5, 4): AMEVCNTR012_EL0, + (3, 3, 13, 5, 5): AMEVCNTR013_EL0, + (3, 3, 13, 5, 6): AMEVCNTR014_EL0, + (3, 3, 13, 5, 7): AMEVCNTR015_EL0, + + (3, 3, 13, 6, 0): AMEVTYPER00_EL0, + (3, 3, 13, 6, 1): AMEVTYPER01_EL0, + (3, 3, 13, 6, 2): AMEVTYPER02_EL0, + (3, 3, 13, 6, 3): AMEVTYPER03_EL0, + (3, 3, 13, 6, 4): AMEVTYPER04_EL0, + (3, 3, 13, 6, 5): AMEVTYPER05_EL0, + (3, 3, 13, 6, 6): AMEVTYPER06_EL0, + (3, 3, 13, 6, 7): AMEVTYPER07_EL0, + + (3, 3, 13, 7, 0): AMEVTYPER08_EL0, + (3, 3, 13, 7, 1): AMEVTYPER09_EL0, + (3, 3, 13, 7, 2): AMEVTYPER010_EL0, + (3, 3, 13, 7, 3): AMEVTYPER011_EL0, + (3, 3, 13, 7, 4): AMEVTYPER012_EL0, + (3, 3, 13, 7, 5): AMEVTYPER013_EL0, + (3, 3, 13, 7, 6): AMEVTYPER014_EL0, + (3, 3, 13, 7, 7): AMEVTYPER015_EL0, + + (3, 3, 13, 12, 0): AMEVCNTR10_EL0, + (3, 3, 13, 12, 1): AMEVCNTR11_EL0, + (3, 3, 13, 12, 2): AMEVCNTR12_EL0, + (3, 3, 13, 12, 3): AMEVCNTR13_EL0, + (3, 3, 13, 12, 4): AMEVCNTR14_EL0, + (3, 3, 13, 12, 5): AMEVCNTR15_EL0, + (3, 3, 13, 12, 6): AMEVCNTR16_EL0, + (3, 3, 13, 12, 7): AMEVCNTR17_EL0, + + (3, 3, 13, 13, 0): AMEVCNTR18_EL0, + (3, 3, 13, 13, 1): AMEVCNTR19_EL0, + (3, 3, 13, 13, 2): AMEVCNTR110_EL0, + (3, 3, 13, 13, 3): AMEVCNTR111_EL0, + (3, 3, 13, 13, 4): AMEVCNTR112_EL0, + (3, 3, 13, 13, 5): AMEVCNTR113_EL0, + (3, 3, 13, 13, 6): AMEVCNTR114_EL0, + (3, 3, 13, 13, 7): AMEVCNTR115_EL0, + + (3, 3, 13, 14, 0): AMEVTYPER10_EL0, + (3, 3, 13, 14, 1): AMEVTYPER11_EL0, + (3, 3, 13, 14, 2): AMEVTYPER12_EL0, + (3, 3, 13, 14, 3): AMEVTYPER13_EL0, + (3, 3, 13, 14, 4): AMEVTYPER14_EL0, + (3, 3, 13, 14, 5): AMEVTYPER15_EL0, + (3, 3, 13, 14, 6): AMEVTYPER16_EL0, + (3, 3, 13, 14, 7): AMEVTYPER17_EL0, + + (3, 3, 13, 15, 0): AMEVTYPER18_EL0, + (3, 3, 13, 15, 1): AMEVTYPER19_EL0, + (3, 3, 13, 15, 2): AMEVTYPER110_EL0, + (3, 3, 13, 15, 3): AMEVTYPER111_EL0, + (3, 3, 13, 15, 4): AMEVTYPER112_EL0, + (3, 3, 13, 15, 5): AMEVTYPER113_EL0, + (3, 3, 13, 15, 6): AMEVTYPER114_EL0, + (3, 3, 13, 15, 7): AMEVTYPER115_EL0, + + (3, 3, 14, 0, 0): CNTFRQ_EL0, + (3, 3, 14, 0, 1): CNTPCT_EL0, + (3, 3, 14, 0, 2): CNTVCT_EL0, + (3, 3, 14, 0, 5): CNTPCTSS_EL0, + (3, 3, 14, 0, 6): CNTVCTSS_EL0, + + (3, 3, 14, 2, 0): CNTP_TVAL_EL0, + (3, 3, 14, 2, 1): CNTP_CTL_EL0, + (3, 3, 14, 2, 2): CNTP_CVAL_EL0, + + (3, 3, 14, 3, 0): CNTV_TVAL_EL0, + (3, 3, 14, 3, 1): CNTV_CTL_EL0, + (3, 3, 14, 3, 2): CNTV_CVAL_EL0, + + (3, 3, 14, 8, 0): PMEVCNTR0_EL0, + (3, 3, 14, 8, 1): PMEVCNTR1_EL0, + (3, 3, 14, 8, 2): PMEVCNTR2_EL0, + (3, 3, 14, 8, 3): PMEVCNTR3_EL0, + (3, 3, 14, 8, 4): PMEVCNTR4_EL0, + (3, 3, 14, 8, 5): PMEVCNTR5_EL0, + (3, 3, 14, 8, 6): PMEVCNTR6_EL0, + (3, 3, 14, 8, 7): PMEVCNTR7_EL0, + + (3, 3, 14, 9, 0): PMEVCNTR8_EL0, + (3, 3, 14, 9, 1): PMEVCNTR9_EL0, + (3, 3, 14, 9, 2): PMEVCNTR10_EL0, + (3, 3, 14, 9, 3): PMEVCNTR11_EL0, + (3, 3, 14, 9, 4): PMEVCNTR12_EL0, + (3, 3, 14, 9, 5): PMEVCNTR13_EL0, + (3, 3, 14, 9, 6): PMEVCNTR14_EL0, + (3, 3, 14, 9, 7): PMEVCNTR15_EL0, + + (3, 3, 14, 10, 0): PMEVCNTR16_EL0, + (3, 3, 14, 10, 1): PMEVCNTR17_EL0, + (3, 3, 14, 10, 2): PMEVCNTR18_EL0, + (3, 3, 14, 10, 3): PMEVCNTR19_EL0, + (3, 3, 14, 10, 4): PMEVCNTR20_EL0, + (3, 3, 14, 10, 5): PMEVCNTR21_EL0, + (3, 3, 14, 10, 6): PMEVCNTR22_EL0, + (3, 3, 14, 10, 7): PMEVCNTR23_EL0, + + (3, 3, 14, 11, 0): PMEVCNTR24_EL0, + (3, 3, 14, 11, 1): PMEVCNTR25_EL0, + (3, 3, 14, 11, 2): PMEVCNTR26_EL0, + (3, 3, 14, 11, 3): PMEVCNTR27_EL0, + (3, 3, 14, 11, 4): PMEVCNTR28_EL0, + (3, 3, 14, 11, 5): PMEVCNTR29_EL0, + (3, 3, 14, 11, 6): PMEVCNTR30_EL0, + + (3, 3, 14, 12, 0): PMEVTYPER0_EL0, + (3, 3, 14, 12, 1): PMEVTYPER1_EL0, + (3, 3, 14, 12, 2): PMEVTYPER2_EL0, + (3, 3, 14, 12, 3): PMEVTYPER3_EL0, + (3, 3, 14, 12, 4): PMEVTYPER4_EL0, + (3, 3, 14, 12, 5): PMEVTYPER5_EL0, + (3, 3, 14, 12, 6): PMEVTYPER6_EL0, + (3, 3, 14, 12, 7): PMEVTYPER7_EL0, + + (3, 3, 14, 13, 0): PMEVTYPER8_EL0, + (3, 3, 14, 13, 1): PMEVTYPER9_EL0, + (3, 3, 14, 13, 2): PMEVTYPER10_EL0, + (3, 3, 14, 13, 3): PMEVTYPER11_EL0, + (3, 3, 14, 13, 4): PMEVTYPER12_EL0, + (3, 3, 14, 13, 5): PMEVTYPER13_EL0, + (3, 3, 14, 13, 6): PMEVTYPER14_EL0, + (3, 3, 14, 13, 7): PMEVTYPER15_EL0, + + (3, 3, 14, 14, 0): PMEVTYPER16_EL0, + (3, 3, 14, 14, 1): PMEVTYPER17_EL0, + (3, 3, 14, 14, 2): PMEVTYPER18_EL0, + (3, 3, 14, 14, 3): PMEVTYPER19_EL0, + (3, 3, 14, 14, 4): PMEVTYPER20_EL0, + (3, 3, 14, 14, 5): PMEVTYPER21_EL0, + (3, 3, 14, 14, 6): PMEVTYPER22_EL0, + (3, 3, 14, 14, 7): PMEVTYPER23_EL0, + + (3, 3, 14, 15, 0): PMEVTYPER24_EL0, + (3, 3, 14, 15, 1): PMEVTYPER25_EL0, + (3, 3, 14, 15, 2): PMEVTYPER26_EL0, + (3, 3, 14, 15, 3): PMEVTYPER27_EL0, + (3, 3, 14, 15, 4): PMEVTYPER28_EL0, + (3, 3, 14, 15, 5): PMEVTYPER29_EL0, + (3, 3, 14, 15, 6): PMEVTYPER30_EL0, + (3, 3, 14, 15, 7): PMCCFILTR_EL0, + + (3, 4, 0, 0, 0): VPIDR_EL2, + (3, 4, 0, 0, 5): VMPIDR_EL2, + + (3, 4, 1, 0, 0): SCTLR_EL2, + (3, 4, 1, 0, 5): ACTLR_EL2, + + (3, 4, 1, 1, 0): HCR_EL2, + (3, 4, 1, 1, 1): MDCR_EL2, + (3, 4, 1, 1, 2): CPTR_EL2, + (3, 4, 1, 1, 3): HSTR_EL2, + (3, 4, 1, 1, 4): HFGRTR_EL2, + (3, 4, 1, 1, 5): HFGWTR_EL2, + (3, 4, 1, 1, 6): HFGITR_EL2, + (3, 4, 1, 1, 7): HACR_EL2, + + (3, 4, 1, 2, 0): ZCR_EL2, + + (3, 4, 1, 2, 1): TRFCR_EL2, + + (3, 4, 1, 3, 1): SDER32_EL2, + + (3, 4, 2, 0, 0): TTBR0_EL2, + (3, 4, 2, 0, 2): TCR_EL2, + + (3, 4, 2, 1, 0): VTTBR_EL2, + (3, 4, 2, 1, 2): VTCR_EL2, + + (3, 4, 2, 2, 0): VNCR_EL2, + + (3, 4, 2, 6, 0): VSTTBR_EL2, + (3, 4, 2, 6, 2): VSTCR_EL2, + + (3, 4, 3, 0, 0): DACR32_EL2, + + (3, 4, 3, 1, 4): HDFGRTR_EL2, + (3, 4, 3, 1, 5): HDFGWTR_EL2, + (3, 4, 3, 1, 6): HAFGRTR_EL2, + + (3, 4, 5, 0, 1): IFSR32_EL2, + + (3, 4, 5, 1, 0): AFSR0_EL2, + (3, 4, 5, 1, 1): AFSR1_EL2, + + (3, 4, 5, 2, 0): ESR_EL2, + (3, 4, 5, 2, 3): VSESR_EL2, + + (3, 4, 5, 3, 0): FPEXC32_EL2, + + (3, 4, 6, 0, 0): FAR_EL2, + (3, 4, 6, 0, 4): HPFAR_EL2, + + (3, 4, 9, 9, 0): PMSCR_EL2, + + (3, 4, 10, 2, 0): MAIR_EL2, + + (3, 4, 10, 3, 0): AMAIR_EL2, + + (3, 4, 12, 0, 0): VBAR_EL2, + (3, 4, 12, 0, 1): RVBAR_EL2, + (3, 4, 12, 0, 2): RMR_EL2, + + (3, 4, 12, 1, 1): VDISR_EL2, + + (3, 4, 12, 8, 0): ICH_AP0R0_EL2, + (3, 4, 12, 8, 1): ICH_AP0R1_EL2, + (3, 4, 12, 8, 2): ICH_AP0R2_EL2, + (3, 4, 12, 8, 3): ICH_AP0R3_EL2, + + (3, 4, 12, 9, 0): ICH_AP1R0_EL2, + (3, 4, 12, 9, 1): ICH_AP1R1_EL2, + (3, 4, 12, 9, 2): ICH_AP1R2_EL2, + (3, 4, 12, 9, 3): ICH_AP1R3_EL2, + (3, 4, 12, 9, 5): ICC_SRE_EL2, + + (3, 4, 12, 11, 0): ICH_HCR_EL2, + (3, 4, 12, 11, 1): ICH_VTR_EL2, + (3, 4, 12, 11, 2): ICH_MISR_EL2, + (3, 4, 12, 11, 3): ICH_EISR_EL2, + (3, 4, 12, 11, 5): ICH_ELRSR_EL2, + (3, 4, 12, 11, 7): ICH_VMCR_EL2, + + (3, 4, 12, 12, 0): ICH_LR0_EL2, + (3, 4, 12, 12, 1): ICH_LR1_EL2, + (3, 4, 12, 12, 2): ICH_LR2_EL2, + (3, 4, 12, 12, 3): ICH_LR3_EL2, + (3, 4, 12, 12, 4): ICH_LR4_EL2, + (3, 4, 12, 12, 5): ICH_LR5_EL2, + (3, 4, 12, 12, 6): ICH_LR6_EL2, + (3, 4, 12, 12, 7): ICH_LR7_EL2, + + (3, 4, 12, 13, 0): ICH_LR8_EL2, + (3, 4, 12, 13, 1): ICH_LR9_EL2, + (3, 4, 12, 13, 2): ICH_LR10_EL2, + (3, 4, 12, 13, 3): ICH_LR11_EL2, + (3, 4, 12, 13, 4): ICH_LR12_EL2, + (3, 4, 12, 13, 5): ICH_LR13_EL2, + (3, 4, 12, 13, 6): ICH_LR14_EL2, + (3, 4, 12, 13, 7): ICH_LR15_EL2, + + (3, 4, 13, 0, 1): CONTEXTIDR_EL2, + (3, 4, 13, 0, 2): TPIDR_EL2, + + (3, 4, 13, 8, 0): AMEVCNTVOFF00_EL2, + (3, 4, 13, 8, 1): AMEVCNTVOFF01_EL2, + (3, 4, 13, 8, 2): AMEVCNTVOFF02_EL2, + (3, 4, 13, 8, 3): AMEVCNTVOFF03_EL2, + (3, 4, 13, 8, 4): AMEVCNTVOFF04_EL2, + (3, 4, 13, 8, 5): AMEVCNTVOFF05_EL2, + (3, 4, 13, 8, 6): AMEVCNTVOFF06_EL2, + (3, 4, 13, 8, 7): AMEVCNTVOFF07_EL2, + + (3, 4, 13, 9, 0): AMEVCNTVOFF08_EL2, + (3, 4, 13, 9, 1): AMEVCNTVOFF09_EL2, + (3, 4, 13, 9, 2): AMEVCNTVOFF010_EL2, + (3, 4, 13, 9, 3): AMEVCNTVOFF011_EL2, + (3, 4, 13, 9, 4): AMEVCNTVOFF012_EL2, + (3, 4, 13, 9, 5): AMEVCNTVOFF013_EL2, + (3, 4, 13, 9, 6): AMEVCNTVOFF014_EL2, + (3, 4, 13, 9, 7): AMEVCNTVOFF015_EL2, + + (3, 4, 13, 10, 0): AMEVCNTVOFF10_EL2, + (3, 4, 13, 10, 1): AMEVCNTVOFF11_EL2, + (3, 4, 13, 10, 2): AMEVCNTVOFF12_EL2, + (3, 4, 13, 10, 3): AMEVCNTVOFF13_EL2, + (3, 4, 13, 10, 4): AMEVCNTVOFF14_EL2, + (3, 4, 13, 10, 5): AMEVCNTVOFF15_EL2, + (3, 4, 13, 10, 6): AMEVCNTVOFF16_EL2, + (3, 4, 13, 10, 7): AMEVCNTVOFF17_EL2, + + (3, 4, 13, 11, 0): AMEVCNTVOFF18_EL2, + (3, 4, 13, 11, 1): AMEVCNTVOFF19_EL2, + (3, 4, 13, 11, 2): AMEVCNTVOFF110_EL2, + (3, 4, 13, 11, 3): AMEVCNTVOFF111_EL2, + (3, 4, 13, 11, 4): AMEVCNTVOFF112_EL2, + (3, 4, 13, 11, 5): AMEVCNTVOFF113_EL2, + (3, 4, 13, 11, 6): AMEVCNTVOFF114_EL2, + (3, 4, 13, 11, 7): AMEVCNTVOFF115_EL2, + + (3, 4, 14, 0, 3): CNTVOFF_EL2, + (3, 4, 14, 0, 6): CNTPOFF_EL2, + + (3, 4, 14, 1, 0): CNTHCTL_EL2, + + (3, 4, 14, 2, 0): CNTHP_TVAL_EL2, + (3, 4, 14, 2, 1): CNTHP_CTL_EL2, + (3, 4, 14, 2, 2): CNTHP_CVAL_EL2, + + (3, 4, 14, 3, 0): CNTHV_TVAL_EL2, + (3, 4, 14, 3, 1): CNTHV_CTL_EL2, + (3, 4, 14, 3, 2): CNTHV_CVAL_EL2, + + (3, 4, 14, 4, 0): CNTHVS_TVAL_EL2, + (3, 4, 14, 4, 1): CNTHVS_CTL_EL2, + (3, 4, 14, 4, 2): CNTHVS_CVAL_EL2, + + (3, 4, 14, 5, 0): CNTHPS_TVAL_EL2, + (3, 4, 14, 5, 1): CNTHPS_CTL_EL2, + (3, 4, 14, 5, 2): CNTHPS_CVAL_EL2, + + # Aliases for *_EL02 *_EL12 + # see page 2864 of "Arm Architecture Reference Manual Armv8, + # for Armv8-A architecture profile" Release 31 March 2020 + (3, 5, 1, 0, 0): SCTLR_EL1, + (3, 5, 1, 0, 2): CPACR_EL1, + + (3, 5, 1, 2, 0): ZCR_EL1, + (3, 5, 1, 2, 1): TRFCR_EL1, + + (3, 5, 2, 0, 0): TTBR0_EL1, + (3, 5, 2, 0, 1): TTBR1_EL1, + (3, 5, 2, 0, 2): TCR_EL1, + + (3, 5, 4, 0, 0): SPSR_EL1, + (3, 5, 4, 0, 1): ELR_EL1, + + (3, 5, 5, 1, 0): AFSR0_EL1, + (3, 5, 5, 1, 1): AFSR1_EL1, + + (3, 5, 5, 2, 0): ESR_EL1, + + (3, 5, 6, 0, 0): FAR_EL1, + + (3, 5, 9, 9, 0): PMSCR_EL1, + + (3, 5, 10, 2, 0): MAIR_EL1, + + (3, 5, 10, 3, 0): AMAIR_EL1, + + (3, 5, 12, 0, 0): VBAR_EL1, + + (3, 5, 13, 0, 0): CONTEXTIDR_EL1, + + (3, 5, 14, 1, 0): CNTKCTL_EL1, + + (3, 5, 14, 2, 0): CNTP_TVAL_EL0, + (3, 5, 14, 2, 1): CNTP_CTL_EL0, + (3, 5, 14, 2, 2): CNTP_CVAL_EL0, + + (3, 5, 14, 3, 0): CNTV_TVAL_EL0, + (3, 5, 14, 3, 1): CNTV_CTL_EL0, + (3, 5, 14, 3, 2): CNTV_CVAL_EL0, + # End of aliases + + (3, 6, 1, 0, 0): SCTLR_EL3, + (3, 6, 1, 0, 1): ACTLR_EL3, + + (3, 6, 1, 1, 0): SCR_EL3, + (3, 6, 1, 1, 1): SDER32_EL3, + (3, 6, 1, 1, 2): CPTR_EL3, + + (3, 6, 1, 2, 0): ZCR_EL3, + + (3, 6, 1, 3, 1): MDCR_EL3, + + (3, 6, 2, 0, 0): TTBR0_EL3, + (3, 6, 2, 0, 2): TCR_EL3, + + (3, 6, 4, 0, 0): SPSR_EL3, + (3, 6, 4, 0, 1): ELR_EL3, + + (3, 6, 4, 1, 0): SP_EL2, + + (3, 6, 5, 1, 0): AFSR0_EL3, + (3, 6, 5, 1, 1): AFSR1_EL3, + + (3, 6, 5, 2, 0): ESR_EL3, + + (3, 6, 6, 0, 0): FAR_EL3, + + (3, 6, 10, 2, 0): MAIR_EL3, + + (3, 6, 10, 3, 0): AMAIR_EL3, + + (3, 6, 12, 0, 0): VBAR_EL3, + (3, 6, 12, 0, 1): RVBAR_EL3, + (3, 6, 12, 0, 2): RMR_EL3, + + (3, 6, 12, 12, 4): ICC_CTLR_EL3, + (3, 6, 12, 12, 5): ICC_SRE_EL3, + (3, 6, 12, 12, 7): ICC_IGRPEN1_EL3, + + (3, 6, 13, 0, 2): TPIDR_EL3, + + (3, 7, 14, 2, 0): CNTPS_TVAL_EL1, + (3, 7, 14, 2, 1): CNTPS_CTL_EL1, + (3, 7, 14, 2, 2): CNTPS_CVAL_EL1, +} # CPSR: N Z C V @@ -746,9 +1473,9 @@ def bfm(ir, instr, arg1, arg2, arg3, arg4): -def mrs(ir, insr, arg1, arg2, arg3, arg4, arg5): +def mrs(ir, insr, arg1, arg2, arg3, arg4, arg5, arg6): e = [] - if arg2.is_int(3) and arg3.is_id("c4") and arg4.is_id("c2") and arg5.is_int(0): + if arg2.is_int(3) and arg3.is_int(3) and arg4.is_id("c4") and arg5.is_id("c2") and arg6.is_int(0): out = [] out.append(ExprInt(0x0, 28)) out.append(of) @@ -756,20 +1483,110 @@ def mrs(ir, insr, arg1, arg2, arg3, arg4, arg5): out.append(zf) out.append(nf) e.append(ExprAssign(arg1, ExprCompose(*out).zeroExtend(arg1.size))) + + elif arg1.is_int(3) and arg2.is_int(3) and arg3.is_id("c4") and arg4.is_id("c2") and arg5.is_int(7): + out = [] + out.append(ExprInt(0x0, 38)) + out.append(tco) + e.append(ExprAssign(arg1, ExprCompose(*out).zeroExtend(arg1.size))) + + elif arg1.is_int(3) and arg2.is_int(3) and arg3.is_id("c4") and arg4.is_id("c2") and arg5.is_int(0): + out = [] + out.append(ExprInt(0x0, 39)) + out.append(dit) + e.append(ExprAssign(arg1, ExprCompose(*out).zeroExtend(arg1.size))) + + elif arg1.is_int(3) and arg2.is_int(0) and arg3.is_id("c4") and arg4.is_id("c2") and arg5.is_int(4): + out = [] + out.append(ExprInt(0x0, 40)) + out.append(uao) + e.append(ExprAssign(arg1, ExprCompose(*out).zeroExtend(arg1.size))) + + elif arg1.is_int(3) and arg2.is_int(0) and arg3.is_id("c4") and arg4.is_id("c2") and arg5.is_int(3): + out = [] + out.append(ExprInt(0x0, 41)) + out.append(pan) + e.append(ExprAssign(arg1, ExprCompose(*out).zeroExtend(arg1.size))) + + elif arg1.is_int(3) and arg2.is_int(3) and arg3.is_id("c4") and arg4.is_id("c2") and arg5.is_int(6): + out = [] + out.append(ExprInt(0x0, 51)) + out.append(ssbs) + e.append(ExprAssign(arg1, ExprCompose(*out).zeroExtend(arg1.size))) + + elif arg1.is_int(3) and arg2.is_int(3) and arg3.is_id("c4") and arg4.is_id("c2") and arg5.is_int(1): + out = [] + out.append(ExprInt(0x0, 54)) + out.append(df) + out.append(af) + out.append(iff) + out.append(ff) + e.append(ExprAssign(arg1, ExprCompose(*out).zeroExtend(arg1.size))) + + elif arg1.is_int(3) and arg2.is_int(0) and arg3.is_id("c4") and arg4.is_id("c2") and arg5.is_int(2): + out = [] + out.append(ExprInt(0x0, 60)) + out.append(cur_el) + e.append(ExprAssign(arg1, ExprCompose(*out).zeroExtend(arg1.size))) + + elif arg1.is_int(3) and arg2.is_int(0) and arg3.is_id("c4") and arg4.is_id("c2") and arg5.is_int(0): + out = [] + out.append(ExprInt(0x0, 63)) + out.append(spsel) + e.append(ExprAssign(arg1, ExprCompose(*out).zeroExtend(arg1.size))) + else: - raise NotImplementedError("MRS not implemented") + sreg = (int(arg2), int(arg3), int(str(arg4)[1:]), int(str(arg5)[1:]), int(arg6)) + if sreg in system_regs: + e.append(ExprAssign(arg1, system_regs[sreg])) + else: + raise NotImplementedError("Unknown system register: %d %d %s %s %d" % (int(arg2), int(arg3), str(arg4), str(arg5), int(arg6))) + return e, [] -def msr(ir, instr, arg1, arg2, arg3, arg4, arg5): +def msr(ir, instr, arg1, arg2, arg3, arg4, arg5, arg6): e = [] - if arg1.is_int(3) and arg2.is_id("c4") and arg3.is_id("c2") and arg4.is_int(0): - e.append(ExprAssign(nf, arg5[31:32])) - e.append(ExprAssign(zf, arg5[30:31])) - e.append(ExprAssign(cf, arg5[29:30])) - e.append(ExprAssign(of, arg5[28:29])) + if arg1.is_int(3) and arg2.is_int(3) and arg3.is_id("c4") and arg4.is_id("c2") and arg5.is_int(0): + e.append(ExprAssign(nf, arg6[31:32])) + e.append(ExprAssign(zf, arg6[30:31])) + e.append(ExprAssign(cf, arg6[29:30])) + e.append(ExprAssign(of, arg6[28:29])) + + elif arg1.is_int(3) and arg2.is_int(3) and arg3.is_id("c4") and arg4.is_id("c2") and arg5.is_int(7): + e.append(ExprAssign(tco, arg6[25:26])) + + elif arg1.is_int(3) and arg2.is_int(3) and arg3.is_id("c4") and arg4.is_id("c2") and arg5.is_int(0): + e.append(ExprAssign(dit, arg6[24:25])) + + elif arg1.is_int(3) and arg2.is_int(0) and arg3.is_id("c4") and arg4.is_id("c2") and arg5.is_int(4): + e.append(ExprAssign(uao, arg6[23:24])) + + elif arg1.is_int(3) and arg2.is_int(0) and arg3.is_id("c4") and arg4.is_id("c2") and arg5.is_int(3): + e.append(ExprAssign(pan, arg6[22:23])) + + elif arg1.is_int(3) and arg2.is_int(3) and arg3.is_id("c4") and arg4.is_id("c2") and arg5.is_int(6): + e.append(ExprAssign(ssbs, arg6[12:13])) + + elif arg1.is_int(3) and arg2.is_int(3) and arg3.is_id("c4") and arg4.is_id("c2") and arg5.is_int(1): + e.append(ExprAssign(df, arg6[9:10])) + e.append(ExprAssign(af, arg6[8:9])) + e.append(ExprAssign(iff, arg6[7:8])) + e.append(ExprAssign(ff, arg6[6:7])) + + elif arg1.is_int(3) and arg2.is_int(0) and arg3.is_id("c4") and arg4.is_id("c2") and arg5.is_int(2): + e.append(ExprAssign(cur_el, arg6[2:4])) + + elif arg1.is_int(3) and arg2.is_int(0) and arg3.is_id("c4") and arg4.is_id("c2") and arg5.is_int(0): + e.append(ExprAssign(spsel, arg6[0:1])) + else: - raise NotImplementedError("MSR not implemented") + sreg = (int(arg1), int(arg2), int(str(arg3)[1:]), int(str(arg4)[1:]), int(arg5)) + if sreg in system_regs: + e.append(ExprAssign(system_regs[sreg], arg6)) + else: + raise NotImplementedError("Unknown system register: %d %d %s %s %d" % (int(arg1), int(arg2), str(arg3), str(arg4), int(arg5))) + return e, [] diff --git a/test/arch/aarch64/arch.py b/test/arch/aarch64/arch.py index 9fc6ee8e..62105236 100644 --- a/test/arch/aarch64/arch.py +++ b/test/arch/aarch64/arch.py @@ -1740,14 +1740,14 @@ reg_tests_aarch64 = [ "010000D4"), - ("00458FF4 MRS X0, 0x3, c13, c0, 0x2", + ("00458FF4 MRS X0, 0x3, 0x3, c13, c0, 0x2", "40D03BD5"), - ("0045BA04 MSR 0x3, c13, c0, 0x2, X0", + ("0045BA04 MSR 0x3, 0x3, c13, c0, 0x2, X0", "40D01BD5"), - ("0048A2E8 MRS X13, 0x3, c4, c4, 0x0", - "0D443BD5"), - ("0048A9DC MRS X0, 0x3, c4, c4, 0x1", - "20443BD5"), + ("0048A2E8 MRS X8, 0x3, 0x3, c4, c2, 0x0", + "08423BD5"), + ("0048A9DC MSR 0x3, 0x3, c4, c2, 0x0, X7", + "07421BD5"), ("004010C8 ORR W2, 0x0, 0x1", "E2030032"), |