Skip to main content

UserContext

Struct UserContext 

Source
pub struct UserContext {
    pub sp: u64,
    pub tpidr: u64,
    /* private fields */
}
Available on crate feature uspace only.
Expand description

Context to enter user space.

Fields§

§sp: u64

Stack Pointer (SP_EL0).

§tpidr: u64

Software Thread ID Register (TPIDR_EL0).

Implementations§

Source§

impl UserContext

Source

pub fn new(entry: usize, ustack_top: VirtAddr, arg0: usize) -> Self

Creates a new user context with the given entry point, stack top, and argument.

Source

pub unsafe fn emulate_mrs_id_reg(&mut self) -> bool

Emulates an EL0 MRS Xt, ID_AA64*_EL1 that trapped as an “unknown” exception (EC=0), mirroring Linux’s emulate_mrs. AArch64 CPU-feature detection — e.g. the Go runtime’s cpu probing — reads these ID feature registers from EL0; reading an EL1 register from EL0 is UNDEFINED and traps, which would otherwise be delivered as SIGILL and crash every such program. Reads the real register (the kernel runs at EL1) into Xt, advances the PC, and returns true; returns false if the faulting instruction is not one of the emulated ID-register reads so the caller can fall back to SIGILL.

§Safety

Reads the 4-byte instruction at the trapped PC (elr) from the active user address space. The caller invokes this only while that aspace is installed and the PC was just executing, so the page is mapped.

Source

pub fn prepare_clone_child_return_state(&mut self)

Normalizes a cloned user context so it can safely return to EL0.

Source

pub const fn clear_single_step_after_debug(&mut self) -> bool

Clears any architecture single-step state after a debug exception.

AArch64 user single-step is currently emulated by the Starry ptrace layer, so there is no saved CPU flag to clear here.

Source

pub const fn syscall_insn_len(&self) -> usize

Returns the syscall instruction length in bytes.

Source

pub const fn sp(&self) -> usize

Gets the stack pointer.

Source

pub const fn set_sp(&mut self, sp: usize)

Sets the stack pointer.

Source

pub const fn tls(&self) -> usize

Gets the TLS area.

Source

pub const fn set_tls(&mut self, tls: usize)

Sets the TLS area.

Source

pub fn has_interruptible_user_return_mode(&self) -> bool

Returns whether this register image can be restored as an interruptible EL0 context.

Source

pub unsafe fn run_unchecked(&mut self) -> ReturnReason

Enters user space without validating the runtime transition.

It restores the user registers and jumps to the user entry point (saved in elr).

This function returns when an exception or syscall occurs.

§Safety

The caller must be the runtime’s prepared user-entry boundary for the current scheduler task. Its context-switch tail must be complete, no IRQ/preemption guard or hard interrupt may be active, and local IRQs must remain disabled after the final scheduler-work check. The active logical address space, hardware root and CPU footprint must match this task and keep every user address referenced by self valid. SPSR must describe an interruptible EL0 return. No code may run between those validations and this call.

Safe code cannot invoke this raw boundary:

fn bypass_runtime(context: &mut ax_cpu::uspace::UserContext) {
    context.run_unchecked();
}

Methods from Deref<Target = TrapFrame>§

Source

pub fn origin(&self) -> TrapOrigin

Returns the privilege domain represented by this register image.

Source

pub fn arg0(&self) -> usize

Gets the 0th syscall argument.

Source

pub fn set_arg0(&mut self, a0: usize)

Sets the 0th syscall argument.

Source

pub fn arg1(&self) -> usize

Gets the 1st syscall argument.

Source

pub fn set_arg1(&mut self, a1: usize)

Sets the 1st syscall argument.

Source

pub fn arg2(&self) -> usize

Gets the 2nd syscall argument.

Source

pub fn set_arg2(&mut self, a2: usize)

Sets the 2nd syscall argument.

Source

pub fn arg3(&self) -> usize

Gets the 3rd syscall argument.

Source

pub fn set_arg3(&mut self, a3: usize)

Sets the 3rd syscall argument.

Source

pub fn arg4(&self) -> usize

Gets the 4th syscall argument.

Source

pub fn set_arg4(&mut self, a4: usize)

Sets the 4th syscall argument.

Source

pub fn arg5(&self) -> usize

Gets the 5th syscall argument.

Source

pub fn set_arg5(&mut self, a5: usize)

Sets the 5th syscall argument.

Source

pub fn ip(&self) -> usize

Gets the instruction pointer.

Source

pub fn set_ip(&mut self, pc: usize)

Sets the instruction pointer.

Source

pub fn sysno(&self) -> usize

Get the syscall number.

Source

pub fn set_sysno(&mut self, sysno: usize)

Sets the syscall number.

Source

pub fn retval(&self) -> usize

Gets the return value register.

Source

pub fn set_retval(&mut self, r0: usize)

Sets the return value register.

Source

pub fn set_ra(&mut self, lr: usize)

Sets the return address.

Source

pub fn backtrace(&self) -> Backtrace

Unwind the stack and get the backtrace.

Trait Implementations§

Source§

impl Clone for UserContext

Source§

fn clone(&self) -> UserContext

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

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

Performs copy-assignment from source. Read more
Source§

impl Copy for UserContext

Source§

impl Debug for UserContext

Source§

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

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

impl Deref for UserContext

Source§

type Target = TrapFrame

The resulting type after dereferencing.
Source§

fn deref(&self) -> &Self::Target

Dereferences the value.
Source§

impl DerefMut for UserContext

Source§

fn deref_mut(&mut self) -> &mut Self::Target

Mutably dereferences the value.
Source§

impl NoUninit for UserContext

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

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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<P, T> Receiver for P
where P: Deref<Target = T> + ?Sized, T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
Source§

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

Source§

type Error = !

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

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

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

Source§

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.