pub struct SyscallContext<'a, 'b: 'a> {
pub current_shard: u32,
pub clk: u32,
pub next_pc: u32,
pub exit_code: u32,
pub rt: &'a mut Executor<'b>,
pub local_memory_access: HashMap<u32, MemoryLocalEvent>,
}
Expand description
A runtime for syscalls that is protected so that developers cannot arbitrarily modify the runtime.
Fields§
§current_shard: u32
The current shard.
clk: u32
The clock cycle.
next_pc: u32
The next program counter.
exit_code: u32
The exit code.
rt: &'a mut Executor<'b>
The runtime.
local_memory_access: HashMap<u32, MemoryLocalEvent>
The local memory access events for the syscall.
Implementations§
Source§impl<'a, 'b> SyscallContext<'a, 'b>
impl<'a, 'b> SyscallContext<'a, 'b>
Sourcepub fn new(runtime: &'a mut Executor<'b>) -> Self
pub fn new(runtime: &'a mut Executor<'b>) -> Self
Create a new SyscallContext
.
Sourcepub fn record_mut(&mut self) -> &mut ExecutionRecord
pub fn record_mut(&mut self) -> &mut ExecutionRecord
Get a mutable reference to the execution record.
Sourcepub fn add_precompile_event(
&mut self,
syscall_code: SyscallCode,
syscall_event: SyscallEvent,
event: PrecompileEvent,
)
pub fn add_precompile_event( &mut self, syscall_code: SyscallCode, syscall_event: SyscallEvent, event: PrecompileEvent, )
Add a precompile event to the execution record.
Sourcepub fn current_shard(&self) -> u32
pub fn current_shard(&self) -> u32
Get the current shard.
Sourcepub fn mr(&mut self, addr: u32) -> (MemoryReadRecord, u32)
pub fn mr(&mut self, addr: u32) -> (MemoryReadRecord, u32)
Read a word from memory.
addr
must be a pointer to main memory, not a register.
Sourcepub fn mr_slice(
&mut self,
addr: u32,
len: usize,
) -> (Vec<MemoryReadRecord>, Vec<u32>)
pub fn mr_slice( &mut self, addr: u32, len: usize, ) -> (Vec<MemoryReadRecord>, Vec<u32>)
Read a slice of words from memory.
addr
must be a pointer to main memory, not a register.
Sourcepub fn mw(&mut self, addr: u32, value: u32) -> MemoryWriteRecord
pub fn mw(&mut self, addr: u32, value: u32) -> MemoryWriteRecord
Write a word to memory.
addr
must be a pointer to main memory, not a register.
Sourcepub fn mw_slice(&mut self, addr: u32, values: &[u32]) -> Vec<MemoryWriteRecord>
pub fn mw_slice(&mut self, addr: u32, values: &[u32]) -> Vec<MemoryWriteRecord>
Write a slice of words to memory.
Sourcepub fn rr_traced(&mut self, register: Register) -> (MemoryReadRecord, u32)
pub fn rr_traced(&mut self, register: Register) -> (MemoryReadRecord, u32)
Read a register and record the memory access.
Sourcepub fn rw_traced(
&mut self,
register: Register,
value: u32,
) -> (MemoryWriteRecord, u32)
pub fn rw_traced( &mut self, register: Register, value: u32, ) -> (MemoryWriteRecord, u32)
Write a register and record the memory access.
Sourcepub fn postprocess(&mut self) -> Vec<MemoryLocalEvent>
pub fn postprocess(&mut self) -> Vec<MemoryLocalEvent>
Postprocess the syscall. Specifically will process the syscall’s memory local events.
Sourcepub fn register_unsafe(&mut self, register: Register) -> u32
pub fn register_unsafe(&mut self, register: Register) -> u32
Get the current value of a register, but doesn’t use a memory record. This is generally unconstrained, so you must be careful using it.
Sourcepub fn byte_unsafe(&mut self, addr: u32) -> u8
pub fn byte_unsafe(&mut self, addr: u32) -> u8
Get the current value of a byte, but doesn’t use a memory record.
Sourcepub fn word_unsafe(&mut self, addr: u32) -> u32
pub fn word_unsafe(&mut self, addr: u32) -> u32
Get the current value of a word, but doesn’t use a memory record.
Sourcepub fn slice_unsafe(&mut self, addr: u32, len: usize) -> Vec<u32>
pub fn slice_unsafe(&mut self, addr: u32, len: usize) -> Vec<u32>
Get a slice of words, but doesn’t use a memory record.
Sourcepub fn set_next_pc(&mut self, next_pc: u32)
pub fn set_next_pc(&mut self, next_pc: u32)
Set the next program counter.
Sourcepub fn set_exit_code(&mut self, exit_code: u32)
pub fn set_exit_code(&mut self, exit_code: u32)
Set the exit code.
Auto Trait Implementations§
impl<'a, 'b> Freeze for SyscallContext<'a, 'b>
impl<'a, 'b> !RefUnwindSafe for SyscallContext<'a, 'b>
impl<'a, 'b> Send for SyscallContext<'a, 'b>
impl<'a, 'b> !Sync for SyscallContext<'a, 'b>
impl<'a, 'b> Unpin for SyscallContext<'a, 'b>
impl<'a, 'b> !UnwindSafe for SyscallContext<'a, 'b>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more