Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/archinfo/arch_mips32.py: 93%
60 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
19# FIXME: Tell fish to fix whatever he was storing in info['current_function']
20# TODO: Only persist t9 in PIC programs
23class ArchMIPS32(Arch):
24 def __init__(self, endness=Endness.BE):
25 super().__init__(endness)
26 if endness == Endness.BE:
27 self.function_prologs = {
28 rb"\x27\xbd\xff[\x00-\xff]" # addiu $sp, xxx
29 rb"\x3c\x1c[\x00-\xff][\x00-\xff]\x9c\x27[\x00-\xff][\x00-\xff]" # lui $gp, xxx; addiu $gp, $gp, xxxx
30 }
31 self.function_epilogs = {
32 rb"\x8f\xbf[\x00-\xff]{2}([\x00-\xff]{4}){0,4}\x03\xe0\x00\x08" # lw ra, off(sp); ... ; jr ra
33 }
34 self.qemu_name = "mips"
35 self.triplet = "mips-linux-gnu"
36 self.linux_name = "mips"
38 bits = 32
39 vex_arch = "VexArchMIPS32"
40 name = "MIPS32"
41 ida_processor = "mipsb"
42 qemu_name = "mipsel"
43 linux_name = "mipsel" # ???
44 triplet = "mipsel-linux-gnu"
45 max_inst_bytes = 4
46 ret_offset = 16
47 syscall_num_offset = 16
48 call_pushes_ret = False
49 stack_change = -4
50 branch_delay_slot = True
51 sizeof = {"short": 16, "int": 32, "long": 32, "long long": 64}
52 if _capstone:
53 cs_arch = _capstone.CS_ARCH_MIPS
54 cs_mode = _capstone.CS_MODE_32 + _capstone.CS_MODE_LITTLE_ENDIAN
55 if _keystone:
56 ks_arch = _keystone.KS_ARCH_MIPS
57 ks_mode = _keystone.KS_MODE_32 + _keystone.KS_MODE_LITTLE_ENDIAN
58 uc_arch = _unicorn.UC_ARCH_MIPS if _unicorn else None
59 uc_mode = (_unicorn.UC_MODE_32 + _unicorn.UC_MODE_LITTLE_ENDIAN) if _unicorn else None
60 uc_const = _unicorn.mips_const if _unicorn else None
61 uc_prefix = "UC_MIPS_" if _unicorn else None
62 function_prologs = {
63 rb"[\x00-\xff]\xff\xbd\x27", # addiu $sp, xxx
64 rb"[\x00-\xff][\x00-\xff]\x1c\x3c[\x00-\xff][\x00-\xff]\x9c\x27", # lui $gp, xxx; addiu $gp, $gp, xxxx
65 }
66 function_epilogs = {rb"[\x00-\xff]{2}\xbf\x8f([\x00-\xff]{4}){0,4}\x08\x00\xe0\x03"} # lw ra, off(sp); ... ; jr ra
68 ret_instruction = b"\x08\x00\xE0\x03" + b"\x25\x08\x20\x00"
69 nop_instruction = b"\x00\x00\x00\x00"
70 instruction_alignment = 4
71 register_list = [
72 Register(name="zero", size=4, alias_names=("r0",)),
73 Register(name="at", size=4, alias_names=("r1",), general_purpose=True),
74 Register(name="v0", size=4, alias_names=("r2",), general_purpose=True, linux_entry_value="ld_destructor"),
75 Register(name="v1", size=4, alias_names=("r3",), general_purpose=True),
76 Register(name="a0", size=4, alias_names=("r4",), general_purpose=True, argument=True),
77 Register(name="a1", size=4, alias_names=("r5",), general_purpose=True, argument=True),
78 Register(name="a2", size=4, alias_names=("r6",), general_purpose=True, argument=True),
79 Register(name="a3", size=4, alias_names=("r7",), general_purpose=True, argument=True),
80 Register(name="t0", size=4, alias_names=("r8",), general_purpose=True),
81 Register(name="t1", size=4, alias_names=("r9",), general_purpose=True),
82 Register(name="t2", size=4, alias_names=("r10",), general_purpose=True),
83 Register(name="t3", size=4, alias_names=("r11",), general_purpose=True),
84 Register(name="t4", size=4, alias_names=("r12",), general_purpose=True),
85 Register(name="t5", size=4, alias_names=("r13",), general_purpose=True),
86 Register(name="t6", size=4, alias_names=("r14",), general_purpose=True),
87 Register(name="t7", size=4, alias_names=("r15",), general_purpose=True),
88 Register(name="s0", size=4, alias_names=("r16",), general_purpose=True),
89 Register(name="s1", size=4, alias_names=("r17",), general_purpose=True),
90 Register(name="s2", size=4, alias_names=("r18",), general_purpose=True),
91 Register(name="s3", size=4, alias_names=("r19",), general_purpose=True),
92 Register(name="s4", size=4, alias_names=("r20",), general_purpose=True),
93 Register(name="s5", size=4, alias_names=("r21",), general_purpose=True),
94 Register(name="s6", size=4, alias_names=("r22",), general_purpose=True),
95 Register(name="s7", size=4, alias_names=("r23",), general_purpose=True),
96 Register(name="t8", size=4, alias_names=("r24",), general_purpose=True),
97 Register(name="t9", size=4, alias_names=("r25",), general_purpose=True, persistent=True),
98 Register(name="k0", size=4, alias_names=("r26",), general_purpose=True),
99 Register(name="k1", size=4, alias_names=("r27",), general_purpose=True),
100 Register(name="gp", size=4, alias_names=("r28",), persistent=True),
101 Register(name="sp", size=4, alias_names=("r29",), default_value=(Arch.initial_sp, True, "global")),
102 Register(name="s8", size=4, alias_names=("r30", "fp", "bp"), general_purpose=True),
103 Register(
104 name="ra", size=4, alias_names=("r31", "lr"), general_purpose=True, persistent=True, linux_entry_value=0
105 ),
106 Register(name="pc", size=4, alias_names=("ip",)),
107 Register(name="hi", size=4, general_purpose=True),
108 Register(name="lo", size=4, general_purpose=True),
109 Register(name="f0", size=8, floating_point=True, subregisters=[("f0_lo", 0, 4)]),
110 Register(name="f1", size=8, floating_point=True, subregisters=[("f1_lo", 0, 4)]),
111 Register(name="f2", size=8, floating_point=True, subregisters=[("f2_lo", 0, 4)]),
112 Register(name="f3", size=8, floating_point=True, subregisters=[("f3_lo", 0, 4)]),
113 Register(name="f4", size=8, floating_point=True, subregisters=[("f4_lo", 0, 4)]),
114 Register(name="f5", size=8, floating_point=True, subregisters=[("f5_lo", 0, 4)]),
115 Register(name="f6", size=8, floating_point=True, subregisters=[("f6_lo", 0, 4)]),
116 Register(name="f7", size=8, floating_point=True, subregisters=[("f7_lo", 0, 4)]),
117 Register(name="f8", size=8, floating_point=True, subregisters=[("f8_lo", 0, 4)]),
118 Register(name="f9", size=8, floating_point=True, subregisters=[("f9_lo", 0, 4)]),
119 Register(name="f10", size=8, floating_point=True, subregisters=[("f10_lo", 0, 4)]),
120 Register(name="f11", size=8, floating_point=True, subregisters=[("f11_lo", 0, 4)]),
121 Register(name="f12", size=8, floating_point=True, subregisters=[("f12_lo", 0, 4)]),
122 Register(name="f13", size=8, floating_point=True, subregisters=[("f13_lo", 0, 4)]),
123 Register(name="f14", size=8, floating_point=True, subregisters=[("f14_lo", 0, 4)]),
124 Register(name="f15", size=8, floating_point=True, subregisters=[("f15_lo", 0, 4)]),
125 Register(name="f16", size=8, floating_point=True, subregisters=[("f16_lo", 0, 4)]),
126 Register(name="f17", size=8, floating_point=True, subregisters=[("f17_lo", 0, 4)]),
127 Register(name="f18", size=8, floating_point=True, subregisters=[("f18_lo", 0, 4)]),
128 Register(name="f19", size=8, floating_point=True, subregisters=[("f19_lo", 0, 4)]),
129 Register(name="f20", size=8, floating_point=True, subregisters=[("f20_lo", 0, 4)]),
130 Register(name="f21", size=8, floating_point=True, subregisters=[("f21_lo", 0, 4)]),
131 Register(name="f22", size=8, floating_point=True, subregisters=[("f22_lo", 0, 4)]),
132 Register(name="f23", size=8, floating_point=True, subregisters=[("f23_lo", 0, 4)]),
133 Register(name="f24", size=8, floating_point=True, subregisters=[("f24_lo", 0, 4)]),
134 Register(name="f25", size=8, floating_point=True, subregisters=[("f25_lo", 0, 4)]),
135 Register(name="f26", size=8, floating_point=True, subregisters=[("f26_lo", 0, 4)]),
136 Register(name="f27", size=8, floating_point=True, subregisters=[("f27_lo", 0, 4)]),
137 Register(name="f28", size=8, floating_point=True, subregisters=[("f28_lo", 0, 4)]),
138 Register(name="f29", size=8, floating_point=True, subregisters=[("f29_lo", 0, 4)]),
139 Register(name="f30", size=8, floating_point=True, subregisters=[("f30_lo", 0, 4)]),
140 Register(name="f31", size=8, floating_point=True, subregisters=[("f31_lo", 0, 4)]),
141 Register(name="fir", size=4, floating_point=True),
142 Register(name="fccr", size=4, floating_point=True),
143 Register(name="fexr", size=4, floating_point=True),
144 Register(name="fenr", size=4, floating_point=True),
145 Register(name="fcsr", size=4, floating_point=True),
146 Register(name="ulr", size=4),
147 Register(name="emnote", size=4, artificial=True),
148 Register(name="cmstart", size=4),
149 Register(name="cmlen", size=4),
150 Register(name="nraddr", size=4),
151 Register(name="cond", size=4),
152 Register(name="dspcontrol", size=4),
153 Register(name="ac0", size=8),
154 Register(name="ac1", size=8),
155 Register(name="ac2", size=8),
156 Register(name="ac3", size=8),
157 Register(name="cp0_status", size=4),
158 Register(name="ip_at_syscall", size=4, artificial=True),
159 ]
161 # see https://github.com/radare/radare/blob/master/src/include/elf/mips.h
162 dynamic_tag_translation = {
163 0x70000001: "DT_MIPS_RLD_VERSION",
164 0x70000002: "DT_MIPS_TIME_STAMP",
165 0x70000003: "DT_MIPS_ICHECKSUM",
166 0x70000004: "DT_MIPS_IVERSION",
167 0x70000005: "DT_MIPS_FLAGS",
168 0x70000006: "DT_MIPS_BASE_ADDRESS",
169 0x70000007: "DT_MIPS_MSYM",
170 0x70000008: "DT_MIPS_CONFLICT",
171 0x70000009: "DT_MIPS_LIBLIST",
172 0x7000000A: "DT_MIPS_LOCAL_GOTNO",
173 0x7000000B: "DT_MIPS_CONFLICTNO",
174 0x70000010: "DT_MIPS_LIBLISTNO",
175 0x70000011: "DT_MIPS_SYMTABNO",
176 0x70000012: "DT_MIPS_UNREFEXTNO",
177 0x70000013: "DT_MIPS_GOTSYM",
178 0x70000014: "DT_MIPS_HIPAGENO",
179 0x70000016: "DT_MIPS_RLD_MAP",
180 0x70000017: "DT_MIPS_DELTA_CLASS",
181 0x70000018: "DT_MIPS_DELTA_CLASS_NO",
182 0x70000019: "DT_MIPS_DELTA_INSTANCE",
183 0x7000001A: "DT_MIPS_DELTA_INSTANCE_NO",
184 0x7000001B: "DT_MIPS_DELTA_RELOC",
185 0x7000001C: "DT_MIPS_DELTA_RELOC_NO",
186 0x7000001D: "DT_MIPS_DELTA_SYM",
187 0x7000001E: "DT_MIPS_DELTA_SYM_NO",
188 0x70000020: "DT_MIPS_DELTA_CLASSSYM",
189 0x70000021: "DT_MIPS_DELTA_CLASSSYM_NO",
190 0x70000022: "DT_MIPS_CXX_FLAGS",
191 0x70000023: "DT_MIPS_PIXIE_INIT",
192 0x70000024: "DT_MIPS_SYMBOL_LIB",
193 0x70000025: "DT_MIPS_LOCALPAGE_GOTIDX",
194 0x70000026: "DT_MIPS_LOCAL_GOTIDX",
195 0x70000027: "DT_MIPS_HIDDEN_GOTIDX",
196 0x70000028: "DT_MIPS_PROTECTED_GOTIDX",
197 0x70000029: "DT_MIPS_OPTIONS",
198 0x7000002A: "DT_MIPS_INTERFACE",
199 0x7000002B: "DT_MIPS_DYNSTR_ALIGN",
200 0x7000002C: "DT_MIPS_INTERFACE_SIZE",
201 0x7000002D: "DT_MIPS_RLD_TEXT_RESOLVE_ADDR",
202 0x7000002E: "DT_MIPS_PERF_SUFFIX",
203 0x7000002F: "DT_MIPS_COMPACT_SIZE",
204 0x70000030: "DT_MIPS_GP_VALUE",
205 0x70000031: "DT_MIPS_AUX_DYNAMIC",
206 0x70000032: "DT_MIPS_PLTGOT",
207 }
208 got_section_name = ".got"
209 ld_linux_name = "ld.so.1"
210 elf_tls = TLSArchInfo(1, 8, [], [0], [], 0x7000, 0x8000)
212 dwarf_registers = [
213 "r0",
214 "r1",
215 "r2",
216 "r3",
217 "r4",
218 "r5",
219 "r6",
220 "r7",
221 "r8",
222 "r9",
223 "r10",
224 "r11",
225 "r12",
226 "r13",
227 "r14",
228 "r15",
229 "r16",
230 "r17",
231 "r18",
232 "r19",
233 "r20",
234 "r21",
235 "r22",
236 "r23",
237 "r24",
238 "r25",
239 "r26",
240 "r27",
241 "gp",
242 "sp",
243 "s8",
244 "ra",
245 "f0",
246 "f1",
247 "f2",
248 "f3",
249 "f4",
250 "f5",
251 "f6",
252 "f7",
253 "f8",
254 "f9",
255 "f10",
256 "f11",
257 "f12",
258 "f13",
259 "f14",
260 "f15",
261 "f16",
262 "f17",
263 "f18",
264 "f19",
265 "f20",
266 "f21",
267 "f22",
268 "f23",
269 "f24",
270 "f25",
271 "f26",
272 "f27",
273 "f28",
274 "f29",
275 "f30",
276 "f31",
277 "hi",
278 "lo",
279 ]
282register_arch([r"mipsel|mipsle"], 32, Endness.LE, ArchMIPS32)
283register_arch([r".*mips.*"], 32, "any", ArchMIPS32)