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.
Files changed (166) hide show
  1. smallworld/__init__.py +35 -0
  2. smallworld/analyses/__init__.py +14 -0
  3. smallworld/analyses/analysis.py +88 -0
  4. smallworld/analyses/code_coverage.py +31 -0
  5. smallworld/analyses/colorizer.py +682 -0
  6. smallworld/analyses/colorizer_summary.py +100 -0
  7. smallworld/analyses/field_detection/__init__.py +14 -0
  8. smallworld/analyses/field_detection/field_analysis.py +536 -0
  9. smallworld/analyses/field_detection/guards.py +26 -0
  10. smallworld/analyses/field_detection/hints.py +133 -0
  11. smallworld/analyses/field_detection/malloc.py +211 -0
  12. smallworld/analyses/forced_exec/__init__.py +3 -0
  13. smallworld/analyses/forced_exec/forced_exec.py +87 -0
  14. smallworld/analyses/underlays/__init__.py +4 -0
  15. smallworld/analyses/underlays/basic.py +13 -0
  16. smallworld/analyses/underlays/underlay.py +31 -0
  17. smallworld/analyses/unstable/__init__.py +4 -0
  18. smallworld/analyses/unstable/angr/__init__.py +0 -0
  19. smallworld/analyses/unstable/angr/base.py +12 -0
  20. smallworld/analyses/unstable/angr/divergence.py +274 -0
  21. smallworld/analyses/unstable/angr/model.py +383 -0
  22. smallworld/analyses/unstable/angr/nwbt.py +63 -0
  23. smallworld/analyses/unstable/angr/typedefs.py +170 -0
  24. smallworld/analyses/unstable/angr/utils.py +25 -0
  25. smallworld/analyses/unstable/angr/visitor.py +315 -0
  26. smallworld/analyses/unstable/angr_nwbt.py +106 -0
  27. smallworld/analyses/unstable/code_coverage.py +54 -0
  28. smallworld/analyses/unstable/code_reachable.py +44 -0
  29. smallworld/analyses/unstable/control_flow_tracer.py +71 -0
  30. smallworld/analyses/unstable/pointer_finder.py +90 -0
  31. smallworld/arch/__init__.py +0 -0
  32. smallworld/arch/aarch64_arch.py +286 -0
  33. smallworld/arch/amd64_arch.py +86 -0
  34. smallworld/arch/i386_arch.py +44 -0
  35. smallworld/emulators/__init__.py +14 -0
  36. smallworld/emulators/angr/__init__.py +7 -0
  37. smallworld/emulators/angr/angr.py +1652 -0
  38. smallworld/emulators/angr/default.py +15 -0
  39. smallworld/emulators/angr/exceptions.py +7 -0
  40. smallworld/emulators/angr/exploration/__init__.py +9 -0
  41. smallworld/emulators/angr/exploration/bounds.py +27 -0
  42. smallworld/emulators/angr/exploration/default.py +17 -0
  43. smallworld/emulators/angr/exploration/terminate.py +22 -0
  44. smallworld/emulators/angr/factory.py +55 -0
  45. smallworld/emulators/angr/machdefs/__init__.py +35 -0
  46. smallworld/emulators/angr/machdefs/aarch64.py +292 -0
  47. smallworld/emulators/angr/machdefs/amd64.py +192 -0
  48. smallworld/emulators/angr/machdefs/arm.py +387 -0
  49. smallworld/emulators/angr/machdefs/i386.py +221 -0
  50. smallworld/emulators/angr/machdefs/machdef.py +138 -0
  51. smallworld/emulators/angr/machdefs/mips.py +184 -0
  52. smallworld/emulators/angr/machdefs/mips64.py +189 -0
  53. smallworld/emulators/angr/machdefs/ppc.py +101 -0
  54. smallworld/emulators/angr/machdefs/riscv.py +261 -0
  55. smallworld/emulators/angr/machdefs/xtensa.py +255 -0
  56. smallworld/emulators/angr/memory/__init__.py +7 -0
  57. smallworld/emulators/angr/memory/default.py +10 -0
  58. smallworld/emulators/angr/memory/fixups.py +43 -0
  59. smallworld/emulators/angr/memory/memtrack.py +105 -0
  60. smallworld/emulators/angr/scratch.py +43 -0
  61. smallworld/emulators/angr/simos.py +53 -0
  62. smallworld/emulators/angr/utils.py +70 -0
  63. smallworld/emulators/emulator.py +1013 -0
  64. smallworld/emulators/hookable.py +252 -0
  65. smallworld/emulators/panda/__init__.py +5 -0
  66. smallworld/emulators/panda/machdefs/__init__.py +28 -0
  67. smallworld/emulators/panda/machdefs/aarch64.py +93 -0
  68. smallworld/emulators/panda/machdefs/amd64.py +71 -0
  69. smallworld/emulators/panda/machdefs/arm.py +89 -0
  70. smallworld/emulators/panda/machdefs/i386.py +36 -0
  71. smallworld/emulators/panda/machdefs/machdef.py +86 -0
  72. smallworld/emulators/panda/machdefs/mips.py +94 -0
  73. smallworld/emulators/panda/machdefs/mips64.py +91 -0
  74. smallworld/emulators/panda/machdefs/ppc.py +79 -0
  75. smallworld/emulators/panda/panda.py +575 -0
  76. smallworld/emulators/unicorn/__init__.py +13 -0
  77. smallworld/emulators/unicorn/machdefs/__init__.py +28 -0
  78. smallworld/emulators/unicorn/machdefs/aarch64.py +310 -0
  79. smallworld/emulators/unicorn/machdefs/amd64.py +326 -0
  80. smallworld/emulators/unicorn/machdefs/arm.py +321 -0
  81. smallworld/emulators/unicorn/machdefs/i386.py +137 -0
  82. smallworld/emulators/unicorn/machdefs/machdef.py +117 -0
  83. smallworld/emulators/unicorn/machdefs/mips.py +202 -0
  84. smallworld/emulators/unicorn/unicorn.py +684 -0
  85. smallworld/exceptions/__init__.py +5 -0
  86. smallworld/exceptions/exceptions.py +85 -0
  87. smallworld/exceptions/unstable/__init__.py +1 -0
  88. smallworld/exceptions/unstable/exceptions.py +25 -0
  89. smallworld/extern/__init__.py +4 -0
  90. smallworld/extern/ctypes.py +94 -0
  91. smallworld/extern/unstable/__init__.py +1 -0
  92. smallworld/extern/unstable/ghidra.py +129 -0
  93. smallworld/helpers.py +107 -0
  94. smallworld/hinting/__init__.py +8 -0
  95. smallworld/hinting/hinting.py +214 -0
  96. smallworld/hinting/hints.py +427 -0
  97. smallworld/hinting/unstable/__init__.py +2 -0
  98. smallworld/hinting/utils.py +19 -0
  99. smallworld/instructions/__init__.py +18 -0
  100. smallworld/instructions/aarch64.py +20 -0
  101. smallworld/instructions/arm.py +18 -0
  102. smallworld/instructions/bsid.py +67 -0
  103. smallworld/instructions/instructions.py +258 -0
  104. smallworld/instructions/mips.py +21 -0
  105. smallworld/instructions/x86.py +100 -0
  106. smallworld/logging.py +90 -0
  107. smallworld/platforms.py +95 -0
  108. smallworld/py.typed +0 -0
  109. smallworld/state/__init__.py +6 -0
  110. smallworld/state/cpus/__init__.py +32 -0
  111. smallworld/state/cpus/aarch64.py +563 -0
  112. smallworld/state/cpus/amd64.py +676 -0
  113. smallworld/state/cpus/arm.py +630 -0
  114. smallworld/state/cpus/cpu.py +71 -0
  115. smallworld/state/cpus/i386.py +239 -0
  116. smallworld/state/cpus/mips.py +374 -0
  117. smallworld/state/cpus/mips64.py +372 -0
  118. smallworld/state/cpus/powerpc.py +229 -0
  119. smallworld/state/cpus/riscv.py +357 -0
  120. smallworld/state/cpus/xtensa.py +80 -0
  121. smallworld/state/memory/__init__.py +7 -0
  122. smallworld/state/memory/code.py +70 -0
  123. smallworld/state/memory/elf/__init__.py +3 -0
  124. smallworld/state/memory/elf/elf.py +564 -0
  125. smallworld/state/memory/elf/rela/__init__.py +32 -0
  126. smallworld/state/memory/elf/rela/aarch64.py +27 -0
  127. smallworld/state/memory/elf/rela/amd64.py +32 -0
  128. smallworld/state/memory/elf/rela/arm.py +51 -0
  129. smallworld/state/memory/elf/rela/i386.py +32 -0
  130. smallworld/state/memory/elf/rela/mips.py +45 -0
  131. smallworld/state/memory/elf/rela/ppc.py +45 -0
  132. smallworld/state/memory/elf/rela/rela.py +63 -0
  133. smallworld/state/memory/elf/rela/riscv64.py +27 -0
  134. smallworld/state/memory/elf/rela/xtensa.py +15 -0
  135. smallworld/state/memory/elf/structs.py +55 -0
  136. smallworld/state/memory/heap.py +85 -0
  137. smallworld/state/memory/memory.py +181 -0
  138. smallworld/state/memory/stack/__init__.py +31 -0
  139. smallworld/state/memory/stack/aarch64.py +22 -0
  140. smallworld/state/memory/stack/amd64.py +42 -0
  141. smallworld/state/memory/stack/arm.py +66 -0
  142. smallworld/state/memory/stack/i386.py +22 -0
  143. smallworld/state/memory/stack/mips.py +34 -0
  144. smallworld/state/memory/stack/mips64.py +34 -0
  145. smallworld/state/memory/stack/ppc.py +34 -0
  146. smallworld/state/memory/stack/riscv.py +22 -0
  147. smallworld/state/memory/stack/stack.py +127 -0
  148. smallworld/state/memory/stack/xtensa.py +34 -0
  149. smallworld/state/models/__init__.py +6 -0
  150. smallworld/state/models/mmio.py +186 -0
  151. smallworld/state/models/model.py +163 -0
  152. smallworld/state/models/posix.py +455 -0
  153. smallworld/state/models/x86/__init__.py +2 -0
  154. smallworld/state/models/x86/microsoftcdecl.py +35 -0
  155. smallworld/state/models/x86/systemv.py +240 -0
  156. smallworld/state/state.py +962 -0
  157. smallworld/state/unstable/__init__.py +0 -0
  158. smallworld/state/unstable/elf.py +393 -0
  159. smallworld/state/x86_registers.py +30 -0
  160. smallworld/utils.py +935 -0
  161. smallworld_re-1.0.0.dist-info/LICENSE.txt +21 -0
  162. smallworld_re-1.0.0.dist-info/METADATA +189 -0
  163. smallworld_re-1.0.0.dist-info/RECORD +166 -0
  164. smallworld_re-1.0.0.dist-info/WHEEL +5 -0
  165. smallworld_re-1.0.0.dist-info/entry_points.txt +2 -0
  166. 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)