Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/archinfo/arch_mips64.py: 93%

59 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 

16except ImportError: 

17 _unicorn = None 

18 

19 

20class ArchMIPS64(Arch): 

21 def __init__(self, endness=Endness.BE): 

22 super().__init__(endness) 

23 if endness == Endness.BE: 

24 self.function_prologs = set() 

25 self.function_epilogs = set() 

26 self.triplet = "mips64-linux-gnu" 

27 self.linux_name = "mips64" 

28 self.ida_name = "mips64b" 

29 

30 bits = 64 

31 vex_arch = "VexArchMIPS64" 

32 name = "MIPS64" 

33 qemu_name = "mips64el" 

34 ida_processor = "mips64" 

35 linux_name = "mips64el" # ??? 

36 triplet = "mips64el-linux-gnu" 

37 max_inst_bytes = 4 

38 ret_offset = 32 

39 syscall_register_offset = 16 

40 call_pushes_ret = False 

41 stack_change = -8 

42 branch_delay_slot = True 

43 sizeof = {"short": 16, "int": 32, "long": 64, "long long": 64} 

44 if _capstone: 

45 cs_arch = _capstone.CS_ARCH_MIPS 

46 cs_mode = _capstone.CS_MODE_64 + _capstone.CS_MODE_LITTLE_ENDIAN 

47 if _keystone: 

48 ks_arch = _keystone.KS_ARCH_MIPS 

49 ks_mode = _keystone.KS_MODE_64 + _keystone.KS_MODE_LITTLE_ENDIAN 

50 uc_arch = _unicorn.UC_ARCH_MIPS if _unicorn else None 

51 uc_mode = (_unicorn.UC_MODE_64 + _unicorn.UC_MODE_LITTLE_ENDIAN) if _unicorn else None 

52 uc_const = _unicorn.mips_const if _unicorn else None 

53 uc_prefix = "UC_MIPS_" if _unicorn else None 

54 function_prologs = set() 

55 function_epilogs = set() 

56 

57 ret_instruction = b"\x08\x00\xE0\x03" + b"\x25\x08\x20\x00" 

58 nop_instruction = b"\x00\x00\x00\x00" 

59 instruction_alignment = 4 

60 register_list = [ 

61 Register(name="zero", size=8, alias_names=("r0",)), 

62 Register(name="at", size=8, alias_names=("r1",), general_purpose=True), 

63 Register(name="v0", size=8, alias_names=("r2",), general_purpose=True, linux_entry_value="ld_destructor"), 

64 Register(name="v1", size=8, alias_names=("r3",), general_purpose=True), 

65 Register(name="a0", size=8, alias_names=("r4",), general_purpose=True, argument=True), 

66 Register(name="a1", size=8, alias_names=("r5",), general_purpose=True, argument=True), 

67 Register(name="a2", size=8, alias_names=("r6",), general_purpose=True, argument=True), 

68 Register(name="a3", size=8, alias_names=("r7",), general_purpose=True, argument=True), 

69 Register( 

70 name="t0", 

71 size=8, 

72 alias_names=( 

73 "r8", 

74 "a4", 

75 ), 

76 general_purpose=True, 

77 ), 

78 Register( 

79 name="t1", 

80 size=8, 

81 alias_names=( 

82 "r9", 

83 "a5", 

84 ), 

85 general_purpose=True, 

86 ), 

87 Register( 

88 name="t2", 

89 size=8, 

90 alias_names=( 

91 "r10", 

92 "a6", 

93 ), 

94 general_purpose=True, 

95 ), 

96 Register( 

97 name="t3", 

98 size=8, 

99 alias_names=( 

100 "r11", 

101 "a7", 

102 ), 

103 general_purpose=True, 

104 ), 

105 Register(name="t4", size=8, alias_names=("r12",), general_purpose=True), 

106 Register(name="t5", size=8, alias_names=("r13",), general_purpose=True), 

107 Register(name="t6", size=8, alias_names=("r14",), general_purpose=True), 

108 Register(name="t7", size=8, alias_names=("r15",), general_purpose=True), 

109 Register(name="s0", size=8, alias_names=("r16",), general_purpose=True), 

110 Register(name="s1", size=8, alias_names=("r17",), general_purpose=True), 

111 Register(name="s2", size=8, alias_names=("r18",), general_purpose=True), 

112 Register(name="s3", size=8, alias_names=("r19",), general_purpose=True), 

113 Register(name="s4", size=8, alias_names=("r20",), general_purpose=True), 

114 Register(name="s5", size=8, alias_names=("r21",), general_purpose=True), 

115 Register(name="s6", size=8, alias_names=("r22",), general_purpose=True), 

116 Register(name="s7", size=8, alias_names=("r23",), general_purpose=True), 

117 Register(name="t8", size=8, alias_names=("r24",), general_purpose=True), 

118 Register(name="t9", size=8, alias_names=("r25",), general_purpose=True, persistent=True), 

119 Register(name="k0", size=8, alias_names=("r26",), general_purpose=True), 

120 Register(name="k1", size=8, alias_names=("r27",), general_purpose=True), 

121 Register(name="gp", size=8, alias_names=("r28",), persistent=True), 

122 Register(name="sp", size=8, alias_names=("r29",), default_value=(Arch.initial_sp, True, "global")), 

123 Register(name="s8", size=8, alias_names=("r30", "fp", "bp"), general_purpose=True), 

124 Register( 

125 name="ra", size=8, alias_names=("r31", "lr"), general_purpose=True, persistent=True, linux_entry_value=0 

126 ), 

127 Register(name="pc", size=8, alias_names=("ip",)), 

128 Register(name="hi", size=8, general_purpose=True), 

129 Register(name="lo", size=8, general_purpose=True), 

130 Register(name="f0", size=8, floating_point=True, subregisters=[("f0_lo", 0, 4)]), 

131 Register(name="f1", size=8, floating_point=True, subregisters=[("f1_lo", 0, 4)]), 

132 Register(name="f2", size=8, floating_point=True, subregisters=[("f2_lo", 0, 4)]), 

133 Register(name="f3", size=8, floating_point=True, subregisters=[("f3_lo", 0, 4)]), 

134 Register(name="f4", size=8, floating_point=True, subregisters=[("f4_lo", 0, 4)]), 

135 Register(name="f5", size=8, floating_point=True, subregisters=[("f5_lo", 0, 4)]), 

136 Register(name="f6", size=8, floating_point=True, subregisters=[("f6_lo", 0, 4)]), 

137 Register(name="f7", size=8, floating_point=True, subregisters=[("f7_lo", 0, 4)]), 

138 Register(name="f8", size=8, floating_point=True, subregisters=[("f8_lo", 0, 4)]), 

139 Register(name="f9", size=8, floating_point=True, subregisters=[("f9_lo", 0, 4)]), 

140 Register(name="f10", size=8, floating_point=True, subregisters=[("f10_lo", 0, 4)]), 

141 Register(name="f11", size=8, floating_point=True, subregisters=[("f11_lo", 0, 4)]), 

142 Register(name="f12", size=8, floating_point=True, subregisters=[("f12_lo", 0, 4)]), 

143 Register(name="f13", size=8, floating_point=True, subregisters=[("f13_lo", 0, 4)]), 

144 Register(name="f14", size=8, floating_point=True, subregisters=[("f14_lo", 0, 4)]), 

145 Register(name="f15", size=8, floating_point=True, subregisters=[("f15_lo", 0, 4)]), 

146 Register(name="f16", size=8, floating_point=True, subregisters=[("f16_lo", 0, 4)]), 

147 Register(name="f17", size=8, floating_point=True, subregisters=[("f17_lo", 0, 4)]), 

148 Register(name="f18", size=8, floating_point=True, subregisters=[("f18_lo", 0, 4)]), 

149 Register(name="f19", size=8, floating_point=True, subregisters=[("f19_lo", 0, 4)]), 

150 Register(name="f20", size=8, floating_point=True, subregisters=[("f20_lo", 0, 4)]), 

151 Register(name="f21", size=8, floating_point=True, subregisters=[("f21_lo", 0, 4)]), 

152 Register(name="f22", size=8, floating_point=True, subregisters=[("f22_lo", 0, 4)]), 

153 Register(name="f23", size=8, floating_point=True, subregisters=[("f23_lo", 0, 4)]), 

154 Register(name="f24", size=8, floating_point=True, subregisters=[("f24_lo", 0, 4)]), 

155 Register(name="f25", size=8, floating_point=True, subregisters=[("f25_lo", 0, 4)]), 

156 Register(name="f26", size=8, floating_point=True, subregisters=[("f26_lo", 0, 4)]), 

157 Register(name="f27", size=8, floating_point=True, subregisters=[("f27_lo", 0, 4)]), 

158 Register(name="f28", size=8, floating_point=True, subregisters=[("f28_lo", 0, 4)]), 

159 Register(name="f29", size=8, floating_point=True, subregisters=[("f29_lo", 0, 4)]), 

160 Register(name="f30", size=8, floating_point=True, subregisters=[("f30_lo", 0, 4)]), 

161 Register(name="f31", size=8, floating_point=True, subregisters=[("f31_lo", 0, 4)]), 

162 Register(name="fir", size=4, floating_point=True), 

163 Register(name="fccr", size=4, floating_point=True), 

164 Register(name="fexr", size=4, floating_point=True), 

165 Register(name="fenr", size=4, floating_point=True), 

166 Register(name="fcsr", size=4, floating_point=True), 

167 Register(name="cp0_status", size=4), 

168 Register(name="ulr", size=8), 

169 Register(name="emnote", size=4, artificial=True), 

170 Register(name="cond", size=4), 

171 Register(name="cmstart", size=8), 

172 Register(name="cmlen", size=8), 

173 Register(name="nraddr", size=8), 

174 Register(name="ip_at_syscall", size=8, artificial=True), 

175 ] 

176 

177 # http://techpubs.sgi.com/library/manuals/4000/007-4658-001/pdf/007-4658-001.pdf 

178 dynamic_tag_translation = { 

179 0x70000001: "DT_MIPS_RLD_VERSION", 

180 0x70000005: "DT_MIPS_FLAGS", 

181 0x70000006: "DT_MIPS_BASE_ADDRESS", 

182 0x7000000A: "DT_MIPS_LOCAL_GOTNO", 

183 0x70000011: "DT_MIPS_SYMTABNO", 

184 0x70000012: "DT_MIPS_UNREFEXTNO", 

185 0x70000013: "DT_MIPS_GOTSYM", 

186 0x70000016: "DT_MIPS_RLD_MAP", 

187 } 

188 got_section_name = ".got" 

189 ld_linux_name = "ld.so.1" 

190 elf_tls = TLSArchInfo(1, 16, [], [0], [], 0x7000, 0x8000) 

191 

192 

193register_arch([r".*mipsel.*|.*mips64el|.*mipsel64"], 64, Endness.LE, ArchMIPS64) 

194register_arch([r".*mips64.*|.*mips.*"], 64, "any", ArchMIPS64)