1 | #ifndef CAPSTONE_SPARC_H |
2 | #define CAPSTONE_SPARC_H |
3 | |
4 | /* Capstone Disassembly Engine */ |
5 | /* By Nguyen Anh Quynh <aquynh@gmail.com>, 2014 */ |
6 | |
7 | #ifdef __cplusplus |
8 | extern "C" { |
9 | #endif |
10 | |
11 | #if !defined(_MSC_VER) || !defined(_KERNEL_MODE) |
12 | #include <stdint.h> |
13 | #endif |
14 | |
15 | #include "platform.h" |
16 | |
17 | // GCC SPARC toolchain has a default macro called "sparc" which breaks |
18 | // compilation |
19 | #undef sparc |
20 | |
21 | #ifdef _MSC_VER |
22 | #pragma warning(disable:4201) |
23 | #endif |
24 | |
25 | //> Enums corresponding to Sparc condition codes, both icc's and fcc's. |
26 | typedef enum sparc_cc { |
27 | SPARC_CC_INVALID = 0, // invalid CC (default) |
28 | //> Integer condition codes |
29 | SPARC_CC_ICC_A = 8+256, // Always |
30 | SPARC_CC_ICC_N = 0+256, // Never |
31 | SPARC_CC_ICC_NE = 9+256, // Not Equal |
32 | SPARC_CC_ICC_E = 1+256, // Equal |
33 | SPARC_CC_ICC_G = 10+256, // Greater |
34 | SPARC_CC_ICC_LE = 2+256, // Less or Equal |
35 | SPARC_CC_ICC_GE = 11+256, // Greater or Equal |
36 | SPARC_CC_ICC_L = 3+256, // Less |
37 | SPARC_CC_ICC_GU = 12+256, // Greater Unsigned |
38 | SPARC_CC_ICC_LEU = 4+256, // Less or Equal Unsigned |
39 | SPARC_CC_ICC_CC = 13+256, // Carry Clear/Great or Equal Unsigned |
40 | SPARC_CC_ICC_CS = 5+256, // Carry Set/Less Unsigned |
41 | SPARC_CC_ICC_POS = 14+256, // Positive |
42 | SPARC_CC_ICC_NEG = 6+256, // Negative |
43 | SPARC_CC_ICC_VC = 15+256, // Overflow Clear |
44 | SPARC_CC_ICC_VS = 7+256, // Overflow Set |
45 | |
46 | //> Floating condition codes |
47 | SPARC_CC_FCC_A = 8+16+256, // Always |
48 | SPARC_CC_FCC_N = 0+16+256, // Never |
49 | SPARC_CC_FCC_U = 7+16+256, // Unordered |
50 | SPARC_CC_FCC_G = 6+16+256, // Greater |
51 | SPARC_CC_FCC_UG = 5+16+256, // Unordered or Greater |
52 | SPARC_CC_FCC_L = 4+16+256, // Less |
53 | SPARC_CC_FCC_UL = 3+16+256, // Unordered or Less |
54 | SPARC_CC_FCC_LG = 2+16+256, // Less or Greater |
55 | SPARC_CC_FCC_NE = 1+16+256, // Not Equal |
56 | SPARC_CC_FCC_E = 9+16+256, // Equal |
57 | SPARC_CC_FCC_UE = 10+16+256, // Unordered or Equal |
58 | SPARC_CC_FCC_GE = 11+16+256, // Greater or Equal |
59 | SPARC_CC_FCC_UGE = 12+16+256, // Unordered or Greater or Equal |
60 | SPARC_CC_FCC_LE = 13+16+256, // Less or Equal |
61 | SPARC_CC_FCC_ULE = 14+16+256, // Unordered or Less or Equal |
62 | SPARC_CC_FCC_O = 15+16+256, // Ordered |
63 | } sparc_cc; |
64 | |
65 | //> Branch hint |
66 | typedef enum sparc_hint { |
67 | SPARC_HINT_INVALID = 0, // no hint |
68 | SPARC_HINT_A = 1 << 0, // annul delay slot instruction |
69 | SPARC_HINT_PT = 1 << 1, // branch taken |
70 | SPARC_HINT_PN = 1 << 2, // branch NOT taken |
71 | } sparc_hint; |
72 | |
73 | //> Operand type for instruction's operands |
74 | typedef enum sparc_op_type { |
75 | SPARC_OP_INVALID = 0, // = CS_OP_INVALID (Uninitialized). |
76 | SPARC_OP_REG, // = CS_OP_REG (Register operand). |
77 | SPARC_OP_IMM, // = CS_OP_IMM (Immediate operand). |
78 | SPARC_OP_MEM, // = CS_OP_MEM (Memory operand). |
79 | } sparc_op_type; |
80 | |
81 | // Instruction's operand referring to memory |
82 | // This is associated with SPARC_OP_MEM operand type above |
83 | typedef struct sparc_op_mem { |
84 | uint8_t base; // base register |
85 | uint8_t index; // index register |
86 | int32_t disp; // displacement/offset value |
87 | } sparc_op_mem; |
88 | |
89 | // Instruction operand |
90 | typedef struct cs_sparc_op { |
91 | sparc_op_type type; // operand type |
92 | union { |
93 | unsigned int reg; // register value for REG operand |
94 | int32_t imm; // immediate value for IMM operand |
95 | sparc_op_mem mem; // base/disp value for MEM operand |
96 | }; |
97 | } cs_sparc_op; |
98 | |
99 | // Instruction structure |
100 | typedef struct cs_sparc { |
101 | sparc_cc cc; // code condition for this insn |
102 | sparc_hint hint; // branch hint: encoding as bitwise OR of sparc_hint. |
103 | // Number of operands of this instruction, |
104 | // or 0 when instruction has no operand. |
105 | uint8_t op_count; |
106 | cs_sparc_op operands[4]; // operands for this instruction. |
107 | } cs_sparc; |
108 | |
109 | //> SPARC registers |
110 | typedef enum sparc_reg { |
111 | SPARC_REG_INVALID = 0, |
112 | |
113 | SPARC_REG_F0, |
114 | SPARC_REG_F1, |
115 | SPARC_REG_F2, |
116 | SPARC_REG_F3, |
117 | SPARC_REG_F4, |
118 | SPARC_REG_F5, |
119 | SPARC_REG_F6, |
120 | SPARC_REG_F7, |
121 | SPARC_REG_F8, |
122 | SPARC_REG_F9, |
123 | SPARC_REG_F10, |
124 | SPARC_REG_F11, |
125 | SPARC_REG_F12, |
126 | SPARC_REG_F13, |
127 | SPARC_REG_F14, |
128 | SPARC_REG_F15, |
129 | SPARC_REG_F16, |
130 | SPARC_REG_F17, |
131 | SPARC_REG_F18, |
132 | SPARC_REG_F19, |
133 | SPARC_REG_F20, |
134 | SPARC_REG_F21, |
135 | SPARC_REG_F22, |
136 | SPARC_REG_F23, |
137 | SPARC_REG_F24, |
138 | SPARC_REG_F25, |
139 | SPARC_REG_F26, |
140 | SPARC_REG_F27, |
141 | SPARC_REG_F28, |
142 | SPARC_REG_F29, |
143 | SPARC_REG_F30, |
144 | SPARC_REG_F31, |
145 | SPARC_REG_F32, |
146 | SPARC_REG_F34, |
147 | SPARC_REG_F36, |
148 | SPARC_REG_F38, |
149 | SPARC_REG_F40, |
150 | SPARC_REG_F42, |
151 | SPARC_REG_F44, |
152 | SPARC_REG_F46, |
153 | SPARC_REG_F48, |
154 | SPARC_REG_F50, |
155 | SPARC_REG_F52, |
156 | SPARC_REG_F54, |
157 | SPARC_REG_F56, |
158 | SPARC_REG_F58, |
159 | SPARC_REG_F60, |
160 | SPARC_REG_F62, |
161 | SPARC_REG_FCC0, // Floating condition codes |
162 | SPARC_REG_FCC1, |
163 | SPARC_REG_FCC2, |
164 | SPARC_REG_FCC3, |
165 | SPARC_REG_FP, |
166 | SPARC_REG_G0, |
167 | SPARC_REG_G1, |
168 | SPARC_REG_G2, |
169 | SPARC_REG_G3, |
170 | SPARC_REG_G4, |
171 | SPARC_REG_G5, |
172 | SPARC_REG_G6, |
173 | SPARC_REG_G7, |
174 | SPARC_REG_I0, |
175 | SPARC_REG_I1, |
176 | SPARC_REG_I2, |
177 | SPARC_REG_I3, |
178 | SPARC_REG_I4, |
179 | SPARC_REG_I5, |
180 | SPARC_REG_I7, |
181 | SPARC_REG_ICC, // Integer condition codes |
182 | SPARC_REG_L0, |
183 | SPARC_REG_L1, |
184 | SPARC_REG_L2, |
185 | SPARC_REG_L3, |
186 | SPARC_REG_L4, |
187 | SPARC_REG_L5, |
188 | SPARC_REG_L6, |
189 | SPARC_REG_L7, |
190 | SPARC_REG_O0, |
191 | SPARC_REG_O1, |
192 | SPARC_REG_O2, |
193 | SPARC_REG_O3, |
194 | SPARC_REG_O4, |
195 | SPARC_REG_O5, |
196 | SPARC_REG_O7, |
197 | SPARC_REG_SP, |
198 | SPARC_REG_Y, |
199 | |
200 | // special register |
201 | SPARC_REG_XCC, |
202 | |
203 | SPARC_REG_ENDING, // <-- mark the end of the list of registers |
204 | |
205 | // extras |
206 | SPARC_REG_O6 = SPARC_REG_SP, |
207 | SPARC_REG_I6 = SPARC_REG_FP, |
208 | } sparc_reg; |
209 | |
210 | //> SPARC instruction |
211 | typedef enum sparc_insn { |
212 | SPARC_INS_INVALID = 0, |
213 | |
214 | SPARC_INS_ADDCC, |
215 | SPARC_INS_ADDX, |
216 | SPARC_INS_ADDXCC, |
217 | SPARC_INS_ADDXC, |
218 | SPARC_INS_ADDXCCC, |
219 | SPARC_INS_ADD, |
220 | SPARC_INS_ALIGNADDR, |
221 | SPARC_INS_ALIGNADDRL, |
222 | SPARC_INS_ANDCC, |
223 | SPARC_INS_ANDNCC, |
224 | SPARC_INS_ANDN, |
225 | SPARC_INS_AND, |
226 | SPARC_INS_ARRAY16, |
227 | SPARC_INS_ARRAY32, |
228 | SPARC_INS_ARRAY8, |
229 | SPARC_INS_B, |
230 | SPARC_INS_JMP, |
231 | SPARC_INS_BMASK, |
232 | SPARC_INS_FB, |
233 | SPARC_INS_BRGEZ, |
234 | SPARC_INS_BRGZ, |
235 | SPARC_INS_BRLEZ, |
236 | SPARC_INS_BRLZ, |
237 | SPARC_INS_BRNZ, |
238 | SPARC_INS_BRZ, |
239 | SPARC_INS_BSHUFFLE, |
240 | SPARC_INS_CALL, |
241 | SPARC_INS_CASX, |
242 | SPARC_INS_CAS, |
243 | SPARC_INS_CMASK16, |
244 | SPARC_INS_CMASK32, |
245 | SPARC_INS_CMASK8, |
246 | SPARC_INS_CMP, |
247 | SPARC_INS_EDGE16, |
248 | SPARC_INS_EDGE16L, |
249 | SPARC_INS_EDGE16LN, |
250 | SPARC_INS_EDGE16N, |
251 | SPARC_INS_EDGE32, |
252 | SPARC_INS_EDGE32L, |
253 | SPARC_INS_EDGE32LN, |
254 | SPARC_INS_EDGE32N, |
255 | SPARC_INS_EDGE8, |
256 | SPARC_INS_EDGE8L, |
257 | SPARC_INS_EDGE8LN, |
258 | SPARC_INS_EDGE8N, |
259 | SPARC_INS_FABSD, |
260 | SPARC_INS_FABSQ, |
261 | SPARC_INS_FABSS, |
262 | SPARC_INS_FADDD, |
263 | SPARC_INS_FADDQ, |
264 | SPARC_INS_FADDS, |
265 | SPARC_INS_FALIGNDATA, |
266 | SPARC_INS_FAND, |
267 | SPARC_INS_FANDNOT1, |
268 | SPARC_INS_FANDNOT1S, |
269 | SPARC_INS_FANDNOT2, |
270 | SPARC_INS_FANDNOT2S, |
271 | SPARC_INS_FANDS, |
272 | SPARC_INS_FCHKSM16, |
273 | SPARC_INS_FCMPD, |
274 | SPARC_INS_FCMPEQ16, |
275 | SPARC_INS_FCMPEQ32, |
276 | SPARC_INS_FCMPGT16, |
277 | SPARC_INS_FCMPGT32, |
278 | SPARC_INS_FCMPLE16, |
279 | SPARC_INS_FCMPLE32, |
280 | SPARC_INS_FCMPNE16, |
281 | SPARC_INS_FCMPNE32, |
282 | SPARC_INS_FCMPQ, |
283 | SPARC_INS_FCMPS, |
284 | SPARC_INS_FDIVD, |
285 | SPARC_INS_FDIVQ, |
286 | SPARC_INS_FDIVS, |
287 | SPARC_INS_FDMULQ, |
288 | SPARC_INS_FDTOI, |
289 | SPARC_INS_FDTOQ, |
290 | SPARC_INS_FDTOS, |
291 | SPARC_INS_FDTOX, |
292 | SPARC_INS_FEXPAND, |
293 | SPARC_INS_FHADDD, |
294 | SPARC_INS_FHADDS, |
295 | SPARC_INS_FHSUBD, |
296 | SPARC_INS_FHSUBS, |
297 | SPARC_INS_FITOD, |
298 | SPARC_INS_FITOQ, |
299 | SPARC_INS_FITOS, |
300 | SPARC_INS_FLCMPD, |
301 | SPARC_INS_FLCMPS, |
302 | SPARC_INS_FLUSHW, |
303 | SPARC_INS_FMEAN16, |
304 | SPARC_INS_FMOVD, |
305 | SPARC_INS_FMOVQ, |
306 | SPARC_INS_FMOVRDGEZ, |
307 | SPARC_INS_FMOVRQGEZ, |
308 | SPARC_INS_FMOVRSGEZ, |
309 | SPARC_INS_FMOVRDGZ, |
310 | SPARC_INS_FMOVRQGZ, |
311 | SPARC_INS_FMOVRSGZ, |
312 | SPARC_INS_FMOVRDLEZ, |
313 | SPARC_INS_FMOVRQLEZ, |
314 | SPARC_INS_FMOVRSLEZ, |
315 | SPARC_INS_FMOVRDLZ, |
316 | SPARC_INS_FMOVRQLZ, |
317 | SPARC_INS_FMOVRSLZ, |
318 | SPARC_INS_FMOVRDNZ, |
319 | SPARC_INS_FMOVRQNZ, |
320 | SPARC_INS_FMOVRSNZ, |
321 | SPARC_INS_FMOVRDZ, |
322 | SPARC_INS_FMOVRQZ, |
323 | SPARC_INS_FMOVRSZ, |
324 | SPARC_INS_FMOVS, |
325 | SPARC_INS_FMUL8SUX16, |
326 | SPARC_INS_FMUL8ULX16, |
327 | SPARC_INS_FMUL8X16, |
328 | SPARC_INS_FMUL8X16AL, |
329 | SPARC_INS_FMUL8X16AU, |
330 | SPARC_INS_FMULD, |
331 | SPARC_INS_FMULD8SUX16, |
332 | SPARC_INS_FMULD8ULX16, |
333 | SPARC_INS_FMULQ, |
334 | SPARC_INS_FMULS, |
335 | SPARC_INS_FNADDD, |
336 | SPARC_INS_FNADDS, |
337 | SPARC_INS_FNAND, |
338 | SPARC_INS_FNANDS, |
339 | SPARC_INS_FNEGD, |
340 | SPARC_INS_FNEGQ, |
341 | SPARC_INS_FNEGS, |
342 | SPARC_INS_FNHADDD, |
343 | SPARC_INS_FNHADDS, |
344 | SPARC_INS_FNOR, |
345 | SPARC_INS_FNORS, |
346 | SPARC_INS_FNOT1, |
347 | SPARC_INS_FNOT1S, |
348 | SPARC_INS_FNOT2, |
349 | SPARC_INS_FNOT2S, |
350 | SPARC_INS_FONE, |
351 | SPARC_INS_FONES, |
352 | SPARC_INS_FOR, |
353 | SPARC_INS_FORNOT1, |
354 | SPARC_INS_FORNOT1S, |
355 | SPARC_INS_FORNOT2, |
356 | SPARC_INS_FORNOT2S, |
357 | SPARC_INS_FORS, |
358 | SPARC_INS_FPACK16, |
359 | SPARC_INS_FPACK32, |
360 | SPARC_INS_FPACKFIX, |
361 | SPARC_INS_FPADD16, |
362 | SPARC_INS_FPADD16S, |
363 | SPARC_INS_FPADD32, |
364 | SPARC_INS_FPADD32S, |
365 | SPARC_INS_FPADD64, |
366 | SPARC_INS_FPMERGE, |
367 | SPARC_INS_FPSUB16, |
368 | SPARC_INS_FPSUB16S, |
369 | SPARC_INS_FPSUB32, |
370 | SPARC_INS_FPSUB32S, |
371 | SPARC_INS_FQTOD, |
372 | SPARC_INS_FQTOI, |
373 | SPARC_INS_FQTOS, |
374 | SPARC_INS_FQTOX, |
375 | SPARC_INS_FSLAS16, |
376 | SPARC_INS_FSLAS32, |
377 | SPARC_INS_FSLL16, |
378 | SPARC_INS_FSLL32, |
379 | SPARC_INS_FSMULD, |
380 | SPARC_INS_FSQRTD, |
381 | SPARC_INS_FSQRTQ, |
382 | SPARC_INS_FSQRTS, |
383 | SPARC_INS_FSRA16, |
384 | SPARC_INS_FSRA32, |
385 | SPARC_INS_FSRC1, |
386 | SPARC_INS_FSRC1S, |
387 | SPARC_INS_FSRC2, |
388 | SPARC_INS_FSRC2S, |
389 | SPARC_INS_FSRL16, |
390 | SPARC_INS_FSRL32, |
391 | SPARC_INS_FSTOD, |
392 | SPARC_INS_FSTOI, |
393 | SPARC_INS_FSTOQ, |
394 | SPARC_INS_FSTOX, |
395 | SPARC_INS_FSUBD, |
396 | SPARC_INS_FSUBQ, |
397 | SPARC_INS_FSUBS, |
398 | SPARC_INS_FXNOR, |
399 | SPARC_INS_FXNORS, |
400 | SPARC_INS_FXOR, |
401 | SPARC_INS_FXORS, |
402 | SPARC_INS_FXTOD, |
403 | SPARC_INS_FXTOQ, |
404 | SPARC_INS_FXTOS, |
405 | SPARC_INS_FZERO, |
406 | SPARC_INS_FZEROS, |
407 | SPARC_INS_JMPL, |
408 | SPARC_INS_LDD, |
409 | SPARC_INS_LD, |
410 | SPARC_INS_LDQ, |
411 | SPARC_INS_LDSB, |
412 | SPARC_INS_LDSH, |
413 | SPARC_INS_LDSW, |
414 | SPARC_INS_LDUB, |
415 | SPARC_INS_LDUH, |
416 | SPARC_INS_LDX, |
417 | SPARC_INS_LZCNT, |
418 | SPARC_INS_MEMBAR, |
419 | SPARC_INS_MOVDTOX, |
420 | SPARC_INS_MOV, |
421 | SPARC_INS_MOVRGEZ, |
422 | SPARC_INS_MOVRGZ, |
423 | SPARC_INS_MOVRLEZ, |
424 | SPARC_INS_MOVRLZ, |
425 | SPARC_INS_MOVRNZ, |
426 | SPARC_INS_MOVRZ, |
427 | SPARC_INS_MOVSTOSW, |
428 | SPARC_INS_MOVSTOUW, |
429 | SPARC_INS_MULX, |
430 | SPARC_INS_NOP, |
431 | SPARC_INS_ORCC, |
432 | SPARC_INS_ORNCC, |
433 | SPARC_INS_ORN, |
434 | SPARC_INS_OR, |
435 | SPARC_INS_PDIST, |
436 | SPARC_INS_PDISTN, |
437 | SPARC_INS_POPC, |
438 | SPARC_INS_RD, |
439 | SPARC_INS_RESTORE, |
440 | SPARC_INS_RETT, |
441 | SPARC_INS_SAVE, |
442 | SPARC_INS_SDIVCC, |
443 | SPARC_INS_SDIVX, |
444 | SPARC_INS_SDIV, |
445 | SPARC_INS_SETHI, |
446 | SPARC_INS_SHUTDOWN, |
447 | SPARC_INS_SIAM, |
448 | SPARC_INS_SLLX, |
449 | SPARC_INS_SLL, |
450 | SPARC_INS_SMULCC, |
451 | SPARC_INS_SMUL, |
452 | SPARC_INS_SRAX, |
453 | SPARC_INS_SRA, |
454 | SPARC_INS_SRLX, |
455 | SPARC_INS_SRL, |
456 | SPARC_INS_STBAR, |
457 | SPARC_INS_STB, |
458 | SPARC_INS_STD, |
459 | SPARC_INS_ST, |
460 | SPARC_INS_STH, |
461 | SPARC_INS_STQ, |
462 | SPARC_INS_STX, |
463 | SPARC_INS_SUBCC, |
464 | SPARC_INS_SUBX, |
465 | SPARC_INS_SUBXCC, |
466 | SPARC_INS_SUB, |
467 | SPARC_INS_SWAP, |
468 | SPARC_INS_TADDCCTV, |
469 | SPARC_INS_TADDCC, |
470 | SPARC_INS_T, |
471 | SPARC_INS_TSUBCCTV, |
472 | SPARC_INS_TSUBCC, |
473 | SPARC_INS_UDIVCC, |
474 | SPARC_INS_UDIVX, |
475 | SPARC_INS_UDIV, |
476 | SPARC_INS_UMULCC, |
477 | SPARC_INS_UMULXHI, |
478 | SPARC_INS_UMUL, |
479 | SPARC_INS_UNIMP, |
480 | SPARC_INS_FCMPED, |
481 | SPARC_INS_FCMPEQ, |
482 | SPARC_INS_FCMPES, |
483 | SPARC_INS_WR, |
484 | SPARC_INS_XMULX, |
485 | SPARC_INS_XMULXHI, |
486 | SPARC_INS_XNORCC, |
487 | SPARC_INS_XNOR, |
488 | SPARC_INS_XORCC, |
489 | SPARC_INS_XOR, |
490 | |
491 | // alias instructions |
492 | SPARC_INS_RET, |
493 | SPARC_INS_RETL, |
494 | |
495 | SPARC_INS_ENDING, // <-- mark the end of the list of instructions |
496 | } sparc_insn; |
497 | |
498 | //> Group of SPARC instructions |
499 | typedef enum sparc_insn_group { |
500 | SPARC_GRP_INVALID = 0, // = CS_GRP_INVALID |
501 | |
502 | //> Generic groups |
503 | // all jump instructions (conditional+direct+indirect jumps) |
504 | SPARC_GRP_JUMP, // = CS_GRP_JUMP |
505 | |
506 | //> Architecture-specific groups |
507 | SPARC_GRP_HARDQUAD = 128, |
508 | SPARC_GRP_V9, |
509 | SPARC_GRP_VIS, |
510 | SPARC_GRP_VIS2, |
511 | SPARC_GRP_VIS3, |
512 | SPARC_GRP_32BIT, |
513 | SPARC_GRP_64BIT, |
514 | |
515 | SPARC_GRP_ENDING, // <-- mark the end of the list of groups |
516 | } sparc_insn_group; |
517 | |
518 | #ifdef __cplusplus |
519 | } |
520 | #endif |
521 | |
522 | #endif |
523 | |