smallworld-re 1.0.2__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 +44 -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 +225 -61
  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.2.dist-info → smallworld_re-2.0.0.dist-info}/METADATA +76 -43
  297. smallworld_re-2.0.0.dist-info/RECORD +374 -0
  298. {smallworld_re-1.0.2.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.2.dist-info/RECORD +0 -166
  303. /smallworld/state/models/{posix.py → _posix.py} +0 -0
  304. {smallworld_re-1.0.2.dist-info → smallworld_re-2.0.0.dist-info}/entry_points.txt +0 -0
  305. {smallworld_re-1.0.2.dist-info → smallworld_re-2.0.0.dist-info/licenses}/LICENSE.txt +0 -0
  306. {smallworld_re-1.0.2.dist-info → smallworld_re-2.0.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,258 @@
1
+ import capstone
2
+
3
+ from ..platforms import Architecture, Byteorder
4
+ from .platformdef import PlatformDef, RegisterAliasDef, RegisterDef
5
+
6
+
7
+ class I386(PlatformDef):
8
+ architecture = Architecture.X86_32
9
+ byteorder = Byteorder.LITTLE
10
+
11
+ address_size = 4
12
+
13
+ capstone_arch = capstone.CS_ARCH_X86
14
+ capstone_mode = capstone.CS_MODE_32
15
+
16
+ conditional_branch_mnemonics = {
17
+ # All 57 varieties of Jcc opcode
18
+ "jo",
19
+ "jno",
20
+ "jb",
21
+ "jnae",
22
+ "jc",
23
+ "jnb",
24
+ "jae",
25
+ "jnc",
26
+ "jz",
27
+ "je",
28
+ "jnz",
29
+ "jne",
30
+ "jbe",
31
+ "jna",
32
+ "jnbe",
33
+ "ja",
34
+ "js",
35
+ "jns",
36
+ "jp",
37
+ "jpe",
38
+ "jnp",
39
+ "jpo",
40
+ "jl",
41
+ "jnge",
42
+ "jnl",
43
+ "jge",
44
+ "jle",
45
+ "jng",
46
+ "jnle",
47
+ "jg",
48
+ # Jump if (re)?cx is zero
49
+ # Oddly I can't find this in the opcode tables;
50
+ # it's mentioned tangentially in the docs for Jcc
51
+ # (and it's accepted by the assembler.)
52
+ "jrcxz",
53
+ "jecxz",
54
+ "jcxz",
55
+ }
56
+ # TODO: Should arithmetic operations that impact flags be compares?
57
+ compare_mnemonics = {
58
+ # Basic integer comparisons.
59
+ "cmp",
60
+ "test",
61
+ # SIMD float comparisons
62
+ # 'pd' and 'ps' variants work on packed double and packed single floats.
63
+ # TODO I'm not sure how this extends for AVX2 registers
64
+ # NOTE: There's another, less-descriptive way to decode these
65
+ # what does capstone use?
66
+ "cmpeqpd",
67
+ "cmpeqps",
68
+ "cmpltpd",
69
+ "cmpltps",
70
+ "cmplepd",
71
+ "cmpleps",
72
+ "cmpunordpd",
73
+ "cmpunordps",
74
+ "cmpneqpd",
75
+ "cmpneqps",
76
+ "cmpnltpd",
77
+ "cmpnltps",
78
+ "cmpnlepd",
79
+ "cmpnleps",
80
+ "cmpordpd",
81
+ "cmpordps",
82
+ # Compare string operands
83
+ "cmps",
84
+ "cmpsw",
85
+ "cmpsd",
86
+ "cmpsq",
87
+ # Single float comparisons
88
+ # 'sd' and 'ss' variants work on double and single-precision floats.
89
+ # TODO: I'm not sure how this extends for AVX2 registers
90
+ "cmpeqsd",
91
+ "cmpeqss",
92
+ "cmpltsd",
93
+ "cmpltss",
94
+ "cmplesd",
95
+ "cmpless",
96
+ "cmpunordsd",
97
+ "cmpunordss",
98
+ "cmpneqsd",
99
+ "cmpneqss",
100
+ "cmpnltsd",
101
+ "cmpnltss",
102
+ "cmpnlesd",
103
+ "cmpnless",
104
+ "cmpordsd",
105
+ "cmpordss",
106
+ # TODO: Do cmpxchg, cmpxchg8b, cmpxchg16b count?
107
+ # Generic float comparison
108
+ # Unlike previous lists, sets multiple flags depending.
109
+ "comisd",
110
+ "comiss",
111
+ # x87 float comparison
112
+ # Sets FPU condition flags
113
+ "fcom",
114
+ "fcomp",
115
+ "fcompp",
116
+ # x87 float comparison
117
+ # Sets eflags
118
+ "fcomi",
119
+ "fcomip",
120
+ "fcomipp",
121
+ # x87 integer comparison
122
+ "ficom",
123
+ "ficomp",
124
+ # x87 test (comparison against zero)
125
+ # Sets FPU condition flags
126
+ "ftst",
127
+ # x87 float comparison
128
+ # Sets FPU condition flags
129
+ # Behaves differently with NaNs
130
+ "fucom",
131
+ "fucomp",
132
+ "fucompp",
133
+ # x87 examine float
134
+ # Sets FPU flags according to which type of float this is (normal, zero, NaN, infty...)
135
+ "fxam",
136
+ # TODO: There may be more of these... waiting...
137
+ }
138
+
139
+ pc_register = "eip"
140
+ sp_register = "esp"
141
+
142
+ # NOTE: ebp and esp are not considered general.
143
+ # You _can_ use them as GPRs; it's very rarely a good idea.
144
+ general_purpose_registers = ["eax", "ebx", "ecx", "edx", "edi", "esi"]
145
+
146
+ registers = {
147
+ "eax": RegisterDef(name="eax", size=4),
148
+ "ax": RegisterAliasDef(name="ax", parent="eax", size=2, offset=0),
149
+ "al": RegisterAliasDef(name="al", parent="eax", size=1, offset=0),
150
+ "ah": RegisterAliasDef(name="ah", parent="eax", size=1, offset=1),
151
+ "ebx": RegisterDef(name="ebx", size=4),
152
+ "bx": RegisterAliasDef(name="bx", parent="ebx", size=2, offset=0),
153
+ "bl": RegisterAliasDef(name="bl", parent="ebx", size=1, offset=0),
154
+ "bh": RegisterAliasDef(name="bh", parent="ebx", size=1, offset=1),
155
+ "ecx": RegisterDef(name="ecx", size=4),
156
+ "cx": RegisterAliasDef(name="cx", parent="ecx", size=2, offset=0),
157
+ "cl": RegisterAliasDef(name="cl", parent="ecx", size=1, offset=0),
158
+ "ch": RegisterAliasDef(name="ch", parent="ecx", size=1, offset=1),
159
+ "edx": RegisterDef(name="edx", size=4),
160
+ "dx": RegisterAliasDef(name="dx", parent="edx", size=2, offset=0),
161
+ "dl": RegisterAliasDef(name="dl", parent="edx", size=1, offset=0),
162
+ "dh": RegisterAliasDef(name="dh", parent="edx", size=1, offset=1),
163
+ "esi": RegisterDef(name="esi", size=4),
164
+ "si": RegisterAliasDef(name="si", parent="esi", size=2, offset=0),
165
+ "sil": RegisterAliasDef(name="sil", parent="esi", size=1, offset=0),
166
+ "edi": RegisterDef(name="edi", size=4),
167
+ "di": RegisterAliasDef(name="di", parent="edi", size=2, offset=0),
168
+ "dil": RegisterAliasDef(name="dil", parent="edi", size=1, offset=0),
169
+ "ebp": RegisterDef(name="ebp", size=4),
170
+ "bp": RegisterAliasDef(name="bp", parent="ebp", size=2, offset=0),
171
+ "bpl": RegisterAliasDef(name="bpl", parent="ebp", size=1, offset=0),
172
+ "esp": RegisterDef(name="esp", size=4),
173
+ "sp": RegisterAliasDef(name="sp", parent="esp", size=2, offset=0),
174
+ "spl": RegisterAliasDef(name="spl", parent="esp", size=1, offset=0),
175
+ # *** Instruction Pointer ***
176
+ "eip": RegisterDef(name="eip", size=4),
177
+ "ip": RegisterAliasDef(name="ip", parent="eip", size=2, offset=0),
178
+ "pc": RegisterAliasDef(name="pc", parent="eip", size=4, offset=0),
179
+ # *** Segment Registers ***
180
+ "cs": RegisterDef(name="cs", size=2),
181
+ "ss": RegisterDef(name="ss", size=2),
182
+ "ds": RegisterDef(name="ds", size=2),
183
+ "es": RegisterDef(name="es", size=2),
184
+ "fs": RegisterDef(name="fs", size=2),
185
+ "gs": RegisterDef(name="gs", size=2),
186
+ # *** Flags Registers ***
187
+ "eflags": RegisterDef(name="eflags", size=4),
188
+ "flags": RegisterAliasDef(name="flags", parent="eflags", size=2, offset=0),
189
+ # *** Control Registers ***
190
+ "cr0": RegisterDef(name="cr0", size=4),
191
+ "cr1": RegisterDef(name="cr1", size=4),
192
+ "cr2": RegisterDef(name="cr2", size=4),
193
+ "cr3": RegisterDef(name="cr3", size=4),
194
+ "cr4": RegisterDef(name="cr4", size=4),
195
+ # NOTE: I've got conflicting reports whether cr8 exists in i386.
196
+ "cr8": RegisterDef(name="cr8", size=4),
197
+ # *** Debug Registers ***
198
+ "dr0": RegisterDef(name="dr0", size=4),
199
+ "dr1": RegisterDef(name="dr1", size=4),
200
+ "dr2": RegisterDef(name="dr2", size=4),
201
+ "dr3": RegisterDef(name="dr3", size=4),
202
+ "dr6": RegisterDef(name="dr6", size=4),
203
+ "dr7": RegisterDef(name="dr7", size=4),
204
+ # *** Descriptor Table Registers
205
+ # NOTE: Yes, this is 6 bytes; 2 byte segment selector plus 4 byte offset
206
+ "gdtr": RegisterDef(name="gdtr", size=6),
207
+ "idtr": RegisterDef(name="idtr", size=6),
208
+ "ldtr": RegisterDef(name="ldtr", size=6),
209
+ # *** Task Register ***
210
+ # NOTE: Yes, this is 6 bytes; 2 byte segment selector plus 4 byte offset
211
+ "tr": RegisterDef(name="tr", size=6),
212
+ # *** x87 registers ***
213
+ "fpr0": RegisterDef(name="fpr0", size=10),
214
+ "fpr1": RegisterDef(name="fpr1", size=10),
215
+ "fpr2": RegisterDef(name="fpr2", size=10),
216
+ "fpr3": RegisterDef(name="fpr3", size=10),
217
+ "fpr4": RegisterDef(name="fpr4", size=10),
218
+ "fpr5": RegisterDef(name="fpr5", size=10),
219
+ "fpr6": RegisterDef(name="fpr6", size=10),
220
+ "fpr7": RegisterDef(name="fpr7", size=10),
221
+ # x87 Control Register
222
+ "fctrl": RegisterDef(name="fctrl", size=2),
223
+ # x87 Status Register
224
+ "fstat": RegisterDef(name="fstat", size=2),
225
+ # x87 Tag Register
226
+ "ftag": RegisterDef(name="ftag", size=2),
227
+ # x87 Last Instruction Register
228
+ "fip": RegisterDef(name="fip", size=8),
229
+ # x87 Last Operand Pointer
230
+ "fdp": RegisterDef(name="fdp", size=8),
231
+ # x87 Last Opcode
232
+ "fop": RegisterDef(name="fop", size=2),
233
+ # NOTE: Docs disagree on the format of fip and fdp.
234
+ # One source describes them as 48-bit offset-plus-segment,
235
+ # the other describes them as 64-bit.
236
+ # There may also be separate segment registers.
237
+ # If you care about the x87 debug info, please feel free to update.
238
+ # *** MMX Registers ***
239
+ # NOTE: The MMX registers are aliases for the low 8 bytes of the x87 registers.
240
+ # The two subsystems cannot be used simultaneously.
241
+ "mm0": RegisterAliasDef(name="mm0", parent="fpr0", size=8, offset=0),
242
+ "mm1": RegisterAliasDef(name="mm1", parent="fpr1", size=8, offset=0),
243
+ "mm2": RegisterAliasDef(name="mm2", parent="fpr2", size=8, offset=0),
244
+ "mm3": RegisterAliasDef(name="mm3", parent="fpr3", size=8, offset=0),
245
+ "mm4": RegisterAliasDef(name="mm4", parent="fpr4", size=8, offset=0),
246
+ "mm5": RegisterAliasDef(name="mm5", parent="fpr5", size=8, offset=0),
247
+ "mm6": RegisterAliasDef(name="mm6", parent="fpr6", size=8, offset=0),
248
+ "mm7": RegisterAliasDef(name="mm7", parent="fpr7", size=8, offset=0),
249
+ # *** SSE Registers ***
250
+ "xmm0": RegisterDef(name="xmm0", size=16),
251
+ "xmm1": RegisterDef(name="xmm1", size=16),
252
+ "xmm2": RegisterDef(name="xmm2", size=16),
253
+ "xmm3": RegisterDef(name="xmm3", size=16),
254
+ "xmm4": RegisterDef(name="xmm4", size=16),
255
+ "xmm5": RegisterDef(name="xmm5", size=16),
256
+ "xmm6": RegisterDef(name="xmm6", size=16),
257
+ "xmm7": RegisterDef(name="xmm7", size=16),
258
+ }
@@ -0,0 +1,270 @@
1
+ import typing
2
+
3
+ from ..platforms import Architecture, Byteorder
4
+ from .platformdef import PlatformDef, RegisterAliasDef, RegisterDef
5
+
6
+
7
+ class LoongArchPlatformDef(PlatformDef):
8
+ byteorder = Byteorder.LITTLE
9
+
10
+ # NOTE: Capstone does not yet support LoongArch
11
+ capstone_arch = -1
12
+ capstone_mode = -1
13
+
14
+ pc_register = "pc"
15
+ sp_register = "r3"
16
+
17
+ conditional_branch_mnemonics = {
18
+ "beq",
19
+ "bne",
20
+ "blt",
21
+ "bge",
22
+ "bltu",
23
+ "bgeu",
24
+ "beqz",
25
+ }
26
+ # LoongArch follows MIPS' philosophy.
27
+ # Integer comparisons are built into the conditional branch instructions.
28
+ # I'd bet there are conditional FPU instructions,
29
+ # if I can find them.
30
+ compare_mnemonics = set()
31
+
32
+ @property
33
+ def general_purpose_registers(self) -> typing.List[str]:
34
+ # Special registers:
35
+ # r0: Hard-wired to zero
36
+ # r1: Return address
37
+ # r2: TLS pointer
38
+ # r3: Stack pointer
39
+ # r21: Per-CPU pointer
40
+ return ["r{i}" for i in range(4, 32) if i != 21]
41
+
42
+ @property
43
+ def registers(self) -> typing.Dict[str, RegisterDef]:
44
+ return self._registers
45
+
46
+ def __init__(self):
47
+ self._registers = {
48
+ # Program counter (not a real register)
49
+ "pc": RegisterDef(name="pc", size=self.address_size),
50
+ # Zero register
51
+ "r0": RegisterDef(name="r0", size=self.address_size),
52
+ "zero": RegisterAliasDef(
53
+ name="zero", parent="r0", size=self.address_size, offset=0
54
+ ),
55
+ # Return address
56
+ "r1": RegisterDef(name="r1", size=self.address_size),
57
+ "ra": RegisterAliasDef(
58
+ name="ra", parent="r1", size=self.address_size, offset=0
59
+ ),
60
+ # TLS pointer
61
+ "r2": RegisterDef(name="r2", size=self.address_size),
62
+ "tp": RegisterAliasDef(
63
+ name="tp", parent="r2", size=self.address_size, offset=0
64
+ ),
65
+ # Stack pointer
66
+ "r3": RegisterDef(name="r3", size=self.address_size),
67
+ "sp": RegisterAliasDef(
68
+ name="sp", parent="r3", size=self.address_size, offset=0
69
+ ),
70
+ # Arguments.
71
+ # a0 and a1 are also the return registers
72
+ "r4": RegisterDef(name="r4", size=self.address_size),
73
+ "a0": RegisterAliasDef(
74
+ name="a0", parent="r4", size=self.address_size, offset=0
75
+ ),
76
+ "v0": RegisterAliasDef(
77
+ name="v0", parent="r4", size=self.address_size, offset=0
78
+ ),
79
+ "r5": RegisterDef(name="r5", size=self.address_size),
80
+ "a1": RegisterAliasDef(
81
+ name="a1", parent="r5", size=self.address_size, offset=0
82
+ ),
83
+ "v1": RegisterAliasDef(
84
+ name="v1", parent="r5", size=self.address_size, offset=0
85
+ ),
86
+ "r6": RegisterDef(name="r6", size=self.address_size),
87
+ "a2": RegisterAliasDef(
88
+ name="a2", parent="r6", size=self.address_size, offset=0
89
+ ),
90
+ "r7": RegisterDef(name="r7", size=self.address_size),
91
+ "a3": RegisterAliasDef(
92
+ name="a3", parent="r7", size=self.address_size, offset=0
93
+ ),
94
+ "r8": RegisterDef(name="r8", size=self.address_size),
95
+ "a4": RegisterAliasDef(
96
+ name="a4", parent="r8", size=self.address_size, offset=0
97
+ ),
98
+ "r9": RegisterDef(name="r9", size=self.address_size),
99
+ "a5": RegisterAliasDef(
100
+ name="a5", parent="r9", size=self.address_size, offset=0
101
+ ),
102
+ "r10": RegisterDef(name="r10", size=self.address_size),
103
+ "a6": RegisterAliasDef(
104
+ name="a6", parent="r10", size=self.address_size, offset=0
105
+ ),
106
+ "r11": RegisterDef(name="r11", size=self.address_size),
107
+ "a7": RegisterAliasDef(
108
+ name="a7", parent="r11", size=self.address_size, offset=0
109
+ ),
110
+ # Temporary registers
111
+ "r12": RegisterDef(name="r12", size=self.address_size),
112
+ "t0": RegisterAliasDef(
113
+ name="t0", parent="r12", size=self.address_size, offset=0
114
+ ),
115
+ "r13": RegisterDef(name="r13", size=self.address_size),
116
+ "t1": RegisterAliasDef(
117
+ name="t1", parent="r13", size=self.address_size, offset=0
118
+ ),
119
+ "r14": RegisterDef(name="r14", size=self.address_size),
120
+ "t2": RegisterAliasDef(
121
+ name="t2", parent="r14", size=self.address_size, offset=0
122
+ ),
123
+ "r15": RegisterDef(name="r15", size=self.address_size),
124
+ "t3": RegisterAliasDef(
125
+ name="t3", parent="r15", size=self.address_size, offset=0
126
+ ),
127
+ "r16": RegisterDef(name="r16", size=self.address_size),
128
+ "t4": RegisterAliasDef(
129
+ name="t4", parent="r16", size=self.address_size, offset=0
130
+ ),
131
+ "r17": RegisterDef(name="r17", size=self.address_size),
132
+ "t5": RegisterAliasDef(
133
+ name="t5", parent="r17", size=self.address_size, offset=0
134
+ ),
135
+ "r18": RegisterDef(name="r18", size=self.address_size),
136
+ "t6": RegisterAliasDef(
137
+ name="t6", parent="r18", size=self.address_size, offset=0
138
+ ),
139
+ "r19": RegisterDef(name="r19", size=self.address_size),
140
+ "t7": RegisterAliasDef(
141
+ name="t7", parent="r19", size=self.address_size, offset=0
142
+ ),
143
+ "r20": RegisterDef(name="r20", size=self.address_size),
144
+ "t8": RegisterAliasDef(
145
+ name="t8", parent="r20", size=self.address_size, offset=0
146
+ ),
147
+ # Per-CPU Base Address
148
+ "r21": RegisterDef(name="r21", size=self.address_size),
149
+ "u0": RegisterAliasDef(
150
+ name="u0", parent="r21", size=self.address_size, offset=0
151
+ ),
152
+ # Frame Pointer
153
+ "r22": RegisterDef(name="r22", size=self.address_size),
154
+ "fp": RegisterAliasDef(
155
+ name="fp", parent="r22", size=self.address_size, offset=0
156
+ ),
157
+ # Static registers
158
+ "r23": RegisterDef(name="r23", size=self.address_size),
159
+ "s0": RegisterAliasDef(
160
+ name="s0", parent="r23", size=self.address_size, offset=0
161
+ ),
162
+ "r24": RegisterDef(name="r24", size=self.address_size),
163
+ "s1": RegisterAliasDef(
164
+ name="s1", parent="r24", size=self.address_size, offset=0
165
+ ),
166
+ "r25": RegisterDef(name="r25", size=self.address_size),
167
+ "s2": RegisterAliasDef(
168
+ name="s2", parent="r25", size=self.address_size, offset=0
169
+ ),
170
+ "r26": RegisterDef(name="r26", size=self.address_size),
171
+ "s3": RegisterAliasDef(
172
+ name="s3", parent="r26", size=self.address_size, offset=0
173
+ ),
174
+ "r27": RegisterDef(name="r27", size=self.address_size),
175
+ "s4": RegisterAliasDef(
176
+ name="s4", parent="r27", size=self.address_size, offset=0
177
+ ),
178
+ "r28": RegisterDef(name="r28", size=self.address_size),
179
+ "s5": RegisterAliasDef(
180
+ name="s5", parent="r28", size=self.address_size, offset=0
181
+ ),
182
+ "r29": RegisterDef(name="r29", size=self.address_size),
183
+ "s6": RegisterAliasDef(
184
+ name="s6", parent="r29", size=self.address_size, offset=0
185
+ ),
186
+ "r30": RegisterDef(name="r30", size=self.address_size),
187
+ "s7": RegisterAliasDef(
188
+ name="s7", parent="r30", size=self.address_size, offset=0
189
+ ),
190
+ "r31": RegisterDef(name="r31", size=self.address_size),
191
+ "s8": RegisterAliasDef(
192
+ name="s8", parent="r31", size=self.address_size, offset=0
193
+ ),
194
+ # Floating-point arguments.
195
+ # fa0 and fa1 are also return values
196
+ "f0": RegisterDef(name="f0", size=8),
197
+ "fa0": RegisterAliasDef(name="fa0", parent="f0", size=8, offset=0),
198
+ "f1": RegisterDef(name="f1", size=8),
199
+ "fa1": RegisterAliasDef(name="fa1", parent="f1", size=8, offset=0),
200
+ "f2": RegisterDef(name="f2", size=8),
201
+ "fa2": RegisterAliasDef(name="fa2", parent="f2", size=8, offset=0),
202
+ "f3": RegisterDef(name="f3", size=8),
203
+ "fa3": RegisterAliasDef(name="fa3", parent="f3", size=8, offset=0),
204
+ "f4": RegisterDef(name="f4", size=8),
205
+ "fa4": RegisterAliasDef(name="fa4", parent="f4", size=8, offset=0),
206
+ "f5": RegisterDef(name="f5", size=8),
207
+ "fa5": RegisterAliasDef(name="fa5", parent="f5", size=8, offset=0),
208
+ "f6": RegisterDef(name="f6", size=8),
209
+ "fa6": RegisterAliasDef(name="fa6", parent="f6", size=8, offset=0),
210
+ "f7": RegisterDef(name="f7", size=8),
211
+ "fa7": RegisterAliasDef(name="fa7", parent="f7", size=8, offset=0),
212
+ # Floating-point temporary registers
213
+ "f8": RegisterDef(name="f8", size=8),
214
+ "ft0": RegisterAliasDef(name="ft0", parent="f8", size=8, offset=0),
215
+ "f9": RegisterDef(name="f9", size=8),
216
+ "ft1": RegisterAliasDef(name="ft1", parent="f9", size=8, offset=0),
217
+ "f10": RegisterDef(name="f10", size=8),
218
+ "ft2": RegisterAliasDef(name="ft2", parent="f10", size=8, offset=0),
219
+ "f11": RegisterDef(name="f11", size=8),
220
+ "ft3": RegisterAliasDef(name="ft3", parent="f11", size=8, offset=0),
221
+ "f12": RegisterDef(name="f12", size=8),
222
+ "ft4": RegisterAliasDef(name="ft4", parent="f12", size=8, offset=0),
223
+ "f13": RegisterDef(name="f13", size=8),
224
+ "ft5": RegisterAliasDef(name="ft5", parent="f13", size=8, offset=0),
225
+ "f14": RegisterDef(name="f14", size=8),
226
+ "ft6": RegisterAliasDef(name="ft6", parent="f14", size=8, offset=0),
227
+ "f15": RegisterDef(name="f15", size=8),
228
+ "ft7": RegisterAliasDef(name="ft7", parent="f15", size=8, offset=0),
229
+ "f16": RegisterDef(name="f16", size=8),
230
+ "ft8": RegisterAliasDef(name="ft8", parent="f16", size=8, offset=0),
231
+ "f17": RegisterDef(name="f17", size=8),
232
+ "ft9": RegisterAliasDef(name="ft9", parent="f17", size=8, offset=0),
233
+ "f18": RegisterDef(name="f18", size=8),
234
+ "ft10": RegisterAliasDef(name="ft10", parent="f18", size=8, offset=0),
235
+ "f19": RegisterDef(name="f19", size=8),
236
+ "ft11": RegisterAliasDef(name="ft11", parent="f19", size=8, offset=0),
237
+ "f20": RegisterDef(name="f20", size=8),
238
+ "ft12": RegisterAliasDef(name="ft12", parent="f20", size=8, offset=0),
239
+ "f21": RegisterDef(name="f21", size=8),
240
+ "ft13": RegisterAliasDef(name="ft13", parent="f21", size=8, offset=0),
241
+ "f22": RegisterDef(name="f22", size=8),
242
+ "ft14": RegisterAliasDef(name="ft14", parent="f22", size=8, offset=0),
243
+ "f23": RegisterDef(name="f23", size=8),
244
+ "ft15": RegisterAliasDef(name="ft15", parent="f23", size=8, offset=0),
245
+ # Floating-point static registers
246
+ "f24": RegisterDef(name="f24", size=8),
247
+ "fs0": RegisterAliasDef(name="fs0", parent="f24", size=8, offset=0),
248
+ "f25": RegisterDef(name="f25", size=8),
249
+ "fs1": RegisterAliasDef(name="fs1", parent="f25", size=8, offset=0),
250
+ "f26": RegisterDef(name="f26", size=8),
251
+ "fs2": RegisterAliasDef(name="fs2", parent="f26", size=8, offset=0),
252
+ "f27": RegisterDef(name="f27", size=8),
253
+ "fs3": RegisterAliasDef(name="fs3", parent="f27", size=8, offset=0),
254
+ "f28": RegisterDef(name="f28", size=8),
255
+ "fs4": RegisterAliasDef(name="fs4", parent="f28", size=8, offset=0),
256
+ "f29": RegisterDef(name="f29", size=8),
257
+ "fs5": RegisterAliasDef(name="fs5", parent="f29", size=8, offset=0),
258
+ "f30": RegisterDef(name="f30", size=8),
259
+ "fs6": RegisterAliasDef(name="fs6", parent="f30", size=8, offset=0),
260
+ "f31": RegisterDef(name="f31", size=8),
261
+ "fs7": RegisterAliasDef(name="fs7", parent="f31", size=8, offset=0),
262
+ }
263
+
264
+
265
+ class LoongArch64(LoongArchPlatformDef):
266
+ architecture = Architecture.LOONGARCH64
267
+ address_size = 8
268
+
269
+
270
+ __all__ = ["LoongArch64"]