Struct probe_rs::Core

source ·
pub struct Core<'probe> { /* private fields */ }
Expand description

Generic core handle representing a physical core on an MCU.

This should be considered as a temporary view of the core which locks the debug probe driver to as single consumer by borrowing it.

As soon as you did your atomic task (e.g. halt the core, read the core state and all other debug relevant info) you should drop this object, to allow potential other shareholders of the session struct to grab a core handle too.

Implementations§

source§

impl<'probe> Core<'probe>

source

pub fn inner_mut(&mut self) -> &mut Box<dyn CoreInterface + 'probe>

Borrow the boxed CoreInterface mutable.

source

pub fn memory_regions(&self) -> impl Iterator<Item = &MemoryRegion>

Return the memory regions associated with this core.

source

pub fn id(&self) -> usize

Returns the ID of this core.

source

pub fn wait_for_core_halted(&mut self, timeout: Duration) -> Result<(), Error>

Wait until the core is halted. If the core does not halt on its own, a DebugProbeError::Timeout error will be returned.

source

pub fn core_halted(&mut self) -> Result<bool, Error>

Check if the core is halted. If the core does not halt on its own, a DebugProbeError::Timeout error will be returned.

source

pub fn halt(&mut self, timeout: Duration) -> Result<CoreInformation, Error>

Try to halt the core. This function ensures the core is actually halted, and returns a DebugProbeError::Timeout otherwise.

source

pub fn run(&mut self) -> Result<(), Error>

Continue to execute instructions.

source

pub fn reset(&mut self) -> Result<(), Error>

Reset the core, and then continue to execute instructions. If the core should be halted after reset, use the reset_and_halt function.

source

pub fn reset_and_halt( &mut self, timeout: Duration ) -> Result<CoreInformation, Error>

Reset the core, and then immediately halt. To continue execution after reset, use the reset function.

source

pub fn step(&mut self) -> Result<CoreInformation, Error>

Steps one instruction and then enters halted state again.

source

pub fn status(&mut self) -> Result<CoreStatus, Error>

Returns the current status of the core.

source

pub fn read_core_reg<T>( &mut self, address: impl Into<RegisterId> ) -> Result<T, Error>
where RegisterValue: TryInto<T>, Result<T, <RegisterValue as TryInto<T>>::Error>: RegisterValueResultExt<T>,

Read the value of a core register.

§Remarks

T can be an unsigned integer type, such as u32 or u64, or it can be RegisterValue to allow the caller to support arbitrary length registers.

To add support to convert to a custom type implement TryInto<CustomType> for RegisterValue.

§Errors

If T isn’t large enough to hold the register value an error will be raised.

source

pub fn write_core_reg<T>( &mut self, address: impl Into<RegisterId>, value: T ) -> Result<(), Error>
where T: Into<RegisterValue>,

Write the value of a core register.

§Errors

If T is too large to write to the target register an error will be raised.

source

pub fn available_breakpoint_units(&mut self) -> Result<u32, Error>

Returns all the available breakpoint units of the core.

source

pub fn debug_on_sw_breakpoint(&mut self, enabled: bool) -> Result<(), Error>

Configure the debug module to ensure software breakpoints will enter Debug Mode.

source

pub fn registers(&self) -> &'static CoreRegisters

Returns a list of all the registers of this core.

source

pub fn program_counter(&self) -> &'static CoreRegister

Returns the program counter register.

source

pub fn frame_pointer(&self) -> &'static CoreRegister

Returns the stack pointer register.

source

pub fn stack_pointer(&self) -> &'static CoreRegister

Returns the frame pointer register.

source

pub fn return_address(&self) -> &'static CoreRegister

Returns the return address register, a.k.a. link register.

source

pub fn set_hw_breakpoint(&mut self, address: u64) -> Result<(), Error>

Set a hardware breakpoint

This function will try to set a hardware breakpoint att address.

The amount of hardware breakpoints which are supported is chip specific, and can be queried using the get_available_breakpoint_units function.

source

pub fn clear_hw_breakpoint(&mut self, address: u64) -> Result<(), Error>

Set a hardware breakpoint

This function will try to clear a hardware breakpoint at address if there exists a breakpoint at that address.

source

pub fn clear_all_hw_breakpoints(&mut self) -> Result<(), Error>

Clear all hardware breakpoints

This function will clear all HW breakpoints which are configured on the target, regardless if they are set by probe-rs, AND regardless if they are enabled or not. Also used as a helper function in Session::drop.

source

pub fn architecture(&self) -> Architecture

Returns the architecture of the core.

source

pub fn core_type(&self) -> CoreType

Returns the core type of the core

source

pub fn instruction_set(&mut self) -> Result<InstructionSet, Error>

Determine the instruction set the core is operating in This must be queried while halted as this is a runtime decision for some core types

source

pub fn fpu_support(&mut self) -> Result<bool, Error>

Determine if an FPU is present. This must be queried while halted as this is a runtime decision for some core types.

source

pub fn floating_point_register_count(&mut self) -> Result<usize, Error>

Determine the number of floating point registers. This must be queried while halted as this is a runtime decision for some core types.

source

pub fn enable_vector_catch( &mut self, condition: VectorCatchCondition ) -> Result<(), Error>

Enables vector catching for the given condition

source

pub fn disable_vector_catch( &mut self, condition: VectorCatchCondition ) -> Result<(), Error>

Disables vector catching for the given condition

source

pub fn dump(&mut self, ranges: Vec<Range<u64>>) -> Result<CoreDump, Error>

Dumps core info with the current state.

§Arguments
  • ranges: Memory ranges that should be dumped.
source

pub fn is_64_bit(&self) -> bool

Check if the integer size is 64-bit

Trait Implementations§

source§

impl<'probe> CoreInterface for Core<'probe>

source§

fn wait_for_core_halted(&mut self, timeout: Duration) -> Result<(), Error>

Wait until the core is halted. If the core does not halt on its own, a DebugProbeError::Timeout error will be returned.
source§

fn core_halted(&mut self) -> Result<bool, Error>

Check if the core is halted. If the core does not halt on its own, a DebugProbeError::Timeout error will be returned.
source§

fn status(&mut self) -> Result<CoreStatus, Error>

Returns the current status of the core.
source§

fn halt(&mut self, timeout: Duration) -> Result<CoreInformation, Error>

Try to halt the core. This function ensures the core is actually halted, and returns a DebugProbeError::Timeout otherwise.
source§

fn run(&mut self) -> Result<(), Error>

Continue to execute instructions.
source§

fn reset(&mut self) -> Result<(), Error>

Reset the core, and then continue to execute instructions. If the core should be halted after reset, use the reset_and_halt function.
source§

fn reset_and_halt( &mut self, timeout: Duration ) -> Result<CoreInformation, Error>

Reset the core, and then immediately halt. To continue execution after reset, use the reset function.
source§

fn step(&mut self) -> Result<CoreInformation, Error>

Steps one instruction and then enters halted state again.
source§

fn read_core_reg(&mut self, address: RegisterId) -> Result<RegisterValue, Error>

Read the value of a core register.
source§

fn write_core_reg( &mut self, address: RegisterId, value: RegisterValue ) -> Result<(), Error>

Write the value of a core register.
source§

fn available_breakpoint_units(&mut self) -> Result<u32, Error>

Returns all the available breakpoint units of the core.
source§

fn hw_breakpoints(&mut self) -> Result<Vec<Option<u64>>, Error>

Read the hardware breakpoints from FpComp registers, and adds them to the Result Vector. A value of None in any position of the Vector indicates that the position is unset/available. We intentionally return all breakpoints, irrespective of whether they are enabled or not.
source§

fn enable_breakpoints(&mut self, state: bool) -> Result<(), Error>

Enables breakpoints on this core. If a breakpoint is set, it will halt as soon as it is hit.
source§

fn set_hw_breakpoint( &mut self, _unit_index: usize, addr: u64 ) -> Result<(), Error>

Sets a breakpoint at addr. It does so by using unit bp_unit_index.
source§

fn clear_hw_breakpoint(&mut self, _unit_index: usize) -> Result<(), Error>

Clears the breakpoint configured in unit unit_index.
source§

fn registers(&self) -> &'static CoreRegisters

Returns a list of all the registers of this core.
source§

fn program_counter(&self) -> &'static CoreRegister

Returns the program counter register.
source§

fn frame_pointer(&self) -> &'static CoreRegister

Returns the stack pointer register.
source§

fn stack_pointer(&self) -> &'static CoreRegister

Returns the frame pointer register.
source§

fn return_address(&self) -> &'static CoreRegister

Returns the return address register, a.k.a. link register.
source§

fn hw_breakpoints_enabled(&self) -> bool

Returns true if hardware breakpoints are enabled, false otherwise.
source§

fn architecture(&self) -> Architecture

Get the Architecture of the Core.
source§

fn core_type(&self) -> CoreType

Get the CoreType of the Core
source§

fn instruction_set(&mut self) -> Result<InstructionSet, Error>

Determine the instruction set the core is operating in This must be queried while halted as this is a runtime decision for some core types
source§

fn fpu_support(&mut self) -> Result<bool, Error>

Determine if an FPU is present. This must be queried while halted as this is a runtime decision for some core types.
source§

fn floating_point_register_count(&mut self) -> Result<usize, Error>

Determine the number of floating point registers. This must be queried while halted as this is a runtime decision for some core types.
source§

fn reset_catch_set(&mut self) -> Result<(), Error>

Set the reset catch setting. Read more
source§

fn reset_catch_clear(&mut self) -> Result<(), Error>

Clear the reset catch setting. Read more
source§

fn debug_core_stop(&mut self) -> Result<(), Error>

Called when we stop debugging a core.
source§

fn is_64_bit(&self) -> bool

Check if the integer size is 64-bit
source§

fn debug_on_sw_breakpoint(&mut self, _enabled: bool) -> Result<(), Error>

Configure the target to ensure software breakpoints will enter Debug Mode.
source§

fn on_session_stop(&mut self) -> Result<(), Error>

Called during session stop to do any pending cleanup
source§

fn enable_vector_catch( &mut self, _condition: VectorCatchCondition ) -> Result<(), Error>

Enables vector catching for the given condition
source§

fn disable_vector_catch( &mut self, _condition: VectorCatchCondition ) -> Result<(), Error>

Disables vector catching for the given condition
source§

impl<'probe> MemoryInterface for Core<'probe>

source§

fn supports_native_64bit_access(&mut self) -> bool

Does this interface support native 64-bit wide accesses Read more
source§

fn read_word_64(&mut self, address: u64) -> Result<u64, Error>

Read a 64bit word of at address. Read more
source§

fn read_word_32(&mut self, address: u64) -> Result<u32, Error>

Read a 32bit word of at address. Read more
source§

fn read_word_16(&mut self, address: u64) -> Result<u16, Error>

Read a 16bit word of at address. Read more
source§

fn read_word_8(&mut self, address: u64) -> Result<u8, Error>

Read an 8bit word of at address.
source§

fn read_64(&mut self, address: u64, data: &mut [u64]) -> Result<(), Error>

Read a block of 64bit words at address. Read more
source§

fn read_32(&mut self, address: u64, data: &mut [u32]) -> Result<(), Error>

Read a block of 32bit words at address. Read more
source§

fn read_16(&mut self, address: u64, data: &mut [u16]) -> Result<(), Error>

Read a block of 16bit words at address. Read more
source§

fn read_8(&mut self, address: u64, data: &mut [u8]) -> Result<(), Error>

Read a block of 8bit words at address.
source§

fn read(&mut self, address: u64, data: &mut [u8]) -> Result<(), Error>

Read data from address. Read more
source§

fn write_word_64(&mut self, addr: u64, data: u64) -> Result<(), Error>

Write a 64bit word at address. Read more
source§

fn write_word_32(&mut self, addr: u64, data: u32) -> Result<(), Error>

Write a 32bit word at address. Read more
source§

fn write_word_16(&mut self, addr: u64, data: u16) -> Result<(), Error>

Write a 16bit word at address. Read more
source§

fn write_word_8(&mut self, addr: u64, data: u8) -> Result<(), Error>

Write an 8bit word at address.
source§

fn write_64(&mut self, addr: u64, data: &[u64]) -> Result<(), Error>

Write a block of 64bit words at address. Read more
source§

fn write_32(&mut self, addr: u64, data: &[u32]) -> Result<(), Error>

Write a block of 32bit words at address. Read more
source§

fn write_16(&mut self, addr: u64, data: &[u16]) -> Result<(), Error>

Write a block of 16bit words at address. Read more
source§

fn write_8(&mut self, addr: u64, data: &[u8]) -> Result<(), Error>

Write a block of 8bit words at address.
source§

fn write(&mut self, addr: u64, data: &[u8]) -> Result<(), Error>

Write a block of 8bit words at address. May use 64 bit memory access, so should only be used if reading memory locations that don’t have side effects. Generally faster than MemoryInterface::write_8. Read more
source§

fn supports_8bit_transfers(&self) -> Result<bool, Error>

Returns whether the current platform supports native 8bit transfers.
source§

fn flush(&mut self) -> Result<(), Error>

Flush any outstanding operations. Read more
source§

fn read_mem_64bit(&mut self, address: u64, data: &mut [u8]) -> Result<(), Error>

Reads bytes using 64 bit memory access. Read more
source§

fn read_mem_32bit(&mut self, address: u64, data: &mut [u8]) -> Result<(), Error>

Reads bytes using 32 bit memory access. Read more
source§

fn write_mem_64bit(&mut self, address: u64, data: &[u8]) -> Result<(), Error>

Writes bytes using 64 bit memory access. Address must be 64 bit aligned and data must be an exact multiple of 8.
source§

fn write_mem_32bit(&mut self, address: u64, data: &[u8]) -> Result<(), Error>

Writes bytes using 32 bit memory access. Address must be 32 bit aligned and data must be an exact multiple of 8.

Auto Trait Implementations§

§

impl<'probe> Freeze for Core<'probe>

§

impl<'probe> !RefUnwindSafe for Core<'probe>

§

impl<'probe> !Send for Core<'probe>

§

impl<'probe> !Sync for Core<'probe>

§

impl<'probe> Unpin for Core<'probe>

§

impl<'probe> !UnwindSafe for Core<'probe>

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> Conv for T

source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
source§

impl<T> FmtForward for T

source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
source§

impl<T> Pipe for T
where T: ?Sized,

source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
source§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
source§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> Tap for T

source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
source§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
source§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
source§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
source§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
source§

impl<T> TryConv for T

source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more