Struct NvramSpecServices

Source
pub struct NvramSpecServices<S: InspectableNvramStorage> { /* private fields */ }
Expand description

An implementation of UEFI spec 8.2 - Variable Services

This API tries to match the API defined by the UEFI spec 1:1, hence why it doesn’t look very “Rust-y”.

If you need to interact with NvramServices outside the context of the UEFI device itself, consider importing the NvramServicesExt trait. This trait provides various helper methods that make it easier to get/set nvram variables, without worrying about the nitty-gritty details of UCS-2 string encoding, pointer sizes/nullness, etc…

Instead of returning a typical Result type, these methods all return a tuple of (Option<T>, EfiStatus, Option<NvramError>), where the EfiStatus field should be unconditionally returned to the guest, while the NvramError type provides additional context as to what error occurred in OpenVMM (i.e: for logging purposes).

Implementations§

Source§

impl<S: InspectableNvramStorage> NvramSpecServices<S>

Source

pub fn new(storage: S) -> NvramSpecServices<S>

Construct a new NvramServices instance from an existing storage backend.

Source

pub async fn is_empty(&mut self) -> Result<bool, NvramStorageError>

Check if the nvram store is empty.

Source

pub async fn update_setup_mode(&mut self) -> Result<(), NvramStorageError>

Update “SetupMode” based on the current value of “PK”

From UEFI spec section 32.3

While no Platform Key is enrolled, the SetupMode variable shall be equal to 1. While SetupMode == 1, the platform firmware shall not require authentication in order to modify the Platform Key, Key Enrollment Key, OsRecoveryOrder, OsRecovery####, and image security databases.

After the Platform Key is enrolled, the SetupMode variable shall be equal to 0. While SetupMode == 0, the platform firmware shall require authentication in order to modify the Platform Key, Key Enrollment Key, OsRecoveryOrder, OsRecovery####, and image security databases.

Source

pub fn exit_boot_services(&mut self)

Nvram behavior changes after the guest signals that ExitBootServices has been called (e.g: hiding variables that are only accessible at boot-time).

Source

pub fn reset(&mut self)

Called when the VM resets to return to the preboot state.

Source

pub fn prepare_for_boot(&mut self)

Called after injecting any pre-boot nvram vars, transitioning the nvram store to start accepting calls from guest UEFI.

Source

pub async fn uefi_get_variable( &mut self, name: Option<&[u8]>, in_vendor: Guid, out_attr: &mut u32, in_out_data_size: &mut u32, data_is_null: bool, ) -> NvramResult<Option<Vec<u8>>>

Get a variable identified by name + vendor, returning the variable’s attributes and data.

  • in_name
    • (In) Variable name (a null-terminated UTF-16 string, or None if the guest passed a nullptr)
  • in_vendor
    • (In) Variable vendor guid
  • out_attr
    • (Out) Variable’s attributes
    • Note: According to the UEFI spec: attr will be populated on both EFI_SUCCESS and when EFI_BUFFER_TOO_SMALL is returned.
  • in_out_data_size
    • (In) Size of available data buffer (provided by guest)
    • (Out) Size of data to be written into buffer
    • Note: If data_is_null is true, and in_out_data_size is set to 0, in_out_data_size will be updated with the size required to store the variable.
  • data_is_null
    • (In) bool indicating if guest passed nullptr as the data addr
Source

pub async fn uefi_set_variable( &mut self, name: Option<&[u8]>, in_vendor: Guid, in_attr: u32, in_data_size: u32, data: Option<Vec<u8>>, ) -> NvramResult<()>

Set a variable identified by name + vendor with the specified attr and data

  • name
    • (In) Variable name (a null-terminated UTF-16 string, or None if the guest passed a nullptr)
    • Note: name must contain one or more character.
  • in_vendor
    • (In) Variable vendor guid
  • in_attr
    • (In) Variable’s attributes
  • in_data_size
    • (In) Length of data to be written
    • If len in 0, and the EFI_VARIABLE_APPEND_WRITE, EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS, EFI_VARIABLE_ENHANCED_AUTHENTICATED_ACCESS, or EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS are not set, the variable will be deleted.
  • data
    • (In) Variable data (or None if the guest passed a nullptr)
Source

pub async fn uefi_get_next_variable( &mut self, in_out_name_size: &mut u32, name: Option<&[u8]>, vendor: Guid, ) -> NvramResult<Option<(Vec<u8>, Guid)>>

Return the variable immediately following the variable identified by name + vendor key.

If name is an empty string, the first variable is returned.

  • name
    • (In) Variable name (a null-terminated UTF-16 string, or None if the guest passed a nullptr)
  • in_out_name_size
    • (In) Length of the provided name
    • (Out) Length of the next variable name
    • Note: If there is insufficient space in the name buffer to store the next variable, in_out_name_size will be updated with the size required to store the variable.
  • vendor
    • (In) Variable vendor guid

Trait Implementations§

Source§

impl<S: Debug + InspectableNvramStorage> Debug for NvramSpecServices<S>

Source§

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

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

impl<S: InspectableNvramStorage> Inspect for NvramSpecServices<S>

Source§

fn inspect(&self, req: Request<'_>)

Inspects the object.
Source§

impl<S: InspectableNvramStorage> NvramServicesExt for NvramSpecServices<S>

Source§

fn get_variable<'life0, 'life1, 'async_trait>( &'life0 mut self, vendor: Guid, name: &'life1 str, ) -> Pin<Box<dyn Future<Output = Result<(u32, Vec<u8>), (EfiStatus, Option<NvramError>)>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Get a variable identified by name (as a Rust string) + vendor, returning the variable’s attributes and data.
Source§

fn get_variable_ucs2<'life0, 'life1, 'async_trait>( &'life0 mut self, vendor: Guid, name: &'life1 Ucs2LeSlice, ) -> Pin<Box<dyn Future<Output = Result<(u32, Vec<u8>), (EfiStatus, Option<NvramError>)>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Get a variable identified by name (as a UCS-2 string) + vendor, returning the variable’s attributes and data.
Source§

fn set_variable<'life0, 'life1, 'async_trait>( &'life0 mut self, vendor: Guid, name: &'life1 str, attr: u32, data: Vec<u8>, ) -> Pin<Box<dyn Future<Output = Result<(), (EfiStatus, Option<NvramError>)>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Set a variable identified by name (as a Rust string) + vendor with the specified attr and data.
Source§

fn set_variable_ucs2<'life0, 'life1, 'async_trait>( &'life0 mut self, vendor: Guid, name: &'life1 Ucs2LeSlice, attr: u32, data: Vec<u8>, ) -> Pin<Box<dyn Future<Output = Result<(), (EfiStatus, Option<NvramError>)>> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Set a variable identified by name (as a UCS-2 string) + vendor with the specified attr and data.
Source§

impl<S: InspectableNvramStorage> SaveRestore for NvramSpecServices<S>

Source§

type SavedState = SavedState

The concrete saved state type.
Source§

fn save(&mut self) -> Result<Self::SavedState, SaveError>

Saves the object’s state.
Source§

fn restore(&mut self, state: Self::SavedState) -> Result<(), RestoreError>

Restores the object’s state.

Auto Trait Implementations§

§

impl<S> Freeze for NvramSpecServices<S>
where S: Freeze,

§

impl<S> RefUnwindSafe for NvramSpecServices<S>
where S: RefUnwindSafe,

§

impl<S> Send for NvramSpecServices<S>

§

impl<S> Sync for NvramSpecServices<S>

§

impl<S> Unpin for NvramSpecServices<S>
where S: Unpin,

§

impl<S> UnwindSafe for NvramSpecServices<S>
where S: UnwindSafe,

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.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more