pub struct CONTEXT_ARM64 {
    pub context_flags: u32,
    pub cpsr: u32,
    pub iregs: [u64; 31],
    pub sp: u64,
    pub pc: u64,
    pub float_regs: [u128; 32],
    pub fpcr: u32,
    pub fpsr: u32,
    pub bcr: [u32; 8],
    pub bvr: [u64; 8],
    pub wcr: [u32; 2],
    pub wvr: [u64; 2],
}
Expand description

A (microsoft-style) aarch64 (arm64) CPU context

This matches the layout of how Windows defines this type. Breakpad defines it in an equivalent but more-quirky way that relies more on packing.

For general purpose registers:

  • microsoft: make iregs have 31 values and have sp and pc as explicit fields.
  • breakpad make iregs have 33 values, no explicit fields.

For float registers:

  • microsoft: inline the fields for float_regs, fpcr, fpsr.
  • breakpad: wrap them in a struct.

Why we went with these definitions:

  • ARM64 actually defines x0..x30 register names, but sp and pc aren’t “x31” and “x32”. Breakpad is effectively punning them as such, and that’s kinda weird?

  • Microsft’s inlining of the float registers eliminates any need for padding on all platforms (note how there’s always an even number of u32’s before a u64, and an even number of u64’s before a u128!)

NOTE: if you ever decide to try to make this repr(C) and get really clever, note that microsoft aligns this to 16 (and as of this writing, rust does not consistently aling u128 as such).

Fields§

§context_flags: u32§cpsr: u32§iregs: [u64; 31]

[x0, x1, ..., x28, fp, lr]. See Arm64RegisterNumbers.

§sp: u64§pc: u64§float_regs: [u128; 32]

float/NEON registers [d0, d1, ..., d31]

§fpcr: u32

FPU control register.

§fpsr: u32

FPU status register.

§bcr: [u32; 8]§bvr: [u64; 8]§wcr: [u32; 2]§wvr: [u64; 2]

Trait Implementations§

source§

impl Clone for CONTEXT_ARM64

source§

fn clone(&self) -> CONTEXT_ARM64

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl CpuContext for CONTEXT_ARM64

§

type Register = u64

The word size of general-purpose registers in the context.
source§

const REGISTERS: &'static [&'static str] = _

General purpose registers in this context type.
source§

fn memoize_register(&self, reg: &str) -> Option<&'static str>

Gets a static version of the given register name, if possible. Read more
source§

fn register_is_valid(&self, reg: &str, valid: &MinidumpContextValidity) -> bool

Gets whether the given register is valid Read more
source§

fn get_register_always(&self, reg: &str) -> u64

Get a register value regardless of whether it is valid.
source§

fn set_register(&mut self, reg: &str, val: Self::Register) -> Option<()>

Set a register value, if that register name it exists. Read more
source§

fn stack_pointer_register_name(&self) -> &'static str

Gets the name of the stack pointer register (for use with get_register/set_register).
source§

fn instruction_pointer_register_name(&self) -> &'static str

Gets the name of the instruction pointer register (for use with get_register/set_register).
source§

fn get_register( &self, reg: &str, valid: &MinidumpContextValidity ) -> Option<Self::Register>

Get a register value if it is valid. Read more
source§

fn format_register(&self, reg: &str) -> String

Return a String containing the value of reg formatted to its natural width.
source§

fn registers(&self) -> CpuRegisters<'_, Self>

An iterator over all registers in this context. Read more
source§

fn valid_registers<'a>( &'a self, valid: &'a MinidumpContextValidity ) -> CpuRegisters<'a, Self>

An iterator over valid registers in this context. Read more
source§

impl Debug for CONTEXT_ARM64

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
source§

impl Default for CONTEXT_ARM64

source§

fn default() -> CONTEXT_ARM64

Returns the “default value” for a type. Read more
source§

impl SizeWith<Endian> for CONTEXT_ARM64

source§

impl<'a> TryFromCtx<'a, Endian> for CONTEXT_ARM64
where CONTEXT_ARM64: 'a,

source§

impl<'a> TryIntoCtx<Endian> for &'a CONTEXT_ARM64

§

type Error = Error

source§

fn try_into_ctx( self, dst: &mut [u8], ctx: Endian ) -> Result<usize, <&'a CONTEXT_ARM64 as TryIntoCtx<Endian>>::Error>

source§

impl TryIntoCtx<Endian> for CONTEXT_ARM64

§

type Error = Error

source§

fn try_into_ctx( self, dst: &mut [u8], ctx: Endian ) -> Result<usize, <CONTEXT_ARM64 as TryIntoCtx<Endian>>::Error>

Auto Trait Implementations§

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> 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> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. 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