diff --git a/lib/src/collateral/target_info.rs b/lib/src/collateral/target_info.rs index 449230e..138a3bf 100644 --- a/lib/src/collateral/target_info.rs +++ b/lib/src/collateral/target_info.rs @@ -6,7 +6,7 @@ use crate::Error; use crate::utils::Map; #[cfg(not(feature = "std"))] use alloc::string::String; -use serde::Deserialize; +use serde::{Deserialize, Deserializer}; /// Stores various product information #[derive(Debug, Deserialize)] @@ -19,14 +19,30 @@ pub struct TargetInfo { #[serde(default = "default_variant")] pub variant: String, /// Die IDs/names - #[serde(default)] - pub die_id: Map, + #[serde(default, deserialize_with = "deserialize_die_ids")] + pub die_id: Map, } fn default_variant() -> String { String::from("all") } +fn deserialize_die_ids<'de, D>(deserializer: D) -> Result, D::Error> +where + D: Deserializer<'de>, +{ + let map: Map = Deserialize::deserialize(deserializer)?; + Ok(map + .into_iter() + .filter_map(|(key, value)| { + key.parse::() + .inspect_err(|_| log::warn!("Invalid die ID value: {key}")) + .ok() + .map(|k| (k, value)) + }) + .collect()) +} + impl CollateralManager { pub(super) fn update_target_info(&mut self) -> Result<(), Error> { self.target_info.clear(); diff --git a/lib/src/header.rs b/lib/src/header.rs index d4f427d..cdf678d 100644 --- a/lib/src/header.rs +++ b/lib/src/header.rs @@ -302,7 +302,7 @@ impl Header { #[cfg(feature = "collateral_manager")] pub fn die<'a, T: CollateralTree>(&self, cm: &'a CollateralManager) -> Option<&'a str> { let target_info = cm.target_info.get(&self.product_id())?; - let die_id = target_info.die_id.get(&self.die_id()?.to_string())?; + let die_id = target_info.die_id.get(&self.die_id()?)?; Some(die_id) } diff --git a/lib/tests/header.rs b/lib/tests/header.rs index 715595f..7263ad3 100644 --- a/lib/tests/header.rs +++ b/lib/tests/header.rs @@ -2,6 +2,7 @@ // SPDX-License-Identifier: MIT use intel_crashlog::prelude::*; +use std::fs; use std::path::Path; const COLLATERAL_TREE_PATH: &str = "tests/collateral"; @@ -56,3 +57,17 @@ fn decode_header_to_node() { NodeType::Field { value: 0x7a } ); } + +#[test] +fn decode_die_id_header() { + let cm = CollateralManager::file_system_tree(Path::new(COLLATERAL_TREE_PATH)).unwrap(); + + let data = fs::read("tests/samples/dummy_mca_rev2.crashlog").unwrap(); + let header = Header::from_slice(&data).unwrap().unwrap(); + + let die_id = header.die_id().unwrap(); + assert_eq!(die_id, 1); + + let die = header.die(&cm).unwrap(); + assert_eq!(die, "io1"); +}