pub struct UserContext {
pub sp: u64,
pub tpidr: u64,
/* private fields */
}uspace only.Expand description
Context to enter user space.
Fields§
§sp: u64Stack Pointer (SP_EL0).
tpidr: u64Software Thread ID Register (TPIDR_EL0).
Implementations§
Source§impl UserContext
impl UserContext
Sourcepub fn new(entry: usize, ustack_top: VirtAddr, arg0: usize) -> Self
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.
Sourcepub unsafe fn emulate_mrs_id_reg(&mut self) -> bool
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.
Sourcepub fn prepare_clone_child_return_state(&mut self)
pub fn prepare_clone_child_return_state(&mut self)
Normalizes a cloned user context so it can safely return to EL0.
Sourcepub const fn clear_single_step_after_debug(&mut self) -> bool
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.
Sourcepub const fn syscall_insn_len(&self) -> usize
pub const fn syscall_insn_len(&self) -> usize
Returns the syscall instruction length in bytes.
Sourcepub fn has_interruptible_user_return_mode(&self) -> bool
pub fn has_interruptible_user_return_mode(&self) -> bool
Returns whether this register image can be restored as an interruptible EL0 context.
Sourcepub unsafe fn run_unchecked(&mut self) -> ReturnReason
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>§
Sourcepub fn origin(&self) -> TrapOrigin
pub fn origin(&self) -> TrapOrigin
Returns the privilege domain represented by this register image.
Sourcepub fn set_retval(&mut self, r0: usize)
pub fn set_retval(&mut self, r0: usize)
Sets the return value register.
Trait Implementations§
Source§impl Clone for UserContext
impl Clone for UserContext
Source§fn clone(&self) -> UserContext
fn clone(&self) -> UserContext
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more