diff options
Diffstat (limited to 'tools/proxyclient/m1n1/sysreg.py')
| -rw-r--r-- | tools/proxyclient/m1n1/sysreg.py | 383 |
1 files changed, 383 insertions, 0 deletions
diff --git a/tools/proxyclient/m1n1/sysreg.py b/tools/proxyclient/m1n1/sysreg.py new file mode 100644 index 0000000..3c08238 --- /dev/null +++ b/tools/proxyclient/m1n1/sysreg.py @@ -0,0 +1,383 @@ +# SPDX-License-Identifier: MIT +import json, os, re +from enum import Enum, IntEnum, IntFlag +from .utils import Register, Register64, Register32 + +__all__ = ["sysreg_fwd", "sysreg_rev"] + +def _load_registers(): + global sysreg_fwd, sysop_fwd + + sysreg_fwd = {} + sysop_fwd = {} + for fname in ["arm_regs.json", "apple_regs.json"]: + data = json.load(open(os.path.join(os.path.dirname(__file__), "..", "..", "tools", fname))) + for reg in data: + if "accessors" in reg: + for acc in reg["accessors"]: + if acc in ("MRS", "MSR"): + sysreg_fwd[reg["name"]] = tuple(reg["enc"]) + else: + sysop_fwd[acc + " " + reg["name"]] = tuple(reg["enc"]) + else: + sysreg_fwd[reg["name"]] = tuple(reg["enc"]) + +_load_registers() +sysreg_rev = {v: k for k, v in sysreg_fwd.items()} +sysop_rev = {v: k for k, v in sysop_fwd.items()} +sysop_fwd_id = {k.replace(" ", "_"): v for k,v in sysop_fwd.items()} + +globals().update(sysreg_fwd) +__all__.extend(sysreg_fwd.keys()) +globals().update(sysop_fwd_id) +__all__.extend(sysop_fwd_id.keys()) + +def sysreg_name(enc): + if enc in sysreg_rev: + return sysreg_rev[enc] + if enc in sysop_rev: + return sysop_rev[enc] + return f"s{enc[0]}_{enc[1]}_c{enc[2]}_c{enc[3]}_{enc[4]}" + +def sysreg_parse(s): + if isinstance(s, tuple) or isinstance(s, list): + return tuple(s) + s = s.strip() + for r in (r"s(\d+)_(\d+)_c(\d+)_c(\d+)_(\d+)", r"(\d+), *(\d+), *(\d+), *(\d+), *(\d+)"): + if m := re.match(r, s): + enc = tuple(map(int, m.groups())) + break + else: + for i in sysreg_fwd, sysop_fwd, sysop_fwd_id: + try: + enc = i[s] + except KeyError: + continue + break + else: + raise Exception(f"Unknown sysreg name {s}") + return enc + +def DBGBCRn_EL1(n): + return (2,0,0,n,5) + +def DBGBVRn_EL1(n): + return (2,0,0,n,4) + +def DBGWCRn_EL1(n): + return (2,0,0,n,7) + +def DBGWVRn_EL1(n): + return (2,0,0,n,6) + +class ESR_EC(IntEnum): + UNKNOWN = 0b000000 + WFI = 0b000001 + FP_TRAP = 0b000111 + PAUTH_TRAP = 0b001000 + LS64 = 0b001010 + BTI = 0b001101 + ILLEGAL = 0b001110 + SVC = 0b010101 + HVC = 0b010110 + SMC = 0b010111 + MSR = 0b011000 + SVE = 0b011001 + PAUTH_FAIL = 0b011100 + IABORT_LOWER = 0b100000 + IABORT = 0b100001 + PC_ALIGN = 0b100010 + DABORT_LOWER = 0b100100 + DABORT = 0b100101 + SP_ALIGN = 0b100110 + FP_EXC = 0b101100 + SERROR = 0b101111 + BKPT_LOWER = 0b110000 + BKPT = 0b110001 + SSTEP_LOWER = 0b110010 + SSTEP = 0b110011 + WATCH_LOWER = 0b110100 + WATCH = 0b110101 + BRK = 0b111100 + IMPDEF = 0b111111 + +class MSR_DIR(IntEnum): + WRITE = 0 + READ = 1 + +class ESR_ISS_MSR(Register32): + Op0 = 21, 20 + Op2 = 19, 17 + Op1 = 16, 14 + CRn = 13, 10 + Rt = 9, 5 + CRm = 4, 1 + DIR = 0, 0, MSR_DIR + +class DABORT_DFSC(IntEnum): + ASIZE_L0 = 0b000000 + ASIZE_L1 = 0b000001 + ASIZE_L2 = 0b000010 + ASIZE_L3 = 0b000011 + XLAT_L0 = 0b000100 + XLAT_L1 = 0b000101 + XLAT_L2 = 0b000110 + XLAT_L3 = 0b000111 + AF_L0 = 0b001000 + AF_L1 = 0b001001 + AF_L2 = 0b001010 + AF_L3 = 0b001011 + PERM_L0 = 0b001100 + PERM_L1 = 0b001101 + PERM_L2 = 0b001110 + PERM_L3 = 0b001111 + EABORT = 0b010000 + TAG_CHECK = 0b010001 + PT_EABORT_Lm1 = 0b010011 + PT_EABORT_L0 = 0b010100 + PT_EABORT_L1 = 0b010101 + PT_EABORT_L2 = 0b010110 + PT_EABORT_L3 = 0b010111 + ECC_ERROR = 0b011000 + PT_ECC_ERROR_Lm1 = 0b011011 + PT_ECC_ERROR_L0 = 0b011100 + PT_ECC_ERROR_L1 = 0b011101 + PT_ECC_ERROR_L2 = 0b011110 + PT_ECC_ERROR_L3 = 0b011111 + ALIGN = 0b100001 + ASIZE_Lm1 = 0b101001 + XLAT_Lm1 = 0b101011 + TLB_CONFLICT = 0b110000 + UNSUPP_ATOMIC = 0b110001 + IMPDEF_LOCKDOWN = 0b110100 + IMPDEF_ATOMIC = 0b110101 + +class ESR_ISS_DABORT(Register32): + ISV = 24 + SAS = 23, 22 + SSE = 21 + SRT = 20, 16 + SF = 15 + AR = 14 + VNCR = 13 + SET = 12, 11 + LSR = 12, 11 + FnV = 10 + EA = 9 + CM = 8 + S1PTR = 7 + WnR = 6 + DFSC = 5, 0, DABORT_DFSC + +class ESR(Register64): + ISS2 = 36, 32 + EC = 31, 26, ESR_EC + IL = 25 + ISS = 24, 0 + +class SPSR_M(IntEnum): + EL0t = 0 + EL1t = 4 + EL1h = 5 + EL2t = 8 + EL2h = 9 + +class SPSR(Register64): + N = 31 + Z = 30 + C = 29 + V = 28 + TCO = 25 + DIT = 24 + UAO = 23 + PAN = 22 + SS = 21 + IL = 20 + SSBS = 12 + BTYPE = 11, 10 + D = 9 + A = 8 + I = 7 + F = 6 + M = 4, 0, SPSR_M + +class ACTLR(Register64): + EnMDSB = 12 + EnPRSV = 6 + EnAFP = 5 + EnAPFLG = 4 + DisHWP = 3 + EnTSO = 1 + +class HCR(Register64): + TWEDEL = 63, 60 + TWEDEn = 59 + TID5 = 58 + DCT = 57 + ATA = 56 + TTLBOS = 55 + TTLBIS = 54 + EnSCXT = 53 + TOCU = 52 + AMVOFFEN = 51 + TICAB = 50 + TID4 = 49 + FIEN = 47 + FWB = 46 + NV2 = 45 + AT = 44 + NV1 = 43 + NV = 42 + API = 41 + APK = 40 + MIOCNCE = 38 + TEA = 37 + TERR = 36 + TLOR = 35 + E2H = 34 + ID = 33 + CD = 32 + RW = 31 + TRVM = 30 + HCD = 29 + TDZ = 28 + TGE = 27 + TVM = 26 + TTLB = 25 + TPU = 24 + TPCP = 23 + TPC = 23 + TSW = 22 + TACR = 21 + TIDCP = 20 + TSC = 19 + TID3 = 18 + TID2 = 17 + TID1 = 16 + TID0 = 15 + TWE = 14 + TWI = 13 + DC = 12 + BSU = 11, 10 + FB = 9 + VSE = 8 + VI = 7 + VF = 6 + AMO = 5 + IMO = 4 + FMO = 3 + PTW = 2 + SWIO = 1 + VM = 0 + +class HACR(Register64): + TRAP_CPU_EXT = 0 + TRAP_AIDR = 4 + TRAP_AMX = 10 + TRAP_SPRR = 11 + TRAP_GXF = 13 + TRAP_CTRR = 14 + TRAP_IPI = 16 + TRAP_s3_4_c15_c5z6_x = 18 + TRAP_s3_4_c15_c0z12_5 = 19 + GIC_CNTV = 20 + TRAP_s3_4_c15_c10_4 = 25 + TRAP_SERROR_INFO = 48 + TRAP_EHID = 49 + TRAP_HID = 50 + TRAP_s3_0_c15_c12_1z2 = 51 + TRAP_ACC = 52 + TRAP_PM = 57 + TRAP_UPM = 58 + TRAP_s3_1z7_c15_cx_3 = 59 + +class AMX_CTL(Register64): + EN = 63 + EN_EL1 = 62 + +class MDCR(Register64): + TDE = 8 + TDA = 9 + TDOSA = 10 + TDRA = 11 + +class MDSCR(Register64): + SS = 0 + MDE = 15 + +class DBGBCR(Register32): + BT = 23, 20 + LBN = 16, 16 + SSC = 15, 14 + HMC = 13 + BAS = 8,5 + PMC = 2,1 + E = 0 + +class DBGWCR_LSC(IntFlag): + L = 1 + S = 2 + +class DBGWCR(Register32): + SSCE = 29 + MASK = 28, 24 + WT = 20 + LBN = 19, 16 + SSC = 15, 14 + HMC = 13 + BAS = 12, 5 + LSC = 4, 3 + PAC = 2, 1 + E = 0 + +# TCR_EL1 +class TCR(Register64): + DS = 59 + TCMA1 = 58 + TCMA0 = 57 + E0PD1 = 56 + E0PD0 = 55 + NFD1 = 54 + NFD0 = 53 + TBID1 = 52 + TBID0 = 51 + HWU162 = 50 + HWU161 = 49 + HWU160 = 48 + HWU159 = 47 + HWU062 = 46 + HWU061 = 45 + HWU060 = 44 + HWU059 = 43 + HPD1 = 42 + HPD0 = 41 + HD = 40 + HA = 39 + TBI1 = 38 + TBI0 = 37 + AS = 36 + IPS = 34, 32 + TG1 = 31, 30 + SH1 = 29, 28 + ORGN1 = 27, 26 + IRGN1 = 25, 24 + EPD1 = 23 + A1 = 22 + T1SZ = 21, 16 + TG0 = 15, 14 + SH0 = 13, 12 + ORGN0 = 11, 10 + IRGN0 = 9, 8 + EPD0 = 7 + T0SZ = 5, 0 + +class TLBI_RVA(Register64): + ASID = 63, 48 + TG = 47, 46 + SCALE = 45, 44 + NUM = 43, 39 + TTL = 38, 37 + BaseADDR = 36, 0 + +__all__.extend(k for k, v in globals().items() + if (callable(v) or isinstance(v, type)) and v.__module__ == __name__) |
