axhal::arch

Struct UspaceContext

Source
pub struct UspaceContext(/* private fields */);
Available on crate feature uspace only.
Expand description

Context to enter user space.

Implementations§

Source§

impl UspaceContext

Source

pub const fn empty() -> Self

Creates an empty context with all registers set to zero.

Source

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

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

Source

pub const fn from(tf: &TrapFrame) -> Self

Creates a new context from the given TrapFrame.

It copies almost all registers except CS and SS which need to be set to the user segment selectors.

Source

pub unsafe fn enter_uspace(&self, kstack_top: VirtAddr) -> !

Enters user space.

It restores the user registers and jumps to the user entry point (saved in rip). When an exception or syscall occurs, the kernel stack pointer is switched to kstack_top.

§Safety

This function is unsafe because it changes processor mode and the stack.

Methods from Deref<Target = TrapFrame>§

Source

pub fn arg0(&self) -> usize

Gets the 0th syscall argument.

Source

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

Sets the 0th syscall argument.

Source

pub fn arg1(&self) -> usize

Gets the 1st syscall argument.

Source

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

Sets the 1st syscall argument.

Source

pub fn arg2(&self) -> usize

Gets the 2nd syscall argument.

Source

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

Sets the 2nd syscall argument.

Source

pub fn arg3(&self) -> usize

Gets the 3rd syscall argument.

Source

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

Sets the 3rd syscall argument.

Source

pub fn arg4(&self) -> usize

Gets the 4th syscall argument.

Source

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

Sets the 4th syscall argument.

Source

pub fn arg5(&self) -> usize

Gets the 5th syscall argument.

Source

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

Sets the 5th syscall argument.

Source

pub fn is_user(&self) -> bool

Whether the trap is from userspace.

Source

pub fn ip(&self) -> usize

Gets the instruction pointer.

Source

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

Sets the instruction pointer.

Source

pub fn sp(&self) -> usize

Gets the stack pointer.

Source

pub fn set_sp(&mut self, rsp: usize)

Sets the stack pointer.

Source

pub fn retval(&self) -> usize

Gets the return value register.

Source

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

Sets the return value register.

Source

pub fn push_ra(&mut self, addr: usize)

Push the return address.

On x86_64, return address is stored in stack, so we need to modify the stack in order to change the return address. This function uses a separate name (rather than set_ra) to avoid confusion and misuse.

Source

pub fn tls(&self) -> usize

Gets the TLS area.

Source

pub fn set_tls(&mut self, tls_area: usize)

Sets the TLS area.

Trait Implementations§

Source§

impl Deref for UspaceContext

Source§

type Target = TrapFrame

The resulting type after dereferencing.
Source§

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

Dereferences the value.
Source§

impl DerefMut for UspaceContext

Source§

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

Mutably dereferences the value.

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, 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 = 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>,

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.