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