mirror of
https://github.com/logos-storage/plonky2.git
synced 2026-01-07 00:03:10 +00:00
Merge pull request #791 from mir-protocol/kernel_msize
Implement MSIZE in the kernel
This commit is contained in:
commit
7b2f515c00
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -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",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user