From 503a9cba0abc29647e641a57530fb4198a707de4 Mon Sep 17 00:00:00 2001 From: Alex Zenla Date: Mon, 3 Nov 2025 23:45:35 -0500 Subject: [PATCH] chore(code): move load options parsing to crates/eficore --- Cargo.lock | 2 +- crates/boot/Cargo.toml | 1 - crates/boot/src/options.rs | 3 --- crates/boot/src/options/parser.rs | 10 +++---- crates/eficore/Cargo.toml | 1 + .../{boot/src/options => eficore/src}/env.rs | 26 +++++++++---------- crates/eficore/src/lib.rs | 2 ++ 7 files changed, 22 insertions(+), 23 deletions(-) rename crates/{boot/src/options => eficore/src}/env.rs (88%) diff --git a/Cargo.lock b/Cargo.lock index 9841cd4..93cd08e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -75,7 +75,6 @@ dependencies = [ "hex", "log", "sha2", - "shlex", "toml", "uefi", "uefi-raw", @@ -99,6 +98,7 @@ dependencies = [ "anyhow", "bitflags", "log", + "shlex", "spin", "uefi", "uefi-raw", diff --git a/crates/boot/Cargo.toml b/crates/boot/Cargo.toml index 7c2a24e..2f0c739 100644 --- a/crates/boot/Cargo.toml +++ b/crates/boot/Cargo.toml @@ -13,7 +13,6 @@ edera-sprout-config.path = "../config" edera-sprout-eficore.path = "../eficore" hex.workspace = true sha2.workspace = true -shlex.workspace = true toml.workspace = true log.workspace = true uefi.workspace = true diff --git a/crates/boot/src/options.rs b/crates/boot/src/options.rs index 718dd20..2331ac7 100644 --- a/crates/boot/src/options.rs +++ b/crates/boot/src/options.rs @@ -3,9 +3,6 @@ use alloc::collections::BTreeMap; use alloc::string::{String, ToString}; use anyhow::{Context, Result, bail}; -/// Acquire arguments from UEFI environment. -pub mod env; - /// The Sprout options parser. pub mod parser; diff --git a/crates/boot/src/options/parser.rs b/crates/boot/src/options/parser.rs index 4d07b5e..c8252fb 100644 --- a/crates/boot/src/options/parser.rs +++ b/crates/boot/src/options/parser.rs @@ -1,8 +1,8 @@ -use crate::options::env; use alloc::collections::BTreeMap; use alloc::string::{String, ToString}; use anyhow::{Context, Result, bail}; use core::ptr::null_mut; +use eficore::env; use log::info; use uefi_raw::Status; @@ -18,7 +18,7 @@ pub enum OptionForm { Help, } -/// The description of an option, used in the options parser +/// The description of an option, used in the option parser /// to make decisions about how to progress. #[derive(Debug, Clone)] pub struct OptionDescription<'a> { @@ -35,8 +35,8 @@ pub trait OptionsRepresentable { type Output; /// The configured options for this type. This should describe all the options - /// that are valid to produce the type. The left hand side is the name of the option, - /// and the right hand side is the description. + /// that are valid to produce the type. The left-hand side is the name of the option, + /// and the right-hand side is the description. fn options() -> &'static [(&'static str, OptionDescription<'static>)]; /// Produces the type by taking the `options` and processing it into the output. @@ -44,7 +44,7 @@ pub trait OptionsRepresentable { /// For minimalism, we don't want a full argument parser. Instead, we use /// a simple --xyz = xyz: None and --abc 123 = abc: Some("123") format. - /// We also support --abc=123 = abc: Some("123") format. + /// We also support the format: --abc=123 fn parse_raw() -> Result>> { // Access the configured options for this type. let configured: BTreeMap<_, _> = BTreeMap::from_iter(Self::options().to_vec()); diff --git a/crates/eficore/Cargo.toml b/crates/eficore/Cargo.toml index 6a6a89e..7898c91 100644 --- a/crates/eficore/Cargo.toml +++ b/crates/eficore/Cargo.toml @@ -11,6 +11,7 @@ edition.workspace = true anyhow.workspace = true bitflags.workspace = true log.workspace = true +shlex.workspace = true spin.workspace = true uefi.workspace = true uefi-raw.workspace = true diff --git a/crates/boot/src/options/env.rs b/crates/eficore/src/env.rs similarity index 88% rename from crates/boot/src/options/env.rs rename to crates/eficore/src/env.rs index 261e8cb..c4d1243 100644 --- a/crates/boot/src/options/env.rs +++ b/crates/eficore/src/env.rs @@ -3,14 +3,14 @@ use alloc::vec::Vec; use anyhow::{Context, Result, bail}; use uefi::proto::loaded_image::{LoadOptionsError, LoadedImage}; -/// Loads the command-line arguments passed to Sprout. +/// Loads the command-line arguments passed to the current image. pub fn args() -> Result> { - // Acquire the image handle of Sprout. + // Acquire the current image handle. let handle = uefi::boot::image_handle(); - // Open the LoadedImage protocol for Sprout. + // Open the LoadedImage protocol for the current image. let loaded_image = uefi::boot::open_protocol_exclusive::(handle) - .context("unable to open loaded image protocol for sprout")?; + .context("unable to open loaded image protocol for current image")?; // Load the command-line argument string. let options = match loaded_image.load_options_as_cstr16() { @@ -35,7 +35,7 @@ pub fn args() -> Result> { let options = options.to_string(); // Use shlex to parse the options. - // If shlex fails, we will fall back to a simple whitespace split. + // If shlex fails, we will perform a simple whitespace split. let mut args = shlex::split(&options).unwrap_or_else(|| { options .split_ascii_whitespace() @@ -43,14 +43,6 @@ pub fn args() -> Result> { .collect::>() }); - // If there is a first argument, check if it is not an option. - // If it is not, we will assume it is the path to the executable and remove it. - if let Some(arg) = args.first() - && !arg.starts_with('-') - { - args.remove(0); - } - // Correct firmware that may add invalid arguments at the start. // Witnessed this on a Dell Precision 5690 when direct booting. loop { @@ -73,5 +65,13 @@ pub fn args() -> Result> { break; } + // If there is a first argument, check if it is not an option. + // If it is not, we will assume it is the path to the executable and remove it. + if let Some(arg) = args.first() + && !arg.starts_with('-') + { + args.remove(0); + } + Ok(args) } diff --git a/crates/eficore/src/lib.rs b/crates/eficore/src/lib.rs index 36ae779..0488c78 100644 --- a/crates/eficore/src/lib.rs +++ b/crates/eficore/src/lib.rs @@ -29,6 +29,8 @@ pub mod strings; /// Implements support for the bootloader interface specification. pub mod bootloader_interface; +/// Acquire arguments from UEFI environment. +pub mod env; /// Support code for the EFI framebuffer. pub mod framebuffer; /// Support code for the media loader protocol.