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,676 @@
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 AMD64(cpu.CPU):
10
+ """Generic AMD64 CPU state model.
11
+
12
+ Specific implementations support different vector extensions.
13
+ Because of how smallworld works, an emulator can only support
14
+ platforms if it supports all base registers.
15
+ Since the AVX extensions keep adding registers under
16
+ the old ones, we need new platforms.
17
+ """
18
+
19
+ _GENERAL_PURPOSE_REGS = [
20
+ "rax",
21
+ "rbx",
22
+ "rcx",
23
+ "rdx",
24
+ "rdi",
25
+ "rsi",
26
+ "rbp",
27
+ "rsp",
28
+ "r8",
29
+ "r9",
30
+ "r10",
31
+ "r11",
32
+ "r12",
33
+ "r13",
34
+ "r14",
35
+ "r15",
36
+ ]
37
+
38
+ def get_general_purpose_registers(self) -> typing.List[str]:
39
+ return self._GENERAL_PURPOSE_REGS
40
+
41
+ def __init__(self):
42
+ super().__init__()
43
+ # *** General Purpose Registers ***
44
+ self.rax = state.Register("rax", 8)
45
+ self.add(self.rax)
46
+ self.eax = state.RegisterAlias("eax", self.rax, 4, 0)
47
+ self.add(self.eax)
48
+ self.ax = state.RegisterAlias("ax", self.rax, 2, 0)
49
+ self.add(self.ax)
50
+ self.al = state.RegisterAlias("al", self.rax, 1, 0)
51
+ self.add(self.al)
52
+ self.ah = state.RegisterAlias("ah", self.rax, 1, 1)
53
+ self.add(self.ah)
54
+
55
+ self.rbx = state.Register("rbx", 8)
56
+ self.add(self.rbx)
57
+ self.ebx = state.RegisterAlias("ebx", self.rbx, 4, 0)
58
+ self.add(self.ebx)
59
+ self.bx = state.RegisterAlias("bx", self.rbx, 2, 0)
60
+ self.add(self.bx)
61
+ self.bl = state.RegisterAlias("bl", self.rbx, 1, 0)
62
+ self.add(self.bl)
63
+ self.bh = state.RegisterAlias("bh", self.rbx, 1, 1)
64
+ self.add(self.bh)
65
+
66
+ self.rcx = state.Register("rcx", 8)
67
+ self.add(self.rcx)
68
+ self.ecx = state.RegisterAlias("ecx", self.rcx, 4, 0)
69
+ self.add(self.ecx)
70
+ self.cx = state.RegisterAlias("cx", self.rcx, 2, 0)
71
+ self.add(self.cx)
72
+ self.cl = state.RegisterAlias("cl", self.rcx, 1, 0)
73
+ self.add(self.cl)
74
+ self.ch = state.RegisterAlias("ch", self.rcx, 1, 1)
75
+ self.add(self.ch)
76
+
77
+ self.rdx = state.Register("rdx", 8)
78
+ self.add(self.rdx)
79
+ self.edx = state.RegisterAlias("edx", self.rdx, 4, 0)
80
+ self.add(self.edx)
81
+ self.dx = state.RegisterAlias("dx", self.rdx, 2, 0)
82
+ self.add(self.dx)
83
+ self.dl = state.RegisterAlias("dl", self.rdx, 1, 0)
84
+ self.add(self.dl)
85
+ self.dh = state.RegisterAlias("dh", self.rdx, 1, 1)
86
+ self.add(self.dh)
87
+
88
+ self.r8 = state.Register("r8", 8)
89
+ self.add(self.r8)
90
+ self.r8d = state.RegisterAlias("r8d", self.r8, 4, 0)
91
+ self.add(self.r8d)
92
+ self.r8w = state.RegisterAlias("r8w", self.r8, 2, 0)
93
+ self.add(self.r8w)
94
+ self.r8b = state.RegisterAlias("r8b", self.r8, 1, 0)
95
+ self.add(self.r8b)
96
+
97
+ self.r9 = state.Register("r9", 8)
98
+ self.add(self.r9)
99
+ self.r9d = state.RegisterAlias("r9d", self.r9, 4, 0)
100
+ self.add(self.r9d)
101
+ self.r9w = state.RegisterAlias("r9w", self.r9, 2, 0)
102
+ self.add(self.r9w)
103
+ self.r9b = state.RegisterAlias("r9b", self.r9, 1, 0)
104
+ self.add(self.r9b)
105
+
106
+ self.r10 = state.Register("r10", 8)
107
+ self.add(self.r10)
108
+ self.r10d = state.RegisterAlias("r10d", self.r10, 4, 0)
109
+ self.add(self.r10d)
110
+ self.r10w = state.RegisterAlias("r10w", self.r10, 2, 0)
111
+ self.add(self.r10w)
112
+ self.r10b = state.RegisterAlias("r10b", self.r10, 1, 0)
113
+ self.add(self.r10b)
114
+
115
+ self.r11 = state.Register("r11", 8)
116
+ self.add(self.r11)
117
+ self.r11d = state.RegisterAlias("r11d", self.r11, 4, 0)
118
+ self.add(self.r11d)
119
+ self.r11w = state.RegisterAlias("r11w", self.r11, 2, 0)
120
+ self.add(self.r11w)
121
+ self.r11b = state.RegisterAlias("r11b", self.r11, 1, 0)
122
+ self.add(self.r11b)
123
+
124
+ self.r12 = state.Register("r12", 8)
125
+ self.add(self.r12)
126
+ self.r12d = state.RegisterAlias("r12d", self.r12, 4, 0)
127
+ self.add(self.r12d)
128
+ self.r12w = state.RegisterAlias("r12w", self.r12, 2, 0)
129
+ self.add(self.r12w)
130
+ self.r12b = state.RegisterAlias("r12b", self.r12, 1, 0)
131
+ self.add(self.r12b)
132
+
133
+ self.r13 = state.Register("r13", 8)
134
+ self.add(self.r13)
135
+ self.r13d = state.RegisterAlias("r13d", self.r13, 4, 0)
136
+ self.add(self.r13d)
137
+ self.r13w = state.RegisterAlias("r13w", self.r13, 2, 0)
138
+ self.add(self.r13w)
139
+ self.r13b = state.RegisterAlias("r13b", self.r13, 1, 0)
140
+ self.add(self.r13b)
141
+
142
+ self.r14 = state.Register("r14", 8)
143
+ self.add(self.r14)
144
+ self.r14d = state.RegisterAlias("r14d", self.r14, 4, 0)
145
+ self.add(self.r14d)
146
+ self.r14w = state.RegisterAlias("r14w", self.r14, 2, 0)
147
+ self.add(self.r14w)
148
+ self.r14b = state.RegisterAlias("r14b", self.r14, 1, 0)
149
+ self.add(self.r14b)
150
+
151
+ self.r15 = state.Register("r15", 8)
152
+ self.add(self.r15)
153
+ self.r15d = state.RegisterAlias("r15d", self.r15, 4, 0)
154
+ self.add(self.r15d)
155
+ self.r15w = state.RegisterAlias("r15w", self.r15, 2, 0)
156
+ self.add(self.r15w)
157
+ self.r15b = state.RegisterAlias("r15b", self.r15, 1, 0)
158
+ self.add(self.r15b)
159
+
160
+ self.rdi = state.Register("rdi", 8)
161
+ self.add(self.rdi)
162
+ self.edi = state.RegisterAlias("edi", self.rdi, 4, 0)
163
+ self.add(self.edi)
164
+ self.di = state.RegisterAlias("di", self.rdi, 2, 0)
165
+ self.add(self.di)
166
+ self.dil = state.RegisterAlias("dil", self.rdi, 1, 0)
167
+ self.add(self.dil)
168
+
169
+ self.rsi = state.Register("rsi", 8)
170
+ self.add(self.rsi)
171
+ self.esi = state.RegisterAlias("rsi", self.rsi, 4, 0)
172
+ self.add(self.esi)
173
+ self.si = state.RegisterAlias("si", self.rsi, 2, 0)
174
+ self.add(self.si)
175
+ self.sil = state.RegisterAlias("sil", self.rsi, 1, 0)
176
+ self.add(self.sil)
177
+
178
+ self.rsp = state.Register("rsp", 8)
179
+ self.add(self.rsp)
180
+ self.esp = state.RegisterAlias("rsp", self.rsp, 4, 0)
181
+ self.add(self.esp)
182
+ self.sp = state.RegisterAlias("sp", self.rsp, 2, 0)
183
+ self.add(self.sp)
184
+ self.spl = state.RegisterAlias("spl", self.rsp, 1, 0)
185
+ self.add(self.spl)
186
+
187
+ self.rbp = state.Register("rbp", 8)
188
+ self.add(self.rbp)
189
+ self.ebp = state.RegisterAlias("rbp", self.rbp, 4, 0)
190
+ self.add(self.ebp)
191
+ self.bp = state.RegisterAlias("bp", self.rbp, 2, 0)
192
+ self.add(self.bp)
193
+ self.bpl = state.RegisterAlias("bpl", self.rbp, 1, 0)
194
+ self.add(self.bpl)
195
+
196
+ # *** Instruction Pointer ***
197
+ self.rip = state.Register("rip", 8)
198
+ self.add(self.rip)
199
+ self.eip = state.RegisterAlias("rip", self.rip, 4, 0)
200
+ self.add(self.eip)
201
+ self.ip = state.RegisterAlias("ip", self.rip, 2, 0)
202
+ self.add(self.ip)
203
+
204
+ self.pc = state.RegisterAlias("pc", self.rip, 8, 0)
205
+ self.add(self.pc)
206
+
207
+ # *** Flags register ***
208
+ self.rflags = state.Register("rflags", 8)
209
+ self.add(self.rflags)
210
+ self.eflags = state.RegisterAlias("eflags", self.rflags, 4, 0)
211
+ self.add(self.eflags)
212
+ self.flags = state.RegisterAlias("flags", self.rflags, 2, 0)
213
+ self.add(self.flags)
214
+
215
+ # *** Segment Registers ***
216
+ # NOTE: These are actually 16 bits
217
+ # However, their representation in different emulators gets weird.
218
+ self.cs = state.Register("cs", 8)
219
+ self.add(self.cs)
220
+ self.ds = state.Register("ds", 8)
221
+ self.add(self.ds)
222
+ self.es = state.Register("es", 8)
223
+ self.add(self.es)
224
+ self.fs = state.Register("fs", 8)
225
+ self.add(self.fs)
226
+ self.gs = state.Register("gs", 8)
227
+ self.add(self.gs)
228
+
229
+ # *** Control Registers ***
230
+ self.cr0 = state.Register("cr0", 8)
231
+ self.add(self.cr0)
232
+ self.cr1 = state.Register("cr1", 8)
233
+ self.add(self.cr1)
234
+ self.cr2 = state.Register("cr2", 8)
235
+ self.add(self.cr2)
236
+ self.cr3 = state.Register("cr3", 8)
237
+ self.add(self.cr3)
238
+ self.cr4 = state.Register("cr4", 8)
239
+ self.add(self.cr4)
240
+ self.cr8 = state.Register("cr8", 8)
241
+ self.add(self.cr8)
242
+
243
+ # *** Debug Registers ***
244
+ self.dr0 = state.Register("dr0", 8)
245
+ self.add(self.dr0)
246
+ self.dr1 = state.Register("dr1", 8)
247
+ self.add(self.dr1)
248
+ self.dr2 = state.Register("dr2", 8)
249
+ self.add(self.dr2)
250
+ self.dr3 = state.Register("dr3", 8)
251
+ self.add(self.dr3)
252
+ self.dr6 = state.Register("dr6", 8)
253
+ self.add(self.dr6)
254
+ self.dr7 = state.Register("dr7", 8)
255
+ self.add(self.dr7)
256
+ self.dr8 = state.Register("dr8", 8)
257
+ self.add(self.dr8)
258
+ self.dr9 = state.Register("dr9", 8)
259
+ self.add(self.dr9)
260
+ self.dr10 = state.Register("dr10", 8)
261
+ self.add(self.dr10)
262
+ self.dr11 = state.Register("dr11", 8)
263
+ self.add(self.dr11)
264
+ self.dr12 = state.Register("dr12", 8)
265
+ self.add(self.dr12)
266
+ self.dr13 = state.Register("dr13", 8)
267
+ self.add(self.dr13)
268
+ self.dr14 = state.Register("dr14", 8)
269
+ self.add(self.dr14)
270
+ self.dr15 = state.Register("dr15", 8)
271
+ self.add(self.dr15)
272
+
273
+ # *** Descriptor Table Registers ***
274
+ self.gdtr = X86MMRRegister("gdtr", 10)
275
+ self.add(self.gdtr)
276
+ self.idtr = X86MMRRegister("idtr", 10)
277
+ self.add(self.idtr)
278
+ self.ldtr = X86MMRRegister("ldtr", 10)
279
+ self.add(self.ldtr)
280
+
281
+ # *** Task Register ***
282
+ self.tr = X86MMRRegister("tr", 2)
283
+ self.add(self.tr)
284
+
285
+ # *** x87 registers ***
286
+ self.fpr0 = state.Register("fpr0", 10)
287
+ self.add(self.fpr0)
288
+ self.fpr1 = state.Register("fpr1", 10)
289
+ self.add(self.fpr1)
290
+ self.fpr2 = state.Register("fpr2", 10)
291
+ self.add(self.fpr2)
292
+ self.fpr3 = state.Register("fpr3", 10)
293
+ self.add(self.fpr3)
294
+ self.fpr4 = state.Register("fpr4", 10)
295
+ self.add(self.fpr4)
296
+ self.fpr5 = state.Register("fpr5", 10)
297
+ self.add(self.fpr5)
298
+ self.fpr6 = state.Register("fpr6", 10)
299
+ self.add(self.fpr6)
300
+ self.fpr7 = state.Register("fpr7", 10)
301
+ self.add(self.fpr7)
302
+
303
+ # x87 Control Register
304
+ self.fctrl = state.Register("fctrl", 2)
305
+ self.add(self.fctrl)
306
+ # x87 Status Register
307
+ self.fstat = state.Register("fstat", 2)
308
+ self.add(self.fstat)
309
+ # x87 Tag Register
310
+ self.ftag = state.Register("ftag", 2)
311
+ self.add(self.ftag)
312
+ # x87 Last Instruction Register
313
+ self.fip = state.Register("fip", 8)
314
+ self.add(self.fip)
315
+ # x87 Last Operand Pointer
316
+ self.fdp = state.Register("fdp", 8)
317
+ self.add(self.fdp)
318
+ # x87 Last Opcode
319
+ self.fop = state.Register("fop", 2)
320
+ self.add(self.fop)
321
+
322
+ # NOTE: Docs disagree on the format of fip and fdp.
323
+ # One source describes them as 48-bit offset-plus-segment,
324
+ # the other describes them as 64-bit.
325
+ # There may also be separate segment registers.
326
+ # If you care about the x87 debug info, please feel free to update.
327
+
328
+ # *** MMX Registers ***
329
+ # NOTE: The MMX registers are aliases for the low 8 bytes of the x87 registers.
330
+ # The two subsystems cannot be used simultaneously.
331
+ self.mm0 = state.RegisterAlias("mm0", self.fpr0, 8, 0)
332
+ self.add(self.mm0)
333
+ self.mm1 = state.RegisterAlias("mm1", self.fpr1, 8, 0)
334
+ self.add(self.mm1)
335
+ self.mm2 = state.RegisterAlias("mm2", self.fpr2, 8, 0)
336
+ self.add(self.mm2)
337
+ self.mm3 = state.RegisterAlias("mm3", self.fpr3, 8, 0)
338
+ self.add(self.mm3)
339
+ self.mm4 = state.RegisterAlias("mm4", self.fpr4, 8, 0)
340
+ self.add(self.mm4)
341
+ self.mm5 = state.RegisterAlias("mm5", self.fpr5, 8, 0)
342
+ self.add(self.mm5)
343
+ self.mm6 = state.RegisterAlias("mm6", self.fpr6, 8, 0)
344
+ self.add(self.mm6)
345
+ self.mm7 = state.RegisterAlias("mm7", self.fpr7, 8, 0)
346
+ self.add(self.mm7)
347
+
348
+
349
+ class AMD64AVX2(AMD64):
350
+ """AMD64 CPU supporting up to AVX2
351
+
352
+ This is our default, since all emulators support up to AVX2,
353
+ and 99.9% of our users won't use the vector extensions.
354
+ """
355
+
356
+ platform = platforms.Platform(
357
+ platforms.Architecture.X86_64, platforms.Byteorder.LITTLE
358
+ )
359
+
360
+ def __init__(self):
361
+ super().__init__()
362
+ # *** SSE/AVX/AVX2 registers ***
363
+ self.ymm0 = state.Register("ymm0", 32)
364
+ self.add(self.ymm0)
365
+ self.xmm0 = state.RegisterAlias("xmm0", self.ymm0, 16, 0)
366
+ self.add(self.xmm0)
367
+
368
+ self.ymm1 = state.Register("ymm1", 32)
369
+ self.add(self.ymm1)
370
+ self.xmm1 = state.RegisterAlias("xmm1", self.ymm1, 16, 0)
371
+ self.add(self.xmm1)
372
+
373
+ self.ymm2 = state.Register("ymm2", 32)
374
+ self.add(self.ymm2)
375
+ self.xmm2 = state.RegisterAlias("xmm2", self.ymm2, 16, 0)
376
+ self.add(self.xmm2)
377
+
378
+ self.ymm3 = state.Register("ymm3", 32)
379
+ self.add(self.ymm3)
380
+ self.xmm3 = state.RegisterAlias("xmm3", self.ymm3, 16, 0)
381
+ self.add(self.xmm3)
382
+
383
+ self.ymm4 = state.Register("ymm4", 32)
384
+ self.add(self.ymm4)
385
+ self.xmm4 = state.RegisterAlias("xmm4", self.ymm4, 16, 0)
386
+ self.add(self.xmm4)
387
+
388
+ self.ymm5 = state.Register("ymm5", 32)
389
+ self.add(self.ymm5)
390
+ self.xmm5 = state.RegisterAlias("xmm5", self.ymm5, 16, 0)
391
+ self.add(self.xmm5)
392
+
393
+ self.ymm6 = state.Register("ymm6", 32)
394
+ self.add(self.ymm6)
395
+ self.xmm6 = state.RegisterAlias("xmm6", self.ymm6, 16, 0)
396
+ self.add(self.xmm6)
397
+
398
+ self.ymm7 = state.Register("ymm7", 32)
399
+ self.add(self.ymm7)
400
+ self.xmm7 = state.RegisterAlias("xmm7", self.ymm7, 16, 0)
401
+ self.add(self.xmm7)
402
+
403
+ self.ymm8 = state.Register("ymm8", 32)
404
+ self.add(self.ymm8)
405
+ self.xmm8 = state.RegisterAlias("xmm8", self.ymm8, 16, 0)
406
+ self.add(self.xmm8)
407
+
408
+ self.ymm9 = state.Register("ymm9", 32)
409
+ self.add(self.ymm9)
410
+ self.xmm9 = state.RegisterAlias("xmm9", self.ymm9, 16, 0)
411
+ self.add(self.xmm9)
412
+
413
+ self.ymm10 = state.Register("ymm10", 32)
414
+ self.add(self.ymm10)
415
+ self.xmm10 = state.RegisterAlias("xmm10", self.ymm10, 16, 0)
416
+ self.add(self.xmm10)
417
+
418
+ self.ymm11 = state.Register("ymm11", 32)
419
+ self.add(self.ymm11)
420
+ self.xmm11 = state.RegisterAlias("xmm11", self.ymm11, 16, 0)
421
+ self.add(self.xmm11)
422
+
423
+ self.ymm12 = state.Register("ymm12", 32)
424
+ self.add(self.ymm12)
425
+ self.xmm12 = state.RegisterAlias("xmm12", self.ymm12, 16, 0)
426
+ self.add(self.xmm12)
427
+
428
+ self.ymm13 = state.Register("ymm13", 32)
429
+ self.add(self.ymm13)
430
+ self.xmm13 = state.RegisterAlias("xmm13", self.ymm13, 16, 0)
431
+ self.add(self.xmm13)
432
+
433
+ self.ymm14 = state.Register("ymm14", 32)
434
+ self.add(self.ymm14)
435
+ self.xmm14 = state.RegisterAlias("xmm14", self.ymm14, 16, 0)
436
+ self.add(self.xmm14)
437
+
438
+ self.ymm15 = state.Register("ymm15", 32)
439
+ self.add(self.ymm15)
440
+ self.xmm15 = state.RegisterAlias("xmm15", self.ymm15, 16, 0)
441
+ self.add(self.xmm15)
442
+
443
+
444
+ class AMD64AVX512(AMD64):
445
+ """AMD64 CPU supporting up to AVX512"""
446
+
447
+ platform = platforms.Platform(
448
+ platforms.Architecture.X86_64_AVX512, platforms.Byteorder.LITTLE
449
+ )
450
+
451
+ def __init__(self):
452
+ super().__init__()
453
+ # *** SSE/AVX/AVX2/AVX512 registers ***
454
+ self.zmm0 = state.Register("zmm0", 64)
455
+ self.add(self.zmm0)
456
+ self.ymm0 = state.RegisterAlias("ymm0", self.zmm0, 32, 0)
457
+ self.add(self.ymm0)
458
+ self.xmm0 = state.RegisterAlias("xmm0", self.zmm0, 16, 0)
459
+ self.add(self.xmm0)
460
+
461
+ self.zmm1 = state.Register("zmm1", 64)
462
+ self.add(self.zmm1)
463
+ self.ymm1 = state.RegisterAlias("ymm1", self.zmm1, 32, 0)
464
+ self.add(self.ymm1)
465
+ self.xmm1 = state.RegisterAlias("xmm1", self.zmm1, 16, 0)
466
+ self.add(self.xmm1)
467
+
468
+ self.zmm2 = state.Register("zmm2", 64)
469
+ self.add(self.zmm2)
470
+ self.ymm2 = state.RegisterAlias("ymm2", self.zmm2, 32, 0)
471
+ self.add(self.ymm2)
472
+ self.xmm2 = state.RegisterAlias("xmm2", self.zmm2, 16, 0)
473
+ self.add(self.xmm2)
474
+
475
+ self.zmm3 = state.Register("zmm3", 64)
476
+ self.add(self.zmm3)
477
+ self.ymm3 = state.RegisterAlias("ymm3", self.zmm3, 32, 0)
478
+ self.add(self.ymm3)
479
+ self.xmm3 = state.RegisterAlias("xmm3", self.zmm3, 16, 0)
480
+ self.add(self.xmm3)
481
+
482
+ self.zmm4 = state.Register("zmm4", 64)
483
+ self.add(self.zmm4)
484
+ self.ymm4 = state.RegisterAlias("ymm4", self.zmm4, 32, 0)
485
+ self.add(self.ymm4)
486
+ self.xmm4 = state.RegisterAlias("xmm4", self.zmm4, 16, 0)
487
+ self.add(self.xmm4)
488
+
489
+ self.zmm5 = state.Register("zmm5", 64)
490
+ self.add(self.zmm5)
491
+ self.ymm5 = state.RegisterAlias("ymm5", self.zmm5, 32, 0)
492
+ self.add(self.ymm5)
493
+ self.xmm5 = state.RegisterAlias("xmm5", self.zmm5, 16, 0)
494
+ self.add(self.xmm5)
495
+
496
+ self.zmm6 = state.Register("zmm6", 64)
497
+ self.add(self.zmm6)
498
+ self.ymm6 = state.RegisterAlias("ymm6", self.zmm6, 32, 0)
499
+ self.add(self.ymm6)
500
+ self.xmm6 = state.RegisterAlias("xmm6", self.zmm6, 16, 0)
501
+ self.add(self.xmm6)
502
+
503
+ self.zmm7 = state.Register("zmm7", 64)
504
+ self.add(self.zmm7)
505
+ self.ymm7 = state.RegisterAlias("ymm7", self.zmm7, 32, 0)
506
+ self.add(self.ymm7)
507
+ self.xmm7 = state.RegisterAlias("xmm7", self.zmm7, 16, 0)
508
+ self.add(self.xmm7)
509
+
510
+ self.zmm8 = state.Register("zmm8", 64)
511
+ self.add(self.zmm8)
512
+ self.ymm8 = state.RegisterAlias("ymm8", self.zmm8, 32, 0)
513
+ self.add(self.ymm8)
514
+ self.xmm8 = state.RegisterAlias("xmm8", self.zmm8, 16, 0)
515
+ self.add(self.xmm8)
516
+
517
+ self.zmm9 = state.Register("zmm9", 64)
518
+ self.add(self.zmm9)
519
+ self.ymm9 = state.RegisterAlias("ymm9", self.zmm9, 32, 0)
520
+ self.add(self.ymm9)
521
+ self.xmm9 = state.RegisterAlias("xmm9", self.zmm9, 16, 0)
522
+ self.add(self.xmm9)
523
+
524
+ self.zmm10 = state.Register("zmm10", 64)
525
+ self.add(self.zmm10)
526
+ self.ymm10 = state.RegisterAlias("ymm10", self.zmm10, 32, 0)
527
+ self.add(self.ymm10)
528
+ self.xmm10 = state.RegisterAlias("xmm10", self.zmm10, 16, 0)
529
+ self.add(self.xmm10)
530
+
531
+ self.zmm11 = state.Register("zmm11", 64)
532
+ self.add(self.zmm11)
533
+ self.ymm11 = state.RegisterAlias("ymm11", self.zmm11, 32, 0)
534
+ self.add(self.ymm11)
535
+ self.xmm11 = state.RegisterAlias("xmm11", self.zmm11, 16, 0)
536
+ self.add(self.xmm11)
537
+
538
+ self.zmm12 = state.Register("zmm12", 64)
539
+ self.add(self.zmm12)
540
+ self.ymm12 = state.RegisterAlias("ymm12", self.zmm12, 32, 0)
541
+ self.add(self.ymm12)
542
+ self.xmm12 = state.RegisterAlias("xmm12", self.zmm12, 16, 0)
543
+ self.add(self.xmm12)
544
+
545
+ self.zmm13 = state.Register("zmm13", 64)
546
+ self.add(self.zmm13)
547
+ self.ymm13 = state.RegisterAlias("ymm13", self.zmm13, 32, 0)
548
+ self.add(self.ymm13)
549
+ self.xmm13 = state.RegisterAlias("xmm13", self.zmm13, 16, 0)
550
+ self.add(self.xmm13)
551
+
552
+ self.zmm14 = state.Register("zmm14", 64)
553
+ self.add(self.zmm14)
554
+ self.ymm14 = state.RegisterAlias("ymm14", self.zmm14, 32, 0)
555
+ self.add(self.ymm14)
556
+ self.xmm14 = state.RegisterAlias("xmm14", self.zmm14, 16, 0)
557
+ self.add(self.xmm14)
558
+
559
+ self.zmm15 = state.Register("zmm15", 64)
560
+ self.add(self.zmm15)
561
+ self.ymm15 = state.RegisterAlias("ymm15", self.zmm15, 32, 0)
562
+ self.add(self.ymm15)
563
+ self.xmm15 = state.RegisterAlias("xmm15", self.zmm15, 16, 0)
564
+ self.add(self.xmm15)
565
+
566
+ self.zmm16 = state.Register("zmm16", 64)
567
+ self.add(self.zmm16)
568
+ self.ymm16 = state.RegisterAlias("ymm16", self.zmm16, 32, 0)
569
+ self.add(self.ymm16)
570
+ self.xmm16 = state.RegisterAlias("xmm16", self.zmm16, 16, 0)
571
+ self.add(self.xmm16)
572
+
573
+ self.zmm17 = state.Register("zmm17", 64)
574
+ self.add(self.zmm17)
575
+ self.ymm17 = state.RegisterAlias("ymm17", self.zmm17, 32, 0)
576
+ self.add(self.ymm17)
577
+ self.xmm17 = state.RegisterAlias("xmm17", self.zmm17, 16, 0)
578
+ self.add(self.xmm17)
579
+
580
+ self.zmm18 = state.Register("zmm18", 64)
581
+ self.add(self.zmm18)
582
+ self.ymm18 = state.RegisterAlias("ymm18", self.zmm18, 32, 0)
583
+ self.add(self.ymm18)
584
+ self.xmm18 = state.RegisterAlias("xmm18", self.zmm18, 16, 0)
585
+ self.add(self.xmm18)
586
+
587
+ self.zmm19 = state.Register("zmm19", 64)
588
+ self.add(self.zmm19)
589
+ self.ymm19 = state.RegisterAlias("ymm19", self.zmm19, 32, 0)
590
+ self.add(self.ymm19)
591
+ self.xmm19 = state.RegisterAlias("xmm19", self.zmm19, 16, 0)
592
+ self.add(self.xmm19)
593
+
594
+ self.zmm20 = state.Register("zmm20", 64)
595
+ self.add(self.zmm20)
596
+ self.ymm20 = state.RegisterAlias("ymm20", self.zmm20, 32, 0)
597
+ self.add(self.ymm20)
598
+ self.xmm20 = state.RegisterAlias("xmm20", self.zmm20, 16, 0)
599
+ self.add(self.xmm20)
600
+
601
+ self.zmm21 = state.Register("zmm21", 64)
602
+ self.add(self.zmm21)
603
+ self.ymm21 = state.RegisterAlias("ymm21", self.zmm21, 32, 0)
604
+ self.add(self.ymm21)
605
+ self.xmm21 = state.RegisterAlias("xmm21", self.zmm21, 16, 0)
606
+ self.add(self.xmm21)
607
+
608
+ self.zmm22 = state.Register("zmm22", 64)
609
+ self.add(self.zmm22)
610
+ self.ymm22 = state.RegisterAlias("ymm22", self.zmm22, 32, 0)
611
+ self.add(self.ymm22)
612
+ self.xmm22 = state.RegisterAlias("xmm22", self.zmm22, 16, 0)
613
+ self.add(self.xmm22)
614
+
615
+ self.zmm23 = state.Register("zmm23", 64)
616
+ self.add(self.zmm23)
617
+ self.ymm23 = state.RegisterAlias("ymm23", self.zmm23, 32, 0)
618
+ self.add(self.ymm23)
619
+ self.xmm23 = state.RegisterAlias("xmm23", self.zmm23, 16, 0)
620
+ self.add(self.xmm23)
621
+
622
+ self.zmm24 = state.Register("zmm24", 64)
623
+ self.add(self.zmm24)
624
+ self.ymm24 = state.RegisterAlias("ymm24", self.zmm24, 32, 0)
625
+ self.add(self.ymm24)
626
+ self.xmm24 = state.RegisterAlias("xmm24", self.zmm24, 16, 0)
627
+ self.add(self.xmm24)
628
+
629
+ self.zmm25 = state.Register("zmm25", 64)
630
+ self.add(self.zmm25)
631
+ self.ymm25 = state.RegisterAlias("ymm25", self.zmm25, 32, 0)
632
+ self.add(self.ymm25)
633
+ self.xmm25 = state.RegisterAlias("xmm25", self.zmm25, 16, 0)
634
+ self.add(self.xmm25)
635
+
636
+ self.zmm26 = state.Register("zmm26", 64)
637
+ self.add(self.zmm26)
638
+ self.ymm26 = state.RegisterAlias("ymm26", self.zmm26, 32, 0)
639
+ self.add(self.ymm26)
640
+ self.xmm26 = state.RegisterAlias("xmm26", self.zmm26, 16, 0)
641
+ self.add(self.xmm26)
642
+
643
+ self.zmm27 = state.Register("zmm27", 64)
644
+ self.add(self.zmm27)
645
+ self.ymm27 = state.RegisterAlias("ymm27", self.zmm27, 32, 0)
646
+ self.add(self.ymm27)
647
+ self.xmm27 = state.RegisterAlias("xmm27", self.zmm27, 16, 0)
648
+ self.add(self.xmm27)
649
+
650
+ self.zmm28 = state.Register("zmm28", 64)
651
+ self.add(self.zmm28)
652
+ self.ymm28 = state.RegisterAlias("ymm28", self.zmm28, 32, 0)
653
+ self.add(self.ymm28)
654
+ self.xmm28 = state.RegisterAlias("xmm28", self.zmm28, 16, 0)
655
+ self.add(self.xmm28)
656
+
657
+ self.zmm29 = state.Register("zmm29", 64)
658
+ self.add(self.zmm29)
659
+ self.ymm29 = state.RegisterAlias("ymm29", self.zmm29, 32, 0)
660
+ self.add(self.ymm29)
661
+ self.xmm29 = state.RegisterAlias("xmm29", self.zmm29, 16, 0)
662
+ self.add(self.xmm29)
663
+
664
+ self.zmm30 = state.Register("zmm30", 64)
665
+ self.add(self.zmm30)
666
+ self.ymm30 = state.RegisterAlias("ymm30", self.zmm30, 32, 0)
667
+ self.add(self.ymm30)
668
+ self.xmm30 = state.RegisterAlias("xmm30", self.zmm30, 16, 0)
669
+ self.add(self.xmm30)
670
+
671
+ self.zmm31 = state.Register("zmm31", 64)
672
+ self.add(self.zmm31)
673
+ self.ymm31 = state.RegisterAlias("ymm31", self.zmm31, 32, 0)
674
+ self.add(self.ymm31)
675
+ self.xmm31 = state.RegisterAlias("xmm31", self.zmm31, 16, 0)
676
+ self.add(self.xmm31)