Skip to content

Commit e721b59

Browse files
committed
Add (partial) safe protocol implementation for EFI_HII_DATABASE_PROTOCOL
This only grants access to the HII-database's raw buffer for now.
1 parent a4b852f commit e721b59

File tree

3 files changed

+46
-0
lines changed

3 files changed

+46
-0
lines changed

uefi/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
- Added `proto::hii::config::ConfigKeywordHandler`.
88
- Added `proto::hii::config::HiiConfigAccess`.
99
- Added `proto::hii::config_str::ConfigurationString`.
10+
- Added `proto::hii::database::HiiDatabase`.
1011

1112
## Changed
1213
- **Breaking:** `boot::stall` now take `core::time::Duration` instead of `usize`.

uefi/src/proto/hii/database.rs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// SPDX-License-Identifier: MIT OR Apache-2.0
2+
3+
//! HII Database protocol.
4+
5+
use alloc::boxed::Box;
6+
use uefi_macros::unsafe_protocol;
7+
use uefi_raw::protocol::hii::database::HiiDatabaseProtocol;
8+
9+
use crate::StatusExt;
10+
use crate::mem::make_boxed;
11+
12+
/// The HII Configuration Access Protocol.
13+
///
14+
/// This protocol grants access to the HII database definition available in every UEFI firmware.
15+
/// This database contains internationalized strings, as well as a description of all
16+
/// supported BIOS settings, together with their logic (e.g.: option A blocks option B if value is `true`).
17+
///
18+
/// # UEFI Spec Description
19+
///
20+
/// Database manager for HII-related data structures.
21+
#[derive(Debug)]
22+
#[repr(transparent)]
23+
#[unsafe_protocol(HiiDatabaseProtocol::GUID)]
24+
pub struct HiiDatabase(HiiDatabaseProtocol);
25+
26+
impl HiiDatabase {
27+
/// Export all package lists as raw byte buffer.
28+
pub fn export_all_raw<'a>(&self) -> crate::Result<Box<[u8]>> {
29+
let fetch_data_fn = |buf: &'a mut [u8]| unsafe {
30+
let mut size = buf.len();
31+
let status = {
32+
(self.0.export_package_lists)(
33+
&self.0,
34+
core::ptr::null_mut(),
35+
&mut size,
36+
buf.as_mut_ptr().cast(),
37+
)
38+
};
39+
status.to_result_with_err(|_| Some(size)).map(|_| buf)
40+
};
41+
make_boxed::<[u8], _>(fetch_data_fn)
42+
}
43+
}

uefi/src/proto/hii/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,5 @@
55
pub mod config;
66
#[cfg(feature = "alloc")]
77
pub mod config_str;
8+
#[cfg(feature = "alloc")]
9+
pub mod database;

0 commit comments

Comments
 (0)