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