Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.11/site-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 ._register_info import REGISTER_OFFSETS
2from .enums import default_vex_archinfo, vex_endness_from_string
3from .types import Register
4from .vex_ffi import guest_offsets
7class PyvexArch:
8 """
9 An architecture definition for use with pyvex - usable version.
10 """
12 def __init__(self, name: str, bits: int, memory_endness: str, instruction_endness: str = "Iend_BE"):
13 self.name = name
14 self.bits = bits
15 self.memory_endness = memory_endness
16 self.instruction_endness = instruction_endness
17 self.byte_width = 8
18 self.register_list: list[Register] = []
19 self.registers: dict[str, tuple[int, int]] = {}
20 self.vex_arch = {
21 "X86": "VexArchX86",
22 "AMD64": "VexArchAMD64",
23 "ARM": "VexArchARM",
24 "ARM64": "VexArchARM64",
25 "PPC32": "VexArchPPC32",
26 "PPC64": "VexArchPPC64",
27 "S390X": "VexArchS390X",
28 "MIPS32": "VexArchMIPS32",
29 "MIPS64": "VexArchMIPS64",
30 "RISCV64": "VexArchRISCV64",
31 }[name]
32 self.ip_offset = guest_offsets[
33 (
34 self.vex_name_small,
35 {
36 "X86": "eip",
37 "AMD64": "rip",
38 "ARM": "r15t",
39 "ARM64": "pc",
40 "PPC32": "cia",
41 "PPC64": "cia",
42 "S390X": "ia",
43 "MIPS32": "pc",
44 "MIPS64": "pc",
45 "RISCV64": "pc",
46 }[name],
47 )
48 ]
49 self.vex_archinfo = default_vex_archinfo()
50 if memory_endness == "Iend_BE":
51 self.vex_archinfo["endness"] = vex_endness_from_string("VexEndnessBE")
53 def __repr__(self):
54 return f"<PyvexArch {self.name}>"
56 @property
57 def vex_name_small(self):
58 return self.vex_arch[7:].lower()
60 def translate_register_name(self, offset, size=None): # pylint: disable=unused-argument
61 for (arch, reg), offset2 in guest_offsets.items():
62 if arch == self.vex_name_small and offset2 == offset:
63 return reg
64 for (arch, reg), offset2 in REGISTER_OFFSETS.items():
65 if arch == self.vex_name_small and offset2 == offset:
66 return reg
67 return str(offset)
69 def get_register_offset(self, name: str) -> int:
70 arch_reg_tuple = (self.vex_name_small, name)
71 if arch_reg_tuple in guest_offsets:
72 return guest_offsets[arch_reg_tuple]
73 elif arch_reg_tuple in REGISTER_OFFSETS:
74 return REGISTER_OFFSETS[arch_reg_tuple]
75 else:
76 raise KeyError(f"Unknown register {name} for architecture {self.name}")
79ARCH_X86 = PyvexArch("X86", 32, "Iend_LE")
80ARCH_AMD64 = PyvexArch("AMD64", 64, "Iend_LE")
81ARCH_ARM_LE = PyvexArch("ARM", 32, "Iend_LE", instruction_endness="Iend_LE")
82ARCH_ARM_BE_LE = PyvexArch("ARM", 32, "Iend_BE", instruction_endness="Iend_LE")
83ARCH_ARM_BE = PyvexArch("ARM", 32, "Iend_LE")
84ARCH_ARM64_LE = PyvexArch("ARM64", 64, "Iend_LE", instruction_endness="Iend_LE")
85ARCH_ARM64_BE = PyvexArch("ARM64", 64, "Iend_BE")
86ARCH_PPC32 = PyvexArch("PPC32", 32, "Iend_BE")
87ARCH_PPC64_BE = PyvexArch("PPC64", 64, "Iend_BE")
88ARCH_PPC64_LE = PyvexArch("PPC64", 64, "Iend_LE")
89ARCH_S390X = PyvexArch("S390X", 64, "Iend_BE")
90ARCH_MIPS32_BE = PyvexArch("MIPS32", 32, "Iend_BE")
91ARCH_MIPS32_LE = PyvexArch("MIPS32", 32, "Iend_LE")
92ARCH_MIPS64_BE = PyvexArch("MIPS64", 64, "Iend_BE")
93ARCH_MIPS64_LE = PyvexArch("MIPS64", 64, "Iend_LE")
94ARCH_RISCV64_LE = PyvexArch("RISCV64", 64, "Iend_LE", instruction_endness="Iend_LE")