| 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 | |