(verbose: bool, dump_path: Option<&str>)
| 2334 | } |
| 2335 | |
| 2336 | fn me_info(verbose: bool, dump_path: Option<&str>) { |
| 2337 | let smbios = if let Some(path) = dump_path { |
| 2338 | #[cfg(feature = "uefi")] |
| 2339 | let data: Option<Vec<u8>> = crate::fw_uefi::fs::shell_read_file(path); |
| 2340 | #[cfg(not(feature = "uefi"))] |
| 2341 | let data = match std::fs::read(path) { |
| 2342 | Ok(data) => Some(data), |
| 2343 | Err(e) => { |
| 2344 | error!("Failed to read SMBIOS dump file '{}': {}", path, e); |
| 2345 | None |
| 2346 | } |
| 2347 | }; |
| 2348 | data.and_then(|d| smbios::SmbiosStore::from_table_data(d, 3, 0)) |
| 2349 | } else { |
| 2350 | get_smbios() |
| 2351 | }; |
| 2352 | if smbios.is_none() { |
| 2353 | error!("Failed to get SMBIOS data"); |
| 2354 | return; |
| 2355 | } |
| 2356 | let smbios = smbios.unwrap(); |
| 2357 | |
| 2358 | // Track ME family for bootguard parsing |
| 2359 | let mut me_family: Option<csme::MeFamily> = None; |
| 2360 | |
| 2361 | // Try to get ME version from sysfs first (Linux only, live system only) |
| 2362 | #[cfg(target_os = "linux")] |
| 2363 | if dump_path.is_none() { |
| 2364 | if let Ok(csme_info) = csme::csme_from_sysfs() { |
| 2365 | println!("Intel ME Information (from sysfs)"); |
| 2366 | println!(" Enabled: {}", csme_info.enabled); |
| 2367 | println!(" Firmware Version: {}", csme_info.main_ver); |
| 2368 | if csme_info.main_ver != csme_info.recovery_ver |
| 2369 | || csme_info.main_ver != csme_info.fitc_ver |
| 2370 | { |
| 2371 | println!(" Recovery Version: {}", csme_info.recovery_ver); |
| 2372 | println!(" FITC Version: {}", csme_info.fitc_ver); |
| 2373 | } |
| 2374 | let family = csme::MeFamily::from_version(csme_info.main_ver.major); |
| 2375 | println!(" ME Family: {}", family); |
| 2376 | me_family = Some(family); |
| 2377 | } |
| 2378 | } |
| 2379 | |
| 2380 | // Get ME version from SMBIOS type 0xDD (FVI) |
| 2381 | let smbios_version = csme::me_version_from_smbios(&smbios); |
| 2382 | if let Some(ref fvi_version) = smbios_version { |
| 2383 | // If sysfs wasn't available, use SMBIOS version as primary |
| 2384 | if me_family.is_none() { |
| 2385 | println!("Intel ME Version (from SMBIOS Type 0xDD)"); |
| 2386 | println!(" Firmware Version: {}", fvi_version); |
| 2387 | let family = csme::MeFamily::from_version(fvi_version.major as u32); |
| 2388 | println!(" ME Family: {}", family); |
| 2389 | me_family = Some(family); |
| 2390 | } else if verbose { |
| 2391 | // In verbose mode, also show SMBIOS version for comparison |
| 2392 | println!("Intel ME Version (from SMBIOS Type 0xDD)"); |
| 2393 | println!(" Firmware Version: {}", fvi_version); |
no test coverage detected