Skip to main content

report_regions/
report_regions.rs

1// SPDX-License-Identifier: MIT
2
3use 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    // Get the Flash Descriptor Region Section
18    let flash_region = Rom::new(&data).unwrap().flash_region().unwrap();
19
20    // Determine a regions base and limit addresses from the Flash
21    // Region Record that corresponds to it.
22    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    // Print a regions index and name, along with it's base and limit
29    // addresses. Explicitly mark unused regions as such.
30    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}