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,97 @@
1
+ import abc
2
+ import typing
3
+ from dataclasses import dataclass
4
+
5
+ from ... import utils
6
+ from ..platforms import Architecture, Byteorder, Platform
7
+
8
+
9
+ @dataclass(frozen=True)
10
+ class RegisterDef:
11
+ name: str
12
+ size: int
13
+
14
+
15
+ @dataclass(frozen=True)
16
+ class RegisterAliasDef(RegisterDef):
17
+ parent: str
18
+ offset: int
19
+
20
+
21
+ class PlatformDef(metaclass=abc.ABCMeta):
22
+ @property
23
+ @abc.abstractmethod
24
+ def architecture(self) -> Architecture:
25
+ """Architecture ID for this platform"""
26
+ raise NotImplementedError()
27
+
28
+ @property
29
+ @abc.abstractmethod
30
+ def byteorder(self) -> Byteorder:
31
+ """Byteorder for this platform"""
32
+ raise NotImplementedError()
33
+
34
+ @property
35
+ @abc.abstractmethod
36
+ def address_size(self) -> int:
37
+ """Address size in bytes"""
38
+ raise NotImplementedError()
39
+
40
+ @property
41
+ @abc.abstractmethod
42
+ def capstone_arch(self) -> int:
43
+ """Capstone Architecture ID"""
44
+ raise NotImplementedError()
45
+
46
+ @property
47
+ @abc.abstractmethod
48
+ def capstone_mode(self) -> int:
49
+ """Capstone Mode ID"""
50
+ raise NotImplementedError()
51
+
52
+ @property
53
+ @abc.abstractmethod
54
+ def conditional_branch_mnemonics(self) -> typing.Set[str]:
55
+ """Set of conditional branch mnemonics"""
56
+ raise NotImplementedError()
57
+
58
+ @property
59
+ @abc.abstractmethod
60
+ def compare_mnemonics(self) -> typing.Set[str]:
61
+ """Set of comparison mnemonics"""
62
+ raise NotImplementedError()
63
+
64
+ @property
65
+ @abc.abstractmethod
66
+ def pc_register(self) -> str:
67
+ """Program Counter register name"""
68
+ raise NotImplementedError()
69
+
70
+ @property
71
+ @abc.abstractmethod
72
+ def sp_register(self) -> str:
73
+ """Stack Pointer register name"""
74
+ raise NotImplementedError()
75
+
76
+ @property
77
+ @abc.abstractmethod
78
+ def general_purpose_registers(self) -> typing.List[str]:
79
+ """List of general-purpose register names"""
80
+ raise NotImplementedError()
81
+
82
+ @property
83
+ @abc.abstractmethod
84
+ def registers(self) -> typing.Dict[str, RegisterDef]:
85
+ """Mapping from canonical register names to register definitions"""
86
+ raise NotImplementedError()
87
+
88
+ @classmethod
89
+ def for_platform(cls, platform: Platform):
90
+ try:
91
+ return utils.find_subclass(
92
+ cls,
93
+ lambda x: x.architecture == platform.architecture
94
+ and x.byteorder == platform.byteorder,
95
+ )
96
+ except:
97
+ raise ValueError(f"No platform definition for {platform}")
@@ -0,0 +1,259 @@
1
+ import typing
2
+
3
+ import capstone
4
+
5
+ from ..platforms import Architecture, Byteorder
6
+ from .platformdef import PlatformDef, RegisterAliasDef, RegisterDef
7
+
8
+ # PowerPC's register naming convention is extrmely annoying:
9
+ # it doesn't have one.
10
+ #
11
+ # Both the general-purpose registers
12
+ # and floating-point registers are solely referenced by number,
13
+ # thus making it maddening to tell which one you're talking about.
14
+ #
15
+ # Also, registers do have special uses within the ABI,
16
+ # but aside from sp and bp, they're not really written down.
17
+
18
+
19
+ class PowerPCPlatformDef(PlatformDef):
20
+ byteorder = Byteorder.BIG
21
+
22
+ capstone_arch = capstone.CS_ARCH_PPC
23
+
24
+ # PowerPC conditional branches are an abject pain.
25
+ # There are 172 possible ways to conditionally branch to an address,
26
+ # and a similar number of ways to branch to LR or CTR.
27
+ # Not all of these have mnemonics, but the ISA doesn't actually specify which.
28
+
29
+ # Branch to a label
30
+ _branch_to_label = {
31
+ # Conditional branch
32
+ "bc",
33
+ "beq",
34
+ "bne",
35
+ "blt",
36
+ "ble",
37
+ "bgt",
38
+ "bge",
39
+ "bso",
40
+ "bns",
41
+ # Decrement ctr and branch if non-zero
42
+ # NOTE: This can also include a conditional test
43
+ "bdnz",
44
+ # Decrement ctr and branch if zero
45
+ # NOTE: This can also include a conditional test
46
+ "bdz",
47
+ }
48
+ # Handle "branch-and-link" and "absolute address" variants
49
+ _branch_and_link_to_label = set(map(lambda x: f"{x}l", _branch_to_label))
50
+ _branch_absolute_to_label = set(map(lambda x: f"{x}a", _branch_to_label))
51
+ _branch_and_link_absolute_to_label = set(
52
+ map(lambda x: f"{x}a", _branch_and_link_to_label)
53
+ )
54
+
55
+ # Handle branch predictor suggestions
56
+ _branch_to_label_neutral = (
57
+ _branch_to_label
58
+ | _branch_and_link_to_label
59
+ | _branch_absolute_to_label
60
+ | _branch_and_link_absolute_to_label
61
+ )
62
+ _branch_to_label_likely = set(map(lambda x: f"{x}+", _branch_to_label_neutral))
63
+ _branch_to_label_unlikely = set(map(lambda x: f"{x}-", _branch_to_label_neutral))
64
+
65
+ # Collect branch to label
66
+ _branch_to_label_all = (
67
+ _branch_to_label_neutral | _branch_to_label_likely | _branch_to_label_unlikely
68
+ )
69
+
70
+ # Branch to LR looks the same as branch to label, but with an "lr" suffix after the condition code
71
+ _branch_to_lr = set(map(lambda x: f"{x}lr", _branch_to_label))
72
+ _branch_and_link_to_lr = set(map(lambda x: f"{x}l", _branch_to_lr))
73
+
74
+ # Handle branch predictor suggestions
75
+ _branch_to_lr_neutral = _branch_to_lr | _branch_and_link_to_lr
76
+ _branch_to_lr_likely = set(map(lambda x: f"{x}+", _branch_to_lr_neutral))
77
+ _branch_to_lr_unlikely = set(map(lambda x: f"{x}-", _branch_to_lr_neutral))
78
+
79
+ # Collect branch to LR
80
+ _branch_to_lr_all = (
81
+ _branch_to_lr_neutral | _branch_to_lr_likely | _branch_to_lr_unlikely
82
+ )
83
+
84
+ # Branch to CTR looks the same as branch to label, but with a "ctr" suffix after the condition code.
85
+ _branch_to_ctr = set(map(lambda x: f"{x}ctr", _branch_to_label))
86
+ # There are no mnemonics for using ctr as a counter and branch target at once.
87
+ _branch_to_ctr -= {"bdnzctr", "bdzctr"}
88
+ _branch_and_link_to_ctr = set(map(lambda x: f"{x}l", _branch_to_ctr))
89
+
90
+ # Handle branch predictor suggestions
91
+ _branch_to_ctr_neutral = _branch_to_ctr | _branch_and_link_to_ctr
92
+ _branch_to_ctr_likely = set(map(lambda x: f"{x}+", _branch_to_ctr_neutral))
93
+ _branch_to_ctr_unlikely = set(map(lambda x: f"{x}-", _branch_to_ctr_neutral))
94
+
95
+ # Collect branch to CTR
96
+ _branch_to_ctr_all = (
97
+ _branch_to_ctr_neutral | _branch_to_ctr_likely | _branch_to_lr_unlikely
98
+ )
99
+
100
+ # Finally, collect all conditional branch mnemonics
101
+ conditional_branch_mnemonics = (
102
+ _branch_to_label_all | _branch_to_lr_all | _branch_to_ctr_all
103
+ )
104
+
105
+ compare_mnemonics = {
106
+ # Compare registers
107
+ "cmpd",
108
+ "cmpw",
109
+ # Compare immediate
110
+ "cmpi",
111
+ "cmpdi",
112
+ "cmpwi",
113
+ # Compare logical immediate
114
+ "cmpli",
115
+ "cmpldi",
116
+ "cmplwi",
117
+ # Compare
118
+ "cmpl",
119
+ "cmpld",
120
+ "cmplw",
121
+ }
122
+
123
+ pc_register = "pc"
124
+ sp_register = "sp"
125
+
126
+ # Special registers
127
+ # - r0 and r2 are reserved for the assembler.
128
+ # - r1 is the stack pointer
129
+ # - r31 is the base (frame) pointer
130
+ general_purpose_registers = [f"r{i}" for i in range(3, 31)]
131
+
132
+ @property
133
+ def registers(self) -> typing.Dict[str, RegisterDef]:
134
+ return self._registers
135
+
136
+ def __init__(self):
137
+ self._registers = {
138
+ # *** General Purpose Registers ***
139
+ # NOTE: Used expressive names for GPRs and FPRs.
140
+ # gasm just refers to GPRs and FPRS by number.
141
+ # They use the same numbers; it's very annoying.
142
+ "r0": RegisterDef(name="r0", size=self.address_size),
143
+ # NOTE: GPR 1 is also the stack pointer.
144
+ "r1": RegisterDef(name="r1", size=self.address_size),
145
+ "sp": RegisterAliasDef("sp", parent="r1", size=self.address_size, offset=0),
146
+ "r2": RegisterDef(name="r2", size=self.address_size),
147
+ "r3": RegisterDef(name="r3", size=self.address_size),
148
+ "r4": RegisterDef(name="r4", size=self.address_size),
149
+ "r5": RegisterDef(name="r5", size=self.address_size),
150
+ "r6": RegisterDef(name="r6", size=self.address_size),
151
+ "r7": RegisterDef(name="r7", size=self.address_size),
152
+ "r8": RegisterDef(name="r8", size=self.address_size),
153
+ "r9": RegisterDef(name="r9", size=self.address_size),
154
+ "r10": RegisterDef(name="r10", size=self.address_size),
155
+ "r11": RegisterDef(name="r11", size=self.address_size),
156
+ "r12": RegisterDef(name="r12", size=self.address_size),
157
+ "r13": RegisterDef(name="r13", size=self.address_size),
158
+ "r14": RegisterDef(name="r14", size=self.address_size),
159
+ "r15": RegisterDef(name="r15", size=self.address_size),
160
+ "r16": RegisterDef(name="r16", size=self.address_size),
161
+ "r17": RegisterDef(name="r17", size=self.address_size),
162
+ "r18": RegisterDef(name="r18", size=self.address_size),
163
+ "r19": RegisterDef(name="r19", size=self.address_size),
164
+ "r20": RegisterDef(name="r20", size=self.address_size),
165
+ "r21": RegisterDef(name="r21", size=self.address_size),
166
+ "r22": RegisterDef(name="r22", size=self.address_size),
167
+ "r23": RegisterDef(name="r23", size=self.address_size),
168
+ "r24": RegisterDef(name="r24", size=self.address_size),
169
+ "r25": RegisterDef(name="r25", size=self.address_size),
170
+ "r26": RegisterDef(name="r26", size=self.address_size),
171
+ "r27": RegisterDef(name="r27", size=self.address_size),
172
+ "r28": RegisterDef(name="r28", size=self.address_size),
173
+ "r29": RegisterDef(name="r29", size=self.address_size),
174
+ "r30": RegisterDef(name="r30", size=self.address_size),
175
+ # NOTE: GPR 31 is also the base pointer
176
+ "r31": RegisterDef(name="r31", size=self.address_size),
177
+ "bp": RegisterAliasDef(
178
+ name="bp", parent="r31", size=self.address_size, offset=0
179
+ ),
180
+ # Floating Point Registers
181
+ # Always 8 bytes, regardless of self.address_size.
182
+ "f0": RegisterDef(name="f0", size=8),
183
+ "f1": RegisterDef(name="f1", size=8),
184
+ "f2": RegisterDef(name="f2", size=8),
185
+ "f3": RegisterDef(name="f3", size=8),
186
+ "f4": RegisterDef(name="f4", size=8),
187
+ "f5": RegisterDef(name="f5", size=8),
188
+ "f6": RegisterDef(name="f6", size=8),
189
+ "f7": RegisterDef(name="f7", size=8),
190
+ "f8": RegisterDef(name="f8", size=8),
191
+ "f9": RegisterDef(name="f9", size=8),
192
+ "f10": RegisterDef(name="f10", size=8),
193
+ "f11": RegisterDef(name="f11", size=8),
194
+ "f12": RegisterDef(name="f12", size=8),
195
+ "f13": RegisterDef(name="f13", size=8),
196
+ "f14": RegisterDef(name="f14", size=8),
197
+ "f15": RegisterDef(name="f15", size=8),
198
+ "f16": RegisterDef(name="f16", size=8),
199
+ "f17": RegisterDef(name="f17", size=8),
200
+ "f18": RegisterDef(name="f18", size=8),
201
+ "f19": RegisterDef(name="f19", size=8),
202
+ "f20": RegisterDef(name="f20", size=8),
203
+ "f21": RegisterDef(name="f21", size=8),
204
+ "f22": RegisterDef(name="f22", size=8),
205
+ "f23": RegisterDef(name="f23", size=8),
206
+ "f24": RegisterDef(name="f24", size=8),
207
+ "f25": RegisterDef(name="f25", size=8),
208
+ "f26": RegisterDef(name="f26", size=8),
209
+ "f27": RegisterDef(name="f27", size=8),
210
+ "f28": RegisterDef(name="f28", size=8),
211
+ "f29": RegisterDef(name="f29", size=8),
212
+ "f30": RegisterDef(name="f30", size=8),
213
+ "f31": RegisterDef(name="f31", size=8),
214
+ # *** Pointer Registers ***
215
+ # Program Counter.
216
+ # Not really a register; nothing can access it directly
217
+ "pc": RegisterDef(name="pc", size=self.address_size),
218
+ # Link Register
219
+ "lr": RegisterDef(name="lr", size=self.address_size),
220
+ # Counter Register
221
+ # Acts either as a loop index, or a branch target register
222
+ # Only `ctr` and `lr` can act as branch targets.
223
+ "ctr": RegisterDef(name="ctr", size=self.address_size),
224
+ # *** Condition Registers ***
225
+ # The actual condition register `cr` is a single 32-bit register,
226
+ # but it's broken into eight 4-bit fields which are accessed separately.
227
+ #
228
+ # Certain operations use specific registers by default,
229
+ # but some tests can specify a destination register.
230
+ "cr0": RegisterDef(name="cr0", size=1), # Integer condition bits
231
+ "cr1": RegisterDef(name="cr1", size=1), # Floating point condition bits
232
+ "cr2": RegisterDef(name="cr2", size=1),
233
+ "cr3": RegisterDef(name="cr3", size=1),
234
+ "cr4": RegisterDef(name="cr4", size=1),
235
+ "cr5": RegisterDef(name="cr5", size=1),
236
+ "cr6": RegisterDef(name="cr6", size=1),
237
+ "cr7": RegisterDef(name="cr7", size=1),
238
+ # Integer Exception Register
239
+ "xer": RegisterDef(name="xer", size=4),
240
+ # Floating Point Status and Control Register
241
+ "fpscr": RegisterDef(name="fpscr", size=4),
242
+ # TODO: This only focuses on the user-facing registrers.
243
+ # ppc has a huge number of privileged registers.
244
+ # Extend this as needed.
245
+ }
246
+
247
+
248
+ class PowerPC32(PowerPCPlatformDef):
249
+ architecture = Architecture.POWERPC32
250
+
251
+ address_size = 4
252
+ capstone_mode = capstone.CS_MODE_32 | capstone.CS_MODE_BIG_ENDIAN
253
+
254
+
255
+ class PowerPC64(PowerPCPlatformDef):
256
+ architecture = Architecture.POWERPC64
257
+
258
+ address_size = 8
259
+ capstone_mode = capstone.CS_MODE_64 | capstone.CS_MODE_BIG_ENDIAN
@@ -0,0 +1,257 @@
1
+ import capstone
2
+
3
+ from ..platforms import Architecture, Byteorder
4
+ from .platformdef import PlatformDef, RegisterAliasDef, RegisterDef
5
+
6
+ # NOTE: RiscV is designed to be an extensible language.
7
+ # The core ISA is incredibly simple,
8
+ # with a large number of optional extensions available
9
+ # to chip manufacturers
10
+ #
11
+ # Support for any specific extension depends on the emulator.
12
+
13
+
14
+ class RiscV64(PlatformDef):
15
+ architecture = Architecture.RISCV64
16
+ byteorder = Byteorder.LITTLE
17
+
18
+ address_size = 8
19
+
20
+ capstone_arch = capstone.CS_ARCH_RISCV
21
+ capstone_mode = capstone.CS_MODE_RISCV64
22
+
23
+ conditional_branch_mnemonics = {
24
+ # Core conditional branch instructions
25
+ "beq",
26
+ "bne",
27
+ "blt",
28
+ "bltu",
29
+ "ble",
30
+ "bleu",
31
+ "bgt",
32
+ "bgtu",
33
+ "bge",
34
+ "bgeu",
35
+ }
36
+
37
+ # RiscV core has no dedicated compare instructions
38
+ # (they're rather smug about this fact).
39
+ #
40
+ # - The "Zicond" extension adds conditional move instructions.
41
+ # - The "Zacas" extension adds compare-exchange instructions
42
+ compare_mnemonics = set()
43
+
44
+ pc_register = "pc"
45
+ sp_register = "sp"
46
+
47
+ # Special registers:
48
+ # - x0 is wired to zero
49
+ # - x1 is the link register
50
+ # - x2 is the stack pointer
51
+ # - x3 is the global pointer
52
+ # - x4 is the thread pointer
53
+ general_purpose_registers = [f"x{i}" for i in range(0, 32)]
54
+
55
+ registers = {
56
+ # *** General-Purpose Registers ***
57
+ # x0 is wired to 0, and aliased as "zero"
58
+ "x0": RegisterDef(name="x0", size=8),
59
+ "zero": RegisterAliasDef(name="zero", parent="x0", size=8, offset=0),
60
+ # x1 acts as the link register
61
+ # NOTE: ra is the official name; lr might be an angr invention.
62
+ "x1": RegisterDef(name="x1", size=8),
63
+ "ra": RegisterAliasDef(name="ra", parent="x1", size=8, offset=0),
64
+ # x2 acts as the stack pointer
65
+ "x2": RegisterDef(name="x2", size=8),
66
+ "sp": RegisterAliasDef(name="sp", parent="x2", size=8, offset=0),
67
+ # x3 acts as the global pointer
68
+ "x3": RegisterDef(name="x3", size=8),
69
+ "gp": RegisterAliasDef(name="gp", parent="x3", size=8, offset=0),
70
+ # x4 acts as the thread pointer
71
+ "x4": RegisterDef(name="x4", size=8),
72
+ "tp": RegisterAliasDef(name="tp", parent="x4", size=8, offset=0),
73
+ # x5 is a temporary register
74
+ "x5": RegisterDef(name="x5", size=8),
75
+ "t0": RegisterAliasDef(name="t0", parent="x5", size=8, offset=0),
76
+ # x6 is a temporary register
77
+ "x6": RegisterDef(name="x6", size=8),
78
+ "t1": RegisterAliasDef(name="t1", parent="x6", size=8, offset=0),
79
+ # x7 is a temporary register
80
+ "x7": RegisterDef(name="x7", size=8),
81
+ "t2": RegisterAliasDef(name="t2", parent="x7", size=8, offset=0),
82
+ # x8 is a callee-saved register
83
+ "x8": RegisterDef(name="x8", size=8),
84
+ "s0": RegisterAliasDef(name="s0", parent="x8", size=8, offset=0),
85
+ # x9 is a callee-saved register
86
+ "x9": RegisterDef(name="x9", size=8),
87
+ "s1": RegisterAliasDef(name="s1", parent="x9", size=8, offset=0),
88
+ # x10 is argument 0
89
+ "x10": RegisterDef(name="x10", size=8),
90
+ "a0": RegisterAliasDef(name="a0", parent="x10", size=8, offset=0),
91
+ # x11 is argument 1
92
+ "x11": RegisterDef(name="x11", size=8),
93
+ "a1": RegisterAliasDef(name="a1", parent="x11", size=8, offset=0),
94
+ # x12 is argument 2
95
+ "x12": RegisterDef(name="x12", size=8),
96
+ "a2": RegisterAliasDef(name="a2", parent="x12", size=8, offset=0),
97
+ # x13 is argument 3
98
+ "x13": RegisterDef(name="x13", size=8),
99
+ "a3": RegisterAliasDef(name="a3", parent="x13", size=8, offset=0),
100
+ # x14 is argument 4
101
+ "x14": RegisterDef(name="x14", size=8),
102
+ "a4": RegisterAliasDef(name="a4", parent="x14", size=8, offset=0),
103
+ # x15 is argument 5
104
+ "x15": RegisterDef(name="x15", size=8),
105
+ "a5": RegisterAliasDef(name="a5", parent="x15", size=8, offset=0),
106
+ # x16 is argument 6
107
+ "x16": RegisterDef(name="x16", size=8),
108
+ "a6": RegisterAliasDef(name="a6", parent="x16", size=8, offset=0),
109
+ # x17 is argument 7
110
+ "x17": RegisterDef(name="x17", size=8),
111
+ "a7": RegisterAliasDef(name="a7", parent="x17", size=8, offset=0),
112
+ # x18 is a callee-saved register
113
+ "x18": RegisterDef(name="x18", size=8),
114
+ "s2": RegisterAliasDef(name="s2", parent="x18", size=8, offset=0),
115
+ # x19 is a callee-saved register
116
+ "x19": RegisterDef(name="x19", size=8),
117
+ "s3": RegisterAliasDef(name="s3", parent="x19", size=8, offset=0),
118
+ # x20 is a callee-saved register
119
+ "x20": RegisterDef(name="x20", size=8),
120
+ "s4": RegisterAliasDef(name="s4", parent="x20", size=8, offset=0),
121
+ # x21 is a callee-saved register
122
+ "x21": RegisterDef(name="x21", size=8),
123
+ "s5": RegisterAliasDef(name="s5", parent="x21", size=8, offset=0),
124
+ # x22 is a callee-saved register
125
+ "x22": RegisterDef(name="x22", size=8),
126
+ "s6": RegisterAliasDef(name="s6", parent="x22", size=8, offset=0),
127
+ # x23 is a callee-saved register
128
+ "x23": RegisterDef(name="x23", size=8),
129
+ "s7": RegisterAliasDef(name="s7", parent="x23", size=8, offset=0),
130
+ # x24 is a callee-saved register
131
+ "x24": RegisterDef(name="x24", size=8),
132
+ "s8": RegisterAliasDef(name="s8", parent="x24", size=8, offset=0),
133
+ # x25 is a callee-saved register
134
+ "x25": RegisterDef(name="x25", size=8),
135
+ "s9": RegisterAliasDef(name="s9", parent="x25", size=8, offset=0),
136
+ # x26 is a callee-saved register
137
+ "x26": RegisterDef(name="x26", size=8),
138
+ "s10": RegisterAliasDef(name="s10", parent="x26", size=8, offset=0),
139
+ # x27 is a callee-saved register
140
+ "x27": RegisterDef(name="x27", size=8),
141
+ "s11": RegisterAliasDef(name="s11", parent="x27", size=8, offset=0),
142
+ # x28 is a temporary register
143
+ "x28": RegisterDef(name="x28", size=8),
144
+ "t3": RegisterAliasDef(name="t3", parent="x28", size=8, offset=0),
145
+ # x29 is a temporary register
146
+ "x29": RegisterDef(name="x29", size=8),
147
+ "t4": RegisterAliasDef(name="t4", parent="x29", size=8, offset=0),
148
+ # x30 is a temporary register
149
+ "x30": RegisterDef(name="x30", size=8),
150
+ "t5": RegisterAliasDef(name="t5", parent="x30", size=8, offset=0),
151
+ # x31 is a temporary register
152
+ "x31": RegisterDef(name="x31", size=8),
153
+ "t6": RegisterAliasDef(name="t6", parent="x31", size=8, offset=0),
154
+ # *** Program Counter ***
155
+ "pc": RegisterDef(name="pc", size=8),
156
+ # *** Floating-Point Registers ***
157
+ # f0 is a temporary register
158
+ "f0": RegisterDef(name="f0", size=8),
159
+ "ft0": RegisterAliasDef(name="ft0", parent="f0", size=8, offset=0),
160
+ # f1 is a temporary register
161
+ "f1": RegisterDef(name="f1", size=8),
162
+ "ft1": RegisterAliasDef(name="ft1", parent="f1", size=8, offset=0),
163
+ # f2 is a temporary register
164
+ "f2": RegisterDef(name="f2", size=8),
165
+ "ft2": RegisterAliasDef(name="ft2", parent="f2", size=8, offset=0),
166
+ # f3 is a temporary register
167
+ "f3": RegisterDef(name="f3", size=8),
168
+ "ft3": RegisterAliasDef(name="ft3", parent="f3", size=8, offset=0),
169
+ # f4 is a temporary register
170
+ "f4": RegisterDef(name="f4", size=8),
171
+ "ft4": RegisterAliasDef(name="ft4", parent="f4", size=8, offset=0),
172
+ # f5 is a temporary register
173
+ "f5": RegisterDef(name="f5", size=8),
174
+ "ft5": RegisterAliasDef(name="ft5", parent="f5", size=8, offset=0),
175
+ # f6 is a temporary register
176
+ "f6": RegisterDef(name="f6", size=8),
177
+ "ft6": RegisterAliasDef(name="ft6", parent="f6", size=8, offset=0),
178
+ # f7 is a temporary register
179
+ "f7": RegisterDef(name="f7", size=8),
180
+ "ft7": RegisterAliasDef(name="ft7", parent="f7", size=8, offset=0),
181
+ # f8 is a callee saved register
182
+ "f8": RegisterDef(name="f8", size=8),
183
+ "fs0": RegisterAliasDef(name="fs0", parent="f8", size=8, offset=0),
184
+ # f9 is a callee saved register
185
+ "f9": RegisterDef(name="f9", size=8),
186
+ "fs1": RegisterAliasDef(name="fs1", parent="f9", size=8, offset=0),
187
+ # f10 is argument 0
188
+ "f10": RegisterDef(name="f10", size=8),
189
+ "fa0": RegisterAliasDef(name="fa0", parent="f10", size=8, offset=0),
190
+ # f11 is argument 1
191
+ "f11": RegisterDef(name="f11", size=8),
192
+ "fa1": RegisterAliasDef(name="fa1", parent="f11", size=8, offset=0),
193
+ # f12 is argument 2
194
+ "f12": RegisterDef(name="f12", size=8),
195
+ "fa2": RegisterAliasDef(name="fa2", parent="f12", size=8, offset=0),
196
+ # f13 is argument 3
197
+ "f13": RegisterDef(name="f13", size=8),
198
+ "fa3": RegisterAliasDef(name="fa3", parent="f13", size=8, offset=0),
199
+ # f14 is argument 4
200
+ "f14": RegisterDef(name="f14", size=8),
201
+ "fa4": RegisterAliasDef(name="fa4", parent="f14", size=8, offset=0),
202
+ # f15 is argument 5
203
+ "f15": RegisterDef(name="f15", size=8),
204
+ "fa5": RegisterAliasDef(name="fa5", parent="f15", size=8, offset=0),
205
+ # f16 is argument 6
206
+ "f16": RegisterDef(name="f16", size=8),
207
+ "fa6": RegisterAliasDef(name="fa6", parent="f16", size=8, offset=0),
208
+ # f7 is argument 7
209
+ "f17": RegisterDef(name="f17", size=8),
210
+ "fa7": RegisterAliasDef(name="fa7", parent="f17", size=8, offset=0),
211
+ # f18 is a callee-saved register
212
+ "f18": RegisterDef(name="f18", size=8),
213
+ "fs2": RegisterAliasDef(name="fs2", parent="f18", size=8, offset=0),
214
+ # f19 is a callee-saved register
215
+ "f19": RegisterDef(name="f19", size=8),
216
+ "fs3": RegisterAliasDef(name="fs3", parent="f19", size=8, offset=0),
217
+ # f20 is a callee-saved register
218
+ "f20": RegisterDef(name="f20", size=8),
219
+ "fs4": RegisterAliasDef(name="fs4", parent="f20", size=8, offset=0),
220
+ # f21 is a callee-saved register
221
+ "f21": RegisterDef(name="f21", size=8),
222
+ "fs5": RegisterAliasDef(name="fs5", parent="f21", size=8, offset=0),
223
+ # f22 is a callee-saved register
224
+ "f22": RegisterDef(name="f22", size=8),
225
+ "fs6": RegisterAliasDef(name="fs6", parent="f22", size=8, offset=0),
226
+ # f23 is a callee-saved register
227
+ "f23": RegisterDef(name="f23", size=8),
228
+ "fs7": RegisterAliasDef(name="fs7", parent="f23", size=8, offset=0),
229
+ # f24 is a callee-saved register
230
+ "f24": RegisterDef(name="f24", size=8),
231
+ "fs8": RegisterAliasDef(name="fs8", parent="f24", size=8, offset=0),
232
+ # f25 is a callee-saved register
233
+ "f25": RegisterDef(name="f25", size=8),
234
+ "fs9": RegisterAliasDef(name="fs9", parent="f25", size=8, offset=0),
235
+ # f26 is a callee-saved register
236
+ "f26": RegisterDef(name="f26", size=8),
237
+ "fs10": RegisterAliasDef(name="fs10", parent="f26", size=8, offset=0),
238
+ # f27 is a callee-saved register
239
+ "f27": RegisterDef(name="f27", size=8),
240
+ "fs11": RegisterAliasDef(name="fs11", parent="f27", size=8, offset=0),
241
+ # f28 is a temporary register
242
+ "f28": RegisterDef(name="f28", size=8),
243
+ "ft8": RegisterAliasDef(name="ft8", parent="f28", size=8, offset=0),
244
+ # f29 is a temporary register
245
+ "f29": RegisterDef(name="f29", size=8),
246
+ "ft9": RegisterAliasDef(name="ft9", parent="f29", size=8, offset=0),
247
+ # f30 is a temporary register
248
+ "f30": RegisterDef(name="f30", size=8),
249
+ "ft10": RegisterAliasDef(name="ft10", parent="f30", size=8, offset=0),
250
+ # f31 is a temporary register
251
+ "f31": RegisterDef(name="f31", size=8),
252
+ "ft11": RegisterAliasDef(name="ft11", parent="f31", size=8, offset=0),
253
+ # *** Vector Registers ***
254
+ # NOTE: These exist, but are not supported
255
+ # *** Control and Status Registers ***
256
+ # NOTE: These exist, but aren't supported.
257
+ }