pub struct BasicInstructionFetcher<I>where
I: Instruction,{ /* private fields */ }Expand description
Basic instruction fetcher implementation.
This implementation is intentionally basic and correct, but not the most performant. It is possible to have a more efficient implementation that skips certain checks by placing additional constraints on the constructor.
Note that it loads instructions from anywhere in memory. This works, but it is likely that you want to restrict this to a specific executable region of memory.
Every fetch is a bounds-checked memory read, so fetching is allowed at any program counter, whatever moved it there.
Implementations§
Source§impl<I> BasicInstructionFetcher<I>where
I: Instruction,
impl<I> BasicInstructionFetcher<I>where
I: Instruction,
Sourcepub const fn new(
return_trap_address: <<<I as Instruction>::Hart as HartConfig>::Reg as Register>::Type,
pc: <<<I as Instruction>::Hart as HartConfig>::Reg as Register>::Type,
) -> Self
pub const fn new( return_trap_address: <<<I as Instruction>::Hart as HartConfig>::Reg as Register>::Type, pc: <<<I as Instruction>::Hart as HartConfig>::Reg as Register>::Type, ) -> Self
Create a new instance.
return_trap_address is the address at which the interpreter will stop execution
(gracefully).
Trait Implementations§
Source§impl<I> Clone for BasicInstructionFetcher<I>where
I: Instruction + Clone,
impl<I> Clone for BasicInstructionFetcher<I>where
I: Instruction + Clone,
Source§fn clone(&self) -> BasicInstructionFetcher<I>
fn clone(&self) -> BasicInstructionFetcher<I>
Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreimpl<I> Copy for BasicInstructionFetcher<I>where
I: Instruction + Copy,
Source§impl<I> Debug for BasicInstructionFetcher<I>where
I: Instruction + Debug,
impl<I> Debug for BasicInstructionFetcher<I>where
I: Instruction + Debug,
Source§impl<I, Memory> InstructionFetcher<I, Memory> for BasicInstructionFetcher<I>where
I: Instruction,
Memory: VirtualMemory,
impl<I, Memory> InstructionFetcher<I, Memory> for BasicInstructionFetcher<I>where
I: Instruction,
Memory: VirtualMemory,
Source§type Peeked = I
type Peeked = I
What
Self::peek_instruction() returns an instruction as, which is whatever
Self::peeked_instruction() needs besides the fetcher to get back to the instruction. Read moreSource§unsafe fn peeked_instruction<'a>(&'a self, peeked: &'a I) -> &'a I
unsafe fn peeked_instruction<'a>(&'a self, peeked: &'a I) -> &'a I
Source§unsafe fn peek_instruction(
&mut self,
memory: &Memory,
) -> FetchInstructionResult<I>
unsafe fn peek_instruction( &mut self, memory: &Memory, ) -> FetchInstructionResult<I>
Read the instruction at the current position, leaving the program counter on it. Read more
Source§unsafe fn advance(&mut self, instruction_size: u8)
unsafe fn advance(&mut self, instruction_size: u8)
Move the program counter past an instruction of
instruction_size bytes that
Self::peek_instruction() has just returned. Read moreSource§unsafe fn fetch_instruction(
&mut self,
memory: &Memory,
) -> FetchInstructionResult<I>
unsafe fn fetch_instruction( &mut self, memory: &Memory, ) -> FetchInstructionResult<I>
Fetch a single instruction at a specified address and advance the program counter on
successful fetch. Read more
Source§impl<I, Memory> ProgramCounter<<<<I as Instruction>::Hart as HartConfig>::Reg as Register>::Type, Memory> for BasicInstructionFetcher<I>where
I: Instruction,
Memory: VirtualMemory,
impl<I, Memory> ProgramCounter<<<<I as Instruction>::Hart as HartConfig>::Reg as Register>::Type, Memory> for BasicInstructionFetcher<I>where
I: Instruction,
Memory: VirtualMemory,
Source§fn get_pc(
&self,
) -> <<<I as Instruction>::Hart as HartConfig>::Reg as Register>::Type
fn get_pc( &self, ) -> <<<I as Instruction>::Hart as HartConfig>::Reg as Register>::Type
Get the current value of the program counter
Source§unsafe fn try_set_pc_relative(
&mut self,
instruction_size: u8,
offset: i32,
) -> bool
unsafe fn try_set_pc_relative( &mut self, instruction_size: u8, offset: i32, ) -> bool
Move
offset bytes from the instruction being executed for targets this can resolve. Read moreSource§unsafe fn failed_branch(
&mut self,
memory: &Memory,
) -> Result<ControlFlow<()>, ExecutionError<<<<I as Instruction>::Hart as HartConfig>::Reg as Register>::Type>>
unsafe fn failed_branch( &mut self, memory: &Memory, ) -> Result<ControlFlow<()>, ExecutionError<<<<I as Instruction>::Hart as HartConfig>::Reg as Register>::Type>>
Say what is wrong with the target
Self::try_set_pc_relative() refused. Read moreSource§fn set_pc(
&mut self,
_memory: &Memory,
pc: <<<I as Instruction>::Hart as HartConfig>::Reg as Register>::Type,
) -> Result<ControlFlow<()>, ExecutionError<<<<I as Instruction>::Hart as HartConfig>::Reg as Register>::Type>>
fn set_pc( &mut self, _memory: &Memory, pc: <<<I as Instruction>::Hart as HartConfig>::Reg as Register>::Type, ) -> Result<ControlFlow<()>, ExecutionError<<<<I as Instruction>::Hart as HartConfig>::Reg as Register>::Type>>
Set the current value of the program counter
Source§fn old_pc(&self, instruction_size: u8) -> Address
fn old_pc(&self, instruction_size: u8) -> Address
Get the previous value of the program counter before executing an
instruction. Read moreSource§fn set_pc_relative(
&mut self,
memory: &Memory,
instruction_size: u8,
offset: i32,
) -> Result<ControlFlow<()>, ExecutionError<Address>>where
Self: ProgramCounter<Address, Memory>,
fn set_pc_relative(
&mut self,
memory: &Memory,
instruction_size: u8,
offset: i32,
) -> Result<ControlFlow<()>, ExecutionError<Address>>where
Self: ProgramCounter<Address, Memory>,
Apply
ExecutionResult::Branch, continuing offset bytes from the instruction being
executed. Read moreAuto Trait Implementations§
impl<I> Freeze for BasicInstructionFetcher<I>
impl<I> RefUnwindSafe for BasicInstructionFetcher<I>
impl<I> Send for BasicInstructionFetcher<I>
impl<I> Sync for BasicInstructionFetcher<I>
impl<I> Unpin for BasicInstructionFetcher<I>
impl<I> UnsafeUnpin for BasicInstructionFetcher<I>
impl<I> UnwindSafe for BasicInstructionFetcher<I>
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
Mutably borrows from an owned value. Read more