Struct firmware_uefi::service::nvram::spec_services::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>
impl<S: InspectableNvramStorage> NvramSpecServices<S>
sourcepub fn new(storage: S) -> NvramSpecServices<S>
pub fn new(storage: S) -> NvramSpecServices<S>
Construct a new NvramServices instance from an existing storage backend.
sourcepub async fn is_empty(&mut self) -> Result<bool, NvramStorageError>
pub async fn is_empty(&mut self) -> Result<bool, NvramStorageError>
Check if the nvram store is empty.
sourcepub async fn update_setup_mode(&mut self) -> Result<(), NvramStorageError>
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.
sourcepub fn exit_boot_services(&mut self)
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).
sourcepub fn prepare_for_boot(&mut self)
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.
sourcepub 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>>>
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 anullptr
)
- (In) Variable name (a null-terminated UTF-16 string, or
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
istrue
, andin_out_data_size
is set to0
,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
- (In) bool indicating if guest passed
sourcepub 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<()>
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 anullptr
) - Note:
name
must contain one or more character.
- (In) Variable name (a null-terminated UTF-16 string, or
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 anullptr
)
- (In) Variable data (or
sourcepub async fn uefi_get_next_variable(
&mut self,
in_out_name_size: &mut u32,
name: Option<&[u8]>,
vendor: Guid,
) -> NvramResult<Option<(Vec<u8>, Guid)>>
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 anullptr
)
- (In) Variable name (a null-terminated UTF-16 string, or
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.
- (In) Length of the provided
vendor
- (In) Variable vendor guid
Trait Implementations§
source§impl<S: Debug + InspectableNvramStorage> Debug for NvramSpecServices<S>
impl<S: Debug + InspectableNvramStorage> Debug for NvramSpecServices<S>
source§impl<S: InspectableNvramStorage> Inspect for NvramSpecServices<S>
impl<S: InspectableNvramStorage> Inspect for NvramSpecServices<S>
source§impl<S: InspectableNvramStorage> NvramServicesExt for NvramSpecServices<S>
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,
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,
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,
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,
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,
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,
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,
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,
name
(as a UCS-2 string) + vendor
with
the specified attr
and data
.source§impl<S: InspectableNvramStorage> SaveRestore for NvramSpecServices<S>
impl<S: InspectableNvramStorage> SaveRestore for NvramSpecServices<S>
source§type SavedState = SavedState
type SavedState = SavedState
source§fn restore(&mut self, state: Self::SavedState) -> Result<(), RestoreError>
fn restore(&mut self, state: Self::SavedState) -> Result<(), RestoreError>
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> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self
, then passes self.as_ref()
into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self
, then passes self.as_mut()
into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow()
only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref()
only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.