report_regions/
report_regions.rs1use std::{env, fs, process};
4
5use intelflash::{RegionKind, Rom};
6
7fn main() {
8 let file = if let Some(file) = env::args().nth(1) {
9 file
10 } else {
11 eprintln!("used_regions <file>");
12 process::exit(1);
13 };
14
15 let data = fs::read(file).unwrap();
16
17 let flash_region = Rom::new(&data).unwrap().flash_region().unwrap();
19
20 let region_area = |flreg: u32| -> (u32, u32) {
23 let base = (flreg & 0x7FFF) << 12;
24 let limit = ((flreg & (0x7FFF << 16)) >> 4) | 0xFFF;
25 (base, limit)
26 };
27
28 let print_region_info = |region: RegionKind| {
31 let reg = flash_region.data[region as usize];
32 let (base, limit) = region_area(reg);
33 let unused = if (base == 0x07FF_F000) && (limit == 0xFFF) {
34 " (unused)"
35 } else {
36 ""
37 };
38 println!(" {}: {}", region as usize, region);
39 println!(" ({:#010X} - {:#010X}){}", base, limit, unused);
40 };
41
42 println!("Flash Regions");
43 print_region_info(RegionKind::Descriptor);
44 print_region_info(RegionKind::Bios);
45 print_region_info(RegionKind::ManagementEngine);
46 print_region_info(RegionKind::Ethernet);
47 print_region_info(RegionKind::PlatformData);
48 print_region_info(RegionKind::EmbeddedController);
49}