diff options
| author | Theofilos Augoustis <theofilos.augoustis@gmail.com> | 2025-10-02 15:17:19 +0000 |
|---|---|---|
| committer | Theofilos Augoustis <theofilos.augoustis@gmail.com> | 2025-10-07 11:11:59 +0000 |
| commit | c8f9fbecad8094a4cd996f11eb366c1cb356b52f (patch) | |
| tree | caeb146d0dff09d256468acc911d4ab55bb6ae49 | |
| parent | 3c93618662588e9ea956d212b79160bb43cab52c (diff) | |
| download | focaccia-c8f9fbecad8094a4cd996f11eb366c1cb356b52f.tar.gz focaccia-c8f9fbecad8094a4cd996f11eb366c1cb356b52f.zip | |
Add correct handling for Q<num> registers by converting them to the (standard) V<num> form
| -rw-r--r-- | src/focaccia/arch/aarch64.py | 107 | ||||
| -rw-r--r-- | src/focaccia/lldb_target.py | 2 |
2 files changed, 75 insertions, 34 deletions
diff --git a/src/focaccia/arch/aarch64.py b/src/focaccia/arch/aarch64.py index 2e510b9..5a3ff3e 100644 --- a/src/focaccia/arch/aarch64.py +++ b/src/focaccia/arch/aarch64.py @@ -41,38 +41,38 @@ registers = [ _Reg(('SP', 0, 64), ('RSP', 0, 64)), _Reg(('PC', 0, 64)), - _Reg(('V0', 0, 128), ('Q0', 0, 128), ('D0', 0, 64), ('S0', 0, 32), ('H0', 0, 16), ('B0', 0, 8)), - _Reg(('V1', 0, 128), ('Q1', 0, 128), ('D1', 0, 64), ('S1', 0, 32), ('H1', 0, 16), ('B1', 0, 8)), - _Reg(('V2', 0, 128), ('Q2', 0, 128), ('D2', 0, 64), ('S2', 0, 32), ('H2', 0, 16), ('B2', 0, 8)), - _Reg(('V3', 0, 128), ('Q3', 0, 128), ('D3', 0, 64), ('S3', 0, 32), ('H3', 0, 16), ('B3', 0, 8)), - _Reg(('V4', 0, 128), ('Q4', 0, 128), ('D4', 0, 64), ('S4', 0, 32), ('H4', 0, 16), ('B4', 0, 8)), - _Reg(('V5', 0, 128), ('Q5', 0, 128), ('D5', 0, 64), ('S5', 0, 32), ('H5', 0, 16), ('B5', 0, 8)), - _Reg(('V6', 0, 128), ('Q6', 0, 128), ('D6', 0, 64), ('S6', 0, 32), ('H6', 0, 16), ('B6', 0, 8)), - _Reg(('V7', 0, 128), ('Q7', 0, 128), ('D7', 0, 64), ('S7', 0, 32), ('H7', 0, 16), ('B7', 0, 8)), - _Reg(('V8', 0, 128), ('Q8', 0, 128), ('D8', 0, 64), ('S8', 0, 32), ('H8', 0, 16), ('B8', 0, 8)), - _Reg(('V9', 0, 128), ('Q9', 0, 128), ('D9', 0, 64), ('S9', 0, 32), ('H9', 0, 16), ('B9', 0, 8)), - _Reg(('V10', 0, 128), ('Q10', 0, 128), ('D10', 0, 64), ('S10', 0, 32), ('H10', 0, 16), ('B10', 0, 8)), - _Reg(('V11', 0, 128), ('Q11', 0, 128), ('D11', 0, 64), ('S11', 0, 32), ('H11', 0, 16), ('B11', 0, 8)), - _Reg(('V12', 0, 128), ('Q12', 0, 128), ('D12', 0, 64), ('S12', 0, 32), ('H12', 0, 16), ('B12', 0, 8)), - _Reg(('V13', 0, 128), ('Q13', 0, 128), ('D13', 0, 64), ('S13', 0, 32), ('H13', 0, 16), ('B13', 0, 8)), - _Reg(('V14', 0, 128), ('Q14', 0, 128), ('D14', 0, 64), ('S14', 0, 32), ('H14', 0, 16), ('B14', 0, 8)), - _Reg(('V15', 0, 128), ('Q15', 0, 128), ('D15', 0, 64), ('S15', 0, 32), ('H15', 0, 16), ('B15', 0, 8)), - _Reg(('V16', 0, 128), ('Q16', 0, 128), ('D16', 0, 64), ('S16', 0, 32), ('H16', 0, 16), ('B16', 0, 8)), - _Reg(('V17', 0, 128), ('Q17', 0, 128), ('D17', 0, 64), ('S17', 0, 32), ('H17', 0, 16), ('B17', 0, 8)), - _Reg(('V18', 0, 128), ('Q18', 0, 128), ('D18', 0, 64), ('S18', 0, 32), ('H18', 0, 16), ('B18', 0, 8)), - _Reg(('V19', 0, 128), ('Q19', 0, 128), ('D19', 0, 64), ('S19', 0, 32), ('H19', 0, 16), ('B19', 0, 8)), - _Reg(('V20', 0, 128), ('Q20', 0, 128), ('D20', 0, 64), ('S20', 0, 32), ('H20', 0, 16), ('B20', 0, 8)), - _Reg(('V21', 0, 128), ('Q21', 0, 128), ('D21', 0, 64), ('S21', 0, 32), ('H21', 0, 16), ('B21', 0, 8)), - _Reg(('V22', 0, 128), ('Q22', 0, 128), ('D22', 0, 64), ('S22', 0, 32), ('H22', 0, 16), ('B22', 0, 8)), - _Reg(('V23', 0, 128), ('Q23', 0, 128), ('D23', 0, 64), ('S23', 0, 32), ('H23', 0, 16), ('B23', 0, 8)), - _Reg(('V24', 0, 128), ('Q24', 0, 128), ('D24', 0, 64), ('S24', 0, 32), ('H24', 0, 16), ('B24', 0, 8)), - _Reg(('V25', 0, 128), ('Q25', 0, 128), ('D25', 0, 64), ('S25', 0, 32), ('H25', 0, 16), ('B25', 0, 8)), - _Reg(('V26', 0, 128), ('Q26', 0, 128), ('D26', 0, 64), ('S26', 0, 32), ('H26', 0, 16), ('B26', 0, 8)), - _Reg(('V27', 0, 128), ('Q27', 0, 128), ('D27', 0, 64), ('S27', 0, 32), ('H27', 0, 16), ('B27', 0, 8)), - _Reg(('V28', 0, 128), ('Q28', 0, 128), ('D28', 0, 64), ('S28', 0, 32), ('H28', 0, 16), ('B28', 0, 8)), - _Reg(('V29', 0, 128), ('Q29', 0, 128), ('D29', 0, 64), ('S29', 0, 32), ('H29', 0, 16), ('B29', 0, 8)), - _Reg(('V30', 0, 128), ('Q30', 0, 128), ('D30', 0, 64), ('S30', 0, 32), ('H30', 0, 16), ('B30', 0, 8)), - _Reg(('V31', 0, 128), ('Q31', 0, 128), ('D31', 0, 64), ('S31', 0, 32), ('H31', 0, 16), ('B31', 0, 8)), + _Reg(('V0', 0, 128), ('D0', 0, 64), ('S0', 0, 32), ('H0', 0, 16), ('B0', 0, 8)), + _Reg(('V1', 0, 128), ('D1', 0, 64), ('S1', 0, 32), ('H1', 0, 16), ('B1', 0, 8)), + _Reg(('V2', 0, 128), ('D2', 0, 64), ('S2', 0, 32), ('H2', 0, 16), ('B2', 0, 8)), + _Reg(('V3', 0, 128), ('D3', 0, 64), ('S3', 0, 32), ('H3', 0, 16), ('B3', 0, 8)), + _Reg(('V4', 0, 128), ('D4', 0, 64), ('S4', 0, 32), ('H4', 0, 16), ('B4', 0, 8)), + _Reg(('V5', 0, 128), ('D5', 0, 64), ('S5', 0, 32), ('H5', 0, 16), ('B5', 0, 8)), + _Reg(('V6', 0, 128), ('D6', 0, 64), ('S6', 0, 32), ('H6', 0, 16), ('B6', 0, 8)), + _Reg(('V7', 0, 128), ('D7', 0, 64), ('S7', 0, 32), ('H7', 0, 16), ('B7', 0, 8)), + _Reg(('V8', 0, 128), ('D8', 0, 64), ('S8', 0, 32), ('H8', 0, 16), ('B8', 0, 8)), + _Reg(('V9', 0, 128), ('D9', 0, 64), ('S9', 0, 32), ('H9', 0, 16), ('B9', 0, 8)), + _Reg(('V10', 0, 128), ('D10', 0, 64), ('S10', 0, 32), ('H10', 0, 16), ('B10', 0, 8)), + _Reg(('V11', 0, 128), ('D11', 0, 64), ('S11', 0, 32), ('H11', 0, 16), ('B11', 0, 8)), + _Reg(('V12', 0, 128), ('D12', 0, 64), ('S12', 0, 32), ('H12', 0, 16), ('B12', 0, 8)), + _Reg(('V13', 0, 128), ('D13', 0, 64), ('S13', 0, 32), ('H13', 0, 16), ('B13', 0, 8)), + _Reg(('V14', 0, 128), ('D14', 0, 64), ('S14', 0, 32), ('H14', 0, 16), ('B14', 0, 8)), + _Reg(('V15', 0, 128), ('D15', 0, 64), ('S15', 0, 32), ('H15', 0, 16), ('B15', 0, 8)), + _Reg(('V16', 0, 128), ('D16', 0, 64), ('S16', 0, 32), ('H16', 0, 16), ('B16', 0, 8)), + _Reg(('V17', 0, 128), ('D17', 0, 64), ('S17', 0, 32), ('H17', 0, 16), ('B17', 0, 8)), + _Reg(('V18', 0, 128), ('D18', 0, 64), ('S18', 0, 32), ('H18', 0, 16), ('B18', 0, 8)), + _Reg(('V19', 0, 128), ('D19', 0, 64), ('S19', 0, 32), ('H19', 0, 16), ('B19', 0, 8)), + _Reg(('V20', 0, 128), ('D20', 0, 64), ('S20', 0, 32), ('H20', 0, 16), ('B20', 0, 8)), + _Reg(('V21', 0, 128), ('D21', 0, 64), ('S21', 0, 32), ('H21', 0, 16), ('B21', 0, 8)), + _Reg(('V22', 0, 128), ('D22', 0, 64), ('S22', 0, 32), ('H22', 0, 16), ('B22', 0, 8)), + _Reg(('V23', 0, 128), ('D23', 0, 64), ('S23', 0, 32), ('H23', 0, 16), ('B23', 0, 8)), + _Reg(('V24', 0, 128), ('D24', 0, 64), ('S24', 0, 32), ('H24', 0, 16), ('B24', 0, 8)), + _Reg(('V25', 0, 128), ('D25', 0, 64), ('S25', 0, 32), ('H25', 0, 16), ('B25', 0, 8)), + _Reg(('V26', 0, 128), ('D26', 0, 64), ('S26', 0, 32), ('H26', 0, 16), ('B26', 0, 8)), + _Reg(('V27', 0, 128), ('D27', 0, 64), ('S27', 0, 32), ('H27', 0, 16), ('B27', 0, 8)), + _Reg(('V28', 0, 128), ('D28', 0, 64), ('S28', 0, 32), ('H28', 0, 16), ('B28', 0, 8)), + _Reg(('V29', 0, 128), ('D29', 0, 64), ('S29', 0, 32), ('H29', 0, 16), ('B29', 0, 8)), + _Reg(('V30', 0, 128), ('D30', 0, 64), ('S30', 0, 32), ('H30', 0, 16), ('B30', 0, 8)), + _Reg(('V31', 0, 128), ('D31', 0, 64), ('S31', 0, 32), ('H31', 0, 16), ('B31', 0, 8)), _Reg(('CPSR', 0, 64), ('N', 31, 32), @@ -95,6 +95,41 @@ registers = [ # Names of registers in the architecture regnames = [desc.base.base_reg for desc in registers] +regname_aliases = { + 'Q0': 'V0', + 'Q1': 'V1', + 'Q2': 'V2', + 'Q3': 'V3', + 'Q4': 'V4', + 'Q5': 'V5', + 'Q6': 'V6', + 'Q7': 'V7', + 'Q8': 'V8', + 'Q9': 'V9', + 'Q10': 'V10', + 'Q11': 'V11', + 'Q12': 'V12', + 'Q13': 'V13', + 'Q14': 'V14', + 'Q15': 'V15', + 'Q16': 'V16', + 'Q17': 'V17', + 'Q18': 'V18', + 'Q19': 'V19', + 'Q20': 'V20', + 'Q21': 'V21', + 'Q22': 'V22', + 'Q23': 'V23', + 'Q24': 'V24', + 'Q25': 'V25', + 'Q26': 'V26', + 'Q27': 'V27', + 'Q28': 'V28', + 'Q29': 'V29', + 'Q30': 'V30', + 'Q31': 'V31', +} + def decompose_cpsr(cpsr: int) -> dict[str, int]: """Extract individual flag values from the CPSR register.""" return { @@ -121,3 +156,11 @@ def decompose_cpsr(cpsr: int) -> dict[str, int]: class ArchAArch64(Arch): def __init__(self, endianness: Arch.Endianness): super().__init__(archname, registers, 64, endianness) + + def to_regname(self, name: str) -> str | None: + reg = super().to_regname(name) + if reg is not None: + return reg + + return regname_aliases.get(name.upper(), None) + diff --git a/src/focaccia/lldb_target.py b/src/focaccia/lldb_target.py index a6f61bb..1f31337 100644 --- a/src/focaccia/lldb_target.py +++ b/src/focaccia/lldb_target.py @@ -187,8 +187,6 @@ class LLDBConcreteTarget: the register's value. """ try: - if 'Q' in regname: - regname = 'V' + regname[1:] reg = self._get_register(regname) assert(reg.IsValid()) if reg.size > 8: # reg is a vector register |