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

1from .arch import Arch, register_arch, Endness, Register 

2from .tls import TLSArchInfo 

3 

4try: 

5 import capstone as _capstone 

6except ImportError: 

7 _capstone = None 

8 

9try: 

10 import keystone as _keystone 

11except ImportError: 

12 _keystone = None 

13 

14try: 

15 import unicorn as _unicorn 

16 from unicorn import riscv_const 

17except ImportError: 

18 _unicorn = None 

19 

20 

21def is_riscv_arch(a): 

22 return a.name.startswith("RISCV") 

23 

24 

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() 

31 

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 

57 

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 ] 

144 

145 got_section_name = ".got" 

146 ld_linux_name = "ld-linux-riscv64-lp64d.so.1" 

147 elf_tls = TLSArchInfo(1, 32, [], [0], [], 0, 0) 

148 

149 

150register_arch([r".*riscv.*"], 64, "any", ArchRISCV64)