Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/archinfo/arch_mips64.py: 93%
59 statements
« prev ^ index » next coverage.py v7.3.1, created at 2023-09-25 06:15 +0000
« prev ^ index » next coverage.py v7.3.1, created at 2023-09-25 06:15 +0000
1from .arch import Arch, register_arch, Endness, Register
2from .tls import TLSArchInfo
4try:
5 import capstone as _capstone
6except ImportError:
7 _capstone = None
9try:
10 import keystone as _keystone
11except ImportError:
12 _keystone = None
14try:
15 import unicorn as _unicorn
16except ImportError:
17 _unicorn = None
20class ArchMIPS64(Arch):
21 def __init__(self, endness=Endness.BE):
22 super().__init__(endness)
23 if endness == Endness.BE:
24 self.function_prologs = set()
25 self.function_epilogs = set()
26 self.triplet = "mips64-linux-gnu"
27 self.linux_name = "mips64"
28 self.ida_name = "mips64b"
30 bits = 64
31 vex_arch = "VexArchMIPS64"
32 name = "MIPS64"
33 qemu_name = "mips64el"
34 ida_processor = "mips64"
35 linux_name = "mips64el" # ???
36 triplet = "mips64el-linux-gnu"
37 max_inst_bytes = 4
38 ret_offset = 32
39 syscall_register_offset = 16
40 call_pushes_ret = False
41 stack_change = -8
42 branch_delay_slot = True
43 sizeof = {"short": 16, "int": 32, "long": 64, "long long": 64}
44 if _capstone:
45 cs_arch = _capstone.CS_ARCH_MIPS
46 cs_mode = _capstone.CS_MODE_64 + _capstone.CS_MODE_LITTLE_ENDIAN
47 if _keystone:
48 ks_arch = _keystone.KS_ARCH_MIPS
49 ks_mode = _keystone.KS_MODE_64 + _keystone.KS_MODE_LITTLE_ENDIAN
50 uc_arch = _unicorn.UC_ARCH_MIPS if _unicorn else None
51 uc_mode = (_unicorn.UC_MODE_64 + _unicorn.UC_MODE_LITTLE_ENDIAN) if _unicorn else None
52 uc_const = _unicorn.mips_const if _unicorn else None
53 uc_prefix = "UC_MIPS_" if _unicorn else None
54 function_prologs = set()
55 function_epilogs = set()
57 ret_instruction = b"\x08\x00\xE0\x03" + b"\x25\x08\x20\x00"
58 nop_instruction = b"\x00\x00\x00\x00"
59 instruction_alignment = 4
60 register_list = [
61 Register(name="zero", size=8, alias_names=("r0",)),
62 Register(name="at", size=8, alias_names=("r1",), general_purpose=True),
63 Register(name="v0", size=8, alias_names=("r2",), general_purpose=True, linux_entry_value="ld_destructor"),
64 Register(name="v1", size=8, alias_names=("r3",), general_purpose=True),
65 Register(name="a0", size=8, alias_names=("r4",), general_purpose=True, argument=True),
66 Register(name="a1", size=8, alias_names=("r5",), general_purpose=True, argument=True),
67 Register(name="a2", size=8, alias_names=("r6",), general_purpose=True, argument=True),
68 Register(name="a3", size=8, alias_names=("r7",), general_purpose=True, argument=True),
69 Register(
70 name="t0",
71 size=8,
72 alias_names=(
73 "r8",
74 "a4",
75 ),
76 general_purpose=True,
77 ),
78 Register(
79 name="t1",
80 size=8,
81 alias_names=(
82 "r9",
83 "a5",
84 ),
85 general_purpose=True,
86 ),
87 Register(
88 name="t2",
89 size=8,
90 alias_names=(
91 "r10",
92 "a6",
93 ),
94 general_purpose=True,
95 ),
96 Register(
97 name="t3",
98 size=8,
99 alias_names=(
100 "r11",
101 "a7",
102 ),
103 general_purpose=True,
104 ),
105 Register(name="t4", size=8, alias_names=("r12",), general_purpose=True),
106 Register(name="t5", size=8, alias_names=("r13",), general_purpose=True),
107 Register(name="t6", size=8, alias_names=("r14",), general_purpose=True),
108 Register(name="t7", size=8, alias_names=("r15",), general_purpose=True),
109 Register(name="s0", size=8, alias_names=("r16",), general_purpose=True),
110 Register(name="s1", size=8, alias_names=("r17",), general_purpose=True),
111 Register(name="s2", size=8, alias_names=("r18",), general_purpose=True),
112 Register(name="s3", size=8, alias_names=("r19",), general_purpose=True),
113 Register(name="s4", size=8, alias_names=("r20",), general_purpose=True),
114 Register(name="s5", size=8, alias_names=("r21",), general_purpose=True),
115 Register(name="s6", size=8, alias_names=("r22",), general_purpose=True),
116 Register(name="s7", size=8, alias_names=("r23",), general_purpose=True),
117 Register(name="t8", size=8, alias_names=("r24",), general_purpose=True),
118 Register(name="t9", size=8, alias_names=("r25",), general_purpose=True, persistent=True),
119 Register(name="k0", size=8, alias_names=("r26",), general_purpose=True),
120 Register(name="k1", size=8, alias_names=("r27",), general_purpose=True),
121 Register(name="gp", size=8, alias_names=("r28",), persistent=True),
122 Register(name="sp", size=8, alias_names=("r29",), default_value=(Arch.initial_sp, True, "global")),
123 Register(name="s8", size=8, alias_names=("r30", "fp", "bp"), general_purpose=True),
124 Register(
125 name="ra", size=8, alias_names=("r31", "lr"), general_purpose=True, persistent=True, linux_entry_value=0
126 ),
127 Register(name="pc", size=8, alias_names=("ip",)),
128 Register(name="hi", size=8, general_purpose=True),
129 Register(name="lo", size=8, general_purpose=True),
130 Register(name="f0", size=8, floating_point=True, subregisters=[("f0_lo", 0, 4)]),
131 Register(name="f1", size=8, floating_point=True, subregisters=[("f1_lo", 0, 4)]),
132 Register(name="f2", size=8, floating_point=True, subregisters=[("f2_lo", 0, 4)]),
133 Register(name="f3", size=8, floating_point=True, subregisters=[("f3_lo", 0, 4)]),
134 Register(name="f4", size=8, floating_point=True, subregisters=[("f4_lo", 0, 4)]),
135 Register(name="f5", size=8, floating_point=True, subregisters=[("f5_lo", 0, 4)]),
136 Register(name="f6", size=8, floating_point=True, subregisters=[("f6_lo", 0, 4)]),
137 Register(name="f7", size=8, floating_point=True, subregisters=[("f7_lo", 0, 4)]),
138 Register(name="f8", size=8, floating_point=True, subregisters=[("f8_lo", 0, 4)]),
139 Register(name="f9", size=8, floating_point=True, subregisters=[("f9_lo", 0, 4)]),
140 Register(name="f10", size=8, floating_point=True, subregisters=[("f10_lo", 0, 4)]),
141 Register(name="f11", size=8, floating_point=True, subregisters=[("f11_lo", 0, 4)]),
142 Register(name="f12", size=8, floating_point=True, subregisters=[("f12_lo", 0, 4)]),
143 Register(name="f13", size=8, floating_point=True, subregisters=[("f13_lo", 0, 4)]),
144 Register(name="f14", size=8, floating_point=True, subregisters=[("f14_lo", 0, 4)]),
145 Register(name="f15", size=8, floating_point=True, subregisters=[("f15_lo", 0, 4)]),
146 Register(name="f16", size=8, floating_point=True, subregisters=[("f16_lo", 0, 4)]),
147 Register(name="f17", size=8, floating_point=True, subregisters=[("f17_lo", 0, 4)]),
148 Register(name="f18", size=8, floating_point=True, subregisters=[("f18_lo", 0, 4)]),
149 Register(name="f19", size=8, floating_point=True, subregisters=[("f19_lo", 0, 4)]),
150 Register(name="f20", size=8, floating_point=True, subregisters=[("f20_lo", 0, 4)]),
151 Register(name="f21", size=8, floating_point=True, subregisters=[("f21_lo", 0, 4)]),
152 Register(name="f22", size=8, floating_point=True, subregisters=[("f22_lo", 0, 4)]),
153 Register(name="f23", size=8, floating_point=True, subregisters=[("f23_lo", 0, 4)]),
154 Register(name="f24", size=8, floating_point=True, subregisters=[("f24_lo", 0, 4)]),
155 Register(name="f25", size=8, floating_point=True, subregisters=[("f25_lo", 0, 4)]),
156 Register(name="f26", size=8, floating_point=True, subregisters=[("f26_lo", 0, 4)]),
157 Register(name="f27", size=8, floating_point=True, subregisters=[("f27_lo", 0, 4)]),
158 Register(name="f28", size=8, floating_point=True, subregisters=[("f28_lo", 0, 4)]),
159 Register(name="f29", size=8, floating_point=True, subregisters=[("f29_lo", 0, 4)]),
160 Register(name="f30", size=8, floating_point=True, subregisters=[("f30_lo", 0, 4)]),
161 Register(name="f31", size=8, floating_point=True, subregisters=[("f31_lo", 0, 4)]),
162 Register(name="fir", size=4, floating_point=True),
163 Register(name="fccr", size=4, floating_point=True),
164 Register(name="fexr", size=4, floating_point=True),
165 Register(name="fenr", size=4, floating_point=True),
166 Register(name="fcsr", size=4, floating_point=True),
167 Register(name="cp0_status", size=4),
168 Register(name="ulr", size=8),
169 Register(name="emnote", size=4, artificial=True),
170 Register(name="cond", size=4),
171 Register(name="cmstart", size=8),
172 Register(name="cmlen", size=8),
173 Register(name="nraddr", size=8),
174 Register(name="ip_at_syscall", size=8, artificial=True),
175 ]
177 # http://techpubs.sgi.com/library/manuals/4000/007-4658-001/pdf/007-4658-001.pdf
178 dynamic_tag_translation = {
179 0x70000001: "DT_MIPS_RLD_VERSION",
180 0x70000005: "DT_MIPS_FLAGS",
181 0x70000006: "DT_MIPS_BASE_ADDRESS",
182 0x7000000A: "DT_MIPS_LOCAL_GOTNO",
183 0x70000011: "DT_MIPS_SYMTABNO",
184 0x70000012: "DT_MIPS_UNREFEXTNO",
185 0x70000013: "DT_MIPS_GOTSYM",
186 0x70000016: "DT_MIPS_RLD_MAP",
187 }
188 got_section_name = ".got"
189 ld_linux_name = "ld.so.1"
190 elf_tls = TLSArchInfo(1, 16, [], [0], [], 0x7000, 0x8000)
193register_arch([r".*mipsel.*|.*mips64el|.*mipsel64"], 64, Endness.LE, ArchMIPS64)
194register_arch([r".*mips64.*|.*mips.*"], 64, "any", ArchMIPS64)