From 940f05189c25bb4de6e35a91c77dd765e9352c24 Mon Sep 17 00:00:00 2001 From: Tim Crawford Date: Wed, 2 Sep 2026 17:16:28 -0600 Subject: [PATCH] Move HiiStringProtocol from fde to hii Also complete the interface definitions, adding the required HII Font structs. Signed-off-by: Tim Crawford --- Cargo.lock | 1 + Cargo.toml | 1 + src/fde.rs | 62 +------------------------ src/hii/font.rs | 31 +++++++++++++ src/{hii.rs => hii/mod.rs} | 3 ++ src/hii/string.rs | 95 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 133 insertions(+), 60 deletions(-) create mode 100644 src/hii/font.rs rename src/{hii.rs => hii/mod.rs} (92%) create mode 100644 src/hii/string.rs diff --git a/Cargo.lock b/Cargo.lock index b4957e3..395b06e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -162,6 +162,7 @@ dependencies = [ name = "system76_firmware_setup" version = "1.0.0" dependencies = [ + "bitflags", "orbclient", "orbfont", "redox_uefi_std", diff --git a/Cargo.toml b/Cargo.toml index 24d7bea..ab083db 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,6 +8,7 @@ license = "GPL-3.0-only" lto = true [dependencies] +bitflags = "2.13" orbclient = { version = "=0.3.51", default-features = false } orbfont = { version = "0.1.12", default-features = false, features = ["no-std"] } redox_uefi_std = "0.1.14" diff --git a/src/fde.rs b/src/fde.rs index 7a927ef..0f21caf 100644 --- a/src/fde.rs +++ b/src/fde.rs @@ -3,7 +3,7 @@ #![allow(clippy::collapsible_if)] #![allow(clippy::collapsible_match)] -use core::{char, cmp, mem, ptr, slice}; +use core::{cmp, mem, ptr, slice}; use orbclient::{Color, Renderer}; use orbfont::Text; use std::ffi; @@ -18,68 +18,10 @@ use std::uefi::hii::{AnimationId, ImageId, StringId}; use std::uefi::text::TextInputKey; use crate::display::{Display, Output}; +use crate::hii::string::HiiStringProtocol; use crate::key::{Key, raw_key}; use crate::ui::Ui; -// TODO: Move to uefi library { -pub const HII_STRING_PROTOCOL_GUID: Guid = guid!("0fd96974-23aa-4cdc-b9cb-98d17750322a"); - -#[repr(C)] -pub struct HiiStringProtocol { - pub NewString: extern "efiapi" fn(), //TODO - pub GetString: extern "efiapi" fn( - &HiiStringProtocol, - Language: *const u8, - PackageList: HiiHandle, - StringId: StringId, - String: *mut u16, - StringSize: &mut usize, - StringFontInfo: usize, // TODO - ) -> Status, - pub SetString: extern "efiapi" fn(), //TODO - pub GetLanguages: extern "efiapi" fn(), //TODO - pub GetSecondaryLanguages: extern "efiapi" fn(), //TODO -} - -impl HiiStringProtocol { - pub fn string(&self, PackageList: HiiHandle, StringId: StringId) -> Result { - let mut data = vec![0u16; 4096]; - let mut len = data.len(); - Result::from((self.GetString)( - self, - c"en-US".as_ptr() as *const u8, - PackageList, - StringId, - data.as_mut_ptr(), - &mut len, - 0, - ))?; - data.truncate(len); - - let mut string = String::new(); - for &w in data.iter() { - if w == 0 { - break; - } - let c = unsafe { char::from_u32_unchecked(w as u32) }; - string.push(c); - } - Ok(string) - } -} - -impl Protocol for &'static mut HiiStringProtocol { - fn guid() -> Guid { - HII_STRING_PROTOCOL_GUID - } - - fn new(inner: &'static mut HiiStringProtocol) -> Self { - inner - } -} - -// } TODO: Move to uefi library - // TODO: move to uefi library { #[repr(C)] pub struct ListEntry { diff --git a/src/hii/font.rs b/src/hii/font.rs new file mode 100644 index 0000000..b0ceab8 --- /dev/null +++ b/src/hii/font.rs @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: GPL-3.0-only + +// TODO: Move to uefi library + +bitflags::bitflags! { + /// `EFI_HII_FONT_STYLE` + #[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)] + #[repr(transparent)] + pub struct HiiFontStyle: u32 { + const BOLD = 1 << 0; + const ITALIC = 1 << 1; + const EMBOSS = 1 << 16; + const OUTLINE = 1 << 17; + const SHADOW = 1 << 18; + const UNDERLINE = 1 << 19; + const DBL_UNDER = 1 << 20; + } +} + +impl HiiFontStyle { + pub const NORMAL: Self = Self::empty(); +} + +/// `EFI_FONT_INFO` +#[repr(C)] +#[derive(Debug)] +pub struct FontInfo { + pub font_style: HiiFontStyle, + pub font_size: u16, + pub font_name: [u16; 0], +} diff --git a/src/hii.rs b/src/hii/mod.rs similarity index 92% rename from src/hii.rs rename to src/hii/mod.rs index 076d1e1..8abc6f2 100644 --- a/src/hii.rs +++ b/src/hii/mod.rs @@ -1,5 +1,8 @@ // SPDX-License-Identifier: GPL-3.0-only +pub mod font; +pub mod string; + use std::prelude::*; use std::proto::Protocol; use std::uefi::hii::database::HiiDatabase; diff --git a/src/hii/string.rs b/src/hii/string.rs new file mode 100644 index 0000000..715e233 --- /dev/null +++ b/src/hii/string.rs @@ -0,0 +1,95 @@ +// SPDX-License-Identifier: GPL-3.0-only + +// TODO: Move to uefi library + +use super::font::FontInfo; +use std::prelude::*; +use std::proto::Protocol; +use std::uefi::hii::StringId; +use std::uefi::hii::database::HiiHandle; + +/// `EFI_HII_STRING_PROTOCOL` +#[repr(C)] +#[derive(Debug)] +pub struct HiiStringProtocol { + pub new_string: unsafe extern "efiapi" fn( + this: *const Self, + package_list: HiiHandle, + string_id: *mut StringId, + language: *const u8, + language_name: *const u16, + string: *const u16, + string_font_info: *const FontInfo, + ) -> Status, + pub get_string: unsafe extern "efiapi" fn( + this: *const Self, + language: *const u8, + package_list: HiiHandle, + string_id: StringId, + string: *mut u16, + string_size: *mut usize, + string_font_info: *mut *mut FontInfo, + ) -> Status, + pub set_string: unsafe extern "efiapi" fn( + this: *const Self, + package_list: HiiHandle, + string_id: StringId, + language: *const u8, + string: *const u16, + string_font_info: *const FontInfo, + ) -> Status, + pub get_languages: unsafe extern "efiapi" fn( + this: *const Self, + package_list: HiiHandle, + languages: *mut u8, + languages_size: *mut usize, + ) -> Status, + pub get_secondary_languages: unsafe extern "efiapi" fn( + this: *const Self, + package_list: HiiHandle, + primary_language: *const u8, + secondary_languages: *mut u8, + secondary_languages_size: *mut usize, + ) -> Status, +} + +impl HiiStringProtocol { + pub const GUID: Guid = guid!("0fd96974-23aa-4cdc-b9cb-98d17750322a"); + + pub fn string(&self, package_list: HiiHandle, string_id: StringId) -> Result { + let mut data = vec![0u16; 4096]; + let mut len = data.len(); + unsafe { + Result::from((self.get_string)( + self, + c"en-US".as_ptr() as *const u8, + package_list, + string_id, + data.as_mut_ptr(), + &mut len, + core::ptr::null_mut(), + ))?; + } + data.truncate(len); + + let mut string = String::new(); + for &w in data.iter() { + if w == 0 { + break; + } + let c = unsafe { core::char::from_u32_unchecked(w as u32) }; + string.push(c); + } + Ok(string) + } +} + +impl Protocol for &'static mut HiiStringProtocol { + fn guid() -> Guid { + HiiStringProtocol::GUID + } + + fn new(inner: &'static mut HiiStringProtocol) -> Self { + inner + } +}