From bdf35374d5d37469c7123684bbe89a33ab03b42d Mon Sep 17 00:00:00 2001 From: Daniel Lubarov Date: Sun, 19 Mar 2023 23:22:33 -0700 Subject: [PATCH] Misc --- evm/src/cpu/kernel/asm/core/call.asm | 4 ++ evm/src/cpu/kernel/asm/core/create.asm | 47 ++++++++++++++----- evm/src/cpu/kernel/asm/core/gas.asm | 9 ++++ evm/src/cpu/kernel/asm/core/syscall_stubs.asm | 2 + evm/src/cpu/kernel/asm/core/terminate.asm | 1 + evm/src/cpu/kernel/asm/memory/metadata.asm | 10 ++++ .../kernel/asm/mpt/storage/storage_read.asm | 1 + evm/src/cpu/kernel/asm/util/keccak.asm | 1 + 8 files changed, 63 insertions(+), 12 deletions(-) diff --git a/evm/src/cpu/kernel/asm/core/call.asm b/evm/src/cpu/kernel/asm/core/call.asm index cb66b7fa..103977b2 100644 --- a/evm/src/cpu/kernel/asm/core/call.asm +++ b/evm/src/cpu/kernel/asm/core/call.asm @@ -3,6 +3,7 @@ // Creates a new sub context and executes the code of the given account. global sys_call: // stack: kexit_info, gas, address, value, args_offset, args_size, ret_offset, ret_size + // TODO: Charge gas. %create_context // stack: new_ctx, kexit_info, gas, address, value, args_offset, args_size, ret_offset, ret_size @@ -27,6 +28,7 @@ global sys_call: // given account. In particular the storage remains the same. global sys_callcode: // stack: kexit_info, gas, address, value, args_offset, args_size, ret_offset, ret_size + // TODO: Charge gas. %create_context // stack: new_ctx, kexit_info, gas, address, value, args_offset, args_size, ret_offset, ret_size @@ -50,6 +52,7 @@ global sys_callcode: // CALL if the value sent is not 0. global sys_staticcall: // stack: kexit_info, gas, address, args_offset, args_size, ret_offset, ret_size + // TODO: Charge gas. %create_context // stack: new_ctx, kexit_info, gas, address, args_offset, args_size, ret_offset, ret_size @@ -70,6 +73,7 @@ global sys_staticcall: // value remain the same. global sys_delegatecall: // stack: kexit_info, gas, address, args_offset, args_size, ret_offset, ret_size + // TODO: Charge gas. %create_context // stack: new_ctx, kexit_info, gas, address, args_offset, args_size, ret_offset, ret_size diff --git a/evm/src/cpu/kernel/asm/core/create.asm b/evm/src/cpu/kernel/asm/core/create.asm index eb0f821e..cc37f832 100644 --- a/evm/src/cpu/kernel/asm/core/create.asm +++ b/evm/src/cpu/kernel/asm/core/create.asm @@ -1,21 +1,30 @@ // The CREATE syscall. // -// Pre stack: value, CODE_ADDR, code_len, retdest +// Pre stack: kexit_info, value, code_offset, code_len // Post stack: address global sys_create: + // TODO: Charge gas. + %stack (kexit_info, value, code_offset, code_len) + -> (value, 0, @SEGMENT_MAIN_MEMORY, code_offset, code_len) %address + // stack: sender, value, CODE_ADDR: 3, code_len, sys_create_finish, kexit_info %jump(create) +sys_create_finish: + // stack: address, kexit_info + SWAP1 + EXIT_KERNEL // Create a new contract account with the traditional address scheme, i.e. // address = KEC(RLP(sender, nonce))[12:] // This can be used both for the CREATE instruction and for contract-creation // transactions. // -// Pre stack: sender, endowment, CODE_ADDR, code_len, retdest +// Pre stack: sender, endowment, CODE_ADDR: 3, code_len, retdest // Post stack: address // Note: CODE_ADDR refers to a (context, segment, offset) tuple. global create: // stack: sender, endowment, CODE_ADDR, code_len, retdest + // TODO: Charge gas. DUP1 %get_nonce // stack: nonce, sender, endowment, CODE_ADDR, code_len, retdest // Call get_create_address and have it return to create_inner. @@ -26,20 +35,34 @@ global create: // CREATE2; see EIP-1014. Address will be // address = KEC(0xff || sender || salt || code_hash)[12:] // -// Pre stack: sender, endowment, salt, CODE_ADDR: 3, code_len, retdest +// Pre stack: kexit_info, value, code_offset, code_len, salt // Post stack: address -// Note: CODE_ADDR refers to a (context, segment, offset) tuple. global sys_create2: - // stack: sender, endowment, salt, CODE_ADDR: 3, code_len, retdest - DUP7 DUP7 DUP7 DUP7 // CODE_ADDR: 3, code_len + // stack: kexit_info, value, code_offset, code_len, salt + // TODO: Charge gas. + SWAP4 + %stack (salt) -> (salt, sys_create2_got_address) + // stack: salt, sys_create2_got_address, value, code_offset, code_len, kexit_info + DUP4 // code_len + DUP4 // code_offset + PUSH @SEGMENT_MAIN_MEMORY + PUSH 0 // context KECCAK_GENERAL - // stack: code_hash, sender, endowment, salt, CODE_ADDR: 3, code_len, retdest - - // Call get_create2_address and have it return to create_inner. - %stack (code_hash, sender, endowment, salt) - -> (sender, salt, code_hash, create_inner, sender, endowment) - // stack: sender, salt, CODE_ADDR, code_len, create_inner, sender, endowment, CODE_ADDR, code_len, retdest + // stack: hash, salt, sys_create2_got_address, value, code_offset, code_len, kexit_info + %address + // stack: sender, hash, salt, sys_create2_got_address, value, code_offset, code_len, kexit_info %jump(get_create2_address) +sys_create2_got_address: + // stack: address, value, code_offset, code_len, kexit_info + %address + %stack (sender, address, value, code_offset, code_len, kexit_info) + -> (address, sender, value, 0, @SEGMENT_MAIN_MEMORY, code_offset, code_len, + sys_create2_finish, kexit_info) + %jump(create_inner) +sys_create2_finish: + // stack: address, kexit_info + SWAP1 + EXIT_KERNEL // Pre stack: address, sender, endowment, CODE_ADDR, code_len, retdest // Post stack: address diff --git a/evm/src/cpu/kernel/asm/core/gas.asm b/evm/src/cpu/kernel/asm/core/gas.asm index 0cc62e4a..78cc065c 100644 --- a/evm/src/cpu/kernel/asm/core/gas.asm +++ b/evm/src/cpu/kernel/asm/core/gas.asm @@ -47,3 +47,12 @@ global sys_gas: // stack: kexit_info' EXIT_KERNEL %endmacro + +global sys_gasprice: + // stack: kexit_info + %charge_gas_const(@GAS_BASE) + // stack: kexit_info + %mload_txn_field(@TXN_FIELD_COMPUTED_FEE_PER_GAS) + // stack: gas_price, kexit_info + SWAP1 + EXIT_KERNEL diff --git a/evm/src/cpu/kernel/asm/core/syscall_stubs.asm b/evm/src/cpu/kernel/asm/core/syscall_stubs.asm index 23363166..26281eea 100644 --- a/evm/src/cpu/kernel/asm/core/syscall_stubs.asm +++ b/evm/src/cpu/kernel/asm/core/syscall_stubs.asm @@ -44,6 +44,8 @@ global sys_gaslimit: global sys_chainid: // TODO: Return the block's chain ID instead of the txn's, even though they should match. // stack: kexit_info + %charge_gas_const(@GAS_BASE) + // stack: kexit_info %mload_txn_field(@TXN_FIELD_CHAIN_ID) // stack: chain_id, kexit_info SWAP1 diff --git a/evm/src/cpu/kernel/asm/core/terminate.asm b/evm/src/cpu/kernel/asm/core/terminate.asm index 98c65253..4a3fbf02 100644 --- a/evm/src/cpu/kernel/asm/core/terminate.asm +++ b/evm/src/cpu/kernel/asm/core/terminate.asm @@ -20,6 +20,7 @@ global sys_return: global sys_selfdestruct: // stack: kexit_info + // TODO: Charge gas. %consume_gas_const(@GAS_SELFDESTRUCT) %leftover_gas // stack: leftover_gas diff --git a/evm/src/cpu/kernel/asm/memory/metadata.asm b/evm/src/cpu/kernel/asm/memory/metadata.asm index 55c8bebc..89b39707 100644 --- a/evm/src/cpu/kernel/asm/memory/metadata.asm +++ b/evm/src/cpu/kernel/asm/memory/metadata.asm @@ -39,6 +39,8 @@ %endmacro global sys_address: + // stack: kexit_info + %charge_gas_const(@GAS_BASE) // stack: kexit_info %address // stack: address, kexit_info @@ -50,6 +52,8 @@ global sys_address: %endmacro global sys_caller: + // stack: kexit_info + %charge_gas_const(@GAS_BASE) // stack: kexit_info %caller // stack: caller, kexit_info @@ -65,6 +69,8 @@ global sys_caller: %endmacro global sys_codesize: + // stack: kexit_info + %charge_gas_const(@GAS_BASE) // stack: kexit_info %codesize // stack: codesize, kexit_info @@ -72,6 +78,8 @@ global sys_codesize: EXIT_KERNEL global sys_callvalue: + // stack: kexit_info + %charge_gas_const(@GAS_BASE) // stack: kexit_info %callvalue // stack: callvalue, kexit_info @@ -88,6 +96,8 @@ global sys_callvalue: %endmacro global sys_msize: + // stack: kexit_info + %charge_gas_const(@GAS_BASE) // stack: kexit_info %msize // stack: msize, kexit_info diff --git a/evm/src/cpu/kernel/asm/mpt/storage/storage_read.asm b/evm/src/cpu/kernel/asm/mpt/storage/storage_read.asm index e93b333f..cf7ed1e9 100644 --- a/evm/src/cpu/kernel/asm/mpt/storage/storage_read.asm +++ b/evm/src/cpu/kernel/asm/mpt/storage/storage_read.asm @@ -5,6 +5,7 @@ global sys_sload: // stack: kexit_info, slot + // TODO: Charge gas. SWAP1 // stack: slot, kexit_info %stack (slot) -> (slot, after_storage_read) diff --git a/evm/src/cpu/kernel/asm/util/keccak.asm b/evm/src/cpu/kernel/asm/util/keccak.asm index 5665ad3b..280a4047 100644 --- a/evm/src/cpu/kernel/asm/util/keccak.asm +++ b/evm/src/cpu/kernel/asm/util/keccak.asm @@ -1,5 +1,6 @@ global sys_keccak256: // stack: kexit_info, offset, len + // TODO: Charge gas. %stack (kexit_info, offset, len) -> (offset, len, kexit_info) PUSH @SEGMENT_MAIN_MEMORY GET_CONTEXT