Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.9/dist-packages/pyvex/arches.py: 96%
Shortcuts on this page
r m x toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
Shortcuts on this page
r m x toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1from typing import Dict, List, Tuple
3from ._register_info import REGISTER_OFFSETS
4from .enums import default_vex_archinfo, vex_endness_from_string
5from .types import Register
6from .vex_ffi import guest_offsets
9class PyvexArch:
10 """
11 An architecture definition for use with pyvex - usable version.
12 """
14 def __init__(self, name: str, bits: int, memory_endness: str, instruction_endness: str = "Iend_BE"):
15 self.name = name
16 self.bits = bits
17 self.memory_endness = memory_endness
18 self.instruction_endness = instruction_endness
19 self.byte_width = 8
20 self.register_list: List[Register] = []
21 self.registers: Dict[str, Tuple[int, int]] = {}
22 self.vex_arch = {
23 "X86": "VexArchX86",
24 "AMD64": "VexArchAMD64",
25 "ARM": "VexArchARM",
26 "ARM64": "VexArchARM64",
27 "PPC32": "VexArchPPC32",
28 "PPC64": "VexArchPPC64",
29 "S390X": "VexArchS390X",
30 "MIPS32": "VexArchMIPS32",
31 "MIPS64": "VexArchMIPS64",
32 "RISCV64": "VexArchRISCV64",
33 }[name]
34 self.ip_offset = guest_offsets[
35 (
36 self.vex_name_small,
37 {
38 "X86": "eip",
39 "AMD64": "rip",
40 "ARM": "r15t",
41 "ARM64": "pc",
42 "PPC32": "cia",
43 "PPC64": "cia",
44 "S390X": "ia",
45 "MIPS32": "pc",
46 "MIPS64": "pc",
47 "RISCV64": "pc",
48 }[name],
49 )
50 ]
51 self.vex_archinfo = default_vex_archinfo()
52 if memory_endness == "Iend_BE":
53 self.vex_archinfo["endness"] = vex_endness_from_string("VexEndnessBE")
55 def __repr__(self):
56 return f"<PyvexArch {self.name}>"
58 @property
59 def vex_name_small(self):
60 return self.vex_arch[7:].lower()
62 def translate_register_name(self, offset, size=None): # pylint: disable=unused-argument
63 for (arch, reg), offset2 in guest_offsets.items():
64 if arch == self.vex_name_small and offset2 == offset:
65 return reg
66 for (arch, reg), offset2 in REGISTER_OFFSETS.items():
67 if arch == self.vex_name_small and offset2 == offset:
68 return reg
69 return str(offset)
71 def get_register_offset(self, name: str) -> int:
72 arch_reg_tuple = (self.vex_name_small, name)
73 if arch_reg_tuple in guest_offsets:
74 return guest_offsets[arch_reg_tuple]
75 elif arch_reg_tuple in REGISTER_OFFSETS:
76 return REGISTER_OFFSETS[arch_reg_tuple]
77 else:
78 raise KeyError(f"Unknown register {name} for architecture {self.name}")
81ARCH_X86 = PyvexArch("X86", 32, "Iend_LE")
82ARCH_AMD64 = PyvexArch("AMD64", 64, "Iend_LE")
83ARCH_ARM_LE = PyvexArch("ARM", 32, "Iend_LE", instruction_endness="Iend_LE")
84ARCH_ARM_BE_LE = PyvexArch("ARM", 32, "Iend_BE", instruction_endness="Iend_LE")
85ARCH_ARM_BE = PyvexArch("ARM", 32, "Iend_LE")
86ARCH_ARM64_LE = PyvexArch("ARM64", 64, "Iend_LE", instruction_endness="Iend_LE")
87ARCH_ARM64_BE = PyvexArch("ARM64", 64, "Iend_BE")
88ARCH_PPC32 = PyvexArch("PPC32", 32, "Iend_BE")
89ARCH_PPC64_BE = PyvexArch("PPC64", 64, "Iend_BE")
90ARCH_PPC64_LE = PyvexArch("PPC64", 64, "Iend_LE")
91ARCH_S390X = PyvexArch("S390X", 64, "Iend_BE")
92ARCH_MIPS32_BE = PyvexArch("MIPS32", 32, "Iend_BE")
93ARCH_MIPS32_LE = PyvexArch("MIPS32", 32, "Iend_LE")
94ARCH_MIPS64_BE = PyvexArch("MIPS64", 64, "Iend_BE")
95ARCH_MIPS64_LE = PyvexArch("MIPS64", 64, "Iend_LE")
96ARCH_RISCV64_LE = PyvexArch("RISCV64", 64, "Iend_LE", instruction_endness="Iend_LE")