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.
- smallworld/analyses/__init__.py +8 -0
- smallworld/analyses/analysis.py +8 -67
- smallworld/analyses/code_coverage.py +1 -2
- smallworld/analyses/colorizer.py +301 -534
- smallworld/analyses/colorizer_def_use.py +217 -0
- smallworld/analyses/colorizer_summary.py +173 -83
- smallworld/analyses/field_detection/field_analysis.py +7 -8
- smallworld/analyses/field_detection/hints.py +1 -1
- smallworld/analyses/field_detection/malloc.py +2 -2
- smallworld/analyses/trace_execution.py +160 -0
- smallworld/analyses/trace_execution_types.py +42 -0
- smallworld/analyses/unstable/angr/divergence.py +1 -2
- smallworld/analyses/unstable/angr/model.py +5 -6
- smallworld/analyses/unstable/angr_nwbt.py +3 -4
- smallworld/analyses/unstable/code_coverage.py +2 -3
- smallworld/analyses/unstable/code_reachable.py +2 -3
- smallworld/analyses/unstable/control_flow_tracer.py +2 -3
- smallworld/analyses/unstable/pointer_finder.py +2 -3
- smallworld/analyses/unstable/utils/tui.py +71 -0
- smallworld/emulators/__init__.py +3 -1
- smallworld/emulators/angr/angr.py +30 -9
- smallworld/emulators/angr/machdefs/__init__.py +2 -0
- smallworld/emulators/angr/machdefs/aarch64.py +1 -1
- smallworld/emulators/angr/machdefs/amd64.py +0 -4
- smallworld/emulators/angr/machdefs/arm.py +0 -2
- smallworld/emulators/angr/machdefs/i386.py +0 -2
- smallworld/emulators/angr/machdefs/loongarch.py +340 -0
- smallworld/emulators/angr/machdefs/machdef.py +1 -8
- smallworld/emulators/angr/machdefs/mips.py +0 -2
- smallworld/emulators/angr/machdefs/mips64.py +0 -2
- smallworld/emulators/angr/machdefs/ppc.py +1 -2
- smallworld/emulators/angr/machdefs/riscv.py +8 -10
- smallworld/emulators/angr/machdefs/xtensa.py +7 -4
- smallworld/emulators/emulator.py +22 -0
- smallworld/emulators/ghidra/__init__.py +37 -0
- smallworld/emulators/ghidra/ghidra.py +513 -0
- smallworld/emulators/ghidra/machdefs/__init__.py +31 -0
- smallworld/emulators/ghidra/machdefs/aarch64.py +289 -0
- smallworld/emulators/ghidra/machdefs/amd64.py +185 -0
- smallworld/emulators/ghidra/machdefs/arm.py +370 -0
- smallworld/emulators/ghidra/machdefs/i386.py +109 -0
- smallworld/emulators/ghidra/machdefs/loongarch.py +162 -0
- smallworld/emulators/ghidra/machdefs/machdef.py +81 -0
- smallworld/emulators/ghidra/machdefs/mips.py +163 -0
- smallworld/emulators/ghidra/machdefs/mips64.py +186 -0
- smallworld/emulators/ghidra/machdefs/ppc.py +98 -0
- smallworld/emulators/ghidra/machdefs/riscv.py +208 -0
- smallworld/emulators/ghidra/machdefs/xtensa.py +21 -0
- smallworld/emulators/ghidra/typing.py +28 -0
- smallworld/emulators/hookable.py +18 -4
- smallworld/emulators/panda/machdefs/__init__.py +2 -2
- smallworld/emulators/panda/machdefs/aarch64.py +186 -11
- smallworld/emulators/panda/machdefs/amd64.py +103 -11
- smallworld/emulators/panda/machdefs/arm.py +216 -20
- smallworld/emulators/panda/machdefs/i386.py +30 -7
- smallworld/emulators/panda/machdefs/machdef.py +9 -16
- smallworld/emulators/panda/machdefs/mips.py +49 -5
- smallworld/emulators/panda/machdefs/mips64.py +57 -5
- smallworld/emulators/panda/machdefs/ppc.py +38 -13
- smallworld/emulators/panda/panda.py +146 -44
- smallworld/emulators/unicorn/__init__.py +2 -0
- smallworld/emulators/unicorn/machdefs/aarch64.py +253 -264
- smallworld/emulators/unicorn/machdefs/amd64.py +254 -259
- smallworld/emulators/unicorn/machdefs/arm.py +200 -212
- smallworld/emulators/unicorn/machdefs/i386.py +84 -90
- smallworld/emulators/unicorn/machdefs/machdef.py +2 -23
- smallworld/emulators/unicorn/machdefs/mips.py +127 -135
- smallworld/emulators/unicorn/unicorn.py +52 -13
- smallworld/helpers.py +4 -19
- smallworld/hinting/hinting.py +22 -192
- smallworld/hinting/hints.py +50 -18
- smallworld/instructions/bsid.py +8 -8
- smallworld/logging.py +4 -2
- smallworld/platforms/__init__.py +12 -0
- smallworld/platforms/defs/__init__.py +36 -0
- smallworld/platforms/defs/aarch64.py +450 -0
- smallworld/platforms/defs/amd64.py +463 -0
- smallworld/platforms/defs/arm.py +519 -0
- smallworld/platforms/defs/i386.py +258 -0
- smallworld/platforms/defs/loongarch.py +270 -0
- smallworld/platforms/defs/mips.py +321 -0
- smallworld/platforms/defs/mips64.py +313 -0
- smallworld/platforms/defs/platformdef.py +97 -0
- smallworld/platforms/defs/powerpc.py +259 -0
- smallworld/platforms/defs/riscv.py +257 -0
- smallworld/platforms/defs/xtensa.py +96 -0
- smallworld/{platforms.py → platforms/platforms.py} +3 -0
- smallworld/state/cpus/__init__.py +2 -0
- smallworld/state/cpus/aarch64.py +0 -9
- smallworld/state/cpus/amd64.py +6 -28
- smallworld/state/cpus/arm.py +0 -11
- smallworld/state/cpus/cpu.py +0 -11
- smallworld/state/cpus/i386.py +0 -7
- smallworld/state/cpus/loongarch.py +299 -0
- smallworld/state/cpus/mips.py +4 -47
- smallworld/state/cpus/mips64.py +18 -58
- smallworld/state/cpus/powerpc.py +2 -9
- smallworld/state/cpus/riscv.py +1 -11
- smallworld/state/cpus/xtensa.py +0 -5
- smallworld/state/memory/code.py +38 -2
- smallworld/state/memory/elf/__init__.py +5 -1
- smallworld/state/memory/elf/coredump/__init__.py +3 -0
- smallworld/state/memory/elf/coredump/coredump.py +46 -0
- smallworld/state/memory/elf/coredump/prstatus/__init__.py +27 -0
- smallworld/state/memory/elf/coredump/prstatus/aarch64.py +46 -0
- smallworld/state/memory/elf/coredump/prstatus/amd64.py +40 -0
- smallworld/state/memory/elf/coredump/prstatus/arm.py +53 -0
- smallworld/state/memory/elf/coredump/prstatus/i386.py +30 -0
- smallworld/state/memory/elf/coredump/prstatus/mips.py +55 -0
- smallworld/state/memory/elf/coredump/prstatus/mips64.py +57 -0
- smallworld/state/memory/elf/coredump/prstatus/ppc.py +82 -0
- smallworld/state/memory/elf/coredump/prstatus/prstatus.py +129 -0
- smallworld/state/memory/elf/elf.py +211 -57
- smallworld/state/memory/elf/register_state.py +36 -0
- smallworld/state/memory/elf/rela/__init__.py +2 -0
- smallworld/state/memory/elf/rela/aarch64.py +3 -1
- smallworld/state/memory/elf/rela/amd64.py +4 -2
- smallworld/state/memory/elf/rela/arm.py +4 -2
- smallworld/state/memory/elf/rela/i386.py +4 -2
- smallworld/state/memory/elf/rela/loongarch.py +32 -0
- smallworld/state/memory/elf/rela/mips.py +39 -18
- smallworld/state/memory/elf/rela/ppc.py +31 -14
- smallworld/state/memory/elf/structs.py +3 -0
- smallworld/state/memory/heap.py +2 -2
- smallworld/state/memory/memory.py +18 -0
- smallworld/state/memory/pe/__init__.py +3 -0
- smallworld/state/memory/pe/pe.py +361 -0
- smallworld/state/memory/pe/structs.py +60 -0
- smallworld/state/memory/stack/__init__.py +2 -0
- smallworld/state/memory/stack/loongarch.py +26 -0
- smallworld/state/models/__init__.py +29 -2
- smallworld/state/models/aarch64/__init__.py +1 -0
- smallworld/state/models/aarch64/systemv/__init__.py +6 -0
- smallworld/state/models/aarch64/systemv/c99/__init__.py +12 -0
- smallworld/state/models/aarch64/systemv/c99/signal.py +16 -0
- smallworld/state/models/aarch64/systemv/c99/stdio.py +265 -0
- smallworld/state/models/aarch64/systemv/c99/stdlib.py +169 -0
- smallworld/state/models/aarch64/systemv/c99/string.py +139 -0
- smallworld/state/models/aarch64/systemv/c99/time.py +61 -0
- smallworld/state/models/aarch64/systemv/posix/__init__.py +6 -0
- smallworld/state/models/aarch64/systemv/posix/libgen.py +16 -0
- smallworld/state/models/aarch64/systemv/posix/signal.py +157 -0
- smallworld/state/models/aarch64/systemv/systemv.py +80 -0
- smallworld/state/models/amd64/__init__.py +1 -0
- smallworld/state/models/amd64/systemv/__init__.py +6 -0
- smallworld/state/models/amd64/systemv/c99/__init__.py +12 -0
- smallworld/state/models/amd64/systemv/c99/signal.py +16 -0
- smallworld/state/models/amd64/systemv/c99/stdio.py +265 -0
- smallworld/state/models/amd64/systemv/c99/stdlib.py +169 -0
- smallworld/state/models/amd64/systemv/c99/string.py +139 -0
- smallworld/state/models/amd64/systemv/c99/time.py +61 -0
- smallworld/state/models/amd64/systemv/posix/__init__.py +6 -0
- smallworld/state/models/amd64/systemv/posix/libgen.py +16 -0
- smallworld/state/models/amd64/systemv/posix/signal.py +157 -0
- smallworld/state/models/amd64/systemv/systemv.py +78 -0
- smallworld/state/models/armel/__init__.py +1 -0
- smallworld/state/models/armel/systemv/__init__.py +6 -0
- smallworld/state/models/armel/systemv/c99/__init__.py +12 -0
- smallworld/state/models/armel/systemv/c99/signal.py +16 -0
- smallworld/state/models/armel/systemv/c99/stdio.py +265 -0
- smallworld/state/models/armel/systemv/c99/stdlib.py +169 -0
- smallworld/state/models/armel/systemv/c99/string.py +139 -0
- smallworld/state/models/armel/systemv/c99/time.py +61 -0
- smallworld/state/models/armel/systemv/posix/__init__.py +6 -0
- smallworld/state/models/armel/systemv/posix/libgen.py +16 -0
- smallworld/state/models/armel/systemv/posix/signal.py +157 -0
- smallworld/state/models/armel/systemv/systemv.py +82 -0
- smallworld/state/models/armhf/__init__.py +1 -0
- smallworld/state/models/armhf/systemv/__init__.py +6 -0
- smallworld/state/models/armhf/systemv/c99/__init__.py +12 -0
- smallworld/state/models/armhf/systemv/c99/signal.py +16 -0
- smallworld/state/models/armhf/systemv/c99/stdio.py +265 -0
- smallworld/state/models/armhf/systemv/c99/stdlib.py +169 -0
- smallworld/state/models/armhf/systemv/c99/string.py +139 -0
- smallworld/state/models/armhf/systemv/c99/time.py +61 -0
- smallworld/state/models/armhf/systemv/posix/__init__.py +6 -0
- smallworld/state/models/armhf/systemv/posix/libgen.py +16 -0
- smallworld/state/models/armhf/systemv/posix/signal.py +157 -0
- smallworld/state/models/armhf/systemv/systemv.py +77 -0
- smallworld/state/models/c99/__init__.py +12 -0
- smallworld/state/models/c99/fmt_print.py +915 -0
- smallworld/state/models/c99/fmt_scan.py +864 -0
- smallworld/state/models/c99/math.py +362 -0
- smallworld/state/models/c99/signal.py +71 -0
- smallworld/state/models/c99/stdio.py +1305 -0
- smallworld/state/models/c99/stdlib.py +595 -0
- smallworld/state/models/c99/string.py +674 -0
- smallworld/state/models/c99/time.py +340 -0
- smallworld/state/models/c99/utils.py +89 -0
- smallworld/state/models/cstd.py +759 -0
- smallworld/state/models/errno.py +581 -0
- smallworld/state/models/filedesc.py +515 -0
- smallworld/state/models/i386/__init__.py +1 -0
- smallworld/state/models/i386/systemv/__init__.py +6 -0
- smallworld/state/models/i386/systemv/c99/__init__.py +12 -0
- smallworld/state/models/i386/systemv/c99/signal.py +16 -0
- smallworld/state/models/i386/systemv/c99/stdio.py +265 -0
- smallworld/state/models/i386/systemv/c99/stdlib.py +169 -0
- smallworld/state/models/i386/systemv/c99/string.py +139 -0
- smallworld/state/models/i386/systemv/c99/time.py +61 -0
- smallworld/state/models/i386/systemv/posix/__init__.py +6 -0
- smallworld/state/models/i386/systemv/posix/libgen.py +16 -0
- smallworld/state/models/i386/systemv/posix/signal.py +157 -0
- smallworld/state/models/i386/systemv/systemv.py +71 -0
- smallworld/state/models/loongarch64/__init__.py +1 -0
- smallworld/state/models/loongarch64/systemv/__init__.py +6 -0
- smallworld/state/models/loongarch64/systemv/c99/__init__.py +12 -0
- smallworld/state/models/loongarch64/systemv/c99/signal.py +16 -0
- smallworld/state/models/loongarch64/systemv/c99/stdio.py +265 -0
- smallworld/state/models/loongarch64/systemv/c99/stdlib.py +169 -0
- smallworld/state/models/loongarch64/systemv/c99/string.py +139 -0
- smallworld/state/models/loongarch64/systemv/c99/time.py +61 -0
- smallworld/state/models/loongarch64/systemv/posix/__init__.py +6 -0
- smallworld/state/models/loongarch64/systemv/posix/libgen.py +16 -0
- smallworld/state/models/loongarch64/systemv/posix/signal.py +157 -0
- smallworld/state/models/loongarch64/systemv/systemv.py +83 -0
- smallworld/state/models/mips/__init__.py +1 -0
- smallworld/state/models/mips/systemv/__init__.py +6 -0
- smallworld/state/models/mips/systemv/c99/__init__.py +12 -0
- smallworld/state/models/mips/systemv/c99/signal.py +16 -0
- smallworld/state/models/mips/systemv/c99/stdio.py +265 -0
- smallworld/state/models/mips/systemv/c99/stdlib.py +169 -0
- smallworld/state/models/mips/systemv/c99/string.py +139 -0
- smallworld/state/models/mips/systemv/c99/time.py +61 -0
- smallworld/state/models/mips/systemv/posix/__init__.py +6 -0
- smallworld/state/models/mips/systemv/posix/libgen.py +16 -0
- smallworld/state/models/mips/systemv/posix/signal.py +157 -0
- smallworld/state/models/mips/systemv/systemv.py +78 -0
- smallworld/state/models/mips64/__init__.py +1 -0
- smallworld/state/models/mips64/systemv/__init__.py +6 -0
- smallworld/state/models/mips64/systemv/c99/__init__.py +12 -0
- smallworld/state/models/mips64/systemv/c99/signal.py +16 -0
- smallworld/state/models/mips64/systemv/c99/stdio.py +265 -0
- smallworld/state/models/mips64/systemv/c99/stdlib.py +169 -0
- smallworld/state/models/mips64/systemv/c99/string.py +139 -0
- smallworld/state/models/mips64/systemv/c99/time.py +61 -0
- smallworld/state/models/mips64/systemv/posix/__init__.py +6 -0
- smallworld/state/models/mips64/systemv/posix/libgen.py +16 -0
- smallworld/state/models/mips64/systemv/posix/signal.py +157 -0
- smallworld/state/models/mips64/systemv/systemv.py +98 -0
- smallworld/state/models/mips64el/__init__.py +1 -0
- smallworld/state/models/mips64el/systemv/__init__.py +6 -0
- smallworld/state/models/mips64el/systemv/c99/__init__.py +12 -0
- smallworld/state/models/mips64el/systemv/c99/signal.py +16 -0
- smallworld/state/models/mips64el/systemv/c99/stdio.py +265 -0
- smallworld/state/models/mips64el/systemv/c99/stdlib.py +169 -0
- smallworld/state/models/mips64el/systemv/c99/string.py +139 -0
- smallworld/state/models/mips64el/systemv/c99/time.py +61 -0
- smallworld/state/models/mips64el/systemv/posix/__init__.py +6 -0
- smallworld/state/models/mips64el/systemv/posix/libgen.py +16 -0
- smallworld/state/models/mips64el/systemv/posix/signal.py +157 -0
- smallworld/state/models/mips64el/systemv/systemv.py +96 -0
- smallworld/state/models/mipsel/__init__.py +1 -0
- smallworld/state/models/mipsel/systemv/__init__.py +6 -0
- smallworld/state/models/mipsel/systemv/c99/__init__.py +12 -0
- smallworld/state/models/mipsel/systemv/c99/signal.py +16 -0
- smallworld/state/models/mipsel/systemv/c99/stdio.py +265 -0
- smallworld/state/models/mipsel/systemv/c99/stdlib.py +169 -0
- smallworld/state/models/mipsel/systemv/c99/string.py +139 -0
- smallworld/state/models/mipsel/systemv/c99/time.py +61 -0
- smallworld/state/models/mipsel/systemv/posix/__init__.py +6 -0
- smallworld/state/models/mipsel/systemv/posix/libgen.py +16 -0
- smallworld/state/models/mipsel/systemv/posix/signal.py +157 -0
- smallworld/state/models/mipsel/systemv/systemv.py +78 -0
- smallworld/state/models/model.py +27 -2
- smallworld/state/models/posix/__init__.py +6 -0
- smallworld/state/models/posix/libgen.py +123 -0
- smallworld/state/models/posix/signal.py +690 -0
- smallworld/state/models/powerpc/__init__.py +1 -0
- smallworld/state/models/powerpc/systemv/__init__.py +6 -0
- smallworld/state/models/powerpc/systemv/c99/__init__.py +12 -0
- smallworld/state/models/powerpc/systemv/c99/signal.py +16 -0
- smallworld/state/models/powerpc/systemv/c99/stdio.py +265 -0
- smallworld/state/models/powerpc/systemv/c99/stdlib.py +169 -0
- smallworld/state/models/powerpc/systemv/c99/string.py +139 -0
- smallworld/state/models/powerpc/systemv/c99/time.py +61 -0
- smallworld/state/models/powerpc/systemv/posix/__init__.py +6 -0
- smallworld/state/models/powerpc/systemv/posix/libgen.py +16 -0
- smallworld/state/models/powerpc/systemv/posix/signal.py +157 -0
- smallworld/state/models/powerpc/systemv/systemv.py +93 -0
- smallworld/state/models/riscv64/__init__.py +1 -0
- smallworld/state/models/riscv64/systemv/__init__.py +6 -0
- smallworld/state/models/riscv64/systemv/c99/__init__.py +12 -0
- smallworld/state/models/riscv64/systemv/c99/signal.py +16 -0
- smallworld/state/models/riscv64/systemv/c99/stdio.py +265 -0
- smallworld/state/models/riscv64/systemv/c99/stdlib.py +169 -0
- smallworld/state/models/riscv64/systemv/c99/string.py +139 -0
- smallworld/state/models/riscv64/systemv/c99/time.py +61 -0
- smallworld/state/models/riscv64/systemv/posix/__init__.py +6 -0
- smallworld/state/models/riscv64/systemv/posix/libgen.py +16 -0
- smallworld/state/models/riscv64/systemv/posix/signal.py +157 -0
- smallworld/state/models/riscv64/systemv/systemv.py +85 -0
- smallworld/state/state.py +65 -24
- smallworld/state/unstable/elf.py +16 -31
- smallworld/utils.py +6 -1
- {smallworld_re-1.0.3.dist-info → smallworld_re-2.0.0.dist-info}/METADATA +74 -42
- smallworld_re-2.0.0.dist-info/RECORD +374 -0
- {smallworld_re-1.0.3.dist-info → smallworld_re-2.0.0.dist-info}/WHEEL +1 -1
- smallworld/state/models/x86/__init__.py +0 -2
- smallworld/state/models/x86/microsoftcdecl.py +0 -35
- smallworld/state/models/x86/systemv.py +0 -240
- smallworld_re-1.0.3.dist-info/RECORD +0 -166
- /smallworld/state/models/{posix.py → _posix.py} +0 -0
- {smallworld_re-1.0.3.dist-info → smallworld_re-2.0.0.dist-info}/entry_points.txt +0 -0
- {smallworld_re-1.0.3.dist-info → smallworld_re-2.0.0.dist-info}/licenses/LICENSE.txt +0 -0
- {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
|
+
}
|