Skip to content

Commit fbf375c

Browse files
committed
--meinfo: Allow parsing smbios dump
Example: ``` > framework_tool --meinfo framework_lib/test_bins/marigold-smbios.bin Intel ME Version (from SMBIOS Type 0xDD) Firmware Version: 18.0.15.2518 ME Family: CSME 18+ Intel ME Status (SMBIOS Type 0xDB) Working State: Normal Operation Mode: Normal Bootguard: Enabled: Yes ACM Active: Yes ACM Done: Yes FPF SOC Lock: No ``` Signed-off-by: Daniel Schaefer <dhs@frame.work>
1 parent c6f43cc commit fbf375c

File tree

3 files changed

+36
-22
lines changed

3 files changed

+36
-22
lines changed

framework_lib/src/commandline/clap_std.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,10 @@ struct ClapCli {
8282
#[arg(long)]
8383
info: bool,
8484

85-
/// Show Intel ME information (from SMBIOS type 0xDB)
85+
/// Show Intel ME information (from SMBIOS type 0xDB).
86+
/// Optionally provide a dmidecode binary dump file path.
8687
#[arg(long)]
87-
meinfo: bool,
88+
meinfo: Option<Option<String>>,
8889

8990
/// Show details about the PD controllers
9091
#[arg(long)]

framework_lib/src/commandline/mod.rs

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ pub struct Cli {
222222
pub pd_ports: Option<(u8, u8, u8)>,
223223
pub help: bool,
224224
pub info: bool,
225-
pub meinfo: bool,
225+
pub meinfo: Option<Option<String>>,
226226
pub flash_gpu_descriptor: Option<(u8, String)>,
227227
pub flash_gpu_descriptor_file: Option<String>,
228228
pub dump_gpu_descriptor_file: Option<String>,
@@ -1531,9 +1531,9 @@ pub fn run_with_args(args: &Cli, _allupdate: bool) -> i32 {
15311531
power::get_and_print_pd_info(&ec);
15321532
} else if args.info {
15331533
smbios_info();
1534-
} else if args.meinfo {
1534+
} else if let Some(dump_path) = &args.meinfo {
15351535
let verbose = args.verbosity.0 >= log::LevelFilter::Warn;
1536-
me_info(verbose);
1536+
me_info(verbose, dump_path.as_deref());
15371537
} else if args.pd_info {
15381538
print_pd_details(&ec);
15391539
} else if let Some(pd) = args.pd_reset {
@@ -2136,8 +2136,18 @@ fn smbios_info() {
21362136
}
21372137
}
21382138

2139-
fn me_info(verbose: bool) {
2140-
let smbios = get_smbios();
2139+
fn me_info(verbose: bool, dump_path: Option<&str>) {
2140+
let smbios = if let Some(path) = dump_path {
2141+
match std::fs::read(path) {
2142+
Ok(data) => Some(smbioslib::SMBiosData::from_vec_and_version(data, None)),
2143+
Err(e) => {
2144+
error!("Failed to read SMBIOS dump file '{}': {}", path, e);
2145+
return;
2146+
}
2147+
}
2148+
} else {
2149+
get_smbios()
2150+
};
21412151
if smbios.is_none() {
21422152
error!("Failed to get SMBIOS data");
21432153
return;
@@ -2147,20 +2157,23 @@ fn me_info(verbose: bool) {
21472157
// Track ME family for bootguard parsing
21482158
let mut me_family: Option<csme::MeFamily> = None;
21492159

2150-
// Try to get ME version from sysfs first (Linux only)
2160+
// Try to get ME version from sysfs first (Linux only, live system only)
21512161
#[cfg(target_os = "linux")]
2152-
if let Ok(csme_info) = csme::csme_from_sysfs() {
2153-
println!("Intel ME Information (from sysfs)");
2154-
println!(" Enabled: {}", csme_info.enabled);
2155-
println!(" Firmware Version: {}", csme_info.main_ver);
2156-
if csme_info.main_ver != csme_info.recovery_ver || csme_info.main_ver != csme_info.fitc_ver
2157-
{
2158-
println!(" Recovery Version: {}", csme_info.recovery_ver);
2159-
println!(" FITC Version: {}", csme_info.fitc_ver);
2160-
}
2161-
let family = csme::MeFamily::from_version(csme_info.main_ver.major);
2162-
println!(" ME Family: {}", family);
2163-
me_family = Some(family);
2162+
if dump_path.is_none() {
2163+
if let Ok(csme_info) = csme::csme_from_sysfs() {
2164+
println!("Intel ME Information (from sysfs)");
2165+
println!(" Enabled: {}", csme_info.enabled);
2166+
println!(" Firmware Version: {}", csme_info.main_ver);
2167+
if csme_info.main_ver != csme_info.recovery_ver
2168+
|| csme_info.main_ver != csme_info.fitc_ver
2169+
{
2170+
println!(" Recovery Version: {}", csme_info.recovery_ver);
2171+
println!(" FITC Version: {}", csme_info.fitc_ver);
2172+
}
2173+
let family = csme::MeFamily::from_version(csme_info.main_ver.major);
2174+
println!(" ME Family: {}", family);
2175+
me_family = Some(family);
2176+
}
21642177
}
21652178

21662179
// Get ME version from SMBIOS type 0xDD (FVI)

framework_lib/src/commandline/uefi.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ pub fn parse(args: &[String]) -> Cli {
9696
dump_gpu_descriptor_file: None,
9797
allupdate: false,
9898
info: false,
99-
meinfo: false,
99+
meinfo: None,
100100
nvidia: false,
101101
raw_command: vec![],
102102
};
@@ -225,7 +225,7 @@ pub fn parse(args: &[String]) -> Cli {
225225
cli.info = true;
226226
found_an_option = true;
227227
} else if arg == "--meinfo" {
228-
cli.meinfo = true;
228+
cli.meinfo = Some(String::new());
229229
found_an_option = true;
230230
} else if arg == "--intrusion" {
231231
cli.intrusion = true;

0 commit comments

Comments
 (0)