Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/archinfo/arch_riscv64.py: 93%
55 statements
« prev ^ index » next coverage.py v7.3.1, created at 2023-09-25 06:15 +0000
« prev ^ index » next coverage.py v7.3.1, created at 2023-09-25 06:15 +0000
1from .arch import Arch, register_arch, Endness, Register
2from .tls import TLSArchInfo
4try:
5 import capstone as _capstone
6except ImportError:
7 _capstone = None
9try:
10 import keystone as _keystone
11except ImportError:
12 _keystone = None
14try:
15 import unicorn as _unicorn
16 from unicorn import riscv_const
17except ImportError:
18 _unicorn = None
21def is_riscv_arch(a):
22 return a.name.startswith("RISCV")
25class ArchRISCV64(Arch):
26 def __init__(self, endness=Endness.LE):
27 super().__init__(endness)
28 if endness == Endness.BE:
29 self.function_prologs = set()
30 self.function_epilogs = set()
32 bits = 64
33 vex_arch = "VexArchRISCV64"
34 name = "RISCV64"
35 qemu_name = "riscv64"
36 linux_name = "riscv64"
37 triplet = "riscv64-linux-gnu"
38 max_inst_bytes = 4
39 ret_offset = 4
40 vex_conditional_helpers = True
41 syscall_num_offset = 132
42 call_pushes_ret = False
43 memory_endness = Endness.LE
44 register_endness = Endness.LE
45 instruction_endness = Endness.LE
46 sizeof = {"short": 16, "int": 32, "long": 64, "long long": 64}
47 if _capstone and hasattr(_capstone, "CS_ARCH_RISCV"):
48 cs_arch = _capstone.CS_ARCH_RISCV
49 cs_mode = _capstone.CS_MODE_RISCV64
50 # if _keystone:
51 # ks_arch = _keystone.KS_ARCH_RISCV
52 # ks_mode = _keystone.KS_MODE_LITTLE_ENDIAN
53 uc_arch = _unicorn.UC_ARCH_RISCV if _unicorn else None
54 uc_mode = _unicorn.UC_MODE_RISCV64 if _unicorn else None
55 uc_const = riscv_const if _unicorn else None
56 uc_prefix = "UC_RISCV_" if _unicorn else None
58 ret_instruction = b"\x00\x00\x80\x67" # ret
59 nop_instruction = b"\x00\x00\x00\x13" # nop
60 function_prologs = set()
61 function_epilogs = set()
62 instruction_alignment = 4
63 register_list = [
64 Register(name="x0", size=8, alias_names=("zero",)),
65 Register(
66 name="x1",
67 size=8,
68 alias_names=(
69 "ra",
70 "lr",
71 ),
72 general_purpose=True,
73 ),
74 Register(name="x2", size=8, alias_names=("sp",), general_purpose=True),
75 Register(name="x3", size=8, alias_names=("gp",), general_purpose=True),
76 Register(name="x4", size=8, alias_names=("tp",), general_purpose=True),
77 Register(name="x5", size=8, alias_names=("t0",), general_purpose=True),
78 Register(name="x6", size=8, alias_names=("t1",), general_purpose=True),
79 Register(name="x7", size=8, alias_names=("t2",), general_purpose=True),
80 Register(name="x8", size=8, alias_names=("s0", "fp", "bp"), general_purpose=True),
81 Register(name="x9", size=8, alias_names=("s1",), general_purpose=True),
82 Register(name="x10", size=8, alias_names=("a0",), general_purpose=True, argument=True),
83 Register(name="x11", size=8, alias_names=("a1",), general_purpose=True, argument=True),
84 Register(name="x12", size=8, alias_names=("a2",), general_purpose=True, argument=True),
85 Register(name="x13", size=8, alias_names=("a3",), general_purpose=True, argument=True),
86 Register(name="x14", size=8, alias_names=("a4",), general_purpose=True, argument=True),
87 Register(name="x15", size=8, alias_names=("a5",), general_purpose=True, argument=True),
88 Register(name="x16", size=8, alias_names=("a6",), general_purpose=True, argument=True),
89 Register(name="x17", size=8, alias_names=("a7",), general_purpose=True, argument=True),
90 Register(name="x18", size=8, alias_names=("s2",), general_purpose=True),
91 Register(name="x19", size=8, alias_names=("s3",), general_purpose=True),
92 Register(name="x20", size=8, alias_names=("s4",), general_purpose=True),
93 Register(name="x21", size=8, alias_names=("s5",), general_purpose=True),
94 Register(name="x22", size=8, alias_names=("s6",), general_purpose=True),
95 Register(name="x23", size=8, alias_names=("s7",), general_purpose=True),
96 Register(name="x24", size=8, alias_names=("s8",), general_purpose=True),
97 Register(name="x25", size=8, alias_names=("s9",), general_purpose=True),
98 Register(name="x26", size=8, alias_names=("s10",), general_purpose=True),
99 Register(name="x27", size=8, alias_names=("s11",), general_purpose=True),
100 Register(name="x28", size=8, alias_names=("t3",), general_purpose=True),
101 Register(name="x29", size=8, alias_names=("t4",), general_purpose=True),
102 Register(name="x30", size=8, alias_names=("t5",), general_purpose=True),
103 Register(name="x31", size=8, alias_names=("t6",), general_purpose=True),
104 Register(name="pc", size=8, alias_names=("ip",)),
105 Register(
106 name="f0",
107 size=8,
108 alias_names=("ft0",),
109 floating_point=True,
110 ),
111 Register(name="f1", size=8, alias_names=("ft1",), floating_point=True),
112 Register(name="f2", size=8, alias_names=("ft2",), floating_point=True),
113 Register(name="f3", size=8, alias_names=("ft3",), floating_point=True),
114 Register(name="f4", size=8, alias_names=("ft4",), floating_point=True),
115 Register(name="f5", size=8, alias_names=("ft5",), floating_point=True),
116 Register(name="f6", size=8, alias_names=("ft6",), floating_point=True),
117 Register(name="f7", size=8, alias_names=("ft7",), floating_point=True),
118 Register(name="f8", size=8, alias_names=("fs0",), floating_point=True),
119 Register(name="f9", size=8, alias_names=("fs1",), floating_point=True),
120 Register(name="f10", size=8, alias_names=("fa0",), floating_point=True),
121 Register(name="f11", size=8, alias_names=("fa1",), floating_point=True),
122 Register(name="f12", size=8, alias_names=("fa2",), floating_point=True),
123 Register(name="f13", size=8, alias_names=("fa3",), floating_point=True),
124 Register(name="f14", size=8, alias_names=("fa4",), floating_point=True),
125 Register(name="f15", size=8, alias_names=("fa5",), floating_point=True),
126 Register(name="f16", size=8, alias_names=("fa6",), floating_point=True),
127 Register(name="f17", size=8, alias_names=("fa7",), floating_point=True),
128 Register(name="f18", size=8, alias_names=("fs2",), floating_point=True),
129 Register(name="f19", size=8, alias_names=("fs3",), floating_point=True),
130 Register(name="f20", size=8, alias_names=("fs4",), floating_point=True),
131 Register(name="f21", size=8, alias_names=("fs5",), floating_point=True),
132 Register(name="f22", size=8, alias_names=("fs6",), floating_point=True),
133 Register(name="f23", size=8, alias_names=("fs7",), floating_point=True),
134 Register(name="f24", size=8, alias_names=("fs8",), floating_point=True),
135 Register(name="f25", size=8, alias_names=("fs9",), floating_point=True),
136 Register(name="f26", size=8, alias_names=("fs10",), floating_point=True),
137 Register(name="f27", size=8, alias_names=("fs11",), floating_point=True),
138 Register(name="f28", size=8, alias_names=("ft8",), floating_point=True),
139 Register(name="f29", size=8, alias_names=("ft9",), floating_point=True),
140 Register(name="f30", size=8, alias_names=("ft10",), floating_point=True),
141 Register(name="f31", size=8, alias_names=("ft11",), floating_point=True),
142 Register(name="ip_at_syscall", size=8, artificial=True),
143 ]
145 got_section_name = ".got"
146 ld_linux_name = "ld-linux-riscv64-lp64d.so.1"
147 elf_tls = TLSArchInfo(1, 32, [], [0], [], 0, 0)
150register_arch([r".*riscv.*"], 64, "any", ArchRISCV64)