Skip to content

Commit 144e2a9

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 144e2a9

File tree

3 files changed

+55
-0
lines changed

3 files changed

+55
-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: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
// SPDX-License-Identifier: MIT OR Apache-2.0
2+
3+
//! HII Database protocol.
4+
5+
use alloc::vec::Vec;
6+
use uefi_macros::unsafe_protocol;
7+
use uefi_raw::Status;
8+
use uefi_raw::protocol::hii::database::HiiDatabaseProtocol;
9+
10+
use crate::StatusExt;
11+
12+
/// The HII Configuration Access Protocol.
13+
///
14+
/// # UEFI Spec Description
15+
///
16+
/// Database manager for HII-related data structures.
17+
#[derive(Debug)]
18+
#[repr(transparent)]
19+
#[unsafe_protocol(HiiDatabaseProtocol::GUID)]
20+
pub struct HiiDatabase(HiiDatabaseProtocol);
21+
22+
impl HiiDatabase {
23+
/// Export all package lists as raw byte buffer.
24+
#[must_use]
25+
pub fn export_all_raw(&self) -> crate::Result<Vec<u8>> {
26+
// call the function with a buffer_size of 0 first, so it will fail with
27+
// BUFFER_TOO_SMALL to tell us what size is required.
28+
let mut buffer_size = 0;
29+
unsafe {
30+
let result = (self.0.export_package_lists)(
31+
&self.0,
32+
core::ptr::null_mut(),
33+
&mut buffer_size,
34+
core::ptr::null_mut(),
35+
);
36+
assert_eq!(result, Status::BUFFER_TOO_SMALL);
37+
}
38+
39+
// allocate buffer with the requested size and call the method again
40+
let mut buffer = Vec::with_capacity(buffer_size);
41+
buffer.resize(buffer_size, 0u8);
42+
unsafe {
43+
(self.0.export_package_lists)(
44+
&self.0,
45+
core::ptr::null_mut(),
46+
&mut buffer_size,
47+
buffer.as_mut_ptr().cast(),
48+
)
49+
.to_result_with_val(|| buffer)
50+
}
51+
}
52+
}

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)