Skip to main content

Smap

Struct Smap 

pub struct Smap(());
Expand description

A helper type that provides SMAP related methods.

This type can only be instantiated if SMAP is supported by the CPU.

Tuple Fields§

§0: ()

Implementations§

§

impl Smap

pub fn new() -> Option<Smap>

Checks if the CPU supports SMAP and returns a Smap instance if supported or None if not.

This function uses CPUID to determine if SMAP is supported by the CPU.

Note that this function does not check whether SMAP has be enabled in CR4.

pub const unsafe fn new_unchecked() -> Smap

Returns a Smap instance.

§Safety

The caller must ensure that the CPU supports SMAP.

pub fn is_enabled(self) -> bool

Returns whether the RFlags::ALIGNMENT_CHECK flag is unset.

Note that SMAP also requires [Cr4Flags::SUPERVISOR_MODE_ACCESS_PREVENTION] to be set. This function does not check CR4 because doing so is much slower than just checking the AC flag.

pub fn disable(self)

Disable SMAP access checks by setting RFlags::ALIGNMENT_CHECK using the stac instruction.

This will do nothing if SMAP access checks are already disabled.

pub fn enable(self)

Enable SMAP access checks by clearing RFlags::ALIGNMENT_CHECK using the clac instruction.

This will do nothing if SMAP access checks are already enabled.

pub fn without_smap<F, R>(self, f: F) -> R
where F: FnOnce() -> R,

Call a closure with SMAP disabled.

This function disables SMAP before calling the closure and restores the SMAP state afterwards.

Trait Implementations§

§

impl Clone for Smap

§

fn clone(&self) -> Smap

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
§

impl Copy for Smap

§

impl Debug for Smap

§

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

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl Freeze for Smap

§

impl RefUnwindSafe for Smap

§

impl Send for Smap

§

impl Sync for Smap

§

impl Unpin for Smap

§

impl UnsafeUnpin for Smap

§

impl UnwindSafe for Smap

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
§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

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<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

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

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.