SystemZDisassembler.c
Go to the documentation of this file.
1 //===------ SystemZDisassembler.cpp - Disassembler for PowerPC ------*- C++ -*-===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 /* Capstone Disassembly Engine */
11 /* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2015 */
12 
13 #ifdef CAPSTONE_HAS_SYSZ
14 
15 #include <stdio.h> // DEBUG
16 #include <stdlib.h>
17 #include <string.h>
18 
19 #include "../../cs_priv.h"
20 #include "../../utils.h"
21 
22 #include "SystemZDisassembler.h"
23 
24 #include "../../MCInst.h"
25 #include "../../MCInstrDesc.h"
26 #include "../../MCFixedLenDisassembler.h"
27 #include "../../MCRegisterInfo.h"
28 #include "../../MCDisassembler.h"
29 #include "../../MathExtras.h"
30 
31 #include "SystemZMCTargetDesc.h"
32 
33 static uint64_t getFeatureBits(int mode)
34 {
35  // support everything
36  return (uint64_t)-1;
37 }
38 
39 static DecodeStatus decodeRegisterClass(MCInst *Inst, uint64_t RegNo, const unsigned *Regs)
40 {
41  //assert(RegNo < 16 && "Invalid register");
42  RegNo = Regs[RegNo];
43  if (RegNo == 0)
44  return MCDisassembler_Fail;
45 
46  MCOperand_CreateReg0(Inst, (unsigned)RegNo);
48 }
49 
50 static DecodeStatus DecodeGR32BitRegisterClass(MCInst *Inst, uint64_t RegNo,
51  uint64_t Address, const void *Decoder)
52 {
53  return decodeRegisterClass(Inst, RegNo, SystemZMC_GR32Regs);
54 }
55 
56 static DecodeStatus DecodeGRH32BitRegisterClass(MCInst *Inst, uint64_t RegNo,
57  uint64_t Address, const void *Decoder)
58 {
59  return decodeRegisterClass(Inst, RegNo, SystemZMC_GRH32Regs);
60 }
61 
62 static DecodeStatus DecodeGR64BitRegisterClass(MCInst *Inst, uint64_t RegNo,
63  uint64_t Address, const void *Decoder)
64 {
65  return decodeRegisterClass(Inst, RegNo, SystemZMC_GR64Regs);
66 }
67 
68 static DecodeStatus DecodeGR128BitRegisterClass(MCInst *Inst, uint64_t RegNo,
69  uint64_t Address, const void *Decoder)
70 {
71  return decodeRegisterClass(Inst, RegNo, SystemZMC_GR128Regs);
72 }
73 
74 static DecodeStatus DecodeADDR64BitRegisterClass(MCInst *Inst, uint64_t RegNo,
75  uint64_t Address, const void *Decoder)
76 {
77  return decodeRegisterClass(Inst, RegNo, SystemZMC_GR64Regs);
78 }
79 
80 static DecodeStatus DecodeFP32BitRegisterClass(MCInst *Inst, uint64_t RegNo,
81  uint64_t Address, const void *Decoder)
82 {
83  return decodeRegisterClass(Inst, RegNo, SystemZMC_FP32Regs);
84 }
85 
86 static DecodeStatus DecodeFP64BitRegisterClass(MCInst *Inst, uint64_t RegNo,
87  uint64_t Address, const void *Decoder)
88 {
89  return decodeRegisterClass(Inst, RegNo, SystemZMC_FP64Regs);
90 }
91 
92 static DecodeStatus DecodeFP128BitRegisterClass(MCInst *Inst, uint64_t RegNo,
93  uint64_t Address, const void *Decoder)
94 {
95  return decodeRegisterClass(Inst, RegNo, SystemZMC_FP128Regs);
96 }
97 
98 static DecodeStatus DecodeVR32BitRegisterClass(MCInst *Inst, uint64_t RegNo,
99  uint64_t Address, const void *Decoder)
100 {
101  return decodeRegisterClass(Inst, RegNo, SystemZMC_VR32Regs);
102 }
103 
104 static DecodeStatus DecodeVR64BitRegisterClass(MCInst *Inst, uint64_t RegNo,
105  uint64_t Address, const void *Decoder)
106 {
107  return decodeRegisterClass(Inst, RegNo, SystemZMC_VR64Regs);
108 }
109 
110 static DecodeStatus DecodeVR128BitRegisterClass(MCInst *Inst, uint64_t RegNo,
111  uint64_t Address, const void *Decoder)
112 {
113  return decodeRegisterClass(Inst, RegNo, SystemZMC_VR128Regs);
114 }
115 
116 static DecodeStatus DecodeAR32BitRegisterClass(MCInst *Inst, uint64_t RegNo,
117  uint64_t Address, const void *Decoder)
118 {
119  return decodeRegisterClass(Inst, RegNo, SystemZMC_AR32Regs);
120 }
121 
122 static DecodeStatus DecodeCR64BitRegisterClass(MCInst *Inst, uint64_t RegNo,
123  uint64_t Address, const void *Decoder)
124 {
125  return decodeRegisterClass(Inst, RegNo, SystemZMC_CR64Regs);
126 }
127 
128 static DecodeStatus decodeUImmOperand(MCInst *Inst, uint64_t Imm)
129 {
130  //assert(isUInt<N>(Imm) && "Invalid immediate");
131  MCOperand_CreateImm0(Inst, Imm);
132  return MCDisassembler_Success;
133 }
134 
135 static DecodeStatus decodeSImmOperand(MCInst *Inst, uint64_t Imm, unsigned N)
136 {
137  //assert(isUInt<N>(Imm) && "Invalid immediate");
138  MCOperand_CreateImm0(Inst, SignExtend64(Imm, N));
139  return MCDisassembler_Success;
140 }
141 
142 static DecodeStatus decodeU1ImmOperand(MCInst *Inst, uint64_t Imm,
143  uint64_t Address, const void *Decoder)
144 {
145  return decodeUImmOperand(Inst, Imm);
146 }
147 
148 static DecodeStatus decodeU2ImmOperand(MCInst *Inst, uint64_t Imm,
149  uint64_t Address, const void *Decoder)
150 {
151  return decodeUImmOperand(Inst, Imm);
152 }
153 
154 static DecodeStatus decodeU3ImmOperand(MCInst *Inst, uint64_t Imm,
155  uint64_t Address, const void *Decoder)
156 {
157  return decodeUImmOperand(Inst, Imm);
158 }
159 
160 static DecodeStatus decodeU4ImmOperand(MCInst *Inst, uint64_t Imm,
161  uint64_t Address, const void *Decoder)
162 {
163  return decodeUImmOperand(Inst, Imm);
164 }
165 
166 static DecodeStatus decodeU6ImmOperand(MCInst *Inst, uint64_t Imm,
167  uint64_t Address, const void *Decoder)
168 {
169  return decodeUImmOperand(Inst, Imm);
170 }
171 
172 static DecodeStatus decodeU8ImmOperand(MCInst *Inst, uint64_t Imm,
173  uint64_t Address, const void *Decoder)
174 {
175  return decodeUImmOperand(Inst, Imm);
176 }
177 
178 static DecodeStatus decodeU12ImmOperand(MCInst *Inst, uint64_t Imm,
179  uint64_t Address, const void *Decoder)
180 {
181  return decodeUImmOperand(Inst, Imm);
182 }
183 
184 static DecodeStatus decodeU16ImmOperand(MCInst *Inst, uint64_t Imm,
185  uint64_t Address, const void *Decoder)
186 {
187  return decodeUImmOperand(Inst, Imm);
188 }
189 
190 static DecodeStatus decodeU32ImmOperand(MCInst *Inst, uint64_t Imm,
191  uint64_t Address, const void *Decoder)
192 {
193  return decodeUImmOperand(Inst, Imm);
194 }
195 
196 static DecodeStatus decodeS8ImmOperand(MCInst *Inst, uint64_t Imm,
197  uint64_t Address, const void *Decoder)
198 {
199  return decodeSImmOperand(Inst, Imm, 8);
200 }
201 
202 static DecodeStatus decodeS16ImmOperand(MCInst *Inst, uint64_t Imm,
203  uint64_t Address, const void *Decoder)
204 {
205  return decodeSImmOperand(Inst, Imm, 16);
206 }
207 
208 static DecodeStatus decodeS32ImmOperand(MCInst *Inst, uint64_t Imm,
209  uint64_t Address, const void *Decoder)
210 {
211  return decodeSImmOperand(Inst, Imm, 32);
212 }
213 
214 static DecodeStatus decodePCDBLOperand(MCInst *Inst, uint64_t Imm,
215  uint64_t Address, unsigned N)
216 {
217  //assert(isUInt<N>(Imm) && "Invalid PC-relative offset");
218  MCOperand_CreateImm0(Inst, SignExtend64(Imm, N) * 2 + Address);
219  return MCDisassembler_Success;
220 }
221 
222 static DecodeStatus decodePC12DBLBranchOperand(MCInst *Inst, uint64_t Imm,
224  const void *Decoder)
225 {
226  return decodePCDBLOperand(Inst, Imm, Address, 12);
227 }
228 
229 static DecodeStatus decodePC16DBLBranchOperand(MCInst *Inst, uint64_t Imm,
231  const void *Decoder)
232 {
233  return decodePCDBLOperand(Inst, Imm, Address, 16);
234 }
235 
236 static DecodeStatus decodePC24DBLBranchOperand(MCInst *Inst, uint64_t Imm,
238  const void *Decoder)
239 {
240  return decodePCDBLOperand(Inst, Imm, Address, 24);
241 }
242 
243 static DecodeStatus decodePC32DBLBranchOperand(MCInst *Inst, uint64_t Imm,
245  const void *Decoder)
246 {
247  return decodePCDBLOperand(Inst, Imm, Address, 32);
248 }
249 
250 static DecodeStatus decodePC32DBLOperand(MCInst *Inst, uint64_t Imm,
252  const void *Decoder)
253 {
254  return decodePCDBLOperand(Inst, Imm, Address, 32);
255 }
256 
257 static DecodeStatus decodeBDAddr12Operand(MCInst *Inst, uint64_t Field,
258  const unsigned *Regs)
259 {
260  uint64_t Base = Field >> 12;
261  uint64_t Disp = Field & 0xfff;
262  //assert(Base < 16 && "Invalid BDAddr12");
263 
264  MCOperand_CreateReg0(Inst, Base == 0 ? 0 : Regs[Base]);
265  MCOperand_CreateImm0(Inst, Disp);
266 
267  return MCDisassembler_Success;
268 }
269 
270 static DecodeStatus decodeBDAddr20Operand(MCInst *Inst, uint64_t Field,
271  const unsigned *Regs)
272 {
273  uint64_t Base = Field >> 20;
274  uint64_t Disp = ((Field << 12) & 0xff000) | ((Field >> 8) & 0xfff);
275  //assert(Base < 16 && "Invalid BDAddr20");
276 
277  MCOperand_CreateReg0(Inst, Base == 0 ? 0 : Regs[Base]);
278  MCOperand_CreateImm0(Inst, SignExtend64(Disp, 20));
279  return MCDisassembler_Success;
280 }
281 
282 static DecodeStatus decodeBDXAddr12Operand(MCInst *Inst, uint64_t Field,
283  const unsigned *Regs)
284 {
285  uint64_t Index = Field >> 16;
286  uint64_t Base = (Field >> 12) & 0xf;
287  uint64_t Disp = Field & 0xfff;
288 
289  //assert(Index < 16 && "Invalid BDXAddr12");
290  MCOperand_CreateReg0(Inst, Base == 0 ? 0 : Regs[Base]);
291  MCOperand_CreateImm0(Inst, Disp);
292  MCOperand_CreateReg0(Inst, Index == 0 ? 0 : Regs[Index]);
293 
294  return MCDisassembler_Success;
295 }
296 
297 static DecodeStatus decodeBDXAddr20Operand(MCInst *Inst, uint64_t Field,
298  const unsigned *Regs)
299 {
300  uint64_t Index = Field >> 24;
301  uint64_t Base = (Field >> 20) & 0xf;
302  uint64_t Disp = ((Field & 0xfff00) >> 8) | ((Field & 0xff) << 12);
303 
304  //assert(Index < 16 && "Invalid BDXAddr20");
305  MCOperand_CreateReg0(Inst, Base == 0 ? 0 : Regs[Base]);
306  MCOperand_CreateImm0(Inst, SignExtend64(Disp, 20));
307  MCOperand_CreateReg0(Inst, Index == 0 ? 0 : Regs[Index]);
308 
309  return MCDisassembler_Success;
310 }
311 
312 static DecodeStatus decodeBDLAddr12Len8Operand(MCInst *Inst, uint64_t Field,
313  const unsigned *Regs)
314 {
315  uint64_t Length = Field >> 16;
316  uint64_t Base = (Field >> 12) & 0xf;
317  uint64_t Disp = Field & 0xfff;
318  //assert(Length < 256 && "Invalid BDLAddr12Len8");
319 
320  MCOperand_CreateReg0(Inst, Base == 0 ? 0 : Regs[Base]);
321  MCOperand_CreateImm0(Inst, Disp);
322  MCOperand_CreateImm0(Inst, Length + 1);
323 
324  return MCDisassembler_Success;
325 }
326 
327 static DecodeStatus decodeBDRAddr12Operand(MCInst *Inst, uint64_t Field,
328  const unsigned *Regs)
329 {
330  uint64_t Length = Field >> 16;
331  uint64_t Base = (Field >> 12) & 0xf;
332  uint64_t Disp = Field & 0xfff;
333  //assert(Length < 16 && "Invalid BDRAddr12");
334 
335  MCOperand_CreateReg0(Inst, Base == 0 ? 0 : Regs[Base]);
336  MCOperand_CreateImm0(Inst, Disp);
337  MCOperand_CreateReg0(Inst, Regs[Length]);
338 
339  return MCDisassembler_Success;
340 }
341 
342 static DecodeStatus decodeBDVAddr12Operand(MCInst *Inst, uint64_t Field,
343  const unsigned *Regs)
344 {
345  uint64_t Index = Field >> 16;
346  uint64_t Base = (Field >> 12) & 0xf;
347  uint64_t Disp = Field & 0xfff;
348  //assert(Index < 32 && "Invalid BDVAddr12");
349 
350  MCOperand_CreateReg0(Inst, Base == 0 ? 0 : Regs[Base]);
351  MCOperand_CreateImm0(Inst, Disp);
353 
354  return MCDisassembler_Success;
355 }
356 
357 static DecodeStatus decodeBDAddr32Disp12Operand(MCInst *Inst, uint64_t Field,
358  uint64_t Address, const void *Decoder)
359 {
360  return decodeBDAddr12Operand(Inst, Field, SystemZMC_GR32Regs);
361 }
362 
363 static DecodeStatus decodeBDAddr32Disp20Operand(MCInst *Inst, uint64_t Field,
364  uint64_t Address, const void *Decoder)
365 {
366  return decodeBDAddr20Operand(Inst, Field, SystemZMC_GR32Regs);
367 }
368 
369 static DecodeStatus decodeBDAddr64Disp12Operand(MCInst *Inst, uint64_t Field,
370  uint64_t Address, const void *Decoder)
371 {
372  return decodeBDAddr12Operand(Inst, Field, SystemZMC_GR64Regs);
373 }
374 
375 static DecodeStatus decodeBDAddr64Disp20Operand(MCInst *Inst, uint64_t Field,
376  uint64_t Address, const void *Decoder)
377 {
378  return decodeBDAddr20Operand(Inst, Field, SystemZMC_GR64Regs);
379 }
380 
381 static DecodeStatus decodeBDXAddr64Disp12Operand(MCInst *Inst, uint64_t Field,
382  uint64_t Address, const void *Decoder)
383 {
384  return decodeBDXAddr12Operand(Inst, Field, SystemZMC_GR64Regs);
385 }
386 
387 static DecodeStatus decodeBDXAddr64Disp20Operand(MCInst *Inst, uint64_t Field,
388  uint64_t Address, const void *Decoder)
389 {
390  return decodeBDXAddr20Operand(Inst, Field, SystemZMC_GR64Regs);
391 }
392 
393 static DecodeStatus decodeBDLAddr64Disp12Len4Operand(MCInst *Inst, uint64_t Field,
394  uint64_t Address, const void *Decoder)
395 {
396  return decodeBDLAddr12Len8Operand(Inst, Field, SystemZMC_GR64Regs);
397 }
398 
399 static DecodeStatus decodeBDLAddr64Disp12Len8Operand(MCInst *Inst, uint64_t Field,
400  uint64_t Address, const void *Decoder)
401 {
402  return decodeBDLAddr12Len8Operand(Inst, Field, SystemZMC_GR64Regs);
403 }
404 
405 static DecodeStatus decodeBDRAddr64Disp12Operand(MCInst *Inst, uint64_t Field,
406  uint64_t Address, const void *Decoder)
407 {
408  return decodeBDRAddr12Operand(Inst, Field, SystemZMC_GR64Regs);
409 }
410 
411 static DecodeStatus decodeBDVAddr64Disp12Operand(MCInst *Inst, uint64_t Field,
412  uint64_t Address, const void *Decoder)
413 {
414  return decodeBDVAddr12Operand(Inst, Field, SystemZMC_GR64Regs);
415 }
416 
417 
418 #define GET_SUBTARGETINFO_ENUM
419 #include "SystemZGenSubtargetInfo.inc"
420 #include "SystemZGenDisassemblerTables.inc"
421 bool SystemZ_getInstruction(csh ud, const uint8_t *code, size_t code_len, MCInst *MI,
422  uint16_t *size, uint64_t address, void *info)
423 {
424  uint64_t Inst;
425  const uint8_t *Table;
426  uint16_t I;
427 
428  // The top 2 bits of the first byte specify the size.
429  if (*code < 0x40) {
430  *size = 2;
431  Table = DecoderTable16;
432  } else if (*code < 0xc0) {
433  *size = 4;
434  Table = DecoderTable32;
435  } else {
436  *size = 6;
437  Table = DecoderTable48;
438  }
439 
440  if (code_len < *size)
441  // short of input data
442  return false;
443 
444  if (MI->flat_insn->detail) {
445  memset(MI->flat_insn->detail, 0, offsetof(cs_detail, sysz)+sizeof(cs_sysz));
446  }
447 
448  // Construct the instruction.
449  Inst = 0;
450  for (I = 0; I < *size; ++I)
451  Inst = (Inst << 8) | code[I];
452 
453  return decodeInstruction(Table, MI, Inst, address, info, 0);
454 }
455 
456 #define GET_REGINFO_ENUM
457 #define GET_REGINFO_MC_DESC
458 #include "SystemZGenRegisterInfo.inc"
459 void SystemZ_init(MCRegisterInfo *MRI)
460 {
461  /*
462  InitMCRegisterInfo(SystemZRegDesc, 98, RA, PC,
463  SystemZMCRegisterClasses, 12,
464  SystemZRegUnitRoots,
465  49,
466  SystemZRegDiffLists,
467  SystemZRegStrings,
468  SystemZSubRegIdxLists,
469  7,
470  SystemZSubRegIdxRanges,
471  SystemZRegEncodingTable);
472  */
473 
474  MCRegisterInfo_InitMCRegisterInfo(MRI, SystemZRegDesc, 194,
475  0, 0,
476  SystemZMCRegisterClasses, 21,
477  0, 0,
478  SystemZRegDiffLists,
479  0,
480  SystemZSubRegIdxLists, 7,
481  0);
482 }
483 
484 #endif
MCDisassembler_Success
@ MCDisassembler_Success
Definition: MCDisassembler.h:10
memset
return memset(p, 0, total)
MCOperand_CreateReg0
void MCOperand_CreateReg0(MCInst *mcInst, unsigned Reg)
Definition: MCInst.c:155
cs_sysz
Definition: systemz.h:194
uint16_t
unsigned short uint16_t
Definition: stdint-msvc2008.h:79
SystemZMC_CR64Regs
const unsigned SystemZMC_CR64Regs[16]
string.h
SystemZMCTargetDesc.h
mode
const char int mode
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:135
uint8_t
unsigned char uint8_t
Definition: stdint-msvc2008.h:78
absl::Length
size_t Length(TestCordSize size)
Definition: abseil-cpp/absl/strings/cord_test_helpers.h:80
MCOperand_CreateImm0
void MCOperand_CreateImm0(MCInst *mcInst, int64_t Val)
Definition: MCInst.c:174
SystemZMC_FP32Regs
const unsigned SystemZMC_FP32Regs[16]
SignExtend64
static int64_t SignExtend64(uint64_t X, unsigned B)
Sign extend number in the bottom B bits of X to a 64-bit int. Requires 0 < B <= 64.
Definition: MathExtras.h:413
SystemZMC_VR32Regs
const unsigned SystemZMC_VR32Regs[32]
SystemZDisassembler.h
uint64_t
unsigned __int64 uint64_t
Definition: stdint-msvc2008.h:90
SystemZMC_GR32Regs
const unsigned SystemZMC_GR32Regs[16]
framework.rpc.grpc_channelz.Address
Address
Definition: grpc_channelz.py:50
csh
size_t csh
Definition: capstone.h:71
DecodeStatus
DecodeStatus
Definition: MCDisassembler.h:7
MCInst
Definition: MCInst.h:88
SystemZ_getInstruction
bool SystemZ_getInstruction(csh ud, const uint8_t *code, size_t code_len, MCInst *instr, uint16_t *size, uint64_t address, void *info)
MCRegisterInfo_InitMCRegisterInfo
void MCRegisterInfo_InitMCRegisterInfo(MCRegisterInfo *RI, const MCRegisterDesc *D, unsigned NR, unsigned RA, unsigned PC, const MCRegisterClass *C, unsigned NC, uint16_t(*RURoots)[2], unsigned NRU, const MCPhysReg *DL, const char *Strings, const uint16_t *SubIndices, unsigned NumIndices, const uint16_t *RET)
Definition: MCRegisterInfo.c:28
MCDisassembler_Fail
@ MCDisassembler_Fail
Definition: MCDisassembler.h:8
N
#define N
Definition: sync_test.cc:37
I
#define I(b, c, d)
Definition: md5.c:120
SystemZMC_GRH32Regs
const unsigned SystemZMC_GRH32Regs[16]
SystemZMC_GR128Regs
const unsigned SystemZMC_GR128Regs[16]
SystemZMC_GR64Regs
const unsigned SystemZMC_GR64Regs[16]
SystemZMC_VR128Regs
const unsigned SystemZMC_VR128Regs[32]
SystemZMC_FP128Regs
const unsigned SystemZMC_FP128Regs[16]
MCRegisterInfo
Definition: MCRegisterInfo.h:78
Field
Definition: bloaty/third_party/protobuf/src/google/protobuf/type.pb.h:446
code
Definition: bloaty/third_party/zlib/contrib/infback9/inftree9.h:24
google::protobuf::python::descriptor::Index
static PyObject * Index(PyContainer *self, PyObject *item)
Definition: bloaty/third_party/protobuf/python/google/protobuf/pyext/descriptor_containers.cc:672
SystemZMC_AR32Regs
const unsigned SystemZMC_AR32Regs[16]
size
voidpf void uLong size
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
SystemZMC_VR64Regs
const unsigned SystemZMC_VR64Regs[32]
SystemZMC_FP64Regs
const unsigned SystemZMC_FP64Regs[16]
SystemZ_init
void SystemZ_init(MCRegisterInfo *MRI)
MCInst::flat_insn
cs_insn * flat_insn
Definition: MCInst.h:95
decodeInstruction
int decodeInstruction(struct InternalInstruction *insn, byteReader_t reader, const void *readerArg, uint64_t startLoc, DisassemblerMode mode)


grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:01:28