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,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
|
+
}
|