smallworld-re 1.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- smallworld/__init__.py +35 -0
- smallworld/analyses/__init__.py +14 -0
- smallworld/analyses/analysis.py +88 -0
- smallworld/analyses/code_coverage.py +31 -0
- smallworld/analyses/colorizer.py +682 -0
- smallworld/analyses/colorizer_summary.py +100 -0
- smallworld/analyses/field_detection/__init__.py +14 -0
- smallworld/analyses/field_detection/field_analysis.py +536 -0
- smallworld/analyses/field_detection/guards.py +26 -0
- smallworld/analyses/field_detection/hints.py +133 -0
- smallworld/analyses/field_detection/malloc.py +211 -0
- smallworld/analyses/forced_exec/__init__.py +3 -0
- smallworld/analyses/forced_exec/forced_exec.py +87 -0
- smallworld/analyses/underlays/__init__.py +4 -0
- smallworld/analyses/underlays/basic.py +13 -0
- smallworld/analyses/underlays/underlay.py +31 -0
- smallworld/analyses/unstable/__init__.py +4 -0
- smallworld/analyses/unstable/angr/__init__.py +0 -0
- smallworld/analyses/unstable/angr/base.py +12 -0
- smallworld/analyses/unstable/angr/divergence.py +274 -0
- smallworld/analyses/unstable/angr/model.py +383 -0
- smallworld/analyses/unstable/angr/nwbt.py +63 -0
- smallworld/analyses/unstable/angr/typedefs.py +170 -0
- smallworld/analyses/unstable/angr/utils.py +25 -0
- smallworld/analyses/unstable/angr/visitor.py +315 -0
- smallworld/analyses/unstable/angr_nwbt.py +106 -0
- smallworld/analyses/unstable/code_coverage.py +54 -0
- smallworld/analyses/unstable/code_reachable.py +44 -0
- smallworld/analyses/unstable/control_flow_tracer.py +71 -0
- smallworld/analyses/unstable/pointer_finder.py +90 -0
- smallworld/arch/__init__.py +0 -0
- smallworld/arch/aarch64_arch.py +286 -0
- smallworld/arch/amd64_arch.py +86 -0
- smallworld/arch/i386_arch.py +44 -0
- smallworld/emulators/__init__.py +14 -0
- smallworld/emulators/angr/__init__.py +7 -0
- smallworld/emulators/angr/angr.py +1652 -0
- smallworld/emulators/angr/default.py +15 -0
- smallworld/emulators/angr/exceptions.py +7 -0
- smallworld/emulators/angr/exploration/__init__.py +9 -0
- smallworld/emulators/angr/exploration/bounds.py +27 -0
- smallworld/emulators/angr/exploration/default.py +17 -0
- smallworld/emulators/angr/exploration/terminate.py +22 -0
- smallworld/emulators/angr/factory.py +55 -0
- smallworld/emulators/angr/machdefs/__init__.py +35 -0
- smallworld/emulators/angr/machdefs/aarch64.py +292 -0
- smallworld/emulators/angr/machdefs/amd64.py +192 -0
- smallworld/emulators/angr/machdefs/arm.py +387 -0
- smallworld/emulators/angr/machdefs/i386.py +221 -0
- smallworld/emulators/angr/machdefs/machdef.py +138 -0
- smallworld/emulators/angr/machdefs/mips.py +184 -0
- smallworld/emulators/angr/machdefs/mips64.py +189 -0
- smallworld/emulators/angr/machdefs/ppc.py +101 -0
- smallworld/emulators/angr/machdefs/riscv.py +261 -0
- smallworld/emulators/angr/machdefs/xtensa.py +255 -0
- smallworld/emulators/angr/memory/__init__.py +7 -0
- smallworld/emulators/angr/memory/default.py +10 -0
- smallworld/emulators/angr/memory/fixups.py +43 -0
- smallworld/emulators/angr/memory/memtrack.py +105 -0
- smallworld/emulators/angr/scratch.py +43 -0
- smallworld/emulators/angr/simos.py +53 -0
- smallworld/emulators/angr/utils.py +70 -0
- smallworld/emulators/emulator.py +1013 -0
- smallworld/emulators/hookable.py +252 -0
- smallworld/emulators/panda/__init__.py +5 -0
- smallworld/emulators/panda/machdefs/__init__.py +28 -0
- smallworld/emulators/panda/machdefs/aarch64.py +93 -0
- smallworld/emulators/panda/machdefs/amd64.py +71 -0
- smallworld/emulators/panda/machdefs/arm.py +89 -0
- smallworld/emulators/panda/machdefs/i386.py +36 -0
- smallworld/emulators/panda/machdefs/machdef.py +86 -0
- smallworld/emulators/panda/machdefs/mips.py +94 -0
- smallworld/emulators/panda/machdefs/mips64.py +91 -0
- smallworld/emulators/panda/machdefs/ppc.py +79 -0
- smallworld/emulators/panda/panda.py +575 -0
- smallworld/emulators/unicorn/__init__.py +13 -0
- smallworld/emulators/unicorn/machdefs/__init__.py +28 -0
- smallworld/emulators/unicorn/machdefs/aarch64.py +310 -0
- smallworld/emulators/unicorn/machdefs/amd64.py +326 -0
- smallworld/emulators/unicorn/machdefs/arm.py +321 -0
- smallworld/emulators/unicorn/machdefs/i386.py +137 -0
- smallworld/emulators/unicorn/machdefs/machdef.py +117 -0
- smallworld/emulators/unicorn/machdefs/mips.py +202 -0
- smallworld/emulators/unicorn/unicorn.py +684 -0
- smallworld/exceptions/__init__.py +5 -0
- smallworld/exceptions/exceptions.py +85 -0
- smallworld/exceptions/unstable/__init__.py +1 -0
- smallworld/exceptions/unstable/exceptions.py +25 -0
- smallworld/extern/__init__.py +4 -0
- smallworld/extern/ctypes.py +94 -0
- smallworld/extern/unstable/__init__.py +1 -0
- smallworld/extern/unstable/ghidra.py +129 -0
- smallworld/helpers.py +107 -0
- smallworld/hinting/__init__.py +8 -0
- smallworld/hinting/hinting.py +214 -0
- smallworld/hinting/hints.py +427 -0
- smallworld/hinting/unstable/__init__.py +2 -0
- smallworld/hinting/utils.py +19 -0
- smallworld/instructions/__init__.py +18 -0
- smallworld/instructions/aarch64.py +20 -0
- smallworld/instructions/arm.py +18 -0
- smallworld/instructions/bsid.py +67 -0
- smallworld/instructions/instructions.py +258 -0
- smallworld/instructions/mips.py +21 -0
- smallworld/instructions/x86.py +100 -0
- smallworld/logging.py +90 -0
- smallworld/platforms.py +95 -0
- smallworld/py.typed +0 -0
- smallworld/state/__init__.py +6 -0
- smallworld/state/cpus/__init__.py +32 -0
- smallworld/state/cpus/aarch64.py +563 -0
- smallworld/state/cpus/amd64.py +676 -0
- smallworld/state/cpus/arm.py +630 -0
- smallworld/state/cpus/cpu.py +71 -0
- smallworld/state/cpus/i386.py +239 -0
- smallworld/state/cpus/mips.py +374 -0
- smallworld/state/cpus/mips64.py +372 -0
- smallworld/state/cpus/powerpc.py +229 -0
- smallworld/state/cpus/riscv.py +357 -0
- smallworld/state/cpus/xtensa.py +80 -0
- smallworld/state/memory/__init__.py +7 -0
- smallworld/state/memory/code.py +70 -0
- smallworld/state/memory/elf/__init__.py +3 -0
- smallworld/state/memory/elf/elf.py +564 -0
- smallworld/state/memory/elf/rela/__init__.py +32 -0
- smallworld/state/memory/elf/rela/aarch64.py +27 -0
- smallworld/state/memory/elf/rela/amd64.py +32 -0
- smallworld/state/memory/elf/rela/arm.py +51 -0
- smallworld/state/memory/elf/rela/i386.py +32 -0
- smallworld/state/memory/elf/rela/mips.py +45 -0
- smallworld/state/memory/elf/rela/ppc.py +45 -0
- smallworld/state/memory/elf/rela/rela.py +63 -0
- smallworld/state/memory/elf/rela/riscv64.py +27 -0
- smallworld/state/memory/elf/rela/xtensa.py +15 -0
- smallworld/state/memory/elf/structs.py +55 -0
- smallworld/state/memory/heap.py +85 -0
- smallworld/state/memory/memory.py +181 -0
- smallworld/state/memory/stack/__init__.py +31 -0
- smallworld/state/memory/stack/aarch64.py +22 -0
- smallworld/state/memory/stack/amd64.py +42 -0
- smallworld/state/memory/stack/arm.py +66 -0
- smallworld/state/memory/stack/i386.py +22 -0
- smallworld/state/memory/stack/mips.py +34 -0
- smallworld/state/memory/stack/mips64.py +34 -0
- smallworld/state/memory/stack/ppc.py +34 -0
- smallworld/state/memory/stack/riscv.py +22 -0
- smallworld/state/memory/stack/stack.py +127 -0
- smallworld/state/memory/stack/xtensa.py +34 -0
- smallworld/state/models/__init__.py +6 -0
- smallworld/state/models/mmio.py +186 -0
- smallworld/state/models/model.py +163 -0
- smallworld/state/models/posix.py +455 -0
- smallworld/state/models/x86/__init__.py +2 -0
- smallworld/state/models/x86/microsoftcdecl.py +35 -0
- smallworld/state/models/x86/systemv.py +240 -0
- smallworld/state/state.py +962 -0
- smallworld/state/unstable/__init__.py +0 -0
- smallworld/state/unstable/elf.py +393 -0
- smallworld/state/x86_registers.py +30 -0
- smallworld/utils.py +935 -0
- smallworld_re-1.0.0.dist-info/LICENSE.txt +21 -0
- smallworld_re-1.0.0.dist-info/METADATA +189 -0
- smallworld_re-1.0.0.dist-info/RECORD +166 -0
- smallworld_re-1.0.0.dist-info/WHEEL +5 -0
- smallworld_re-1.0.0.dist-info/entry_points.txt +2 -0
- smallworld_re-1.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,239 @@
|
|
1
|
+
import typing
|
2
|
+
|
3
|
+
from ... import platforms
|
4
|
+
from .. import state
|
5
|
+
from ..x86_registers import X86MMRRegister
|
6
|
+
from . import cpu
|
7
|
+
|
8
|
+
|
9
|
+
class I386(cpu.CPU):
|
10
|
+
"""i386 CPU state model."""
|
11
|
+
|
12
|
+
platform = platforms.Platform(
|
13
|
+
platforms.Architecture.X86_32, platforms.Byteorder.LITTLE
|
14
|
+
)
|
15
|
+
|
16
|
+
_GENERAL_PURPOSE_REGS = ["eax", "ebx", "ecx", "edx", "edi", "esi", "ebp", "esp"]
|
17
|
+
|
18
|
+
def get_general_purpose_registers(self) -> typing.List[str]:
|
19
|
+
return self._GENERAL_PURPOSE_REGS
|
20
|
+
|
21
|
+
def __init__(self):
|
22
|
+
super().__init__()
|
23
|
+
# *** General Purpose Registers ***
|
24
|
+
self.eax = state.Register("eax", 4)
|
25
|
+
self.add(self.eax)
|
26
|
+
self.ax = state.RegisterAlias("ax", self.eax, 2, 0)
|
27
|
+
self.add(self.ax)
|
28
|
+
self.al = state.RegisterAlias("al", self.eax, 1, 0)
|
29
|
+
self.add(self.al)
|
30
|
+
self.ah = state.RegisterAlias("ah", self.eax, 1, 1)
|
31
|
+
self.add(self.ah)
|
32
|
+
|
33
|
+
self.ebx = state.Register("ebx", 4)
|
34
|
+
self.add(self.ebx)
|
35
|
+
self.bx = state.RegisterAlias("bx", self.ebx, 2, 0)
|
36
|
+
self.add(self.bx)
|
37
|
+
self.bl = state.RegisterAlias("bl", self.ebx, 1, 0)
|
38
|
+
self.add(self.bl)
|
39
|
+
self.bh = state.RegisterAlias("bh", self.ebx, 1, 1)
|
40
|
+
self.add(self.bh)
|
41
|
+
|
42
|
+
self.ecx = state.Register("ecx", 4)
|
43
|
+
self.add(self.ecx)
|
44
|
+
self.cx = state.RegisterAlias("cx", self.ecx, 2, 0)
|
45
|
+
self.add(self.cx)
|
46
|
+
self.cl = state.RegisterAlias("cl", self.ecx, 1, 0)
|
47
|
+
self.add(self.cl)
|
48
|
+
self.ch = state.RegisterAlias("ch", self.ecx, 1, 1)
|
49
|
+
self.add(self.ch)
|
50
|
+
|
51
|
+
self.edx = state.Register("edx", 4)
|
52
|
+
self.add(self.edx)
|
53
|
+
self.dx = state.RegisterAlias("dx", self.edx, 2, 0)
|
54
|
+
self.add(self.dx)
|
55
|
+
self.dl = state.RegisterAlias("dl", self.edx, 1, 0)
|
56
|
+
self.add(self.dl)
|
57
|
+
self.dh = state.RegisterAlias("dh", self.edx, 1, 1)
|
58
|
+
self.add(self.dh)
|
59
|
+
|
60
|
+
self.esi = state.Register("esi", 4)
|
61
|
+
self.add(self.esi)
|
62
|
+
self.si = state.RegisterAlias("si", self.esi, 2, 0)
|
63
|
+
self.add(self.si)
|
64
|
+
self.sil = state.RegisterAlias("sil", self.esi, 1, 0)
|
65
|
+
self.add(self.sil)
|
66
|
+
|
67
|
+
self.edi = state.Register("edi", 4)
|
68
|
+
self.add(self.edi)
|
69
|
+
self.di = state.RegisterAlias("di", self.edi, 2, 0)
|
70
|
+
self.add(self.di)
|
71
|
+
self.dil = state.RegisterAlias("dil", self.edi, 1, 0)
|
72
|
+
self.add(self.dil)
|
73
|
+
|
74
|
+
self.ebp = state.Register("ebp", 4)
|
75
|
+
self.add(self.ebp)
|
76
|
+
self.bp = state.RegisterAlias("bp", self.ebp, 2, 0)
|
77
|
+
self.add(self.bp)
|
78
|
+
self.bpl = state.RegisterAlias("bpl", self.ebp, 1, 0)
|
79
|
+
self.add(self.bpl)
|
80
|
+
|
81
|
+
self.esp = state.Register("esp", 4)
|
82
|
+
self.add(self.esp)
|
83
|
+
self.sp = state.RegisterAlias("sp", self.esp, 2, 0)
|
84
|
+
self.add(self.sp)
|
85
|
+
self.spl = state.RegisterAlias("spl", self.esp, 1, 0)
|
86
|
+
self.add(self.spl)
|
87
|
+
|
88
|
+
# *** Instruction Pointer ***
|
89
|
+
self.eip = state.Register("eip", 4)
|
90
|
+
self.add(self.eip)
|
91
|
+
self.ip = state.RegisterAlias("ip", self.eip, 2, 0)
|
92
|
+
self.add(self.ip)
|
93
|
+
|
94
|
+
self.pc = state.RegisterAlias("pc", self.eip, 4, 0)
|
95
|
+
self.add(self.pc)
|
96
|
+
|
97
|
+
# *** Segment Registers ***
|
98
|
+
self.cs = state.Register("cs", 2)
|
99
|
+
self.add(self.cs)
|
100
|
+
self.ss = state.Register("ss", 2)
|
101
|
+
self.add(self.ss)
|
102
|
+
self.ds = state.Register("ds", 2)
|
103
|
+
self.add(self.ds)
|
104
|
+
self.es = state.Register("es", 2)
|
105
|
+
self.add(self.es)
|
106
|
+
self.fs = state.Register("fs", 2)
|
107
|
+
self.add(self.fs)
|
108
|
+
self.gs = state.Register("gs", 2)
|
109
|
+
self.add(self.gs)
|
110
|
+
|
111
|
+
# *** Flags Registers ***
|
112
|
+
self.eflags = state.Register("eflags", 4)
|
113
|
+
self.add(self.eflags)
|
114
|
+
self.flags = state.RegisterAlias("flags", self.eflags, 2)
|
115
|
+
self.add(self.flags)
|
116
|
+
|
117
|
+
# *** Control Registers ***
|
118
|
+
self.cr0 = state.Register("cr0", 4)
|
119
|
+
self.add(self.cr0)
|
120
|
+
self.cr1 = state.Register("cr1", 4)
|
121
|
+
self.add(self.cr1)
|
122
|
+
self.cr2 = state.Register("cr2", 4)
|
123
|
+
self.add(self.cr2)
|
124
|
+
self.cr3 = state.Register("cr3", 4)
|
125
|
+
self.add(self.cr3)
|
126
|
+
self.cr4 = state.Register("cr4", 4)
|
127
|
+
self.add(self.cr4)
|
128
|
+
# NOTE: I've got conflicting reports whether cr8 exists in i386.
|
129
|
+
self.cr8 = state.Register("cr8", 4)
|
130
|
+
self.add(self.cr8)
|
131
|
+
|
132
|
+
# *** Debug Registers ***
|
133
|
+
self.dr0 = state.Register("dr0", 4)
|
134
|
+
self.add(self.dr0)
|
135
|
+
self.dr1 = state.Register("dr1", 4)
|
136
|
+
self.add(self.dr1)
|
137
|
+
self.dr2 = state.Register("dr2", 4)
|
138
|
+
self.add(self.dr2)
|
139
|
+
self.dr3 = state.Register("dr3", 4)
|
140
|
+
self.add(self.dr3)
|
141
|
+
self.dr6 = state.Register("dr6", 4)
|
142
|
+
self.add(self.dr6)
|
143
|
+
self.dr7 = state.Register("dr7", 4)
|
144
|
+
self.add(self.dr7)
|
145
|
+
|
146
|
+
# *** Descriptor Table Registers
|
147
|
+
# NOTE: Yes, this is 6 bytes; 2 byte segment selector plus 4 byte offset
|
148
|
+
self.gdtr = X86MMRRegister("gdtr", 6)
|
149
|
+
self.add(self.gdtr)
|
150
|
+
self.idtr = X86MMRRegister("idtr", 6)
|
151
|
+
self.add(self.idtr)
|
152
|
+
self.ldtr = X86MMRRegister("ldtr", 6)
|
153
|
+
self.add(self.ldtr)
|
154
|
+
|
155
|
+
# *** Task Register ***
|
156
|
+
# NOTE: Yes, this is 6 bytes; 2 byte segment selector plus 4 byte offset
|
157
|
+
self.tr = X86MMRRegister("tr", 6)
|
158
|
+
self.add(self.tr)
|
159
|
+
|
160
|
+
# *** x87 registers ***
|
161
|
+
self.fpr0 = state.Register("fpr0", 10)
|
162
|
+
self.add(self.fpr0)
|
163
|
+
self.fpr1 = state.Register("fpr1", 10)
|
164
|
+
self.add(self.fpr1)
|
165
|
+
self.fpr2 = state.Register("fpr2", 10)
|
166
|
+
self.add(self.fpr2)
|
167
|
+
self.fpr3 = state.Register("fpr3", 10)
|
168
|
+
self.add(self.fpr3)
|
169
|
+
self.fpr4 = state.Register("fpr4", 10)
|
170
|
+
self.add(self.fpr4)
|
171
|
+
self.fpr5 = state.Register("fpr5", 10)
|
172
|
+
self.add(self.fpr5)
|
173
|
+
self.fpr6 = state.Register("fpr6", 10)
|
174
|
+
self.add(self.fpr6)
|
175
|
+
self.fpr7 = state.Register("fpr7", 10)
|
176
|
+
self.add(self.fpr7)
|
177
|
+
|
178
|
+
# x87 Control Register
|
179
|
+
self.fctrl = state.Register("fctrl", 2)
|
180
|
+
self.add(self.fctrl)
|
181
|
+
# x87 Status Register
|
182
|
+
self.fstat = state.Register("fstat", 2)
|
183
|
+
self.add(self.fstat)
|
184
|
+
# x87 Tag Register
|
185
|
+
self.ftag = state.Register("ftag", 2)
|
186
|
+
self.add(self.ftag)
|
187
|
+
# x87 Last Instruction Register
|
188
|
+
self.fip = state.Register("fip", 8)
|
189
|
+
self.add(self.fip)
|
190
|
+
# x87 Last Operand Pointer
|
191
|
+
self.fdp = state.Register("fdp", 8)
|
192
|
+
self.add(self.fdp)
|
193
|
+
# x87 Last Opcode
|
194
|
+
self.fop = state.Register("fop", 2)
|
195
|
+
self.add(self.fop)
|
196
|
+
|
197
|
+
# NOTE: Docs disagree on the format of fip and fdp.
|
198
|
+
# One source describes them as 48-bit offset-plus-segment,
|
199
|
+
# the other describes them as 64-bit.
|
200
|
+
# There may also be separate segment registers.
|
201
|
+
# If you care about the x87 debug info, please feel free to update.
|
202
|
+
|
203
|
+
# *** MMX Registers ***
|
204
|
+
# NOTE: The MMX registers are aliases for the low 8 bytes of the x87 registers.
|
205
|
+
# The two subsystems cannot be used simultaneously.
|
206
|
+
self.mm0 = state.RegisterAlias("mm0", self.fpr0, 8, 0)
|
207
|
+
self.add(self.mm0)
|
208
|
+
self.mm1 = state.RegisterAlias("mm1", self.fpr1, 8, 0)
|
209
|
+
self.add(self.mm1)
|
210
|
+
self.mm2 = state.RegisterAlias("mm2", self.fpr2, 8, 0)
|
211
|
+
self.add(self.mm2)
|
212
|
+
self.mm3 = state.RegisterAlias("mm3", self.fpr3, 8, 0)
|
213
|
+
self.add(self.mm3)
|
214
|
+
self.mm4 = state.RegisterAlias("mm4", self.fpr4, 8, 0)
|
215
|
+
self.add(self.mm4)
|
216
|
+
self.mm5 = state.RegisterAlias("mm5", self.fpr5, 8, 0)
|
217
|
+
self.add(self.mm5)
|
218
|
+
self.mm6 = state.RegisterAlias("mm6", self.fpr6, 8, 0)
|
219
|
+
self.add(self.mm6)
|
220
|
+
self.mm7 = state.RegisterAlias("mm7", self.fpr7, 8, 0)
|
221
|
+
self.add(self.mm7)
|
222
|
+
|
223
|
+
# *** SSE Registers ***
|
224
|
+
self.xmm0 = state.Register("xmm0", 16)
|
225
|
+
self.add(self.xmm0)
|
226
|
+
self.xmm1 = state.Register("xmm1", 16)
|
227
|
+
self.add(self.xmm1)
|
228
|
+
self.xmm2 = state.Register("xmm2", 16)
|
229
|
+
self.add(self.xmm2)
|
230
|
+
self.xmm3 = state.Register("xmm3", 16)
|
231
|
+
self.add(self.xmm3)
|
232
|
+
self.xmm4 = state.Register("xmm4", 16)
|
233
|
+
self.add(self.xmm4)
|
234
|
+
self.xmm5 = state.Register("xmm5", 16)
|
235
|
+
self.add(self.xmm5)
|
236
|
+
self.xmm6 = state.Register("xmm6", 16)
|
237
|
+
self.add(self.xmm6)
|
238
|
+
self.xmm7 = state.Register("xmm7", 16)
|
239
|
+
self.add(self.xmm7)
|
@@ -0,0 +1,374 @@
|
|
1
|
+
import typing
|
2
|
+
|
3
|
+
from ... import platforms
|
4
|
+
from .. import state
|
5
|
+
from . import cpu
|
6
|
+
|
7
|
+
|
8
|
+
class MIPS(cpu.CPU):
|
9
|
+
"""Auto-generated CPU state for mips:mips32:big.
|
10
|
+
|
11
|
+
Generated from Pcode language MIPS:BE:32:default, and Unicorn package
|
12
|
+
unicorn.mips_const.
|
13
|
+
"""
|
14
|
+
|
15
|
+
# Excluded registers:
|
16
|
+
# - zero: Hard-wired to zero
|
17
|
+
# - at: Reserved for assembler
|
18
|
+
# - kX: Reserved for kernel; used as general in some ABIs
|
19
|
+
# - fX: Floating-point registers
|
20
|
+
# - acX: Accumulator registers
|
21
|
+
_GENERAL_PURPOSE_REGS = [
|
22
|
+
"v0",
|
23
|
+
"v1",
|
24
|
+
"a0",
|
25
|
+
"a1",
|
26
|
+
"a2",
|
27
|
+
"a3",
|
28
|
+
"t0",
|
29
|
+
"t1",
|
30
|
+
"t2",
|
31
|
+
"t3",
|
32
|
+
"t4",
|
33
|
+
"t5",
|
34
|
+
"t6",
|
35
|
+
"t7",
|
36
|
+
"t8",
|
37
|
+
"t9",
|
38
|
+
"s0",
|
39
|
+
"s1",
|
40
|
+
"s2",
|
41
|
+
"s3",
|
42
|
+
"s4",
|
43
|
+
"s5",
|
44
|
+
"s6",
|
45
|
+
"s7",
|
46
|
+
"s8",
|
47
|
+
]
|
48
|
+
|
49
|
+
def get_general_purpose_registers(self) -> typing.List[str]:
|
50
|
+
return self._GENERAL_PURPOSE_REGS
|
51
|
+
|
52
|
+
def __init__(self):
|
53
|
+
super().__init__()
|
54
|
+
# NOTE: MIPS registers have both a name and a number.
|
55
|
+
|
56
|
+
# *** General-Purpose Registers ***
|
57
|
+
# Assembler-Temporary Register
|
58
|
+
self.at = state.Register("at", size=4)
|
59
|
+
self.add(self.at)
|
60
|
+
self._1 = state.RegisterAlias("1", self.at, size=4, offset=0)
|
61
|
+
self.add(self._1)
|
62
|
+
# Return Value Registers
|
63
|
+
self.v0 = state.Register("v0", size=4)
|
64
|
+
self.add(self.v0)
|
65
|
+
self._2 = state.RegisterAlias("2", self.v0, size=4, offset=0)
|
66
|
+
self.add(self._2)
|
67
|
+
self.v1 = state.Register("v1", size=4)
|
68
|
+
self.add(self.v1)
|
69
|
+
self._3 = state.RegisterAlias("3", self.v1, size=4, offset=0)
|
70
|
+
self.add(self._3)
|
71
|
+
# Argument Registers
|
72
|
+
self.a0 = state.Register("a0", size=4)
|
73
|
+
self.add(self.a0)
|
74
|
+
self._4 = state.RegisterAlias("4", self.a0, size=4, offset=0)
|
75
|
+
self.add(self._4)
|
76
|
+
self.a1 = state.Register("a1", size=4)
|
77
|
+
self.add(self.a1)
|
78
|
+
self._5 = state.RegisterAlias("5", self.a1, size=4, offset=0)
|
79
|
+
self.add(self._5)
|
80
|
+
self.a2 = state.Register("a2", size=4)
|
81
|
+
self.add(self.a2)
|
82
|
+
self._6 = state.RegisterAlias("6", self.a2, size=4, offset=0)
|
83
|
+
self.add(self._6)
|
84
|
+
self.a3 = state.Register("a3", size=4)
|
85
|
+
self.add(self.a3)
|
86
|
+
self._7 = state.RegisterAlias("7", self.a3, size=4, offset=0)
|
87
|
+
self.add(self._7)
|
88
|
+
# Temporary Registers
|
89
|
+
self.t0 = state.Register("t0", size=4)
|
90
|
+
self.add(self.t0)
|
91
|
+
self._8 = state.RegisterAlias("8", self.t0, size=4, offset=0)
|
92
|
+
self.add(self._8)
|
93
|
+
self.t1 = state.Register("t1", size=4)
|
94
|
+
self.add(self.t1)
|
95
|
+
self._9 = state.RegisterAlias("9", self.t1, size=4, offset=0)
|
96
|
+
self.add(self._9)
|
97
|
+
self.t2 = state.Register("t2", size=4)
|
98
|
+
self.add(self.t2)
|
99
|
+
self._10 = state.RegisterAlias("10", self.t2, size=4, offset=0)
|
100
|
+
self.add(self._10)
|
101
|
+
self.t3 = state.Register("t3", size=4)
|
102
|
+
self.add(self.t3)
|
103
|
+
self._11 = state.RegisterAlias("11", self.t3, size=4, offset=0)
|
104
|
+
self.add(self._11)
|
105
|
+
self.t4 = state.Register("t4", size=4)
|
106
|
+
self.add(self.t4)
|
107
|
+
self._12 = state.RegisterAlias("12", self.t4, size=4, offset=0)
|
108
|
+
self.add(self._12)
|
109
|
+
self.t5 = state.Register("t5", size=4)
|
110
|
+
self.add(self.t5)
|
111
|
+
self._13 = state.RegisterAlias("13", self.t5, size=4, offset=0)
|
112
|
+
self.add(self._13)
|
113
|
+
self.t6 = state.Register("t6", size=4)
|
114
|
+
self.add(self.t6)
|
115
|
+
self._14 = state.RegisterAlias("14", self.t6, size=4, offset=0)
|
116
|
+
self.add(self._14)
|
117
|
+
self.t7 = state.Register("t7", size=4)
|
118
|
+
self.add(self.t7)
|
119
|
+
self._15 = state.RegisterAlias("15", self.t7, size=4, offset=0)
|
120
|
+
self.add(self._15)
|
121
|
+
# NOTE: These numbers aren't out of order.
|
122
|
+
# t8 and t9 are later in the register file than t0 - t7.
|
123
|
+
self.t8 = state.Register("t8", size=4)
|
124
|
+
self.add(self.t8)
|
125
|
+
self._24 = state.RegisterAlias("24", self.t8, size=4, offset=0)
|
126
|
+
self.add(self._24)
|
127
|
+
self.t9 = state.Register("t9", size=4)
|
128
|
+
self.add(self.t9)
|
129
|
+
self._25 = state.RegisterAlias("25", self.t9, size=4, offset=0)
|
130
|
+
self.add(self._25)
|
131
|
+
# Saved Registers
|
132
|
+
self.s0 = state.Register("s0", size=4)
|
133
|
+
self.add(self.s0)
|
134
|
+
self._16 = state.RegisterAlias("16", self.s0, size=4, offset=0)
|
135
|
+
self.add(self._16)
|
136
|
+
self.s1 = state.Register("s1", size=4)
|
137
|
+
self.add(self.s1)
|
138
|
+
self._17 = state.RegisterAlias("17", self.s1, size=4, offset=0)
|
139
|
+
self.add(self._17)
|
140
|
+
self.s2 = state.Register("s2", size=4)
|
141
|
+
self.add(self.s2)
|
142
|
+
self._18 = state.RegisterAlias("18", self.s2, size=4, offset=0)
|
143
|
+
self.add(self._18)
|
144
|
+
self.s3 = state.Register("s3", size=4)
|
145
|
+
self.add(self.s3)
|
146
|
+
self._19 = state.RegisterAlias("19", self.s3, size=4, offset=0)
|
147
|
+
self.add(self._19)
|
148
|
+
self.s4 = state.Register("s4", size=4)
|
149
|
+
self.add(self.s4)
|
150
|
+
self._20 = state.RegisterAlias("20", self.s4, size=4, offset=0)
|
151
|
+
self.add(self._20)
|
152
|
+
self.s5 = state.Register("s5", size=4)
|
153
|
+
self.add(self.s5)
|
154
|
+
self._21 = state.RegisterAlias("21", self.s5, size=4, offset=0)
|
155
|
+
self.add(self._21)
|
156
|
+
self.s6 = state.Register("s6", size=4)
|
157
|
+
self.add(self.s6)
|
158
|
+
self._22 = state.RegisterAlias("22", self.s6, size=4, offset=0)
|
159
|
+
self.add(self._22)
|
160
|
+
self.s7 = state.Register("s7", size=4)
|
161
|
+
self.add(self.s7)
|
162
|
+
self._23 = state.RegisterAlias("23", self.s7, size=4, offset=0)
|
163
|
+
self.add(self._23)
|
164
|
+
# NOTE: Register #30 was originally the Frame Pointer.
|
165
|
+
# It's been re-aliased as s8, since many ABIs don't use the frame pointer.
|
166
|
+
# Unicorn and Sleigh prefer to use the alias s8,
|
167
|
+
# so it should be the base register.
|
168
|
+
self.s8 = state.Register("s8", size=4)
|
169
|
+
self.add(self.s8)
|
170
|
+
self.fp = state.RegisterAlias("fp", self.s8, size=4, offset=0)
|
171
|
+
self.add(self.fp)
|
172
|
+
self._30 = state.RegisterAlias("30", self.s8, size=4, offset=0)
|
173
|
+
self.add(self._30)
|
174
|
+
# Kernel-reserved Registers
|
175
|
+
self.k0 = state.Register("k0", size=4)
|
176
|
+
self.add(self.k0)
|
177
|
+
self._26 = state.RegisterAlias("26", self.k0, size=4, offset=0)
|
178
|
+
self.add(self._26)
|
179
|
+
self.k1 = state.Register("k1", size=4)
|
180
|
+
self.add(self.k1)
|
181
|
+
self._27 = state.RegisterAlias("27", self.k1, size=4, offset=0)
|
182
|
+
self.add(self._27)
|
183
|
+
# *** Pointer Registers ***
|
184
|
+
# Zero register
|
185
|
+
self.zero = state.FixedRegister("zero", size=4, value=0)
|
186
|
+
self.add(self.zero)
|
187
|
+
self._0 = state.RegisterAlias("0", self.zero, size=4, offset=0)
|
188
|
+
self.add(self._0)
|
189
|
+
# Global Offset Pointer
|
190
|
+
self.gp = state.Register("gp", size=4)
|
191
|
+
self.add(self.gp)
|
192
|
+
self._28 = state.RegisterAlias("28", self.gp, size=4, offset=0)
|
193
|
+
self.add(self._28)
|
194
|
+
# Stack Pointer
|
195
|
+
self.sp = state.Register("sp", size=4)
|
196
|
+
self.add(self.sp)
|
197
|
+
self._29 = state.RegisterAlias("29", self.sp, size=4, offset=0)
|
198
|
+
self.add(self._29)
|
199
|
+
# Return Address
|
200
|
+
self.ra = state.Register("ra", size=4)
|
201
|
+
self.add(self.ra)
|
202
|
+
self._31 = state.RegisterAlias("31", self.ra, size=4, offset=0)
|
203
|
+
self.add(self._31)
|
204
|
+
# Program Counter
|
205
|
+
self.pc = state.Register("pc", size=4)
|
206
|
+
self.add(self.pc)
|
207
|
+
# Floating Point Registers
|
208
|
+
self.f0 = state.Register("f0", size=8)
|
209
|
+
self.add(self.f0)
|
210
|
+
self.f1 = state.Register("f1", size=8)
|
211
|
+
self.add(self.f1)
|
212
|
+
self.f2 = state.Register("f2", size=8)
|
213
|
+
self.add(self.f2)
|
214
|
+
self.f3 = state.Register("f3", size=8)
|
215
|
+
self.add(self.f3)
|
216
|
+
self.f4 = state.Register("f4", size=8)
|
217
|
+
self.add(self.f4)
|
218
|
+
self.f5 = state.Register("f5", size=8)
|
219
|
+
self.add(self.f5)
|
220
|
+
self.f6 = state.Register("f6", size=8)
|
221
|
+
self.add(self.f6)
|
222
|
+
self.f7 = state.Register("f7", size=8)
|
223
|
+
self.add(self.f7)
|
224
|
+
self.f8 = state.Register("f8", size=8)
|
225
|
+
self.add(self.f8)
|
226
|
+
self.f9 = state.Register("f9", size=8)
|
227
|
+
self.add(self.f9)
|
228
|
+
self.f10 = state.Register("f10", size=8)
|
229
|
+
self.add(self.f10)
|
230
|
+
self.f11 = state.Register("f11", size=8)
|
231
|
+
self.add(self.f11)
|
232
|
+
self.f12 = state.Register("f12", size=8)
|
233
|
+
self.add(self.f12)
|
234
|
+
self.f13 = state.Register("f13", size=8)
|
235
|
+
self.add(self.f13)
|
236
|
+
self.f14 = state.Register("f14", size=8)
|
237
|
+
self.add(self.f14)
|
238
|
+
self.f15 = state.Register("f15", size=8)
|
239
|
+
self.add(self.f15)
|
240
|
+
self.f16 = state.Register("f16", size=8)
|
241
|
+
self.add(self.f16)
|
242
|
+
self.f17 = state.Register("f17", size=8)
|
243
|
+
self.add(self.f17)
|
244
|
+
self.f18 = state.Register("f18", size=8)
|
245
|
+
self.add(self.f18)
|
246
|
+
self.f19 = state.Register("f19", size=8)
|
247
|
+
self.add(self.f19)
|
248
|
+
self.f20 = state.Register("f20", size=8)
|
249
|
+
self.add(self.f20)
|
250
|
+
self.f21 = state.Register("f21", size=8)
|
251
|
+
self.add(self.f21)
|
252
|
+
self.f22 = state.Register("f22", size=8)
|
253
|
+
self.add(self.f22)
|
254
|
+
self.f23 = state.Register("f23", size=8)
|
255
|
+
self.add(self.f23)
|
256
|
+
self.f24 = state.Register("f24", size=8)
|
257
|
+
self.add(self.f24)
|
258
|
+
self.f25 = state.Register("f25", size=8)
|
259
|
+
self.add(self.f25)
|
260
|
+
self.f26 = state.Register("f26", size=8)
|
261
|
+
self.add(self.f26)
|
262
|
+
self.f27 = state.Register("f27", size=8)
|
263
|
+
self.add(self.f27)
|
264
|
+
self.f28 = state.Register("f28", size=8)
|
265
|
+
self.add(self.f28)
|
266
|
+
self.f29 = state.Register("f29", size=8)
|
267
|
+
self.add(self.f29)
|
268
|
+
self.f30 = state.Register("f30", size=8)
|
269
|
+
self.add(self.f30)
|
270
|
+
self.f31 = state.Register("f31", size=8)
|
271
|
+
self.add(self.f31)
|
272
|
+
# *** Floating Point Control Registers ***
|
273
|
+
# NOTE: These are taken from Sleigh, and the MIPS docs.
|
274
|
+
# Unicorn doesn't use these names, and has a different number of registers.
|
275
|
+
self.fir = state.Register("fir", size=4)
|
276
|
+
self.add(self.fir)
|
277
|
+
self.fcsr = state.Register("fcsr", size=4)
|
278
|
+
self.add(self.fcsr)
|
279
|
+
self.fexr = state.Register("fexr", size=4)
|
280
|
+
self.add(self.fexr)
|
281
|
+
self.fenr = state.Register("fenr", size=4)
|
282
|
+
self.add(self.fenr)
|
283
|
+
self.fccr = state.Register("fccr", size=4)
|
284
|
+
self.add(self.fccr)
|
285
|
+
# TODO: MIPS has a boatload of extensions with their own registers.
|
286
|
+
# There isn't a clean join between Sleigh, Unicorn, and MIPS docs.
|
287
|
+
|
288
|
+
|
289
|
+
class MIPSEL(MIPS):
|
290
|
+
"""Auto-generated CPU state for mips:mips32:little.
|
291
|
+
|
292
|
+
Generated from Pcode language MIPS:LE:32:default, and Unicorn package
|
293
|
+
unicorn.mips_const.
|
294
|
+
"""
|
295
|
+
|
296
|
+
platform = platforms.Platform(
|
297
|
+
platforms.Architecture.MIPS32, platforms.Byteorder.LITTLE
|
298
|
+
)
|
299
|
+
|
300
|
+
def __init__(self):
|
301
|
+
super().__init__()
|
302
|
+
# *** Accumulator Registers ***
|
303
|
+
# MIPS uses these to implement 64-bit results
|
304
|
+
# from 32-bit multiplication, amongst others.
|
305
|
+
self.ac0 = state.Register("ac0", size=8)
|
306
|
+
self.add(self.ac0)
|
307
|
+
self.lo = state.RegisterAlias("lo0", self.ac0, size=4, offset=0)
|
308
|
+
self.add(self.lo)
|
309
|
+
self.hi = state.RegisterAlias("hi0", self.ac0, size=4, offset=4)
|
310
|
+
self.add(self.hi)
|
311
|
+
self.ac1 = state.Register("ac1", size=8)
|
312
|
+
self.add(self.ac1)
|
313
|
+
self.lo1 = state.RegisterAlias("lo1", self.ac1, size=4, offset=0)
|
314
|
+
self.add(self.lo1)
|
315
|
+
self.hi1 = state.RegisterAlias("hi1", self.ac1, size=4, offset=4)
|
316
|
+
self.add(self.hi1)
|
317
|
+
self.ac2 = state.Register("ac2", size=8)
|
318
|
+
self.add(self.ac2)
|
319
|
+
self.lo2 = state.RegisterAlias("lo2", self.ac2, size=4, offset=0)
|
320
|
+
self.add(self.lo2)
|
321
|
+
self.hi2 = state.RegisterAlias("hi2", self.ac2, size=4, offset=4)
|
322
|
+
self.add(self.hi2)
|
323
|
+
self.ac3 = state.Register("ac3", size=8)
|
324
|
+
self.add(self.ac3)
|
325
|
+
self.lo3 = state.RegisterAlias("lo3", self.ac3, size=4, offset=0)
|
326
|
+
self.add(self.lo3)
|
327
|
+
self.hi3 = state.RegisterAlias("hi3", self.ac3, size=4, offset=4)
|
328
|
+
self.add(self.hi3)
|
329
|
+
|
330
|
+
|
331
|
+
class MIPSBE(MIPS):
|
332
|
+
"""Auto-generated CPU state for mips:mips32:big.
|
333
|
+
|
334
|
+
Generated from Pcode language MIPS:BE:32:default, and Unicorn package
|
335
|
+
unicorn.mips_const.
|
336
|
+
"""
|
337
|
+
|
338
|
+
platform = platforms.Platform(
|
339
|
+
platforms.Architecture.MIPS32, platforms.Byteorder.BIG
|
340
|
+
)
|
341
|
+
|
342
|
+
def __init__(self):
|
343
|
+
super().__init__()
|
344
|
+
# *** Accumulator Registers ***
|
345
|
+
# MIPS uses these to implement 64-bit results
|
346
|
+
# from 32-bit multiplication, amongst others.
|
347
|
+
self.ac0 = state.Register("ac0", size=8)
|
348
|
+
self.add(self.ac0)
|
349
|
+
# NOTE: Be careful: there is also a 'hi' and 'lo' register;
|
350
|
+
# they do different things.
|
351
|
+
self.hi0 = state.RegisterAlias("hi0", self.ac0, size=4, offset=0)
|
352
|
+
self.add(self.hi0)
|
353
|
+
self.lo0 = state.RegisterAlias("lo0", self.ac0, size=4, offset=4)
|
354
|
+
self.add(self.lo0)
|
355
|
+
self.ac1 = state.Register("ac1", size=8)
|
356
|
+
self.add(self.ac1)
|
357
|
+
self.hi1 = state.RegisterAlias("hi1", self.ac1, size=4, offset=0)
|
358
|
+
self.add(self.hi1)
|
359
|
+
self.lo1 = state.RegisterAlias("lo1", self.ac1, size=4, offset=4)
|
360
|
+
self.add(self.lo1)
|
361
|
+
self.ac2 = state.Register("ac2", size=8)
|
362
|
+
self.add(self.ac2)
|
363
|
+
self.hi2 = state.RegisterAlias("hi2", self.ac2, size=4, offset=0)
|
364
|
+
self.add(self.hi2)
|
365
|
+
self.lo2 = state.RegisterAlias("lo2", self.ac2, size=4, offset=4)
|
366
|
+
self.add(self.lo2)
|
367
|
+
self.ac3 = state.Register("ac3", size=8)
|
368
|
+
self.add(self.ac3)
|
369
|
+
self.hi3 = state.RegisterAlias("hi3", self.ac3, size=4, offset=0)
|
370
|
+
self.add(self.hi3)
|
371
|
+
self.lo3 = state.RegisterAlias("lo3", self.ac3, size=4, offset=4)
|
372
|
+
self.add(self.lo3)
|
373
|
+
# TODO: MIPS has a boatload of extensions with their own registers.
|
374
|
+
# There isn't a clean join between Sleigh, Unicorn, and MIPS docs.
|