Merge pull request #791 from mir-protocol/kernel_msize

Implement MSIZE in the kernel
This commit is contained in:
wborgeaud 2022-10-21 17:30:44 +02:00 committed by GitHub
commit 7b2f515c00
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 50 additions and 8 deletions

View File

@ -393,3 +393,21 @@
%mstore_kernel_general_2 %mstore_kernel_general_2
// stack: (empty) // stack: (empty)
%endmacro %endmacro
%macro mload_main
// stack: offset
DUP1
// stack: offset, offset
%update_msize
// stack: offset
%mload_current(@SEGMENT_MAIN_MEMORY)
%endmacro
%macro mstore_main
// stack: offset, value
DUP1
// stack: offset, offset, value
%update_msize
// stack: offset, value
%mstore_current(@SEGMENT_MAIN_MEMORY)
%endmacro

View File

@ -45,3 +45,23 @@
%macro callvalue %macro callvalue
%mload_context_metadata(@CTX_METADATA_CALL_VALUE) %mload_context_metadata(@CTX_METADATA_CALL_VALUE)
%endmacro %endmacro
%macro msize
%mload_context_metadata(@CTX_METADATA_MSIZE)
%endmacro
%macro update_msize
// stack: offset
%add_const(32)
// stack: 32 + offset
%div_const(32)
// stack: (offset+32)/32 = ceil_div_usize(offset+1, 32)
%mul_const(32)
// stack: ceil_div_usize(offset+1, 32) * 32
%msize
// stack: current_msize, ceil_div_usize(offset+1, 32) * 32
%max
// stack: new_msize
%mstore_context_metadata(@CTX_METADATA_MSIZE)
%endmacro

View File

@ -23,10 +23,12 @@ pub(crate) enum ContextMetadata {
/// Pointer to the initial version of the state trie, at the creation of this context. Used when /// Pointer to the initial version of the state trie, at the creation of this context. Used when
/// we need to revert a context. /// we need to revert a context.
StateTrieCheckpointPointer = 9, StateTrieCheckpointPointer = 9,
/// Size of the active main memory.
MSize = 10,
} }
impl ContextMetadata { impl ContextMetadata {
pub(crate) const COUNT: usize = 10; pub(crate) const COUNT: usize = 11;
pub(crate) fn all() -> [Self; Self::COUNT] { pub(crate) fn all() -> [Self; Self::COUNT] {
[ [
@ -40,6 +42,7 @@ impl ContextMetadata {
Self::CallValue, Self::CallValue,
Self::Static, Self::Static,
Self::StateTrieCheckpointPointer, Self::StateTrieCheckpointPointer,
Self::MSize,
] ]
} }
@ -56,6 +59,7 @@ impl ContextMetadata {
ContextMetadata::CallValue => "CTX_METADATA_CALL_VALUE", ContextMetadata::CallValue => "CTX_METADATA_CALL_VALUE",
ContextMetadata::Static => "CTX_METADATA_STATIC", ContextMetadata::Static => "CTX_METADATA_STATIC",
ContextMetadata::StateTrieCheckpointPointer => "CTX_METADATA_STATE_TRIE_CHECKPOINT_PTR", ContextMetadata::StateTrieCheckpointPointer => "CTX_METADATA_STATE_TRIE_CHECKPOINT_PTR",
ContextMetadata::MSize => "CTX_METADATA_MSIZE",
} }
} }
} }

View File

@ -9,6 +9,7 @@ use plonky2::field::goldilocks_field::GoldilocksField;
use crate::cpu::kernel::aggregator::KERNEL; use crate::cpu::kernel::aggregator::KERNEL;
use crate::cpu::kernel::assembler::Kernel; use crate::cpu::kernel::assembler::Kernel;
use crate::cpu::kernel::constants::context_metadata::ContextMetadata;
use crate::cpu::kernel::constants::global_metadata::GlobalMetadata; use crate::cpu::kernel::constants::global_metadata::GlobalMetadata;
use crate::cpu::kernel::constants::txn_fields::NormalizedTxnField; use crate::cpu::kernel::constants::txn_fields::NormalizedTxnField;
use crate::generation::memory::{MemoryContextState, MemorySegmentState}; use crate::generation::memory::{MemoryContextState, MemorySegmentState};
@ -45,9 +46,7 @@ impl InterpreterMemory {
mem mem
} }
}
impl InterpreterMemory {
fn mload_general(&self, context: usize, segment: Segment, offset: usize) -> U256 { fn mload_general(&self, context: usize, segment: Segment, offset: usize) -> U256 {
let value = self.context_memory[context].segments[segment as usize].get(offset); let value = self.context_memory[context].segments[segment as usize].get(offset);
assert!( assert!(
@ -499,6 +498,8 @@ impl<'a> Interpreter<'a> {
fn run_keccak_general(&mut self) { fn run_keccak_general(&mut self) {
let context = self.pop().as_usize(); let context = self.pop().as_usize();
let segment = Segment::all()[self.pop().as_usize()]; let segment = Segment::all()[self.pop().as_usize()];
// Not strictly needed but here to avoid surprises with MSIZE.
assert_ne!(segment, Segment::MainMemory, "Call KECCAK256 instead.");
let offset = self.pop().as_usize(); let offset = self.pop().as_usize();
let size = self.pop().as_usize(); let size = self.pop().as_usize();
let bytes = (offset..offset + size) let bytes = (offset..offset + size)
@ -578,11 +579,10 @@ impl<'a> Interpreter<'a> {
} }
fn run_msize(&mut self) { fn run_msize(&mut self) {
let num_bytes = self.memory.context_memory[self.context].segments self.push(
[Segment::MainMemory as usize] self.memory.context_memory[self.context].segments[Segment::ContextMetadata as usize]
.content .get(ContextMetadata::MSize as usize),
.len(); )
self.push(U256::from(num_bytes));
} }
fn run_jumpdest(&mut self) { fn run_jumpdest(&mut self) {