Smap

Struct Smap 

Source
pub struct Smap(/* private fields */);
Expand description

A helper type that provides SMAP related methods.

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

Implementations§

Source§

impl Smap

Source

pub fn new() -> Option<Self>

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.

Source

pub const unsafe fn new_unchecked() -> Self

Returns a Smap instance.

§Safety

The caller must ensure that the CPU supports SMAP.

Source

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.

Source

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.

Source

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.

Source

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§

Source§

impl Clone for Smap

Source§

fn clone(&self) -> Smap

Returns a duplicate of the value. Read more
1.0.0 · Source§

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

Performs copy-assignment from source. Read more
Source§

impl Debug for Smap

Source§

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

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

impl Copy for Smap

Auto Trait Implementations§

§

impl Freeze for Smap

§

impl RefUnwindSafe for Smap

§

impl Send for Smap

§

impl Sync for Smap

§

impl Unpin 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
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, 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.