Skip to content

Commit b4c9a82

Browse files
authored
Merge pull request #1256 from rust-osdev/bishop-more-runtime
runtime: Add query_variable_info
2 parents 54f7fa2 + 441dfd0 commit b4c9a82

File tree

2 files changed

+46
-16
lines changed

2 files changed

+46
-16
lines changed

uefi-test-runner/src/runtime/vars.rs

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -117,20 +117,15 @@ fn test_variables_freestanding() {
117117
}
118118

119119
fn test_variable_info(rt: &RuntimeServices) {
120-
info!(
121-
"Storage for non-volatile boot-services variables: {:?}",
122-
rt.query_variable_info(
123-
VariableAttributes::BOOTSERVICE_ACCESS | VariableAttributes::NON_VOLATILE
124-
)
125-
.unwrap(),
126-
);
127-
info!(
128-
"Storage for volatile runtime variables: {:?}",
129-
rt.query_variable_info(
130-
VariableAttributes::BOOTSERVICE_ACCESS | VariableAttributes::RUNTIME_ACCESS
131-
)
132-
.unwrap(),
133-
);
120+
let attr = VariableAttributes::BOOTSERVICE_ACCESS | VariableAttributes::NON_VOLATILE;
121+
let info = rt.query_variable_info(attr).unwrap();
122+
info!("Storage for non-volatile boot-services variables: {info:?}");
123+
assert_eq!(info, runtime::query_variable_info(attr).unwrap());
124+
125+
let attr = VariableAttributes::BOOTSERVICE_ACCESS | VariableAttributes::RUNTIME_ACCESS;
126+
let info = rt.query_variable_info(attr).unwrap();
127+
info!("Storage for volatile runtime variables: {info:?}");
128+
assert_eq!(info, runtime::query_variable_info(attr).unwrap());
134129
}
135130

136131
pub fn test(rt: &RuntimeServices) {

uefi/src/runtime.rs

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
//! functions after exiting boot services; see the "Calling Convention" section
66
//! of the UEFI specification for details.
77
8-
use crate::{table, CStr16, Error, Result, Status, StatusExt};
8+
use crate::table::{self, Revision};
9+
use crate::{CStr16, Error, Result, Status, StatusExt};
910
use core::mem;
1011
use core::ptr::{self, NonNull};
1112

@@ -17,7 +18,9 @@ use {
1718
#[cfg(all(feature = "unstable", feature = "alloc"))]
1819
use alloc::alloc::Global;
1920

20-
pub use crate::table::runtime::{Daylight, Time, TimeCapabilities, TimeError, TimeParams};
21+
pub use crate::table::runtime::{
22+
Daylight, Time, TimeCapabilities, TimeError, TimeParams, VariableStorageInfo,
23+
};
2124
pub use uefi_raw::capsule::{CapsuleBlockDescriptor, CapsuleFlags, CapsuleHeader};
2225
pub use uefi_raw::table::runtime::{ResetType, VariableAttributes, VariableVendor};
2326

@@ -343,3 +346,35 @@ pub fn set_variable(
343346
pub fn delete_variable(name: &CStr16, vendor: &VariableVendor) -> Result {
344347
set_variable(name, vendor, VariableAttributes::empty(), &[])
345348
}
349+
350+
/// Get information about UEFI variable storage space for the type
351+
/// of variable specified in `attributes`.
352+
///
353+
/// This operation is only supported starting with UEFI 2.0.
354+
///
355+
/// See [`VariableStorageInfo`] for details of the information returned.
356+
///
357+
/// # Errors
358+
///
359+
/// * [`Status::INVALID_PARAMETER`]: invalid combination of variable attributes.
360+
/// * [`Status::UNSUPPORTED`]: the combination of variable attributes is not
361+
/// supported on this platform, or the UEFI version is less than 2.0.
362+
pub fn query_variable_info(attributes: VariableAttributes) -> Result<VariableStorageInfo> {
363+
let rt = runtime_services_raw_panicking();
364+
let rt = unsafe { rt.as_ref() };
365+
366+
if rt.header.revision < Revision::EFI_2_00 {
367+
return Err(Status::UNSUPPORTED.into());
368+
}
369+
370+
let mut info = VariableStorageInfo::default();
371+
unsafe {
372+
(rt.query_variable_info)(
373+
attributes,
374+
&mut info.maximum_variable_storage_size,
375+
&mut info.remaining_variable_storage_size,
376+
&mut info.maximum_variable_size,
377+
)
378+
.to_result_with_val(|| info)
379+
}
380+
}

0 commit comments

Comments
 (0)