1 #ifndef CAPSTONE_EVM_H 2 #define CAPSTONE_EVM_H 3 4 /* Capstone Disassembly Engine */ 5 /* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2018 */ 6 7 #ifdef __cplusplus 8 extern "C" { 9 #endif 10 11 #include "platform.h" 12 13 #ifdef _MSC_VER 14 #pragma warning(disable:4201) 15 #endif 16 17 /// Instruction structure 18 typedef struct cs_evm { 19 unsigned char pop; ///< number of items popped from the stack 20 unsigned char push; ///< number of items pushed into the stack 21 unsigned int fee; ///< gas fee for the instruction 22 } cs_evm; 23 24 /// EVM instruction 25 typedef enum evm_insn { 26 EVM_INS_STOP = 0, 27 EVM_INS_ADD = 1, 28 EVM_INS_MUL = 2, 29 EVM_INS_SUB = 3, 30 EVM_INS_DIV = 4, 31 EVM_INS_SDIV = 5, 32 EVM_INS_MOD = 6, 33 EVM_INS_SMOD = 7, 34 EVM_INS_ADDMOD = 8, 35 EVM_INS_MULMOD = 9, 36 EVM_INS_EXP = 10, 37 EVM_INS_SIGNEXTEND = 11, 38 EVM_INS_LT = 16, 39 EVM_INS_GT = 17, 40 EVM_INS_SLT = 18, 41 EVM_INS_SGT = 19, 42 EVM_INS_EQ = 20, 43 EVM_INS_ISZERO = 21, 44 EVM_INS_AND = 22, 45 EVM_INS_OR = 23, 46 EVM_INS_XOR = 24, 47 EVM_INS_NOT = 25, 48 EVM_INS_BYTE = 26, 49 EVM_INS_SHA3 = 32, 50 EVM_INS_ADDRESS = 48, 51 EVM_INS_BALANCE = 49, 52 EVM_INS_ORIGIN = 50, 53 EVM_INS_CALLER = 51, 54 EVM_INS_CALLVALUE = 52, 55 EVM_INS_CALLDATALOAD = 53, 56 EVM_INS_CALLDATASIZE = 54, 57 EVM_INS_CALLDATACOPY = 55, 58 EVM_INS_CODESIZE = 56, 59 EVM_INS_CODECOPY = 57, 60 EVM_INS_GASPRICE = 58, 61 EVM_INS_EXTCODESIZE = 59, 62 EVM_INS_EXTCODECOPY = 60, 63 EVM_INS_RETURNDATASIZE = 61, 64 EVM_INS_RETURNDATACOPY = 62, 65 EVM_INS_BLOCKHASH = 64, 66 EVM_INS_COINBASE = 65, 67 EVM_INS_TIMESTAMP = 66, 68 EVM_INS_NUMBER = 67, 69 EVM_INS_DIFFICULTY = 68, 70 EVM_INS_GASLIMIT = 69, 71 EVM_INS_POP = 80, 72 EVM_INS_MLOAD = 81, 73 EVM_INS_MSTORE = 82, 74 EVM_INS_MSTORE8 = 83, 75 EVM_INS_SLOAD = 84, 76 EVM_INS_SSTORE = 85, 77 EVM_INS_JUMP = 86, 78 EVM_INS_JUMPI = 87, 79 EVM_INS_PC = 88, 80 EVM_INS_MSIZE = 89, 81 EVM_INS_GAS = 90, 82 EVM_INS_JUMPDEST = 91, 83 EVM_INS_PUSH1 = 96, 84 EVM_INS_PUSH2 = 97, 85 EVM_INS_PUSH3 = 98, 86 EVM_INS_PUSH4 = 99, 87 EVM_INS_PUSH5 = 100, 88 EVM_INS_PUSH6 = 101, 89 EVM_INS_PUSH7 = 102, 90 EVM_INS_PUSH8 = 103, 91 EVM_INS_PUSH9 = 104, 92 EVM_INS_PUSH10 = 105, 93 EVM_INS_PUSH11 = 106, 94 EVM_INS_PUSH12 = 107, 95 EVM_INS_PUSH13 = 108, 96 EVM_INS_PUSH14 = 109, 97 EVM_INS_PUSH15 = 110, 98 EVM_INS_PUSH16 = 111, 99 EVM_INS_PUSH17 = 112, 100 EVM_INS_PUSH18 = 113, 101 EVM_INS_PUSH19 = 114, 102 EVM_INS_PUSH20 = 115, 103 EVM_INS_PUSH21 = 116, 104 EVM_INS_PUSH22 = 117, 105 EVM_INS_PUSH23 = 118, 106 EVM_INS_PUSH24 = 119, 107 EVM_INS_PUSH25 = 120, 108 EVM_INS_PUSH26 = 121, 109 EVM_INS_PUSH27 = 122, 110 EVM_INS_PUSH28 = 123, 111 EVM_INS_PUSH29 = 124, 112 EVM_INS_PUSH30 = 125, 113 EVM_INS_PUSH31 = 126, 114 EVM_INS_PUSH32 = 127, 115 EVM_INS_DUP1 = 128, 116 EVM_INS_DUP2 = 129, 117 EVM_INS_DUP3 = 130, 118 EVM_INS_DUP4 = 131, 119 EVM_INS_DUP5 = 132, 120 EVM_INS_DUP6 = 133, 121 EVM_INS_DUP7 = 134, 122 EVM_INS_DUP8 = 135, 123 EVM_INS_DUP9 = 136, 124 EVM_INS_DUP10 = 137, 125 EVM_INS_DUP11 = 138, 126 EVM_INS_DUP12 = 139, 127 EVM_INS_DUP13 = 140, 128 EVM_INS_DUP14 = 141, 129 EVM_INS_DUP15 = 142, 130 EVM_INS_DUP16 = 143, 131 EVM_INS_SWAP1 = 144, 132 EVM_INS_SWAP2 = 145, 133 EVM_INS_SWAP3 = 146, 134 EVM_INS_SWAP4 = 147, 135 EVM_INS_SWAP5 = 148, 136 EVM_INS_SWAP6 = 149, 137 EVM_INS_SWAP7 = 150, 138 EVM_INS_SWAP8 = 151, 139 EVM_INS_SWAP9 = 152, 140 EVM_INS_SWAP10 = 153, 141 EVM_INS_SWAP11 = 154, 142 EVM_INS_SWAP12 = 155, 143 EVM_INS_SWAP13 = 156, 144 EVM_INS_SWAP14 = 157, 145 EVM_INS_SWAP15 = 158, 146 EVM_INS_SWAP16 = 159, 147 EVM_INS_LOG0 = 160, 148 EVM_INS_LOG1 = 161, 149 EVM_INS_LOG2 = 162, 150 EVM_INS_LOG3 = 163, 151 EVM_INS_LOG4 = 164, 152 EVM_INS_CREATE = 240, 153 EVM_INS_CALL = 241, 154 EVM_INS_CALLCODE = 242, 155 EVM_INS_RETURN = 243, 156 EVM_INS_DELEGATECALL = 244, 157 EVM_INS_CALLBLACKBOX = 245, 158 EVM_INS_STATICCALL = 250, 159 EVM_INS_REVERT = 253, 160 EVM_INS_SUICIDE = 255, 161 162 EVM_INS_INVALID = 512, 163 EVM_INS_ENDING, // <-- mark the end of the list of instructions 164 } evm_insn; 165 166 /// Group of EVM instructions 167 typedef enum evm_insn_group { 168 EVM_GRP_INVALID = 0, ///< = CS_GRP_INVALID 169 170 EVM_GRP_JUMP, ///< all jump instructions 171 172 EVM_GRP_MATH = 8, ///< math instructions 173 EVM_GRP_STACK_WRITE, ///< instructions write to stack 174 EVM_GRP_STACK_READ, ///< instructions read from stack 175 EVM_GRP_MEM_WRITE, ///< instructions write to memory 176 EVM_GRP_MEM_READ, ///< instructions read from memory 177 EVM_GRP_STORE_WRITE, ///< instructions write to storage 178 EVM_GRP_STORE_READ, ///< instructions read from storage 179 EVM_GRP_HALT, ///< instructions halt execution 180 181 EVM_GRP_ENDING, ///< <-- mark the end of the list of groups 182 } evm_insn_group; 183 184 #ifdef __cplusplus 185 } 186 #endif 187 188 #endif 189