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,357 @@
1
+ import typing
2
+
3
+ from ... import platforms, state
4
+ from . import cpu
5
+
6
+
7
+ class RISCV64(cpu.CPU):
8
+ """CPU state for riscv64"""
9
+
10
+ platform = platforms.Platform(
11
+ platforms.Architecture.RISCV64, platforms.Byteorder.LITTLE
12
+ )
13
+
14
+ def get_general_purpose_registers(self) -> typing.List[str]:
15
+ # - x0 is wired to zero
16
+ # - x1 is the link register
17
+ # - x2 is the stack pointer
18
+ # - x3 is the global pointer
19
+ # - x4 is the thread pointer
20
+ return [f"x{i}" for i in range(5, 32)]
21
+
22
+ def __init__(self):
23
+ super().__init__()
24
+ # *** General-Purpose Registers ***
25
+ # x0 is wired to 0, and aliased as "zero"
26
+ self.x0 = state.FixedRegister("x0", 8, 0)
27
+ self.add(self.x0)
28
+ self.zero = state.RegisterAlias("zero", self.x0, 8, 0)
29
+ self.add(self.zero)
30
+ # x1 acts as the link register
31
+ # NOTE: ra is the official name; lr might be an angr invention.
32
+ self.x1 = state.Register("x1", 8)
33
+ self.add(self.x1)
34
+ self.ra = state.RegisterAlias("ra", self.x1, 8, 0)
35
+ self.add(self.ra)
36
+ # x2 acts as the stack pointer
37
+ self.x2 = state.Register("x2", 8)
38
+ self.add(self.x2)
39
+ self.sp = state.RegisterAlias("sp", self.x2, 8, 0)
40
+ self.add(self.sp)
41
+ # x3 acts as the global pointer
42
+ self.x3 = state.Register("x3", 8)
43
+ self.add(self.x3)
44
+ self.gp = state.RegisterAlias("gp", self.x3, 8, 0)
45
+ self.add(self.gp)
46
+ # x4 acts as the thread pointer
47
+ self.x4 = state.Register("x4", 8)
48
+ self.add(self.x4)
49
+ self.tp = state.RegisterAlias("tp", self.x4, 8, 0)
50
+ self.add(self.tp)
51
+ # x5 is a temporary register
52
+ self.x5 = state.Register("x5", 8)
53
+ self.add(self.x5)
54
+ self.t0 = state.RegisterAlias("t0", self.x5, 8, 0)
55
+ self.add(self.t0)
56
+ # x6 is a temporary register
57
+ self.x6 = state.Register("x6", 8)
58
+ self.add(self.x6)
59
+ self.t1 = state.RegisterAlias("t1", self.x6, 8, 0)
60
+ self.add(self.t1)
61
+ # x7 is a temporary register
62
+ self.x7 = state.Register("x7", 8)
63
+ self.add(self.x7)
64
+ self.t2 = state.RegisterAlias("t2", self.x7, 8, 0)
65
+ self.add(self.t2)
66
+ # x8 is a callee-saved register
67
+ self.x8 = state.Register("x8", 8)
68
+ self.add(self.x8)
69
+ self.s0 = state.RegisterAlias("s0", self.x8, 8, 0)
70
+ self.add(self.x8)
71
+ # x9 is a callee-saved register
72
+ self.x9 = state.Register("x9", 8)
73
+ self.add(self.x9)
74
+ self.s1 = state.RegisterAlias("s1", self.x9, 8, 0)
75
+ self.add(self.s1)
76
+ # x10 is argument 0
77
+ self.x10 = state.Register("x10", 8)
78
+ self.add(self.x10)
79
+ self.a0 = state.RegisterAlias("a0", self.x10, 8, 0)
80
+ self.add(self.a0)
81
+ # x11 is argument 1
82
+ self.x11 = state.Register("x11", 8)
83
+ self.add(self.x11)
84
+ self.a1 = state.RegisterAlias("a1", self.x11, 8, 0)
85
+ self.add(self.a1)
86
+ # x12 is argument 2
87
+ self.x12 = state.Register("x12", 8)
88
+ self.add(self.x12)
89
+ self.a2 = state.RegisterAlias("a2", self.x12, 8, 0)
90
+ self.add(self.a2)
91
+ # x13 is argument 3
92
+ self.x13 = state.Register("x13", 8)
93
+ self.add(self.x13)
94
+ self.a3 = state.RegisterAlias("a3", self.x13, 8, 0)
95
+ self.add(self.a3)
96
+ # x14 is argument 4
97
+ self.x14 = state.Register("x14", 8)
98
+ self.add(self.x14)
99
+ self.a4 = state.RegisterAlias("a4", self.x14, 8, 0)
100
+ self.add(self.a4)
101
+ # x15 is argument 5
102
+ self.x15 = state.Register("x15", 8)
103
+ self.add(self.x15)
104
+ self.a5 = state.RegisterAlias("a5", self.x15, 8, 0)
105
+ self.add(self.a5)
106
+ # x16 is argument 6
107
+ self.x16 = state.Register("x16", 8)
108
+ self.add(self.x16)
109
+ self.a6 = state.RegisterAlias("a6", self.x16, 8, 0)
110
+ self.add(self.a6)
111
+ # x17 is argument 7
112
+ self.x17 = state.Register("x17", 8)
113
+ self.add(self.x17)
114
+ self.a7 = state.RegisterAlias("a7", self.x17, 8, 0)
115
+ self.add(self.a7)
116
+ # x18 is a callee-saved register
117
+ self.x18 = state.Register("x18", 8)
118
+ self.add(self.x18)
119
+ self.s2 = state.RegisterAlias("s2", self.x18, 8, 0)
120
+ self.add(self.s2)
121
+ # x19 is a callee-saved register
122
+ self.x19 = state.Register("x19", 8)
123
+ self.add(self.x19)
124
+ self.s3 = state.RegisterAlias("s3", self.x19, 8, 0)
125
+ self.add(self.s3)
126
+ # x20 is a callee-saved register
127
+ self.x20 = state.Register("x20", 8)
128
+ self.add(self.x20)
129
+ self.s4 = state.RegisterAlias("s4", self.x20, 8, 0)
130
+ self.add(self.s4)
131
+ # x21 is a callee-saved register
132
+ self.x21 = state.Register("x21", 8)
133
+ self.add(self.x21)
134
+ self.s5 = state.RegisterAlias("s5", self.x21, 8, 0)
135
+ self.add(self.s5)
136
+ # x22 is a callee-saved register
137
+ self.x22 = state.Register("x22", 8)
138
+ self.add(self.x22)
139
+ self.s6 = state.RegisterAlias("s6", self.x22, 8, 0)
140
+ self.add(self.s6)
141
+ # x23 is a callee-saved register
142
+ self.x23 = state.Register("x23", 8)
143
+ self.add(self.x23)
144
+ self.s7 = state.RegisterAlias("s7", self.x23, 8, 0)
145
+ self.add(self.s7)
146
+ # x24 is a callee-saved register
147
+ self.x24 = state.Register("x24", 8)
148
+ self.add(self.x24)
149
+ self.s8 = state.RegisterAlias("s8", self.x24, 8, 0)
150
+ self.add(self.s8)
151
+ # x25 is a callee-saved register
152
+ self.x25 = state.Register("x25", 8)
153
+ self.add(self.x25)
154
+ self.s9 = state.RegisterAlias("s9", self.x25, 8, 0)
155
+ self.add(self.s9)
156
+ # x26 is a callee-saved register
157
+ self.x26 = state.Register("x26", 8)
158
+ self.add(self.x26)
159
+ self.s10 = state.RegisterAlias("s10", self.x26, 8, 0)
160
+ self.add(self.s10)
161
+ # x27 is a callee-saved register
162
+ self.x27 = state.Register("x27", 8)
163
+ self.add(self.x27)
164
+ self.s11 = state.RegisterAlias("s11", self.x27, 8, 0)
165
+ self.add(self.s11)
166
+ # x28 is a temporary register
167
+ self.x28 = state.Register("x28", 8)
168
+ self.add(self.x28)
169
+ self.t3 = state.RegisterAlias("t3", self.x28, 8, 0)
170
+ self.add(self.t3)
171
+ # x29 is a temporary register
172
+ self.x29 = state.Register("x29", 8)
173
+ self.add(self.x29)
174
+ self.t4 = state.RegisterAlias("t4", self.x29, 8, 0)
175
+ self.add(self.t4)
176
+ # x30 is a temporary register
177
+ self.x30 = state.Register("x30", 8)
178
+ self.add(self.x30)
179
+ self.t5 = state.RegisterAlias("t5", self.x30, 8, 0)
180
+ self.add(self.t5)
181
+ # x31 is a temporary register
182
+ self.x31 = state.Register("x31", 8)
183
+ self.add(self.x31)
184
+ self.t6 = state.RegisterAlias("t6", self.x31, 8, 0)
185
+ self.add(self.t6)
186
+
187
+ # *** Program Counter ***
188
+ self.pc = state.Register("pc", 8)
189
+ self.add(self.pc)
190
+
191
+ # *** Floating-Point Registers ***
192
+ # f0 is a temporary register
193
+ self.f0 = state.Register("f0", 8)
194
+ self.add(self.f0)
195
+ self.ft0 = state.RegisterAlias("ft0", self.f0, 8, 0)
196
+ self.add(self.ft0)
197
+ # f1 is a temporary register
198
+ self.f1 = state.Register("f1", 8)
199
+ self.add(self.f1)
200
+ self.ft1 = state.RegisterAlias("ft1", self.f1, 8, 0)
201
+ self.add(self.ft1)
202
+ # f2 is a temporary register
203
+ self.f2 = state.Register("f2", 8)
204
+ self.add(self.f2)
205
+ self.ft2 = state.RegisterAlias("ft2", self.f2, 8, 0)
206
+ self.add(self.ft2)
207
+ # f3 is a temporary register
208
+ self.f3 = state.Register("f3", 8)
209
+ self.add(self.f3)
210
+ self.ft3 = state.RegisterAlias("ft3", self.f3, 8, 0)
211
+ self.add(self.ft3)
212
+ # f4 is a temporary register
213
+ self.f4 = state.Register("f4", 8)
214
+ self.add(self.f4)
215
+ self.ft4 = state.RegisterAlias("ft4", self.f4, 8, 0)
216
+ self.add(self.ft4)
217
+ # f5 is a temporary register
218
+ self.f5 = state.Register("f5", 8)
219
+ self.add(self.f5)
220
+ self.ft5 = state.RegisterAlias("ft5", self.f5, 8, 0)
221
+ self.add(self.ft5)
222
+ # f6 is a temporary register
223
+ self.f6 = state.Register("f6", 8)
224
+ self.add(self.f6)
225
+ self.ft6 = state.RegisterAlias("ft6", self.f6, 8, 0)
226
+ self.add(self.ft6)
227
+ # f7 is a temporary register
228
+ self.f7 = state.Register("f7", 8)
229
+ self.add(self.f7)
230
+ self.ft7 = state.RegisterAlias("ft7", self.f7, 8, 0)
231
+ self.add(self.ft7)
232
+ # f8 is a callee saved register
233
+ self.f8 = state.Register("f8", 8)
234
+ self.add(self.f8)
235
+ self.fs0 = state.RegisterAlias("fs0", self.f8, 8, 0)
236
+ self.add(self.fs0)
237
+ # f9 is a callee saved register
238
+ self.f9 = state.Register("f9", 8)
239
+ self.add(self.f9)
240
+ self.fs1 = state.RegisterAlias("fs1", self.f9, 8, 0)
241
+ self.add(self.fs1)
242
+ # f10 is argument 0
243
+ self.f10 = state.Register("f10", 8)
244
+ self.add(self.f10)
245
+ self.fa0 = state.RegisterAlias("fa0", self.f10, 8, 0)
246
+ self.add(self.fa0)
247
+ # f11 is argument 1
248
+ self.f11 = state.Register("f11", 8)
249
+ self.add(self.f11)
250
+ self.fa1 = state.RegisterAlias("fa1", self.f11, 8, 0)
251
+ self.add(self.fa1)
252
+ # f12 is argument 2
253
+ self.f12 = state.Register("f12", 8)
254
+ self.add(self.f12)
255
+ self.fa2 = state.RegisterAlias("fa2", self.f12, 8, 0)
256
+ self.add(self.fa2)
257
+ # f13 is argument 3
258
+ self.f13 = state.Register("f13", 8)
259
+ self.add(self.f13)
260
+ self.fa3 = state.RegisterAlias("fa3", self.f13, 8, 0)
261
+ self.add(self.fa3)
262
+ # f14 is argument 4
263
+ self.f14 = state.Register("f14", 8)
264
+ self.add(self.f14)
265
+ self.fa4 = state.RegisterAlias("fa4", self.f14, 8, 0)
266
+ self.add(self.fa4)
267
+ # f15 is argument 5
268
+ self.f15 = state.Register("f15", 8)
269
+ self.add(self.f15)
270
+ self.fa5 = state.RegisterAlias("fa5", self.f15, 8, 0)
271
+ self.add(self.fa5)
272
+ # f16 is argument 6
273
+ self.f16 = state.Register("f16", 8)
274
+ self.add(self.f16)
275
+ self.fa6 = state.RegisterAlias("fa6", self.f16, 8, 0)
276
+ self.add(self.fa6)
277
+ # f7 is argument 7
278
+ self.f17 = state.Register("f17", 8)
279
+ self.add(self.f17)
280
+ self.fa7 = state.RegisterAlias("fa7", self.f17, 8, 0)
281
+ self.add(self.fa7)
282
+ # f18 is a callee-saved register
283
+ self.f18 = state.Register("f18", 8)
284
+ self.add(self.f18)
285
+ self.fs2 = state.RegisterAlias("fs2", self.f18, 8, 0)
286
+ self.add(self.fs2)
287
+ # f19 is a callee-saved register
288
+ self.f19 = state.Register("f19", 8)
289
+ self.add(self.f19)
290
+ self.fs3 = state.RegisterAlias("fs3", self.f19, 8, 0)
291
+ self.add(self.fs3)
292
+ # f20 is a callee-saved register
293
+ self.f20 = state.Register("f20", 8)
294
+ self.add(self.f20)
295
+ self.fs4 = state.RegisterAlias("fs4", self.f20, 8, 0)
296
+ self.add(self.fs4)
297
+ # f21 is a callee-saved register
298
+ self.f21 = state.Register("f21", 8)
299
+ self.add(self.f21)
300
+ self.fs5 = state.RegisterAlias("fs5", self.f21, 8, 0)
301
+ self.add(self.fs5)
302
+ # f22 is a callee-saved register
303
+ self.f22 = state.Register("f22", 8)
304
+ self.add(self.f22)
305
+ self.fs6 = state.RegisterAlias("fs6", self.f22, 8, 0)
306
+ self.add(self.fs6)
307
+ # f23 is a callee-saved register
308
+ self.f23 = state.Register("f23", 8)
309
+ self.add(self.f23)
310
+ self.fs7 = state.RegisterAlias("fs7", self.f23, 8, 0)
311
+ self.add(self.fs7)
312
+ # f24 is a callee-saved register
313
+ self.f24 = state.Register("f24", 8)
314
+ self.add(self.f24)
315
+ self.fs8 = state.RegisterAlias("fs8", self.f24, 8, 0)
316
+ self.add(self.fs8)
317
+ # f25 is a callee-saved register
318
+ self.f25 = state.Register("f25", 8)
319
+ self.add(self.f25)
320
+ self.fs9 = state.RegisterAlias("fs9", self.f25, 8, 0)
321
+ self.add(self.fs9)
322
+ # f26 is a callee-saved register
323
+ self.f26 = state.Register("f26", 8)
324
+ self.add(self.f26)
325
+ self.fs10 = state.RegisterAlias("fs10", self.f26, 8, 0)
326
+ self.add(self.fs10)
327
+ # f27 is a callee-saved register
328
+ self.f27 = state.Register("f27", 8)
329
+ self.add(self.f27)
330
+ self.fs11 = state.RegisterAlias("fs11", self.f27, 8, 0)
331
+ self.add(self.fs11)
332
+ # f28 is a temporary register
333
+ self.f28 = state.Register("f28", 8)
334
+ self.add(self.f28)
335
+ self.ft8 = state.RegisterAlias("ft8", self.f28, 8, 0)
336
+ self.add(self.ft8)
337
+ # f29 is a temporary register
338
+ self.f29 = state.Register("f29", 8)
339
+ self.add(self.f29)
340
+ self.ft9 = state.RegisterAlias("ft9", self.f29, 8, 0)
341
+ self.add(self.ft9)
342
+ # f30 is a temporary register
343
+ self.f30 = state.Register("f30", 8)
344
+ self.add(self.f30)
345
+ self.ft10 = state.RegisterAlias("ft10", self.f30, 8, 0)
346
+ self.add(self.ft10)
347
+ # f31 is a temporary register
348
+ self.f31 = state.Register("f31", 8)
349
+ self.add(self.f31)
350
+ self.ft11 = state.RegisterAlias("ft11", self.f31, 8, 0)
351
+ self.add(self.ft11)
352
+
353
+ # *** Vector Registers ***
354
+ # NOTE: These exist, but are not supported
355
+
356
+ # *** Control and Status Registers ***
357
+ # NOTE: These exist, but aren't supported.
@@ -0,0 +1,80 @@
1
+ import typing
2
+
3
+ from ... import platforms, state
4
+ from . import cpu
5
+
6
+
7
+ class XTensa(cpu.CPU):
8
+ """CPU for XTensa, little-endian
9
+
10
+ Like RISC-V, which shares its lineage,
11
+ xtensa has a very small core architecture
12
+ with a metric boatload of optional extensions.
13
+
14
+ One noteable option is that xtensa uses register windows.
15
+ I'm not putting up with that shit for now.
16
+ """
17
+
18
+ def get_general_purpose_registers(self) -> typing.List[str]:
19
+ return [f"a{i}" for i in range(0, 16)]
20
+
21
+ def __init__(self):
22
+ super().__init__()
23
+ # *** General Purpose Registers ***
24
+ # a0 is also the default link register, but it doesn't get an alias
25
+ self.a0 = state.Register("a0", 4)
26
+ self.add(self.a0)
27
+ # a1 is also the stack pointer
28
+ self.a1 = state.Register("a1", 4)
29
+ self.add(self.a1)
30
+ self.sp = state.RegisterAlias("sp", self.a1, 4, 0)
31
+ self.add(self.sp)
32
+ self.a2 = state.Register("a2", 4)
33
+ self.add(self.a2)
34
+ self.a3 = state.Register("a3", 4)
35
+ self.add(self.a3)
36
+ self.a4 = state.Register("a4", 4)
37
+ self.add(self.a4)
38
+ self.a5 = state.Register("a5", 4)
39
+ self.add(self.a5)
40
+ self.a6 = state.Register("a6", 4)
41
+ self.add(self.a6)
42
+ self.a7 = state.Register("a7", 4)
43
+ self.add(self.a7)
44
+ self.a8 = state.Register("a8", 4)
45
+ self.add(self.a8)
46
+ self.a9 = state.Register("a9", 4)
47
+ self.add(self.a9)
48
+ self.a10 = state.Register("a10", 4)
49
+ self.add(self.a10)
50
+ self.a11 = state.Register("a11", 4)
51
+ self.add(self.a11)
52
+ self.a12 = state.Register("a12", 4)
53
+ self.add(self.a12)
54
+ self.a13 = state.Register("a13", 4)
55
+ self.add(self.a13)
56
+ self.a14 = state.Register("a14", 4)
57
+ self.add(self.a14)
58
+ self.a15 = state.Register("a15", 4)
59
+ self.add(self.a15)
60
+
61
+ # *** Program Counter ***
62
+ self.pc = state.Register("pc", 4)
63
+ self.add(self.pc)
64
+
65
+ # *** Shift Amount Register ***
66
+ # This thing is actually 6 bits.
67
+ self.sar = state.Register("sar", 4)
68
+ self.add(self.sar)
69
+
70
+
71
+ class XTensaEL(XTensa):
72
+ platform = platforms.Platform(
73
+ platforms.Architecture.XTENSA, platforms.Byteorder.LITTLE
74
+ )
75
+
76
+
77
+ class XTensaBE(XTensa):
78
+ platform = platforms.Platform(
79
+ platforms.Architecture.XTENSA, platforms.Byteorder.BIG
80
+ )
@@ -0,0 +1,7 @@
1
+ from . import code, heap, stack
2
+ from .elf import * # noqa: F401, F403
3
+ from .elf import __all__ as __elf__
4
+ from .memory import * # noqa: F401, F403
5
+ from .memory import __all__ as __memory__
6
+
7
+ __all__ = __memory__ + __elf__ + ["stack", "heap", "code"]
@@ -0,0 +1,70 @@
1
+ import typing
2
+
3
+ import claripy
4
+
5
+ from ... import emulators
6
+ from ...platforms import Platform
7
+ from ..state import Value
8
+ from . import memory
9
+
10
+
11
+ class Executable(memory.RawMemory):
12
+ """An execuable piece of code."""
13
+
14
+ entrypoint: typing.Optional[int] = None
15
+ """Entry point address.
16
+
17
+ Note:
18
+ This is not used by Emulators - but is available for reference from
19
+ file parsing, if supported.
20
+ """
21
+
22
+ def _write_content(self, emulator: emulators.Emulator, address: int, value: Value):
23
+ if isinstance(value.get_content(), claripy.ast.bv.BV):
24
+ raise NotImplementedError(
25
+ "Absolutely not. Get your symbolic code out of here."
26
+ )
27
+ emulator.write_code(address, value.to_bytes(emulator.platform.byteorder))
28
+
29
+ @classmethod
30
+ def from_elf(
31
+ cls,
32
+ file: typing.BinaryIO,
33
+ address: typing.Optional[int] = None,
34
+ platform: typing.Optional[Platform] = None,
35
+ ignore_platform: bool = False,
36
+ ):
37
+ """Load an ELF executable from an open file-like object.
38
+
39
+ Arguments:
40
+ file: The open file-like object from which to read.
41
+ address: The address where this executable should be loaded.
42
+ platform: Optional platform for header verification
43
+ ignore_platform: Skip platform ID and verification
44
+
45
+ Returns:
46
+ An Executable parsed from the given ELF file-like object.
47
+ """
48
+ # NOTE: there's a circular dependency between elf.py and code.py
49
+ # This is the accepted fix.
50
+ from .elf import ElfExecutable
51
+
52
+ return ElfExecutable(
53
+ file, user_base=address, platform=platform, ignore_platform=ignore_platform
54
+ )
55
+
56
+ @classmethod
57
+ def from_pe(cls, file: typing.BinaryIO):
58
+ """Load an PE executable from an open file-like object.
59
+
60
+ Arguments:
61
+ file: The open file-like object from which to read.
62
+ address: The address where this executable should be loaded.
63
+
64
+ Returns:
65
+ An Executable parsed from the given PE file-like object.
66
+ """
67
+ raise NotImplementedError("PE parsing not yet implemented")
68
+
69
+
70
+ __all__ = ["Executable"]
@@ -0,0 +1,3 @@
1
+ from .elf import ElfExecutable
2
+
3
+ __all__ = ["ElfExecutable"]