1 #ifndef CAPSTONE_XCORE_H 2 #define CAPSTONE_XCORE_H 3 4 /* Capstone Disassembly Engine */ 5 /* By Nguyen Anh Quynh <aquynh (at) 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 #ifdef _MSC_VER 18 #pragma warning(disable:4201) 19 #endif 20 21 //> Operand type for instruction's operands 22 typedef enum xcore_op_type { 23 XCORE_OP_INVALID = 0, // = CS_OP_INVALID (Uninitialized). 24 XCORE_OP_REG, // = CS_OP_REG (Register operand). 25 XCORE_OP_IMM, // = CS_OP_IMM (Immediate operand). 26 XCORE_OP_MEM, // = CS_OP_MEM (Memory operand). 27 } xcore_op_type; 28 29 // Instruction's operand referring to memory 30 // This is associated with XCORE_OP_MEM operand type above 31 typedef struct xcore_op_mem { 32 uint8_t base; // base register 33 uint8_t index; // index register 34 int32_t disp; // displacement/offset value 35 int direct; // +1: forward, -1: backward 36 } xcore_op_mem; 37 38 // Instruction operand 39 typedef struct cs_xcore_op { 40 xcore_op_type type; // operand type 41 union { 42 unsigned int reg; // register value for REG operand 43 int32_t imm; // immediate value for IMM operand 44 xcore_op_mem mem; // base/disp value for MEM operand 45 }; 46 } cs_xcore_op; 47 48 // Instruction structure 49 typedef struct cs_xcore { 50 // Number of operands of this instruction, 51 // or 0 when instruction has no operand. 52 uint8_t op_count; 53 cs_xcore_op operands[8]; // operands for this instruction. 54 } cs_xcore; 55 56 //> XCore registers 57 typedef enum xcore_reg { 58 XCORE_REG_INVALID = 0, 59 60 XCORE_REG_CP, 61 XCORE_REG_DP, 62 XCORE_REG_LR, 63 XCORE_REG_SP, 64 XCORE_REG_R0, 65 XCORE_REG_R1, 66 XCORE_REG_R2, 67 XCORE_REG_R3, 68 XCORE_REG_R4, 69 XCORE_REG_R5, 70 XCORE_REG_R6, 71 XCORE_REG_R7, 72 XCORE_REG_R8, 73 XCORE_REG_R9, 74 XCORE_REG_R10, 75 XCORE_REG_R11, 76 77 //> pseudo registers 78 XCORE_REG_PC, // pc 79 80 // internal thread registers 81 // see The-XMOS-XS1-Architecture(X7879A).pdf 82 XCORE_REG_SCP, // save pc 83 XCORE_REG_SSR, // save status 84 XCORE_REG_ET, // exception type 85 XCORE_REG_ED, // exception data 86 XCORE_REG_SED, // save exception data 87 XCORE_REG_KEP, // kernel entry pointer 88 XCORE_REG_KSP, // kernel stack pointer 89 XCORE_REG_ID, // thread ID 90 91 XCORE_REG_ENDING, // <-- mark the end of the list of registers 92 } xcore_reg; 93 94 //> XCore instruction 95 typedef enum xcore_insn { 96 XCORE_INS_INVALID = 0, 97 98 XCORE_INS_ADD, 99 XCORE_INS_ANDNOT, 100 XCORE_INS_AND, 101 XCORE_INS_ASHR, 102 XCORE_INS_BAU, 103 XCORE_INS_BITREV, 104 XCORE_INS_BLA, 105 XCORE_INS_BLAT, 106 XCORE_INS_BL, 107 XCORE_INS_BF, 108 XCORE_INS_BT, 109 XCORE_INS_BU, 110 XCORE_INS_BRU, 111 XCORE_INS_BYTEREV, 112 XCORE_INS_CHKCT, 113 XCORE_INS_CLRE, 114 XCORE_INS_CLRPT, 115 XCORE_INS_CLRSR, 116 XCORE_INS_CLZ, 117 XCORE_INS_CRC8, 118 XCORE_INS_CRC32, 119 XCORE_INS_DCALL, 120 XCORE_INS_DENTSP, 121 XCORE_INS_DGETREG, 122 XCORE_INS_DIVS, 123 XCORE_INS_DIVU, 124 XCORE_INS_DRESTSP, 125 XCORE_INS_DRET, 126 XCORE_INS_ECALLF, 127 XCORE_INS_ECALLT, 128 XCORE_INS_EDU, 129 XCORE_INS_EEF, 130 XCORE_INS_EET, 131 XCORE_INS_EEU, 132 XCORE_INS_ENDIN, 133 XCORE_INS_ENTSP, 134 XCORE_INS_EQ, 135 XCORE_INS_EXTDP, 136 XCORE_INS_EXTSP, 137 XCORE_INS_FREER, 138 XCORE_INS_FREET, 139 XCORE_INS_GETD, 140 XCORE_INS_GET, 141 XCORE_INS_GETN, 142 XCORE_INS_GETR, 143 XCORE_INS_GETSR, 144 XCORE_INS_GETST, 145 XCORE_INS_GETTS, 146 XCORE_INS_INCT, 147 XCORE_INS_INIT, 148 XCORE_INS_INPW, 149 XCORE_INS_INSHR, 150 XCORE_INS_INT, 151 XCORE_INS_IN, 152 XCORE_INS_KCALL, 153 XCORE_INS_KENTSP, 154 XCORE_INS_KRESTSP, 155 XCORE_INS_KRET, 156 XCORE_INS_LADD, 157 XCORE_INS_LD16S, 158 XCORE_INS_LD8U, 159 XCORE_INS_LDA16, 160 XCORE_INS_LDAP, 161 XCORE_INS_LDAW, 162 XCORE_INS_LDC, 163 XCORE_INS_LDW, 164 XCORE_INS_LDIVU, 165 XCORE_INS_LMUL, 166 XCORE_INS_LSS, 167 XCORE_INS_LSUB, 168 XCORE_INS_LSU, 169 XCORE_INS_MACCS, 170 XCORE_INS_MACCU, 171 XCORE_INS_MJOIN, 172 XCORE_INS_MKMSK, 173 XCORE_INS_MSYNC, 174 XCORE_INS_MUL, 175 XCORE_INS_NEG, 176 XCORE_INS_NOT, 177 XCORE_INS_OR, 178 XCORE_INS_OUTCT, 179 XCORE_INS_OUTPW, 180 XCORE_INS_OUTSHR, 181 XCORE_INS_OUTT, 182 XCORE_INS_OUT, 183 XCORE_INS_PEEK, 184 XCORE_INS_REMS, 185 XCORE_INS_REMU, 186 XCORE_INS_RETSP, 187 XCORE_INS_SETCLK, 188 XCORE_INS_SET, 189 XCORE_INS_SETC, 190 XCORE_INS_SETD, 191 XCORE_INS_SETEV, 192 XCORE_INS_SETN, 193 XCORE_INS_SETPSC, 194 XCORE_INS_SETPT, 195 XCORE_INS_SETRDY, 196 XCORE_INS_SETSR, 197 XCORE_INS_SETTW, 198 XCORE_INS_SETV, 199 XCORE_INS_SEXT, 200 XCORE_INS_SHL, 201 XCORE_INS_SHR, 202 XCORE_INS_SSYNC, 203 XCORE_INS_ST16, 204 XCORE_INS_ST8, 205 XCORE_INS_STW, 206 XCORE_INS_SUB, 207 XCORE_INS_SYNCR, 208 XCORE_INS_TESTCT, 209 XCORE_INS_TESTLCL, 210 XCORE_INS_TESTWCT, 211 XCORE_INS_TSETMR, 212 XCORE_INS_START, 213 XCORE_INS_WAITEF, 214 XCORE_INS_WAITET, 215 XCORE_INS_WAITEU, 216 XCORE_INS_XOR, 217 XCORE_INS_ZEXT, 218 219 XCORE_INS_ENDING, // <-- mark the end of the list of instructions 220 } xcore_insn; 221 222 //> Group of XCore instructions 223 typedef enum xcore_insn_group { 224 XCORE_GRP_INVALID = 0, // = CS_GRP_INVALID 225 226 //> Generic groups 227 // all jump instructions (conditional+direct+indirect jumps) 228 XCORE_GRP_JUMP, // = CS_GRP_JUMP 229 230 XCORE_GRP_ENDING, // <-- mark the end of the list of groups 231 } xcore_insn_group; 232 233 #ifdef __cplusplus 234 } 235 #endif 236 237 #endif 238