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,372 @@
|
|
1
|
+
import typing
|
2
|
+
|
3
|
+
from ... import platforms
|
4
|
+
from .. import state
|
5
|
+
from . import cpu
|
6
|
+
|
7
|
+
|
8
|
+
class MIPS64(cpu.CPU):
|
9
|
+
"""Abstract CPU state object for all MIPS64 targets"""
|
10
|
+
|
11
|
+
# Excluded registers:
|
12
|
+
# - zero: Hard-wired to zero
|
13
|
+
# - at: Reserved for assembler
|
14
|
+
# - kX: Reserved for kernel; used as general in some ABIs
|
15
|
+
# - fX: Floating-point registers
|
16
|
+
# - acX: Accumulator registers
|
17
|
+
_GENERAL_PURPOSE_REGS = [
|
18
|
+
"v0",
|
19
|
+
"v1",
|
20
|
+
"a0",
|
21
|
+
"a1",
|
22
|
+
"a2",
|
23
|
+
"a3",
|
24
|
+
"a4",
|
25
|
+
"a5",
|
26
|
+
"a6",
|
27
|
+
"a7",
|
28
|
+
"t0",
|
29
|
+
"t1",
|
30
|
+
"t2",
|
31
|
+
"t3",
|
32
|
+
"t4",
|
33
|
+
"t8",
|
34
|
+
"t9",
|
35
|
+
"s0",
|
36
|
+
"s1",
|
37
|
+
"s2",
|
38
|
+
"s3",
|
39
|
+
"s4",
|
40
|
+
"s5",
|
41
|
+
"s6",
|
42
|
+
"s7",
|
43
|
+
"s8",
|
44
|
+
]
|
45
|
+
|
46
|
+
def get_general_purpose_registers(self) -> typing.List[str]:
|
47
|
+
return self._GENERAL_PURPOSE_REGS
|
48
|
+
|
49
|
+
def __init__(self):
|
50
|
+
super().__init__()
|
51
|
+
# NOTE: MIPS registers have both a name and a number.
|
52
|
+
# NOTE: This follows the n64 ABI.
|
53
|
+
# According to n64, there are only six temporary registers;
|
54
|
+
# t0 - t3, t8 and t9.
|
55
|
+
|
56
|
+
# *** General-Purpose Registers ***
|
57
|
+
# Assembler-Temporary Register
|
58
|
+
self.at = state.Register("at", size=8)
|
59
|
+
self.add(self.at)
|
60
|
+
self._1 = state.RegisterAlias("1", self.at, size=8, offset=0)
|
61
|
+
self.add(self._1)
|
62
|
+
# Return Value Registers
|
63
|
+
self.v0 = state.Register("v0", size=8)
|
64
|
+
self.add(self.v0)
|
65
|
+
self._2 = state.RegisterAlias("2", self.v0, size=8, offset=0)
|
66
|
+
self.add(self._2)
|
67
|
+
self.v1 = state.Register("v1", size=8)
|
68
|
+
self.add(self.v1)
|
69
|
+
self._3 = state.RegisterAlias("3", self.v1, size=8, offset=0)
|
70
|
+
self.add(self._3)
|
71
|
+
# Argument Registers
|
72
|
+
self.a0 = state.Register("a0", size=8)
|
73
|
+
self.add(self.a0)
|
74
|
+
self._4 = state.RegisterAlias("4", self.a0, size=8, offset=0)
|
75
|
+
self.add(self._4)
|
76
|
+
self.a1 = state.Register("a1", size=8)
|
77
|
+
self.add(self.a1)
|
78
|
+
self._5 = state.RegisterAlias("5", self.a1, size=8, offset=0)
|
79
|
+
self.add(self._5)
|
80
|
+
self.a2 = state.Register("a2", size=8)
|
81
|
+
self.add(self.a2)
|
82
|
+
self._6 = state.RegisterAlias("6", self.a2, size=8, offset=0)
|
83
|
+
self.add(self._6)
|
84
|
+
self.a3 = state.Register("a3", size=8)
|
85
|
+
self.add(self.a3)
|
86
|
+
self._7 = state.RegisterAlias("7", self.a3, size=8, offset=0)
|
87
|
+
self.add(self._7)
|
88
|
+
self.a4 = state.Register("a4", size=8)
|
89
|
+
self.add(self.a4)
|
90
|
+
self._8 = state.RegisterAlias("8", self.a4, size=8, offset=0)
|
91
|
+
self.add(self._8)
|
92
|
+
self.a5 = state.Register("a5", size=8)
|
93
|
+
self.add(self.a5)
|
94
|
+
self._9 = state.RegisterAlias("9", self.a5, size=8, offset=0)
|
95
|
+
self.add(self._9)
|
96
|
+
self.a6 = state.Register("a6", size=8)
|
97
|
+
self.add(self.a6)
|
98
|
+
self._10 = state.RegisterAlias("10", self.a6, size=8, offset=0)
|
99
|
+
self.add(self._10)
|
100
|
+
self.a7 = state.Register("a7", size=8)
|
101
|
+
self.add(self.a7)
|
102
|
+
self._11 = state.RegisterAlias("11", self.a7, size=8, offset=0)
|
103
|
+
self.add(self._11)
|
104
|
+
# Temporary Registers
|
105
|
+
self.t0 = state.Register("t0", size=8)
|
106
|
+
self.add(self.t0)
|
107
|
+
self._12 = state.RegisterAlias("12", self.t0, size=8, offset=0)
|
108
|
+
self.add(self._12)
|
109
|
+
self.t1 = state.Register("t1", size=8)
|
110
|
+
self.add(self.t1)
|
111
|
+
self._13 = state.RegisterAlias("13", self.t1, size=8, offset=0)
|
112
|
+
self.add(self._13)
|
113
|
+
self.t2 = state.Register("t2", size=8)
|
114
|
+
self.add(self.t2)
|
115
|
+
self._14 = state.RegisterAlias("14", self.t2, size=8, offset=0)
|
116
|
+
self.add(self._14)
|
117
|
+
self.t3 = state.Register("t3", size=8)
|
118
|
+
self.add(self.t3)
|
119
|
+
self._15 = state.RegisterAlias("15", self.t3, size=8, 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 - t3.
|
123
|
+
# The gap is also intentional; t4 - t7 were sacrificed
|
124
|
+
# to make room for a4 - a7
|
125
|
+
self.t8 = state.Register("t8", size=8)
|
126
|
+
self.add(self.t8)
|
127
|
+
self._24 = state.RegisterAlias("24", self.t8, size=8, offset=0)
|
128
|
+
self.add(self._24)
|
129
|
+
self.t9 = state.Register("t9", size=8)
|
130
|
+
self.add(self.t9)
|
131
|
+
self._25 = state.RegisterAlias("25", self.t9, size=8, offset=0)
|
132
|
+
self.add(self._25)
|
133
|
+
# Saved Registers
|
134
|
+
self.s0 = state.Register("s0", size=8)
|
135
|
+
self.add(self.s0)
|
136
|
+
self._16 = state.RegisterAlias("16", self.s0, size=8, offset=0)
|
137
|
+
self.add(self._16)
|
138
|
+
self.s1 = state.Register("s1", size=8)
|
139
|
+
self.add(self.s1)
|
140
|
+
self._17 = state.RegisterAlias("17", self.s1, size=8, offset=0)
|
141
|
+
self.add(self._17)
|
142
|
+
self.s2 = state.Register("s2", size=8)
|
143
|
+
self.add(self.s2)
|
144
|
+
self._18 = state.RegisterAlias("18", self.s2, size=8, offset=0)
|
145
|
+
self.add(self._18)
|
146
|
+
self.s3 = state.Register("s3", size=8)
|
147
|
+
self.add(self.s3)
|
148
|
+
self._19 = state.RegisterAlias("19", self.s3, size=8, offset=0)
|
149
|
+
self.add(self._19)
|
150
|
+
self.s4 = state.Register("s4", size=8)
|
151
|
+
self.add(self.s4)
|
152
|
+
self._20 = state.RegisterAlias("20", self.s4, size=8, offset=0)
|
153
|
+
self.add(self._20)
|
154
|
+
self.s5 = state.Register("s5", size=8)
|
155
|
+
self.add(self.s5)
|
156
|
+
self._21 = state.RegisterAlias("21", self.s5, size=8, offset=0)
|
157
|
+
self.add(self._21)
|
158
|
+
self.s6 = state.Register("s6", size=8)
|
159
|
+
self.add(self.s6)
|
160
|
+
self._22 = state.RegisterAlias("22", self.s6, size=8, offset=0)
|
161
|
+
self.add(self._22)
|
162
|
+
self.s7 = state.Register("s7", size=8)
|
163
|
+
self.add(self.s7)
|
164
|
+
self._23 = state.RegisterAlias("23", self.s7, size=8, offset=0)
|
165
|
+
self.add(self._23)
|
166
|
+
# NOTE: Register #30 was originally the Frame Pointer.
|
167
|
+
# It's been re-aliased as s8, since many ABIs don't use the frame pointer.
|
168
|
+
# Unicorn and Sleigh prefer to use the alias s8,
|
169
|
+
# so it should be the base register.
|
170
|
+
self.s8 = state.Register("s8", size=8)
|
171
|
+
self.add(self.s8)
|
172
|
+
self.fp = state.RegisterAlias("fp", self.s8, size=8, offset=0)
|
173
|
+
self.add(self.fp)
|
174
|
+
self._30 = state.RegisterAlias("30", self.s8, size=8, offset=0)
|
175
|
+
self.add(self._30)
|
176
|
+
# Kernel-reserved Registers
|
177
|
+
self.k0 = state.Register("k0", size=8)
|
178
|
+
self.add(self.k0)
|
179
|
+
self._26 = state.RegisterAlias("26", self.k0, size=8, offset=0)
|
180
|
+
self.add(self._26)
|
181
|
+
self.k1 = state.Register("k1", size=8)
|
182
|
+
self.add(self.k1)
|
183
|
+
self._27 = state.RegisterAlias("27", self.k1, size=8, offset=0)
|
184
|
+
self.add(self._27)
|
185
|
+
# *** Pointer Registers ***
|
186
|
+
# Zero register
|
187
|
+
self.zero = state.FixedRegister("zero", size=8, value=0)
|
188
|
+
self.add(self.zero)
|
189
|
+
self._0 = state.RegisterAlias("0", self.zero, size=8, offset=0)
|
190
|
+
self.add(self._0)
|
191
|
+
# Global Offset Pointer
|
192
|
+
self.gp = state.Register("gp", size=8)
|
193
|
+
self.add(self.gp)
|
194
|
+
self._28 = state.RegisterAlias("28", self.gp, size=8, offset=0)
|
195
|
+
self.add(self._28)
|
196
|
+
# Stack Pointer
|
197
|
+
self.sp = state.Register("sp", size=8)
|
198
|
+
self.add(self.sp)
|
199
|
+
self._29 = state.RegisterAlias("29", self.sp, size=8, offset=0)
|
200
|
+
self.add(self._29)
|
201
|
+
# Return Address
|
202
|
+
self.ra = state.Register("ra", size=8)
|
203
|
+
self.add(self.ra)
|
204
|
+
self._31 = state.RegisterAlias("31", self.ra, size=8, offset=0)
|
205
|
+
self.add(self._31)
|
206
|
+
# Program Counter
|
207
|
+
self.pc = state.Register("pc", size=8)
|
208
|
+
self.add(self.pc)
|
209
|
+
# *** Floating Point Registers ***
|
210
|
+
self.f1 = state.Register("f1", size=8)
|
211
|
+
self.add(self.f1)
|
212
|
+
self.f0 = state.Register("f0", size=8)
|
213
|
+
self.add(self.f0)
|
214
|
+
self.f3 = state.Register("f3", size=8)
|
215
|
+
self.add(self.f3)
|
216
|
+
self.f2 = state.Register("f2", size=8)
|
217
|
+
self.add(self.f2)
|
218
|
+
self.f5 = state.Register("f5", size=8)
|
219
|
+
self.add(self.f5)
|
220
|
+
self.f4 = state.Register("f4", size=8)
|
221
|
+
self.add(self.f4)
|
222
|
+
self.f7 = state.Register("f7", size=8)
|
223
|
+
self.add(self.f7)
|
224
|
+
self.f6 = state.Register("f6", size=8)
|
225
|
+
self.add(self.f6)
|
226
|
+
self.f9 = state.Register("f9", size=8)
|
227
|
+
self.add(self.f9)
|
228
|
+
self.f8 = state.Register("f8", size=8)
|
229
|
+
self.add(self.f8)
|
230
|
+
self.f11 = state.Register("f11", size=8)
|
231
|
+
self.add(self.f11)
|
232
|
+
self.f10 = state.Register("f10", size=8)
|
233
|
+
self.add(self.f10)
|
234
|
+
self.f13 = state.Register("f13", size=8)
|
235
|
+
self.add(self.f13)
|
236
|
+
self.f12 = state.Register("f12", size=8)
|
237
|
+
self.add(self.f12)
|
238
|
+
self.f15 = state.Register("f15", size=8)
|
239
|
+
self.add(self.f15)
|
240
|
+
self.f14 = state.Register("f14", size=8)
|
241
|
+
self.add(self.f14)
|
242
|
+
self.f17 = state.Register("f17", size=8)
|
243
|
+
self.add(self.f17)
|
244
|
+
self.f16 = state.Register("f16", size=8)
|
245
|
+
self.add(self.f16)
|
246
|
+
self.f19 = state.Register("f19", size=8)
|
247
|
+
self.add(self.f19)
|
248
|
+
self.f18 = state.Register("f18", size=8)
|
249
|
+
self.add(self.f18)
|
250
|
+
self.f21 = state.Register("f21", size=8)
|
251
|
+
self.add(self.f21)
|
252
|
+
self.f20 = state.Register("f20", size=8)
|
253
|
+
self.add(self.f20)
|
254
|
+
self.f23 = state.Register("f23", size=8)
|
255
|
+
self.add(self.f23)
|
256
|
+
self.f22 = state.Register("f22", size=8)
|
257
|
+
self.add(self.f22)
|
258
|
+
self.f25 = state.Register("f25", size=8)
|
259
|
+
self.add(self.f25)
|
260
|
+
self.f24 = state.Register("f24", size=8)
|
261
|
+
self.add(self.f24)
|
262
|
+
self.f27 = state.Register("f27", size=8)
|
263
|
+
self.add(self.f27)
|
264
|
+
self.f26 = state.Register("f26", size=8)
|
265
|
+
self.add(self.f26)
|
266
|
+
self.f29 = state.Register("f29", size=8)
|
267
|
+
self.add(self.f29)
|
268
|
+
self.f28 = state.Register("f28", size=8)
|
269
|
+
self.add(self.f28)
|
270
|
+
self.f31 = state.Register("f31", size=8)
|
271
|
+
self.add(self.f31)
|
272
|
+
self.f30 = state.Register("f30", size=8)
|
273
|
+
self.add(self.f30)
|
274
|
+
# *** Floating Point Control Registers ***
|
275
|
+
# NOTE: These are taken from Sleigh, and the MIPS docs.
|
276
|
+
# Unicorn doesn't use these names, and has a different number of registers.
|
277
|
+
self.fir = state.Register("fir", size=4)
|
278
|
+
self.add(self.fir)
|
279
|
+
self.fcsr = state.Register("fcsr", size=4)
|
280
|
+
self.add(self.fcsr)
|
281
|
+
self.fexr = state.Register("fexr", size=4)
|
282
|
+
self.add(self.fexr)
|
283
|
+
self.fenr = state.Register("fenr", size=4)
|
284
|
+
self.add(self.fenr)
|
285
|
+
self.fccr = state.Register("fccr", size=4)
|
286
|
+
self.add(self.fccr)
|
287
|
+
|
288
|
+
|
289
|
+
class MIPS64EL(MIPS64):
|
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.MIPS64, platforms.Byteorder.LITTLE
|
298
|
+
)
|
299
|
+
|
300
|
+
def __init__(self):
|
301
|
+
super().__init__()
|
302
|
+
# *** Accumulator Registers ***
|
303
|
+
# MIPS uses these to implement 128-bit results
|
304
|
+
# from 64-bit multiplication, amongst others.
|
305
|
+
self.ac0 = state.Register("ac0", size=16)
|
306
|
+
self.add(self.ac0)
|
307
|
+
self.lo = state.RegisterAlias("lo0", self.ac0, size=8, offset=0)
|
308
|
+
self.add(self.lo)
|
309
|
+
self.hi = state.RegisterAlias("hi0", self.ac0, size=8, offset=4)
|
310
|
+
self.add(self.hi)
|
311
|
+
self.ac1 = state.Register("ac1", size=16)
|
312
|
+
self.add(self.ac1)
|
313
|
+
self.lo1 = state.RegisterAlias("lo1", self.ac1, size=8, offset=0)
|
314
|
+
self.add(self.lo1)
|
315
|
+
self.hi1 = state.RegisterAlias("hi1", self.ac1, size=8, offset=4)
|
316
|
+
self.add(self.hi1)
|
317
|
+
self.ac2 = state.Register("ac2", size=16)
|
318
|
+
self.add(self.ac2)
|
319
|
+
self.lo2 = state.RegisterAlias("lo2", self.ac2, size=8, offset=0)
|
320
|
+
self.add(self.lo2)
|
321
|
+
self.hi2 = state.RegisterAlias("hi2", self.ac2, size=8, offset=4)
|
322
|
+
self.add(self.hi2)
|
323
|
+
self.ac3 = state.Register("ac3", size=16)
|
324
|
+
self.add(self.ac3)
|
325
|
+
self.lo3 = state.RegisterAlias("lo3", self.ac3, size=8, offset=0)
|
326
|
+
self.add(self.lo3)
|
327
|
+
self.hi3 = state.RegisterAlias("hi3", self.ac3, size=8, offset=4)
|
328
|
+
self.add(self.hi3)
|
329
|
+
# TODO: MIPS has a boatload of extensions with their own registers.
|
330
|
+
# There isn't a clean join between Sleigh, Unicorn, and MIPS docs.
|
331
|
+
|
332
|
+
|
333
|
+
class MIPS64BE(MIPS64):
|
334
|
+
"""Auto-generated CPU state for mips:mips32:big.
|
335
|
+
|
336
|
+
Generated from Pcode language MIPS:BE:32:default, and Unicorn package
|
337
|
+
unicorn.mips_const.
|
338
|
+
"""
|
339
|
+
|
340
|
+
platform = platforms.Platform(
|
341
|
+
platforms.Architecture.MIPS64, platforms.Byteorder.BIG
|
342
|
+
)
|
343
|
+
|
344
|
+
def __init__(self):
|
345
|
+
super().__init__()
|
346
|
+
# *** Accumulator Registers ***
|
347
|
+
# MIPS uses these to implement 64-bit results
|
348
|
+
# from 32-bit multiplication, amongst others.
|
349
|
+
self.ac0 = state.Register("ac0", size=8)
|
350
|
+
self.add(self.ac0)
|
351
|
+
self.hi = state.RegisterAlias("hi0", self.ac0, size=8, offset=0)
|
352
|
+
self.add(self.hi)
|
353
|
+
self.lo = state.RegisterAlias("lo0", self.ac0, size=8, offset=4)
|
354
|
+
self.add(self.lo)
|
355
|
+
self.ac1 = state.Register("ac1", size=8)
|
356
|
+
self.add(self.ac1)
|
357
|
+
self.hi1 = state.RegisterAlias("hi1", self.ac1, size=8, offset=0)
|
358
|
+
self.add(self.hi1)
|
359
|
+
self.lo1 = state.RegisterAlias("lo1", self.ac1, size=8, 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=8, offset=0)
|
364
|
+
self.add(self.hi2)
|
365
|
+
self.lo2 = state.RegisterAlias("lo2", self.ac2, size=8, 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=8, offset=0)
|
370
|
+
self.add(self.hi3)
|
371
|
+
self.lo3 = state.RegisterAlias("lo3", self.ac3, size=8, offset=4)
|
372
|
+
self.add(self.lo3)
|
@@ -0,0 +1,229 @@
|
|
1
|
+
import typing
|
2
|
+
|
3
|
+
from ... import platforms
|
4
|
+
from .. import state
|
5
|
+
from . import cpu
|
6
|
+
|
7
|
+
|
8
|
+
class PowerPC(cpu.CPU):
|
9
|
+
"""CPU state for 32-bit PowerPC."""
|
10
|
+
|
11
|
+
_GENERAL_PURPOSE_REGS = [f"r{i}" for i in range(0, 32)]
|
12
|
+
|
13
|
+
def get_general_purpose_registers(self) -> typing.List[str]:
|
14
|
+
return self._GENERAL_PURPOSE_REGS
|
15
|
+
|
16
|
+
def __init__(self, wordsize):
|
17
|
+
super().__init__()
|
18
|
+
# *** General Purpose Registers ***
|
19
|
+
# NOTE: Used expressive names for GPRs and FPRs.
|
20
|
+
# gasm just refers to GPRs and FPRS by number.
|
21
|
+
# They use the same numbers; it's very annoying.
|
22
|
+
self.r0 = state.Register("r0", size=wordsize)
|
23
|
+
self.add(self.r0)
|
24
|
+
# NOTE: GPR 1 is also the stack pointer.
|
25
|
+
self.r1 = state.Register("r1", size=wordsize)
|
26
|
+
self.add(self.r1)
|
27
|
+
self.sp = state.RegisterAlias("sp", self.r1, size=wordsize, offset=0)
|
28
|
+
self.add(self.sp)
|
29
|
+
self.r2 = state.Register("r2", size=wordsize)
|
30
|
+
self.add(self.r2)
|
31
|
+
self.r3 = state.Register("r3", size=wordsize)
|
32
|
+
self.add(self.r3)
|
33
|
+
self.r4 = state.Register("r4", size=wordsize)
|
34
|
+
self.add(self.r4)
|
35
|
+
self.r5 = state.Register("r5", size=wordsize)
|
36
|
+
self.add(self.r5)
|
37
|
+
self.r6 = state.Register("r6", size=wordsize)
|
38
|
+
self.add(self.r6)
|
39
|
+
self.r7 = state.Register("r7", size=wordsize)
|
40
|
+
self.add(self.r7)
|
41
|
+
self.r8 = state.Register("r8", size=wordsize)
|
42
|
+
self.add(self.r8)
|
43
|
+
self.r9 = state.Register("r9", size=wordsize)
|
44
|
+
self.add(self.r9)
|
45
|
+
self.r10 = state.Register("r10", size=wordsize)
|
46
|
+
self.add(self.r10)
|
47
|
+
self.r11 = state.Register("r11", size=wordsize)
|
48
|
+
self.add(self.r11)
|
49
|
+
self.r12 = state.Register("r12", size=wordsize)
|
50
|
+
self.add(self.r12)
|
51
|
+
self.r13 = state.Register("r13", size=wordsize)
|
52
|
+
self.add(self.r13)
|
53
|
+
self.r14 = state.Register("r14", size=wordsize)
|
54
|
+
self.add(self.r14)
|
55
|
+
self.r15 = state.Register("r15", size=wordsize)
|
56
|
+
self.add(self.r15)
|
57
|
+
self.r16 = state.Register("r16", size=wordsize)
|
58
|
+
self.add(self.r16)
|
59
|
+
self.r17 = state.Register("r17", size=wordsize)
|
60
|
+
self.add(self.r17)
|
61
|
+
self.r18 = state.Register("r18", size=wordsize)
|
62
|
+
self.add(self.r18)
|
63
|
+
self.r19 = state.Register("r19", size=wordsize)
|
64
|
+
self.add(self.r19)
|
65
|
+
self.r20 = state.Register("r20", size=wordsize)
|
66
|
+
self.add(self.r20)
|
67
|
+
self.r21 = state.Register("r21", size=wordsize)
|
68
|
+
self.add(self.r21)
|
69
|
+
self.r22 = state.Register("r22", size=wordsize)
|
70
|
+
self.add(self.r22)
|
71
|
+
self.r23 = state.Register("r23", size=wordsize)
|
72
|
+
self.add(self.r23)
|
73
|
+
self.r24 = state.Register("r24", size=wordsize)
|
74
|
+
self.add(self.r24)
|
75
|
+
self.r25 = state.Register("r25", size=wordsize)
|
76
|
+
self.add(self.r25)
|
77
|
+
self.r26 = state.Register("r26", size=wordsize)
|
78
|
+
self.add(self.r26)
|
79
|
+
self.r27 = state.Register("r27", size=wordsize)
|
80
|
+
self.add(self.r27)
|
81
|
+
self.r28 = state.Register("r28", size=wordsize)
|
82
|
+
self.add(self.r28)
|
83
|
+
self.r29 = state.Register("r29", size=wordsize)
|
84
|
+
self.add(self.r29)
|
85
|
+
self.r30 = state.Register("r30", size=wordsize)
|
86
|
+
self.add(self.r30)
|
87
|
+
# NOTE: GPR 31 is also the base pointer
|
88
|
+
self.r31 = state.Register("r31", size=wordsize)
|
89
|
+
self.add(self.r31)
|
90
|
+
self.bp = state.RegisterAlias("bp", self.r31, size=wordsize, offset=0)
|
91
|
+
self.add(self.bp)
|
92
|
+
|
93
|
+
# Floating Point Registers
|
94
|
+
# Always 8 bytes, regardless of wordsize.
|
95
|
+
self.f0 = state.Register("f0", size=8)
|
96
|
+
self.add(self.f0)
|
97
|
+
self.f1 = state.Register("f1", size=8)
|
98
|
+
self.add(self.f1)
|
99
|
+
self.f2 = state.Register("f2", size=8)
|
100
|
+
self.add(self.f2)
|
101
|
+
self.f3 = state.Register("f3", size=8)
|
102
|
+
self.add(self.f3)
|
103
|
+
self.f4 = state.Register("f4", size=8)
|
104
|
+
self.add(self.f4)
|
105
|
+
self.f5 = state.Register("f5", size=8)
|
106
|
+
self.add(self.f5)
|
107
|
+
self.f6 = state.Register("f6", size=8)
|
108
|
+
self.add(self.f6)
|
109
|
+
self.f7 = state.Register("f7", size=8)
|
110
|
+
self.add(self.f7)
|
111
|
+
self.f8 = state.Register("f8", size=8)
|
112
|
+
self.add(self.f8)
|
113
|
+
self.f9 = state.Register("f9", size=8)
|
114
|
+
self.add(self.f9)
|
115
|
+
self.f10 = state.Register("f10", size=8)
|
116
|
+
self.add(self.f10)
|
117
|
+
self.f11 = state.Register("f11", size=8)
|
118
|
+
self.add(self.f11)
|
119
|
+
self.f12 = state.Register("f12", size=8)
|
120
|
+
self.add(self.f12)
|
121
|
+
self.f13 = state.Register("f13", size=8)
|
122
|
+
self.add(self.f13)
|
123
|
+
self.f14 = state.Register("f14", size=8)
|
124
|
+
self.add(self.f14)
|
125
|
+
self.f15 = state.Register("f15", size=8)
|
126
|
+
self.add(self.f15)
|
127
|
+
self.f16 = state.Register("f16", size=8)
|
128
|
+
self.add(self.f16)
|
129
|
+
self.f17 = state.Register("f17", size=8)
|
130
|
+
self.add(self.f17)
|
131
|
+
self.f18 = state.Register("f18", size=8)
|
132
|
+
self.add(self.f18)
|
133
|
+
self.f19 = state.Register("f19", size=8)
|
134
|
+
self.add(self.f19)
|
135
|
+
self.f20 = state.Register("f20", size=8)
|
136
|
+
self.add(self.f20)
|
137
|
+
self.f21 = state.Register("f21", size=8)
|
138
|
+
self.add(self.f21)
|
139
|
+
self.f22 = state.Register("f22", size=8)
|
140
|
+
self.add(self.f22)
|
141
|
+
self.f23 = state.Register("f23", size=8)
|
142
|
+
self.add(self.f23)
|
143
|
+
self.f24 = state.Register("f24", size=8)
|
144
|
+
self.add(self.f24)
|
145
|
+
self.f25 = state.Register("f25", size=8)
|
146
|
+
self.add(self.f25)
|
147
|
+
self.f26 = state.Register("f26", size=8)
|
148
|
+
self.add(self.f26)
|
149
|
+
self.f27 = state.Register("f27", size=8)
|
150
|
+
self.add(self.f27)
|
151
|
+
self.f28 = state.Register("f28", size=8)
|
152
|
+
self.add(self.f28)
|
153
|
+
self.f29 = state.Register("f29", size=8)
|
154
|
+
self.add(self.f29)
|
155
|
+
self.f30 = state.Register("f30", size=8)
|
156
|
+
self.add(self.f30)
|
157
|
+
self.f31 = state.Register("f31", size=8)
|
158
|
+
self.add(self.f31)
|
159
|
+
|
160
|
+
# *** Pointer Registers ***
|
161
|
+
# Program Counter.
|
162
|
+
# Not really a register; nothing can access it directly
|
163
|
+
self.pc = state.Register("pc", size=wordsize)
|
164
|
+
self.add(self.pc)
|
165
|
+
|
166
|
+
# Link Register
|
167
|
+
self.lr = state.Register("lr", size=wordsize)
|
168
|
+
self.add(self.lr)
|
169
|
+
|
170
|
+
# Counter Register
|
171
|
+
# Acts either as a loop index, or a branch target register
|
172
|
+
# Only `ctr` and `lr` can act as branch targets.
|
173
|
+
self.ctr = state.Register("ctr", size=wordsize)
|
174
|
+
self.add(self.ctr)
|
175
|
+
|
176
|
+
# *** Condition Registers ***
|
177
|
+
# Condition Register
|
178
|
+
# The actual condition register `cr` is a single 32-bit register,
|
179
|
+
# but it's broken into eight 4-bit fields which are accessed separately.
|
180
|
+
self.cr0 = state.Register("cr0", size=1) # Integer condition bits
|
181
|
+
self.add(self.cr0)
|
182
|
+
self.cr1 = state.Register("cr1", size=1) # Floatibg point condition bits
|
183
|
+
self.add(self.cr1)
|
184
|
+
self.cr2 = state.Register("cr2", size=1)
|
185
|
+
self.add(self.cr2)
|
186
|
+
self.cr3 = state.Register("cr3", size=1)
|
187
|
+
self.add(self.cr3)
|
188
|
+
self.cr4 = state.Register("cr4", size=1)
|
189
|
+
self.add(self.cr4)
|
190
|
+
self.cr5 = state.Register("cr5", size=1)
|
191
|
+
self.add(self.cr5)
|
192
|
+
self.cr6 = state.Register("cr6", size=1)
|
193
|
+
self.add(self.cr6)
|
194
|
+
self.cr7 = state.Register("cr7", size=1)
|
195
|
+
self.add(self.cr7)
|
196
|
+
|
197
|
+
# Integer Exception Register
|
198
|
+
self.xer = state.Register("xer", size=4)
|
199
|
+
self.add(self.xer)
|
200
|
+
|
201
|
+
# Floating Point Status and Control Register
|
202
|
+
self.fpsrc = state.Register("fpscr", size=4)
|
203
|
+
self.add(self.fpsrc)
|
204
|
+
|
205
|
+
# TODO: This only focuses on the user-facing registrers.
|
206
|
+
# ppc has a huge number of privileged registers.
|
207
|
+
# Extend this as needed.
|
208
|
+
|
209
|
+
|
210
|
+
class PowerPC32(PowerPC):
|
211
|
+
"""CPU state for 32-bit PowerPC."""
|
212
|
+
|
213
|
+
platform = platforms.Platform(
|
214
|
+
platforms.Architecture.POWERPC32, platforms.Byteorder.BIG
|
215
|
+
)
|
216
|
+
|
217
|
+
def __init__(self):
|
218
|
+
super().__init__(4)
|
219
|
+
|
220
|
+
|
221
|
+
class PowerPC64(PowerPC):
|
222
|
+
"""CPU state for 64-bit PowerPC."""
|
223
|
+
|
224
|
+
platform = platforms.Platform(
|
225
|
+
platforms.Architecture.POWERPC64, platforms.Byteorder.BIG
|
226
|
+
)
|
227
|
+
|
228
|
+
def __init__(self):
|
229
|
+
super().__init__(8)
|