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

51 statements  

« prev     ^ index     » next       coverage.py v7.3.1, created at 2023-09-25 06:15 +0000

1try: 

2 import capstone as _capstone 

3except ImportError: 

4 _capstone = None 

5 

6try: 

7 import keystone as _keystone 

8except ImportError: 

9 _keystone = None 

10 

11try: 

12 import pyvex as _pyvex 

13except ImportError: 

14 _pyvex = None 

15 

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

17from .archerror import ArchError 

18from .tls import TLSArchInfo 

19 

20 

21class ArchS390X(Arch): 

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

23 super().__init__(endness) 

24 if endness != Endness.BE: 

25 raise ArchError("Arch s390x must be big endian") 

26 self.argument_register_positions = ( 

27 { 

28 self.registers["r2"][0]: 0, 

29 self.registers["r3"][0]: 1, 

30 self.registers["r4"][0]: 2, 

31 self.registers["r5"][0]: 3, 

32 self.registers["r6"][0]: 4, 

33 # fp registers 

34 self.registers["f0"][0]: 0, 

35 self.registers["f2"][0]: 1, 

36 self.registers["f4"][0]: 2, 

37 self.registers["f6"][0]: 3, 

38 } 

39 if _pyvex is not None 

40 else None 

41 ) 

42 

43 bits = 64 

44 vex_arch = "VexArchS390X" # enum VexArch 

45 name = "S390X" 

46 qemu_name = "s390x" # target/s390x 

47 triplet = "s390x-linux-gnu" 

48 linux_name = "s390" # arch/s390 

49 max_inst_bytes = 6 

50 ret_offset = 584 # offsetof(VexGuestS390XState, guest_r2) 

51 syscall_num_offset = 576 # offsetof(VexGuestS390XState, guest_r1) 

52 call_pushes_ret = False 

53 stack_change = -8 

54 initial_sp = 0x40000000000 

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

56 if _capstone: 

57 cs_arch = _capstone.CS_ARCH_SYSZ 

58 cs_mode = _capstone.CS_MODE_BIG_ENDIAN 

59 if _keystone: 

60 ks_arch = _keystone.KS_ARCH_SYSTEMZ 

61 ks_mode = _keystone.KS_MODE_BIG_ENDIAN 

62 ret_instruction = b"\x07\xf4" # br %r14 

63 nop_instruction = b"\x07\x07" # nopr %r7 

64 instruction_alignment = 2 

65 register_list = [ 

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

67 Register(name="r0", size=8, general_purpose=True), 

68 Register(name="r1", size=8, general_purpose=True, subregisters=[("r1_32", 4, 4)]), 

69 Register(name="r2", size=8, general_purpose=True, argument=True, subregisters=[("r2_32", 4, 4)]), 

70 Register( 

71 name="r3", 

72 size=8, 

73 general_purpose=True, 

74 argument=True, 

75 linux_entry_value="argc", 

76 subregisters=[("r3_32", 4, 4)], 

77 ), 

78 Register( 

79 name="r4", 

80 size=8, 

81 general_purpose=True, 

82 argument=True, 

83 linux_entry_value="argv", 

84 subregisters=[("r4_32", 4, 4)], 

85 ), 

86 Register( 

87 name="r5", 

88 size=8, 

89 general_purpose=True, 

90 argument=True, 

91 linux_entry_value="envp", 

92 subregisters=[("r5_32", 4, 4)], 

93 ), 

94 Register( 

95 name="r6", size=8, general_purpose=True, argument=True, persistent=True, subregisters=[("r6_32", 4, 4)] 

96 ), 

97 Register(name="r7", size=8, general_purpose=True, persistent=True, subregisters=[("r7_32", 4, 4)]), 

98 Register(name="r8", size=8, general_purpose=True, persistent=True, subregisters=[("r8_32", 4, 4)]), 

99 Register(name="r9", size=8, general_purpose=True, persistent=True, subregisters=[("r9_32", 4, 4)]), 

100 Register(name="r10", size=8, general_purpose=True, persistent=True, subregisters=[("r10_32", 4, 4)]), 

101 Register( 

102 name="r11", 

103 size=8, 

104 alias_names=("bp",), 

105 general_purpose=True, 

106 persistent=True, 

107 subregisters=[("r11_32", 4, 4)], 

108 ), 

109 Register(name="r12", size=8, general_purpose=True, persistent=True, subregisters=[("r12_32", 4, 4)]), 

110 Register(name="r13", size=8, general_purpose=True, persistent=True, subregisters=[("r13_32", 4, 4)]), 

111 # Strictly speaking, there is no fixed link register on s390x. 

112 # However, %r14 is almost always used for that, so mark it as such. 

113 # Situations when that's not the case (e.g. brasl %r0,X) 

114 # can still be handled explicitly. 

115 Register(name="r14", size=8, general_purpose=True, alias_names=("lr",)), 

116 Register( 

117 name="r15", 

118 size=8, 

119 alias_names=("sp",), 

120 general_purpose=True, 

121 persistent=True, 

122 default_value=(initial_sp, True, "global"), 

123 ), 

124 Register(name="v0", size=16, subregisters=[("f0", 0, 8)], floating_point=True), 

125 Register(name="v1", size=16, subregisters=[("f1", 0, 8)], floating_point=True), 

126 Register(name="v2", size=16, subregisters=[("f2", 0, 8)], floating_point=True), 

127 Register(name="v3", size=16, subregisters=[("f3", 0, 8)], floating_point=True), 

128 Register(name="v4", size=16, subregisters=[("f4", 0, 8)], floating_point=True), 

129 Register(name="v5", size=16, subregisters=[("f5", 0, 8)], floating_point=True), 

130 Register(name="v6", size=16, subregisters=[("f6", 0, 8)], floating_point=True), 

131 Register(name="v7", size=16, subregisters=[("f7", 0, 8)], floating_point=True), 

132 Register(name="v8", size=16, subregisters=[("f8", 0, 8)], floating_point=True), 

133 Register(name="v9", size=16, subregisters=[("f9", 0, 8)], floating_point=True), 

134 Register(name="v10", size=16, subregisters=[("f10", 0, 8)], floating_point=True), 

135 Register(name="v11", size=16, subregisters=[("f11", 0, 8)], floating_point=True), 

136 Register(name="v12", size=16, subregisters=[("f12", 0, 8)], floating_point=True), 

137 Register(name="v13", size=16, subregisters=[("f13", 0, 8)], floating_point=True), 

138 Register(name="v14", size=16, subregisters=[("f14", 0, 8)], floating_point=True), 

139 Register(name="v15", size=16, subregisters=[("f15", 0, 8)], floating_point=True), 

140 Register(name="v16", size=16, vector=True), 

141 Register(name="v17", size=16, vector=True), 

142 Register(name="v18", size=16, vector=True), 

143 Register(name="v19", size=16, vector=True), 

144 Register(name="v20", size=16, vector=True), 

145 Register(name="v21", size=16, vector=True), 

146 Register(name="v22", size=16, vector=True), 

147 Register(name="v23", size=16, vector=True), 

148 Register(name="v24", size=16, vector=True), 

149 Register(name="v25", size=16, vector=True), 

150 Register(name="v26", size=16, vector=True), 

151 Register(name="v27", size=16, vector=True), 

152 Register(name="v28", size=16, vector=True), 

153 Register(name="v29", size=16, vector=True), 

154 Register(name="v30", size=16, vector=True), 

155 Register(name="v31", size=16, vector=True), 

156 Register(name="a0", size=4), 

157 Register(name="a1", size=4), 

158 Register(name="a2", size=4), 

159 Register(name="a3", size=4), 

160 Register(name="a4", size=4), 

161 Register(name="a5", size=4), 

162 Register(name="a6", size=4), 

163 Register(name="a7", size=4), 

164 Register(name="a8", size=4), 

165 Register(name="a9", size=4), 

166 Register(name="a10", size=4), 

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

168 Register(name="a12", size=4), 

169 Register(name="a13", size=4), 

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

171 Register(name="a15", size=4), 

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

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

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

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

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

177 ] 

178 

179 function_prologs = { 

180 rb"\xeb.[\xf0-\xff]..\x24", # stmg %r1,%r3,d2(%r15) 

181 } 

182 function_epilogs = { 

183 rb"\x07\xf4", # br %r14 

184 } 

185 

186 got_section_name = ".got" 

187 ld_linux_name = "ld64.so.1" 

188 elf_tls = TLSArchInfo( 

189 variant=2, # 3.4.7 @ https://www.uclibc.org/docs/tls.pdf 

190 tcbhead_size=64, # sizeof(tcbhead_t) 

191 head_offsets=[0], # offsetof(tcbhead_t, tcb) 

192 dtv_offsets=[8], # offsetof(tcbhead_t, dtv) 

193 pthread_offsets=[16], # offsetof(tcbhead_t, self) 

194 tp_offset=0, 

195 dtv_entry_offset=0, 

196 ) 

197 

198 dwarf_registers = [ 

199 "v0", 

200 "v1", 

201 "v2", 

202 "v3", 

203 "v4", 

204 "v5", 

205 "v6", 

206 "v7", 

207 "v8", 

208 "v9", 

209 "v10", 

210 "v11", 

211 "v12", 

212 "v13", 

213 "v14", 

214 "v15", 

215 "v16", 

216 "v17", 

217 "v18", 

218 "v19", 

219 "v20", 

220 "v21", 

221 "v22", 

222 "v23", 

223 "v24", 

224 "v25", 

225 "v26", 

226 "v27", 

227 "v28", 

228 "v29", 

229 "v30", 

230 "v31", 

231 "cr0", 

232 "cr1", 

233 "cr2", 

234 "cr3", 

235 "cr4", 

236 "cr5", 

237 "cr6", 

238 "cr7", 

239 "cr8", 

240 "cr9", 

241 "cr10", 

242 "cr11", 

243 "cr12", 

244 "cr13", 

245 "cr14", 

246 "cr15", 

247 "ar0", 

248 "ar1", 

249 "ar2", 

250 "ar3", 

251 "ar4", 

252 "ar5", 

253 "ar6", 

254 "ar7", 

255 "ar8", 

256 "ar9", 

257 "ar10", 

258 "ar11", 

259 "ar12", 

260 "ar13", 

261 "ar14", 

262 "ar15", 

263 "psw_mask", 

264 "psw_address", 

265 ] 

266 

267 

268register_arch(["s390"], 64, Endness.BE, ArchS390X)