Skip to main content

Tss

Struct Tss 

Source
pub struct Tss {
    tss: UnsafeCell<TaskStateSegment>,
    ist1: AlignedStack<8192>,
    ist2: AlignedStack<8192>,
    ist3: AlignedStack<8192>,
    ist4: AlignedStack<8192>,
}
Expand description

Owns the TaskStateSegment and its four IST stacks; must not move after Tss::init (the GDT descriptor points to it).

Fields§

§tss: UnsafeCell<TaskStateSegment>§ist1: AlignedStack<8192>§ist2: AlignedStack<8192>§ist3: AlignedStack<8192>§ist4: AlignedStack<8192>

Implementations§

Source§

impl Tss

Source

pub const fn new() -> Self

Create a new, uninitialized Tss; call Tss::init to populate it.

Source

pub unsafe fn init(&'static self)

Build the TSS with RSP0 pointing to 0 and the predefined IST stacks

§Safety

This method must be called exactly once before Tss::tss is called to avoid undefined behavior and multiple mutable references.

Source

pub unsafe fn tss(&'static self) -> &'static TaskStateSegment

Getter for Tss::tss, returns a reference

§Safety

The caller must guarantee that there are no mutable references or pointers to self.tss

Source

pub unsafe fn set_rsp0(&self, new_rsp0: VirtAddr)

Setter for TSS.RSP0

§Safety

The caller must guarantee the following:

  • That Tss::init has already been called
  • This method is only called on the CPU which owns this TSS
  • That no refs/ptrs from Tss::tss are held when this is called
  • new_rsp0 is a valid pointer to a valid, mapped kernel stack

Trait Implementations§

Source§

impl Sync for Tss

Safety: tss will only be written to by the owner CPU and will only be written to when the CPU transitions from userspace to kernelspace, where no kernel code could’ve run before

Auto Trait Implementations§

§

impl !Freeze for Tss

§

impl !RefUnwindSafe for Tss

§

impl Send for Tss

§

impl Unpin for Tss

§

impl UnsafeUnpin for Tss

§

impl UnwindSafe for Tss

Blanket Implementations§

§

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

§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

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

§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
§

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

§

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

Mutably borrows from an owned value. Read more
§

impl<T> From<T> for T

§

fn from(t: T) -> T

Returns the argument unchanged.

§

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

§

fn into(self) -> U

Calls U::from(self).

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

§

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

§

type Error = !

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

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

Performs the conversion.
§

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.
§

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

Performs the conversion.