smallworld-re 1.0.3__py3-none-any.whl → 2.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 (306) hide show
  1. smallworld/analyses/__init__.py +8 -0
  2. smallworld/analyses/analysis.py +8 -67
  3. smallworld/analyses/code_coverage.py +1 -2
  4. smallworld/analyses/colorizer.py +301 -534
  5. smallworld/analyses/colorizer_def_use.py +217 -0
  6. smallworld/analyses/colorizer_summary.py +173 -83
  7. smallworld/analyses/field_detection/field_analysis.py +7 -8
  8. smallworld/analyses/field_detection/hints.py +1 -1
  9. smallworld/analyses/field_detection/malloc.py +2 -2
  10. smallworld/analyses/trace_execution.py +160 -0
  11. smallworld/analyses/trace_execution_types.py +42 -0
  12. smallworld/analyses/unstable/angr/divergence.py +1 -2
  13. smallworld/analyses/unstable/angr/model.py +5 -6
  14. smallworld/analyses/unstable/angr_nwbt.py +3 -4
  15. smallworld/analyses/unstable/code_coverage.py +2 -3
  16. smallworld/analyses/unstable/code_reachable.py +2 -3
  17. smallworld/analyses/unstable/control_flow_tracer.py +2 -3
  18. smallworld/analyses/unstable/pointer_finder.py +2 -3
  19. smallworld/analyses/unstable/utils/tui.py +71 -0
  20. smallworld/emulators/__init__.py +3 -1
  21. smallworld/emulators/angr/angr.py +30 -9
  22. smallworld/emulators/angr/machdefs/__init__.py +2 -0
  23. smallworld/emulators/angr/machdefs/aarch64.py +1 -1
  24. smallworld/emulators/angr/machdefs/amd64.py +0 -4
  25. smallworld/emulators/angr/machdefs/arm.py +0 -2
  26. smallworld/emulators/angr/machdefs/i386.py +0 -2
  27. smallworld/emulators/angr/machdefs/loongarch.py +340 -0
  28. smallworld/emulators/angr/machdefs/machdef.py +1 -8
  29. smallworld/emulators/angr/machdefs/mips.py +0 -2
  30. smallworld/emulators/angr/machdefs/mips64.py +0 -2
  31. smallworld/emulators/angr/machdefs/ppc.py +1 -2
  32. smallworld/emulators/angr/machdefs/riscv.py +8 -10
  33. smallworld/emulators/angr/machdefs/xtensa.py +7 -4
  34. smallworld/emulators/emulator.py +22 -0
  35. smallworld/emulators/ghidra/__init__.py +37 -0
  36. smallworld/emulators/ghidra/ghidra.py +513 -0
  37. smallworld/emulators/ghidra/machdefs/__init__.py +31 -0
  38. smallworld/emulators/ghidra/machdefs/aarch64.py +289 -0
  39. smallworld/emulators/ghidra/machdefs/amd64.py +185 -0
  40. smallworld/emulators/ghidra/machdefs/arm.py +370 -0
  41. smallworld/emulators/ghidra/machdefs/i386.py +109 -0
  42. smallworld/emulators/ghidra/machdefs/loongarch.py +162 -0
  43. smallworld/emulators/ghidra/machdefs/machdef.py +81 -0
  44. smallworld/emulators/ghidra/machdefs/mips.py +163 -0
  45. smallworld/emulators/ghidra/machdefs/mips64.py +186 -0
  46. smallworld/emulators/ghidra/machdefs/ppc.py +98 -0
  47. smallworld/emulators/ghidra/machdefs/riscv.py +208 -0
  48. smallworld/emulators/ghidra/machdefs/xtensa.py +21 -0
  49. smallworld/emulators/ghidra/typing.py +28 -0
  50. smallworld/emulators/hookable.py +18 -4
  51. smallworld/emulators/panda/machdefs/__init__.py +2 -2
  52. smallworld/emulators/panda/machdefs/aarch64.py +186 -11
  53. smallworld/emulators/panda/machdefs/amd64.py +103 -11
  54. smallworld/emulators/panda/machdefs/arm.py +216 -20
  55. smallworld/emulators/panda/machdefs/i386.py +30 -7
  56. smallworld/emulators/panda/machdefs/machdef.py +9 -16
  57. smallworld/emulators/panda/machdefs/mips.py +49 -5
  58. smallworld/emulators/panda/machdefs/mips64.py +57 -5
  59. smallworld/emulators/panda/machdefs/ppc.py +38 -13
  60. smallworld/emulators/panda/panda.py +146 -44
  61. smallworld/emulators/unicorn/__init__.py +2 -0
  62. smallworld/emulators/unicorn/machdefs/aarch64.py +253 -264
  63. smallworld/emulators/unicorn/machdefs/amd64.py +254 -259
  64. smallworld/emulators/unicorn/machdefs/arm.py +200 -212
  65. smallworld/emulators/unicorn/machdefs/i386.py +84 -90
  66. smallworld/emulators/unicorn/machdefs/machdef.py +2 -23
  67. smallworld/emulators/unicorn/machdefs/mips.py +127 -135
  68. smallworld/emulators/unicorn/unicorn.py +52 -13
  69. smallworld/helpers.py +4 -19
  70. smallworld/hinting/hinting.py +22 -192
  71. smallworld/hinting/hints.py +50 -18
  72. smallworld/instructions/bsid.py +8 -8
  73. smallworld/logging.py +4 -2
  74. smallworld/platforms/__init__.py +12 -0
  75. smallworld/platforms/defs/__init__.py +36 -0
  76. smallworld/platforms/defs/aarch64.py +450 -0
  77. smallworld/platforms/defs/amd64.py +463 -0
  78. smallworld/platforms/defs/arm.py +519 -0
  79. smallworld/platforms/defs/i386.py +258 -0
  80. smallworld/platforms/defs/loongarch.py +270 -0
  81. smallworld/platforms/defs/mips.py +321 -0
  82. smallworld/platforms/defs/mips64.py +313 -0
  83. smallworld/platforms/defs/platformdef.py +97 -0
  84. smallworld/platforms/defs/powerpc.py +259 -0
  85. smallworld/platforms/defs/riscv.py +257 -0
  86. smallworld/platforms/defs/xtensa.py +96 -0
  87. smallworld/{platforms.py → platforms/platforms.py} +3 -0
  88. smallworld/state/cpus/__init__.py +2 -0
  89. smallworld/state/cpus/aarch64.py +0 -9
  90. smallworld/state/cpus/amd64.py +6 -28
  91. smallworld/state/cpus/arm.py +0 -11
  92. smallworld/state/cpus/cpu.py +0 -11
  93. smallworld/state/cpus/i386.py +0 -7
  94. smallworld/state/cpus/loongarch.py +299 -0
  95. smallworld/state/cpus/mips.py +4 -47
  96. smallworld/state/cpus/mips64.py +18 -58
  97. smallworld/state/cpus/powerpc.py +2 -9
  98. smallworld/state/cpus/riscv.py +1 -11
  99. smallworld/state/cpus/xtensa.py +0 -5
  100. smallworld/state/memory/code.py +38 -2
  101. smallworld/state/memory/elf/__init__.py +5 -1
  102. smallworld/state/memory/elf/coredump/__init__.py +3 -0
  103. smallworld/state/memory/elf/coredump/coredump.py +46 -0
  104. smallworld/state/memory/elf/coredump/prstatus/__init__.py +27 -0
  105. smallworld/state/memory/elf/coredump/prstatus/aarch64.py +46 -0
  106. smallworld/state/memory/elf/coredump/prstatus/amd64.py +40 -0
  107. smallworld/state/memory/elf/coredump/prstatus/arm.py +53 -0
  108. smallworld/state/memory/elf/coredump/prstatus/i386.py +30 -0
  109. smallworld/state/memory/elf/coredump/prstatus/mips.py +55 -0
  110. smallworld/state/memory/elf/coredump/prstatus/mips64.py +57 -0
  111. smallworld/state/memory/elf/coredump/prstatus/ppc.py +82 -0
  112. smallworld/state/memory/elf/coredump/prstatus/prstatus.py +129 -0
  113. smallworld/state/memory/elf/elf.py +211 -57
  114. smallworld/state/memory/elf/register_state.py +36 -0
  115. smallworld/state/memory/elf/rela/__init__.py +2 -0
  116. smallworld/state/memory/elf/rela/aarch64.py +3 -1
  117. smallworld/state/memory/elf/rela/amd64.py +4 -2
  118. smallworld/state/memory/elf/rela/arm.py +4 -2
  119. smallworld/state/memory/elf/rela/i386.py +4 -2
  120. smallworld/state/memory/elf/rela/loongarch.py +32 -0
  121. smallworld/state/memory/elf/rela/mips.py +39 -18
  122. smallworld/state/memory/elf/rela/ppc.py +31 -14
  123. smallworld/state/memory/elf/structs.py +3 -0
  124. smallworld/state/memory/heap.py +2 -2
  125. smallworld/state/memory/memory.py +18 -0
  126. smallworld/state/memory/pe/__init__.py +3 -0
  127. smallworld/state/memory/pe/pe.py +361 -0
  128. smallworld/state/memory/pe/structs.py +60 -0
  129. smallworld/state/memory/stack/__init__.py +2 -0
  130. smallworld/state/memory/stack/loongarch.py +26 -0
  131. smallworld/state/models/__init__.py +29 -2
  132. smallworld/state/models/aarch64/__init__.py +1 -0
  133. smallworld/state/models/aarch64/systemv/__init__.py +6 -0
  134. smallworld/state/models/aarch64/systemv/c99/__init__.py +12 -0
  135. smallworld/state/models/aarch64/systemv/c99/signal.py +16 -0
  136. smallworld/state/models/aarch64/systemv/c99/stdio.py +265 -0
  137. smallworld/state/models/aarch64/systemv/c99/stdlib.py +169 -0
  138. smallworld/state/models/aarch64/systemv/c99/string.py +139 -0
  139. smallworld/state/models/aarch64/systemv/c99/time.py +61 -0
  140. smallworld/state/models/aarch64/systemv/posix/__init__.py +6 -0
  141. smallworld/state/models/aarch64/systemv/posix/libgen.py +16 -0
  142. smallworld/state/models/aarch64/systemv/posix/signal.py +157 -0
  143. smallworld/state/models/aarch64/systemv/systemv.py +80 -0
  144. smallworld/state/models/amd64/__init__.py +1 -0
  145. smallworld/state/models/amd64/systemv/__init__.py +6 -0
  146. smallworld/state/models/amd64/systemv/c99/__init__.py +12 -0
  147. smallworld/state/models/amd64/systemv/c99/signal.py +16 -0
  148. smallworld/state/models/amd64/systemv/c99/stdio.py +265 -0
  149. smallworld/state/models/amd64/systemv/c99/stdlib.py +169 -0
  150. smallworld/state/models/amd64/systemv/c99/string.py +139 -0
  151. smallworld/state/models/amd64/systemv/c99/time.py +61 -0
  152. smallworld/state/models/amd64/systemv/posix/__init__.py +6 -0
  153. smallworld/state/models/amd64/systemv/posix/libgen.py +16 -0
  154. smallworld/state/models/amd64/systemv/posix/signal.py +157 -0
  155. smallworld/state/models/amd64/systemv/systemv.py +78 -0
  156. smallworld/state/models/armel/__init__.py +1 -0
  157. smallworld/state/models/armel/systemv/__init__.py +6 -0
  158. smallworld/state/models/armel/systemv/c99/__init__.py +12 -0
  159. smallworld/state/models/armel/systemv/c99/signal.py +16 -0
  160. smallworld/state/models/armel/systemv/c99/stdio.py +265 -0
  161. smallworld/state/models/armel/systemv/c99/stdlib.py +169 -0
  162. smallworld/state/models/armel/systemv/c99/string.py +139 -0
  163. smallworld/state/models/armel/systemv/c99/time.py +61 -0
  164. smallworld/state/models/armel/systemv/posix/__init__.py +6 -0
  165. smallworld/state/models/armel/systemv/posix/libgen.py +16 -0
  166. smallworld/state/models/armel/systemv/posix/signal.py +157 -0
  167. smallworld/state/models/armel/systemv/systemv.py +82 -0
  168. smallworld/state/models/armhf/__init__.py +1 -0
  169. smallworld/state/models/armhf/systemv/__init__.py +6 -0
  170. smallworld/state/models/armhf/systemv/c99/__init__.py +12 -0
  171. smallworld/state/models/armhf/systemv/c99/signal.py +16 -0
  172. smallworld/state/models/armhf/systemv/c99/stdio.py +265 -0
  173. smallworld/state/models/armhf/systemv/c99/stdlib.py +169 -0
  174. smallworld/state/models/armhf/systemv/c99/string.py +139 -0
  175. smallworld/state/models/armhf/systemv/c99/time.py +61 -0
  176. smallworld/state/models/armhf/systemv/posix/__init__.py +6 -0
  177. smallworld/state/models/armhf/systemv/posix/libgen.py +16 -0
  178. smallworld/state/models/armhf/systemv/posix/signal.py +157 -0
  179. smallworld/state/models/armhf/systemv/systemv.py +77 -0
  180. smallworld/state/models/c99/__init__.py +12 -0
  181. smallworld/state/models/c99/fmt_print.py +915 -0
  182. smallworld/state/models/c99/fmt_scan.py +864 -0
  183. smallworld/state/models/c99/math.py +362 -0
  184. smallworld/state/models/c99/signal.py +71 -0
  185. smallworld/state/models/c99/stdio.py +1305 -0
  186. smallworld/state/models/c99/stdlib.py +595 -0
  187. smallworld/state/models/c99/string.py +674 -0
  188. smallworld/state/models/c99/time.py +340 -0
  189. smallworld/state/models/c99/utils.py +89 -0
  190. smallworld/state/models/cstd.py +759 -0
  191. smallworld/state/models/errno.py +581 -0
  192. smallworld/state/models/filedesc.py +515 -0
  193. smallworld/state/models/i386/__init__.py +1 -0
  194. smallworld/state/models/i386/systemv/__init__.py +6 -0
  195. smallworld/state/models/i386/systemv/c99/__init__.py +12 -0
  196. smallworld/state/models/i386/systemv/c99/signal.py +16 -0
  197. smallworld/state/models/i386/systemv/c99/stdio.py +265 -0
  198. smallworld/state/models/i386/systemv/c99/stdlib.py +169 -0
  199. smallworld/state/models/i386/systemv/c99/string.py +139 -0
  200. smallworld/state/models/i386/systemv/c99/time.py +61 -0
  201. smallworld/state/models/i386/systemv/posix/__init__.py +6 -0
  202. smallworld/state/models/i386/systemv/posix/libgen.py +16 -0
  203. smallworld/state/models/i386/systemv/posix/signal.py +157 -0
  204. smallworld/state/models/i386/systemv/systemv.py +71 -0
  205. smallworld/state/models/loongarch64/__init__.py +1 -0
  206. smallworld/state/models/loongarch64/systemv/__init__.py +6 -0
  207. smallworld/state/models/loongarch64/systemv/c99/__init__.py +12 -0
  208. smallworld/state/models/loongarch64/systemv/c99/signal.py +16 -0
  209. smallworld/state/models/loongarch64/systemv/c99/stdio.py +265 -0
  210. smallworld/state/models/loongarch64/systemv/c99/stdlib.py +169 -0
  211. smallworld/state/models/loongarch64/systemv/c99/string.py +139 -0
  212. smallworld/state/models/loongarch64/systemv/c99/time.py +61 -0
  213. smallworld/state/models/loongarch64/systemv/posix/__init__.py +6 -0
  214. smallworld/state/models/loongarch64/systemv/posix/libgen.py +16 -0
  215. smallworld/state/models/loongarch64/systemv/posix/signal.py +157 -0
  216. smallworld/state/models/loongarch64/systemv/systemv.py +83 -0
  217. smallworld/state/models/mips/__init__.py +1 -0
  218. smallworld/state/models/mips/systemv/__init__.py +6 -0
  219. smallworld/state/models/mips/systemv/c99/__init__.py +12 -0
  220. smallworld/state/models/mips/systemv/c99/signal.py +16 -0
  221. smallworld/state/models/mips/systemv/c99/stdio.py +265 -0
  222. smallworld/state/models/mips/systemv/c99/stdlib.py +169 -0
  223. smallworld/state/models/mips/systemv/c99/string.py +139 -0
  224. smallworld/state/models/mips/systemv/c99/time.py +61 -0
  225. smallworld/state/models/mips/systemv/posix/__init__.py +6 -0
  226. smallworld/state/models/mips/systemv/posix/libgen.py +16 -0
  227. smallworld/state/models/mips/systemv/posix/signal.py +157 -0
  228. smallworld/state/models/mips/systemv/systemv.py +78 -0
  229. smallworld/state/models/mips64/__init__.py +1 -0
  230. smallworld/state/models/mips64/systemv/__init__.py +6 -0
  231. smallworld/state/models/mips64/systemv/c99/__init__.py +12 -0
  232. smallworld/state/models/mips64/systemv/c99/signal.py +16 -0
  233. smallworld/state/models/mips64/systemv/c99/stdio.py +265 -0
  234. smallworld/state/models/mips64/systemv/c99/stdlib.py +169 -0
  235. smallworld/state/models/mips64/systemv/c99/string.py +139 -0
  236. smallworld/state/models/mips64/systemv/c99/time.py +61 -0
  237. smallworld/state/models/mips64/systemv/posix/__init__.py +6 -0
  238. smallworld/state/models/mips64/systemv/posix/libgen.py +16 -0
  239. smallworld/state/models/mips64/systemv/posix/signal.py +157 -0
  240. smallworld/state/models/mips64/systemv/systemv.py +98 -0
  241. smallworld/state/models/mips64el/__init__.py +1 -0
  242. smallworld/state/models/mips64el/systemv/__init__.py +6 -0
  243. smallworld/state/models/mips64el/systemv/c99/__init__.py +12 -0
  244. smallworld/state/models/mips64el/systemv/c99/signal.py +16 -0
  245. smallworld/state/models/mips64el/systemv/c99/stdio.py +265 -0
  246. smallworld/state/models/mips64el/systemv/c99/stdlib.py +169 -0
  247. smallworld/state/models/mips64el/systemv/c99/string.py +139 -0
  248. smallworld/state/models/mips64el/systemv/c99/time.py +61 -0
  249. smallworld/state/models/mips64el/systemv/posix/__init__.py +6 -0
  250. smallworld/state/models/mips64el/systemv/posix/libgen.py +16 -0
  251. smallworld/state/models/mips64el/systemv/posix/signal.py +157 -0
  252. smallworld/state/models/mips64el/systemv/systemv.py +96 -0
  253. smallworld/state/models/mipsel/__init__.py +1 -0
  254. smallworld/state/models/mipsel/systemv/__init__.py +6 -0
  255. smallworld/state/models/mipsel/systemv/c99/__init__.py +12 -0
  256. smallworld/state/models/mipsel/systemv/c99/signal.py +16 -0
  257. smallworld/state/models/mipsel/systemv/c99/stdio.py +265 -0
  258. smallworld/state/models/mipsel/systemv/c99/stdlib.py +169 -0
  259. smallworld/state/models/mipsel/systemv/c99/string.py +139 -0
  260. smallworld/state/models/mipsel/systemv/c99/time.py +61 -0
  261. smallworld/state/models/mipsel/systemv/posix/__init__.py +6 -0
  262. smallworld/state/models/mipsel/systemv/posix/libgen.py +16 -0
  263. smallworld/state/models/mipsel/systemv/posix/signal.py +157 -0
  264. smallworld/state/models/mipsel/systemv/systemv.py +78 -0
  265. smallworld/state/models/model.py +27 -2
  266. smallworld/state/models/posix/__init__.py +6 -0
  267. smallworld/state/models/posix/libgen.py +123 -0
  268. smallworld/state/models/posix/signal.py +690 -0
  269. smallworld/state/models/powerpc/__init__.py +1 -0
  270. smallworld/state/models/powerpc/systemv/__init__.py +6 -0
  271. smallworld/state/models/powerpc/systemv/c99/__init__.py +12 -0
  272. smallworld/state/models/powerpc/systemv/c99/signal.py +16 -0
  273. smallworld/state/models/powerpc/systemv/c99/stdio.py +265 -0
  274. smallworld/state/models/powerpc/systemv/c99/stdlib.py +169 -0
  275. smallworld/state/models/powerpc/systemv/c99/string.py +139 -0
  276. smallworld/state/models/powerpc/systemv/c99/time.py +61 -0
  277. smallworld/state/models/powerpc/systemv/posix/__init__.py +6 -0
  278. smallworld/state/models/powerpc/systemv/posix/libgen.py +16 -0
  279. smallworld/state/models/powerpc/systemv/posix/signal.py +157 -0
  280. smallworld/state/models/powerpc/systemv/systemv.py +93 -0
  281. smallworld/state/models/riscv64/__init__.py +1 -0
  282. smallworld/state/models/riscv64/systemv/__init__.py +6 -0
  283. smallworld/state/models/riscv64/systemv/c99/__init__.py +12 -0
  284. smallworld/state/models/riscv64/systemv/c99/signal.py +16 -0
  285. smallworld/state/models/riscv64/systemv/c99/stdio.py +265 -0
  286. smallworld/state/models/riscv64/systemv/c99/stdlib.py +169 -0
  287. smallworld/state/models/riscv64/systemv/c99/string.py +139 -0
  288. smallworld/state/models/riscv64/systemv/c99/time.py +61 -0
  289. smallworld/state/models/riscv64/systemv/posix/__init__.py +6 -0
  290. smallworld/state/models/riscv64/systemv/posix/libgen.py +16 -0
  291. smallworld/state/models/riscv64/systemv/posix/signal.py +157 -0
  292. smallworld/state/models/riscv64/systemv/systemv.py +85 -0
  293. smallworld/state/state.py +65 -24
  294. smallworld/state/unstable/elf.py +16 -31
  295. smallworld/utils.py +6 -1
  296. {smallworld_re-1.0.3.dist-info → smallworld_re-2.0.0.dist-info}/METADATA +74 -42
  297. smallworld_re-2.0.0.dist-info/RECORD +374 -0
  298. {smallworld_re-1.0.3.dist-info → smallworld_re-2.0.0.dist-info}/WHEEL +1 -1
  299. smallworld/state/models/x86/__init__.py +0 -2
  300. smallworld/state/models/x86/microsoftcdecl.py +0 -35
  301. smallworld/state/models/x86/systemv.py +0 -240
  302. smallworld_re-1.0.3.dist-info/RECORD +0 -166
  303. /smallworld/state/models/{posix.py → _posix.py} +0 -0
  304. {smallworld_re-1.0.3.dist-info → smallworld_re-2.0.0.dist-info}/entry_points.txt +0 -0
  305. {smallworld_re-1.0.3.dist-info → smallworld_re-2.0.0.dist-info}/licenses/LICENSE.txt +0 -0
  306. {smallworld_re-1.0.3.dist-info → smallworld_re-2.0.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,321 @@
1
+ import typing
2
+
3
+ import capstone
4
+
5
+ from ..platforms import Architecture, Byteorder
6
+ from .platformdef import PlatformDef, RegisterAliasDef, RegisterDef
7
+
8
+ # NOTE: mips32 has two major ISA variants.
9
+ #
10
+ # The Debian standard is built around mips32r2.
11
+ #
12
+ # There's a newer specification mips32r6 that adds and deprecates
13
+ # a number of instructions, amongst other changes.
14
+ #
15
+ # There are older ISA variants that are still in use
16
+ # because no one updates their hardware.
17
+ #
18
+ # This definition will focus on mips32r2
19
+ # If you need support for r6, please submit a ticket.
20
+
21
+ # NOTE: MIPS registers don't really have canonical uses, or canonical names.
22
+ # Their names are assigned based on the purpose they serve
23
+ # in a specific ABI.
24
+ #
25
+ # Thus far, I've found two mips32 ABIs:
26
+ #
27
+ # o32 is the original ABI. It assigns four argument registers.
28
+ #
29
+ # n32 is a back-port of the n64 ABI, which assigns eight argument registers.
30
+ # This one's not super-popular.
31
+
32
+
33
+ class MIPSO32PlatformDef(PlatformDef):
34
+ # Abstract MIPS platform definition based on the o32 ABI.
35
+ architecture = Architecture.MIPS32
36
+
37
+ address_size = 4
38
+
39
+ capstone_arch = capstone.CS_ARCH_MIPS
40
+ capstone_mode = capstone.CS_MODE_MIPS32
41
+
42
+ conditional_branch_mnemonics = {
43
+ # Conditional branch
44
+ "beq",
45
+ "bne",
46
+ "bgez",
47
+ "bgtz",
48
+ "blez",
49
+ "bltz",
50
+ # Conditional branch-and-link
51
+ "bgezal",
52
+ "bltzal"
53
+ # Likely conditional branch
54
+ # Skip the delay slot if they are not taken.
55
+ "beql",
56
+ "bnel",
57
+ "bgezl",
58
+ "bgtzl",
59
+ "blezl",
60
+ "bltzl",
61
+ # Likely conditional branch-and-link
62
+ # Skip the delay slot if they are not taken
63
+ "bgezall",
64
+ "bltzall",
65
+ }
66
+
67
+ compare_mnemonics = {
68
+ # MIPS doesn't really have integer comparison instructions
69
+ # All of the conditional branches include a comparsion
70
+ # relative to zero; the compiler needs to reduce
71
+ # all conditional tests to comparisons against zero.
72
+ # Floating-point comparison
73
+ # Save to FCC
74
+ # NOTE: Unlike branches, compares only support eq, lt, and le
75
+ "c.eq.s",
76
+ "c.eq.d",
77
+ "c.eq.ps",
78
+ "c.lt.s",
79
+ "c.lt.d",
80
+ "c.lt.ps",
81
+ "c.le.s",
82
+ "c.le.d",
83
+ "c.le.ps",
84
+ # Floating-point comparison
85
+ # Save to FPR
86
+ "cmp.eq.s",
87
+ "cmp.eq.d",
88
+ "cmp.eq.ps",
89
+ "cmp.lt.s",
90
+ "cmp.lt.d",
91
+ "cmp.lt.ps",
92
+ "cmp.le.s",
93
+ "cmp.le.d",
94
+ "cmp.le.ps",
95
+ }
96
+
97
+ pc_register = "pc"
98
+ sp_register = "sp"
99
+
100
+ # Special registers
101
+ # zero: Hard-wired to zero
102
+ # at: Reserved for assembler
103
+ # sp: Stack pointer
104
+ # gp: Global pointer
105
+ # kX: Reserved for kernel on most platforms
106
+ # fX: Floating-point registers
107
+ # aX: Accumulator registers used in multiplication
108
+ general_purpose_registers = [
109
+ "v0",
110
+ "v1",
111
+ "a0",
112
+ "a1",
113
+ "a2",
114
+ "a3",
115
+ "t0",
116
+ "t1",
117
+ "t2",
118
+ "t3",
119
+ "t4",
120
+ "t5",
121
+ "t6",
122
+ "t7",
123
+ "t8",
124
+ "t9",
125
+ "s0",
126
+ "s1",
127
+ "s2",
128
+ "s3",
129
+ "s4",
130
+ "s5",
131
+ "s6",
132
+ "s7",
133
+ "s8",
134
+ ]
135
+
136
+ @property
137
+ def registers(self) -> typing.Dict[str, RegisterDef]:
138
+ return self._registers
139
+
140
+ def __init__(self):
141
+ # For analysis purposes, the
142
+ self._registers = {
143
+ # *** General-Purpose Registers ***
144
+ # Assembler-Temporary Register
145
+ "at": RegisterDef(name="at", size=4),
146
+ "1": RegisterAliasDef(name="1", parent="at", size=4, offset=0),
147
+ # Return Value Registers
148
+ "v0": RegisterDef(name="v0", size=4),
149
+ "2": RegisterAliasDef(name="2", parent="v0", size=4, offset=0),
150
+ "v1": RegisterDef(name="v1", size=4),
151
+ "3": RegisterAliasDef(name="3", parent="v1", size=4, offset=0),
152
+ # Argument Registers
153
+ "a0": RegisterDef(name="a0", size=4),
154
+ "4": RegisterAliasDef(name="4", parent="a0", size=4, offset=0),
155
+ "a1": RegisterDef(name="a1", size=4),
156
+ "5": RegisterAliasDef(name="5", parent="a1", size=4, offset=0),
157
+ "a2": RegisterDef(name="a2", size=4),
158
+ "6": RegisterAliasDef(name="6", parent="a2", size=4, offset=0),
159
+ "a3": RegisterDef(name="a3", size=4),
160
+ "7": RegisterAliasDef(name="7", parent="a3", size=4, offset=0),
161
+ # Temporary Registers
162
+ "t0": RegisterDef(name="t0", size=4),
163
+ "8": RegisterAliasDef(name="8", parent="t0", size=4, offset=0),
164
+ "t1": RegisterDef(name="t1", size=4),
165
+ "9": RegisterAliasDef(name="9", parent="t1", size=4, offset=0),
166
+ "t2": RegisterDef(name="t2", size=4),
167
+ "10": RegisterAliasDef(name="10", parent="t2", size=4, offset=0),
168
+ "t3": RegisterDef(name="t3", size=4),
169
+ "11": RegisterAliasDef(name="11", parent="t3", size=4, offset=0),
170
+ "t4": RegisterDef(name="t4", size=4),
171
+ "12": RegisterAliasDef(name="12", parent="t4", size=4, offset=0),
172
+ "t5": RegisterDef(name="t5", size=4),
173
+ "13": RegisterAliasDef(name="13", parent="t5", size=4, offset=0),
174
+ "t6": RegisterDef(name="t6", size=4),
175
+ "14": RegisterAliasDef(name="14", parent="t6", size=4, offset=0),
176
+ "t7": RegisterDef(name="t7", size=4),
177
+ "15": RegisterAliasDef(name="15", parent="t7", size=4, offset=0),
178
+ # NOTE: These numbers aren't out of order.
179
+ # t8 and t9 are later in the register file than t0 - t7.
180
+ "t8": RegisterDef(name="t8", size=4),
181
+ "24": RegisterAliasDef(name="24", parent="t8", size=4, offset=0),
182
+ "t9": RegisterDef(name="t9", size=4),
183
+ "25": RegisterAliasDef(name="25", parent="t9", size=4, offset=0),
184
+ # Saved Registers
185
+ "s0": RegisterDef(name="s0", size=4),
186
+ "16": RegisterAliasDef(name="16", parent="s0", size=4, offset=0),
187
+ "s1": RegisterDef(name="s1", size=4),
188
+ "17": RegisterAliasDef(name="17", parent="s1", size=4, offset=0),
189
+ "s2": RegisterDef(name="s2", size=4),
190
+ "18": RegisterAliasDef(name="18", parent="s2", size=4, offset=0),
191
+ "s3": RegisterDef(name="s3", size=4),
192
+ "19": RegisterAliasDef(name="19", parent="s3", size=4, offset=0),
193
+ "s4": RegisterDef(name="s4", size=4),
194
+ "20": RegisterAliasDef(name="20", parent="s4", size=4, offset=0),
195
+ "s5": RegisterDef(name="s5", size=4),
196
+ "21": RegisterAliasDef(name="21", parent="s5", size=4, offset=0),
197
+ "s6": RegisterDef(name="s6", size=4),
198
+ "22": RegisterAliasDef(name="22", parent="s6", size=4, offset=0),
199
+ "s7": RegisterDef(name="s7", size=4),
200
+ "23": RegisterAliasDef(name="23", parent="s7", size=4, offset=0),
201
+ # NOTE: Register #30 was originally the Frame Pointer.
202
+ # It's been re-aliased as s8, since many ABIs don't use the frame pointer.
203
+ # Unicorn and Sleigh prefer to use the alias s8,
204
+ # so it should be the base register.
205
+ "s8": RegisterDef(name="s8", size=4),
206
+ "fp": RegisterAliasDef(name="fp", parent="s8", size=4, offset=0),
207
+ "30": RegisterAliasDef(name="30", parent="s8", size=4, offset=0),
208
+ # Kernel-reserved Registers
209
+ "k0": RegisterDef(name="k0", size=4),
210
+ "26": RegisterAliasDef(name="26", parent="k0", size=4, offset=0),
211
+ "k1": RegisterDef(name="k1", size=4),
212
+ "27": RegisterAliasDef(name="27", parent="k1", size=4, offset=0),
213
+ # *** Pointer Registers ***
214
+ # Zero register
215
+ "zero": RegisterDef(name="zero", size=4),
216
+ "0": RegisterAliasDef(name="0", parent="zero", size=4, offset=0),
217
+ # Global Offset Pointer
218
+ "gp": RegisterDef(name="gp", size=4),
219
+ "28": RegisterAliasDef(name="28", parent="gp", size=4, offset=0),
220
+ # Stack Pointer
221
+ "sp": RegisterDef(name="sp", size=4),
222
+ "29": RegisterAliasDef(name="29", parent="sp", size=4, offset=0),
223
+ # Return Address
224
+ "ra": RegisterDef(name="ra", size=4),
225
+ "31": RegisterAliasDef(name="31", parent="ra", size=4, offset=0),
226
+ # Program Counter
227
+ "pc": RegisterDef(name="pc", size=4),
228
+ # NOTE: MIPS has no ALU flags or status register
229
+ # It doesn't have a non-privileged status register,
230
+ # and the conditional tests write the result to a general register.
231
+ # *** Floating Point Registers ***
232
+ "f0": RegisterDef(name="f0", size=8),
233
+ "f1": RegisterDef(name="f1", size=8),
234
+ "f2": RegisterDef(name="f2", size=8),
235
+ "f3": RegisterDef(name="f3", size=8),
236
+ "f4": RegisterDef(name="f4", size=8),
237
+ "f5": RegisterDef(name="f5", size=8),
238
+ "f6": RegisterDef(name="f6", size=8),
239
+ "f7": RegisterDef(name="f7", size=8),
240
+ "f8": RegisterDef(name="f8", size=8),
241
+ "f9": RegisterDef(name="f9", size=8),
242
+ "f10": RegisterDef(name="f10", size=8),
243
+ "f11": RegisterDef(name="f11", size=8),
244
+ "f12": RegisterDef(name="f12", size=8),
245
+ "f13": RegisterDef(name="f13", size=8),
246
+ "f14": RegisterDef(name="f14", size=8),
247
+ "f15": RegisterDef(name="f15", size=8),
248
+ "f16": RegisterDef(name="f16", size=8),
249
+ "f17": RegisterDef(name="f17", size=8),
250
+ "f18": RegisterDef(name="f18", size=8),
251
+ "f19": RegisterDef(name="f19", size=8),
252
+ "f20": RegisterDef(name="f20", size=8),
253
+ "f21": RegisterDef(name="f21", size=8),
254
+ "f22": RegisterDef(name="f22", size=8),
255
+ "f23": RegisterDef(name="f23", size=8),
256
+ "f24": RegisterDef(name="f24", size=8),
257
+ "f25": RegisterDef(name="f25", size=8),
258
+ "f26": RegisterDef(name="f26", size=8),
259
+ "f27": RegisterDef(name="f27", size=8),
260
+ "f28": RegisterDef(name="f28", size=8),
261
+ "f29": RegisterDef(name="f29", size=8),
262
+ "f30": RegisterDef(name="f30", size=8),
263
+ "f31": RegisterDef(name="f31", size=8),
264
+ # *** Floating Point Control Registers ***
265
+ "fir": RegisterDef(name="fir", size=4),
266
+ "fcsr": RegisterDef(name="fcsr", size=4),
267
+ "fexr": RegisterDef(name="fexr", size=4),
268
+ "fenr": RegisterDef(name="fenr", size=4),
269
+ "fccr": RegisterDef(name="fccr", size=4),
270
+ # TODO: MIPS has a boatload of extensions with their own registers.
271
+ }
272
+
273
+
274
+ class MIPS32EL(MIPSO32PlatformDef):
275
+ byteorder = Byteorder.LITTLE
276
+
277
+ def __init__(self):
278
+ super().__init__()
279
+ self._registers |= {
280
+ # *** Accumulator Registers ***
281
+ # MIPS uses these to implement 64-bit results
282
+ # from 32-bit multiplication, amongst others.
283
+ "ac0": RegisterDef(name="ac0", size=8),
284
+ "lo0": RegisterAliasDef(name="lo0", parent="ac0", size=4, offset=0),
285
+ "hi0": RegisterAliasDef(name="hi0", parent="ac0", size=4, offset=4),
286
+ "ac1": RegisterDef(name="ac1", size=8),
287
+ "lo1": RegisterAliasDef(name="lo1", parent="ac1", size=4, offset=0),
288
+ "hi1": RegisterAliasDef(name="hi1", parent="ac1", size=4, offset=4),
289
+ "ac2": RegisterDef(name="ac2", size=8),
290
+ "lo2": RegisterAliasDef(name="lo2", parent="ac2", size=4, offset=0),
291
+ "hi2": RegisterAliasDef(name="hi2", parent="ac2", size=4, offset=4),
292
+ "ac3": RegisterDef(name="ac3", size=8),
293
+ "lo3": RegisterAliasDef(name="lo3", parent="ac3", size=4, offset=0),
294
+ "hi3": RegisterAliasDef(name="hi3", parent="ac3", size=4, offset=4),
295
+ }
296
+
297
+
298
+ class MIPS32BE(MIPSO32PlatformDef):
299
+ byteorder = Byteorder.BIG
300
+
301
+ capstone_mode = capstone.CS_MODE_MIPS32 | capstone.CS_MODE_BIG_ENDIAN
302
+
303
+ def __init__(self):
304
+ super().__init__()
305
+ self._registers |= {
306
+ # *** Accumulator Registers ***
307
+ # MIPS uses these to implement 64-bit results
308
+ # from 32-bit multiplication, amongst others.
309
+ "ac0": RegisterDef(name="ac0", size=8),
310
+ "hi0": RegisterAliasDef(name="hi0", parent="ac0", size=4, offset=0),
311
+ "lo0": RegisterAliasDef(name="lo0", parent="ac0", size=4, offset=4),
312
+ "ac1": RegisterDef(name="ac1", size=8),
313
+ "hi1": RegisterAliasDef(name="hi1", parent="ac1", size=4, offset=0),
314
+ "lo1": RegisterAliasDef(name="lo1", parent="ac1", size=4, offset=4),
315
+ "ac2": RegisterDef(name="ac2", size=8),
316
+ "hi2": RegisterAliasDef(name="hi2", parent="ac2", size=4, offset=0),
317
+ "lo2": RegisterAliasDef(name="lo2", parent="ac2", size=4, offset=4),
318
+ "ac3": RegisterDef(name="ac3", size=8),
319
+ "hi3": RegisterAliasDef(name="hi3", parent="ac3", size=4, offset=0),
320
+ "lo3": RegisterAliasDef(name="lo3", parent="ac3", size=4, offset=4),
321
+ }
@@ -0,0 +1,313 @@
1
+ import typing
2
+
3
+ import capstone
4
+
5
+ from ..platforms import Architecture, Byteorder
6
+ from .platformdef import PlatformDef, RegisterAliasDef, RegisterDef
7
+
8
+ # NOTE: mips64 has two major ISA variants.
9
+ #
10
+ # The Debian standard is built around mips64r2
11
+ #
12
+ # There's a newer specification mips64r6 that adds and deprecates
13
+ # a number of instructions, amongst other changes.
14
+ #
15
+ # This definition will focus on mips64r2
16
+ # If you need support for r6, please submit a ticket.
17
+
18
+
19
+ # MIPS registers don't really have canonical uses, or canonical names.
20
+ # Their names are assigned based on the purpose they serve
21
+ # in a specific ABI.
22
+ #
23
+ # Thus far, I've found three mips64 ABIs:
24
+ #
25
+ # n64 is the original 64-bit ABI (designed for the Nintendo 64).
26
+ # It allows for up to eight argument registers,
27
+ # at the cost of fewer temporary registers.
28
+ #
29
+ # o64 is a forward-port of the o32 ABI used by mips32.
30
+ #
31
+ # There's another GNU ABI that's similar to n64,
32
+ # but renames the remaining temporary registers differently.
33
+ # (The docs for this one were hosted by SGI, and are tricky to find online.)
34
+
35
+
36
+ class MIPSN64PlatformDef(PlatformDef):
37
+ # Abstract MIPS64 platform definition based on the n64 ABI.
38
+ architecture = Architecture.MIPS64
39
+
40
+ address_size = 8
41
+
42
+ capstone_arch = capstone.CS_ARCH_MIPS
43
+ capstone_mode = capstone.CS_MODE_MIPS64
44
+
45
+ conditional_branch_mnemonics = {
46
+ # Conditional branch
47
+ "beq",
48
+ "bne",
49
+ "bgez",
50
+ "bgtz",
51
+ "blez",
52
+ "bltz",
53
+ # Conditional branch-and-link
54
+ "bgezal",
55
+ "bltzal"
56
+ # Likely conditional branch
57
+ # Skip the delay slot if they are not taken.
58
+ "beql",
59
+ "bnel",
60
+ "bgezl",
61
+ "bgtzl",
62
+ "blezl",
63
+ "bltzl",
64
+ # Likely conditional branch-and-link
65
+ # Skip the delay slot if they are not taken
66
+ "bgezall",
67
+ "bltzall",
68
+ }
69
+
70
+ compare_mnemonics = {
71
+ # MIPS doesn't really have integer comparison instructions
72
+ # All of the conditional branches include a comparsion
73
+ # relative to zero; the compiler needs to reduce
74
+ # all conditional tests to comparisons against zero.
75
+ # Floating-point comparison
76
+ # Save to FCC
77
+ # NOTE: Unlike branches, compares only support eq, lt, and le
78
+ "c.eq.s",
79
+ "c.eq.d",
80
+ "c.eq.ps",
81
+ "c.lt.s",
82
+ "c.lt.d",
83
+ "c.lt.ps",
84
+ "c.le.s",
85
+ "c.le.d",
86
+ "c.le.ps",
87
+ # Floating-point comparison
88
+ # Save to FPR
89
+ "cmp.eq.s",
90
+ "cmp.eq.d",
91
+ "cmp.eq.ps",
92
+ "cmp.lt.s",
93
+ "cmp.lt.d",
94
+ "cmp.lt.ps",
95
+ "cmp.le.s",
96
+ "cmp.le.d",
97
+ "cmp.le.ps",
98
+ }
99
+
100
+ pc_register = "pc"
101
+ sp_register = "sp"
102
+
103
+ general_purpose_registers = [
104
+ "v0",
105
+ "v1",
106
+ "a0",
107
+ "a1",
108
+ "a2",
109
+ "a3",
110
+ "a4",
111
+ "a5",
112
+ "a6",
113
+ "a7",
114
+ "t0",
115
+ "t1",
116
+ "t2",
117
+ "t3",
118
+ "t4",
119
+ "t8",
120
+ "t9",
121
+ "s0",
122
+ "s1",
123
+ "s2",
124
+ "s3",
125
+ "s4",
126
+ "s5",
127
+ "s6",
128
+ "s7",
129
+ "s8",
130
+ ]
131
+
132
+ @property
133
+ def registers(self) -> typing.Dict[str, RegisterDef]:
134
+ return self._registers
135
+
136
+ def __init__(self):
137
+ super().__init__()
138
+ self._registers = {
139
+ # *** General-Purpose Registers ***
140
+ # Assembler-Temporary Register
141
+ "at": RegisterDef(name="at", size=8),
142
+ "1": RegisterAliasDef(name="1", parent="at", size=8, offset=0),
143
+ # Return Value Registers
144
+ "v0": RegisterDef(name="v0", size=8),
145
+ "2": RegisterAliasDef(name="2", parent="v0", size=8, offset=0),
146
+ "v1": RegisterDef(name="v1", size=8),
147
+ "3": RegisterAliasDef(name="3", parent="v1", size=8, offset=0),
148
+ # Argument Registers
149
+ "a0": RegisterDef(name="a0", size=8),
150
+ "4": RegisterAliasDef(name="4", parent="a0", size=8, offset=0),
151
+ "a1": RegisterDef(name="a1", size=8),
152
+ "5": RegisterAliasDef(name="5", parent="a1", size=8, offset=0),
153
+ "a2": RegisterDef(name="a2", size=8),
154
+ "6": RegisterAliasDef(name="6", parent="a2", size=8, offset=0),
155
+ "a3": RegisterDef(name="a3", size=8),
156
+ "7": RegisterAliasDef(name="7", parent="a3", size=8, offset=0),
157
+ "a4": RegisterDef(name="a4", size=8),
158
+ "8": RegisterAliasDef(name="8", parent="a4", size=8, offset=0),
159
+ "a5": RegisterDef(name="a5", size=8),
160
+ "9": RegisterAliasDef(name="9", parent="a5", size=8, offset=0),
161
+ "a6": RegisterDef(name="a6", size=8),
162
+ "10": RegisterAliasDef(name="10", parent="a6", size=8, offset=0),
163
+ "a7": RegisterDef(name="a7", size=8),
164
+ "11": RegisterAliasDef(name="11", parent="a7", size=8, offset=0),
165
+ # Temporary Registers
166
+ "t0": RegisterDef(name="t0", size=8),
167
+ "12": RegisterAliasDef(name="12", parent="t0", size=8, offset=0),
168
+ "t1": RegisterDef(name="t1", size=8),
169
+ "13": RegisterAliasDef(name="13", parent="t1", size=8, offset=0),
170
+ "t2": RegisterDef(name="t2", size=8),
171
+ "14": RegisterAliasDef(name="14", parent="t2", size=8, offset=0),
172
+ "t3": RegisterDef(name="t3", size=8),
173
+ "15": RegisterAliasDef(name="15", parent="t3", size=8, offset=0),
174
+ # NOTE: These numbers aren't out of order.
175
+ # t8 and t9 are later in the register file than t0 - t3.
176
+ # The gap is also intentional; t4 - t7 were sacrificed
177
+ # to make room for a4 - a7
178
+ "t8": RegisterDef(name="t8", size=8),
179
+ "24": RegisterAliasDef(name="24", parent="t8", size=8, offset=0),
180
+ "t9": RegisterDef(name="t9", size=8),
181
+ "25": RegisterAliasDef(name="25", parent="t9", size=8, offset=0),
182
+ # Saved Registers
183
+ "s0": RegisterDef(name="s0", size=8),
184
+ "16": RegisterAliasDef(name="16", parent="s0", size=8, offset=0),
185
+ "s1": RegisterDef(name="s1", size=8),
186
+ "17": RegisterAliasDef(name="17", parent="s1", size=8, offset=0),
187
+ "s2": RegisterDef(name="s2", size=8),
188
+ "18": RegisterAliasDef(name="18", parent="s2", size=8, offset=0),
189
+ "s3": RegisterDef(name="s3", size=8),
190
+ "19": RegisterAliasDef(name="19", parent="s3", size=8, offset=0),
191
+ "s4": RegisterDef(name="s4", size=8),
192
+ "20": RegisterAliasDef(name="20", parent="s4", size=8, offset=0),
193
+ "s5": RegisterDef(name="s5", size=8),
194
+ "21": RegisterAliasDef(name="21", parent="s5", size=8, offset=0),
195
+ "s6": RegisterDef(name="s6", size=8),
196
+ "22": RegisterAliasDef(name="22", parent="s6", size=8, offset=0),
197
+ "s7": RegisterDef(name="s7", size=8),
198
+ "23": RegisterAliasDef(name="23", parent="s7", size=8, offset=0),
199
+ # NOTE: Register #30 was originally the Frame Pointer.
200
+ # It's been re-aliased as s8, since many ABIs don't use the frame pointer.
201
+ "s8": RegisterDef(name="s8", size=8),
202
+ "fp": RegisterAliasDef(name="fp", parent="s8", size=8, offset=0),
203
+ "30": RegisterAliasDef(name="30", parent="s8", size=8, offset=0),
204
+ # Kernel-reserved Registers
205
+ "k0": RegisterDef(name="k0", size=8),
206
+ "26": RegisterAliasDef(name="26", parent="k0", size=8, offset=0),
207
+ "k1": RegisterDef(name="k1", size=8),
208
+ "27": RegisterAliasDef(name="27", parent="k1", size=8, offset=0),
209
+ # *** Pointer Registers ***
210
+ # Zero register
211
+ "zero": RegisterDef(name="zero", size=8),
212
+ "0": RegisterAliasDef(name="0", parent="zero", size=8, offset=0),
213
+ # Global Offset Pointer
214
+ "gp": RegisterDef(name="gp", size=8),
215
+ "28": RegisterAliasDef(name="28", parent="gp", size=8, offset=0),
216
+ # Stack Pointer
217
+ "sp": RegisterDef(name="sp", size=8),
218
+ "29": RegisterAliasDef(name="29", parent="sp", size=8, offset=0),
219
+ # Return Address
220
+ "ra": RegisterDef(name="ra", size=8),
221
+ "31": RegisterAliasDef(name="31", parent="ra", size=8, offset=0),
222
+ # Program Counter
223
+ "pc": RegisterDef(name="pc", size=8),
224
+ # *** Floating Point Registers ***
225
+ "f1": RegisterDef(name="f1", size=8),
226
+ "f0": RegisterDef(name="f0", size=8),
227
+ "f3": RegisterDef(name="f3", size=8),
228
+ "f2": RegisterDef(name="f2", size=8),
229
+ "f5": RegisterDef(name="f5", size=8),
230
+ "f4": RegisterDef(name="f4", size=8),
231
+ "f7": RegisterDef(name="f7", size=8),
232
+ "f6": RegisterDef(name="f6", size=8),
233
+ "f9": RegisterDef(name="f9", size=8),
234
+ "f8": RegisterDef(name="f8", size=8),
235
+ "f11": RegisterDef(name="f11", size=8),
236
+ "f10": RegisterDef(name="f10", size=8),
237
+ "f13": RegisterDef(name="f13", size=8),
238
+ "f12": RegisterDef(name="f12", size=8),
239
+ "f15": RegisterDef(name="f15", size=8),
240
+ "f14": RegisterDef(name="f14", size=8),
241
+ "f17": RegisterDef(name="f17", size=8),
242
+ "f16": RegisterDef(name="f16", size=8),
243
+ "f19": RegisterDef(name="f19", size=8),
244
+ "f18": RegisterDef(name="f18", size=8),
245
+ "f21": RegisterDef(name="f21", size=8),
246
+ "f20": RegisterDef(name="f20", size=8),
247
+ "f23": RegisterDef(name="f23", size=8),
248
+ "f22": RegisterDef(name="f22", size=8),
249
+ "f25": RegisterDef(name="f25", size=8),
250
+ "f24": RegisterDef(name="f24", size=8),
251
+ "f27": RegisterDef(name="f27", size=8),
252
+ "f26": RegisterDef(name="f26", size=8),
253
+ "f29": RegisterDef(name="f29", size=8),
254
+ "f28": RegisterDef(name="f28", size=8),
255
+ "f31": RegisterDef(name="f31", size=8),
256
+ "f30": RegisterDef(name="f30", size=8),
257
+ # *** Floating Point Control Registers ***
258
+ "fir": RegisterDef(name="fir", size=4),
259
+ "fcsr": RegisterDef(name="fcsr", size=4),
260
+ "fexr": RegisterDef(name="fexr", size=4),
261
+ "fenr": RegisterDef(name="fenr", size=4),
262
+ "fccr": RegisterDef(name="fccr", size=4),
263
+ }
264
+
265
+
266
+ class MIPS64EL(MIPSN64PlatformDef):
267
+ byteorder = Byteorder.LITTLE
268
+
269
+ def __init__(self):
270
+ super().__init__()
271
+ self._registers |= {
272
+ # *** Accumulator Registers ***
273
+ # MIPS uses these to implement 128-bit results
274
+ # from 64-bit multiplication, amongst others.
275
+ "ac0": RegisterDef(name="ac0", size=16),
276
+ "lo0": RegisterAliasDef(name="lo0", parent="ac0", size=8, offset=0),
277
+ "hi0": RegisterAliasDef(name="hi0", parent="ac0", size=8, offset=8),
278
+ "ac1": RegisterDef(name="ac1", size=16),
279
+ "lo1": RegisterAliasDef(name="lo1", parent="ac1", size=8, offset=0),
280
+ "hi1": RegisterAliasDef(name="hi1", parent="ac1", size=8, offset=8),
281
+ "ac2": RegisterDef(name="ac2", size=16),
282
+ "lo2": RegisterAliasDef(name="lo2", parent="ac2", size=8, offset=0),
283
+ "hi2": RegisterAliasDef(name="hi2", parent="ac2", size=8, offset=8),
284
+ "ac3": RegisterDef(name="ac3", size=16),
285
+ "lo3": RegisterAliasDef(name="lo3", parent="ac3", size=8, offset=0),
286
+ "hi3": RegisterAliasDef(name="hi3", parent="ac3", size=8, offset=8),
287
+ }
288
+
289
+
290
+ class MIPS64BE(MIPSN64PlatformDef):
291
+ byteorder = Byteorder.BIG
292
+
293
+ capstone_mode = capstone.CS_MODE_MIPS64 | capstone.CS_MODE_BIG_ENDIAN
294
+
295
+ def __init__(self):
296
+ super().__init__()
297
+ self._registers |= {
298
+ # *** Accumulator Registers ***
299
+ # MIPS uses these to implement 128-bit results
300
+ # from 64-bit multiplication, amongst others.
301
+ "ac0": RegisterDef(name="ac0", size=16),
302
+ "hi0": RegisterAliasDef(name="hi0", parent="ac0", size=8, offset=0),
303
+ "lo0": RegisterAliasDef(name="lo0", parent="ac0", size=8, offset=8),
304
+ "ac1": RegisterDef(name="ac1", size=16),
305
+ "hi1": RegisterAliasDef(name="hi1", parent="ac1", size=8, offset=0),
306
+ "lo1": RegisterAliasDef(name="lo1", parent="ac1", size=8, offset=8),
307
+ "ac2": RegisterDef(name="ac2", size=16),
308
+ "hi2": RegisterAliasDef(name="hi2", parent="ac2", size=8, offset=0),
309
+ "lo2": RegisterAliasDef(name="lo2", parent="ac2", size=8, offset=8),
310
+ "ac3": RegisterDef(name="ac3", size=16),
311
+ "hi3": RegisterAliasDef(name="hi3", parent="ac3", size=8, offset=0),
312
+ "lo3": RegisterAliasDef(name="lo3", parent="ac3", size=8, offset=8),
313
+ }