| 124 | } |
| 125 | |
| 126 | fn load_chip(def: &'static ChipDef) -> Result<ChipDatabase, LoadError> { |
| 127 | let path = Path::new(KPEP_DIR).join(format!("{}.plist", def.plist_name)); |
| 128 | |
| 129 | let root: PlistRoot = plist::from_file(&path).map_err(|error| LoadError { path, error })?; |
| 130 | |
| 131 | let cpu = root.system.cpu; |
| 132 | |
| 133 | let mut reverse_aliases: BTreeMap<String, Vec<String>> = BTreeMap::new(); |
| 134 | for (alias, event_name) in cpu.aliases { |
| 135 | reverse_aliases.entry(event_name).or_default().push(alias); |
| 136 | } |
| 137 | |
| 138 | let mut events: Vec<EventData> = cpu |
| 139 | .events |
| 140 | .into_iter() |
| 141 | .map(|(name, raw)| { |
| 142 | let aliases = reverse_aliases.remove(&name).unwrap_or_default(); |
| 143 | EventData { |
| 144 | name, |
| 145 | description: raw.description.unwrap_or_default(), |
| 146 | counters_mask: raw.counters_mask, |
| 147 | number: raw.number, |
| 148 | fixed_counter: raw.fixed_counter, |
| 149 | fallback: raw.fallback, |
| 150 | aliases, |
| 151 | } |
| 152 | }) |
| 153 | .collect(); |
| 154 | |
| 155 | events.sort_by(|left, right| left.name.cmp(&right.name)); |
| 156 | |
| 157 | Ok(ChipDatabase { |
| 158 | def, |
| 159 | marketing_name: cpu.marketing_name, |
| 160 | fixed_counters: cpu.fixed_counters, |
| 161 | config_counters: cpu.config_counters, |
| 162 | power_counters: cpu.power_counters, |
| 163 | events, |
| 164 | }) |
| 165 | } |