Skip to content

Commit e679734

Browse files
committed
Improve dump subcommand.
Fixes <#160>.
1 parent c919b79 commit e679734

File tree

2 files changed

+67
-20
lines changed

2 files changed

+67
-20
lines changed

Cargo.lock

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/main.rs

Lines changed: 63 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use std::cmp::min;
1919
use std::collections::HashSet;
2020
use std::fs;
2121
use std::fs::File;
22+
use std::io::stdout;
2223
use std::io::BufReader;
2324
use std::io::Read;
2425
use std::io::Seek;
@@ -653,6 +654,11 @@ fn dump_bhd_directory<'a, T: FlashRead + FlashWrite>(
653654
.map_while(|entry| {
654655
let entry = entry.clone();
655656
if let Ok(typ) = entry.typ_or_err() {
657+
if typ == BhdDirectoryEntryType::Apob {
658+
// Since this is a runtime value we cannot read it
659+
// from the image.
660+
return None;
661+
}
656662
let payload_beginning =
657663
bhd_directory.payload_beginning(&entry).unwrap();
658664
let size = entry.size().unwrap() as usize;
@@ -727,6 +733,7 @@ fn dump_bhd_directory<'a, T: FlashRead + FlashWrite>(
727733
fn dump(
728734
image_filename: &Path,
729735
blob_dump_dirname: Option<PathBuf>,
736+
output_config_file: &mut impl std::io::Write,
730737
) -> std::io::Result<()> {
731738
let filename = image_filename;
732739
let storage = FlashImage::load(filename)?;
@@ -735,25 +742,40 @@ fn dump(
735742
if filesize <= 0x100_0000 { Some(filesize as u32) } else { None };
736743
let efs = Efs::load(&storage, None, amd_physical_mode_mmio_size).unwrap();
737744
if !efs.compatible_with_processor_generation(ProcessorGeneration::Milan) {
738-
panic!("only Milan is supported for dumping right now");
745+
if !efs.compatible_with_processor_generation(ProcessorGeneration::Rome)
746+
{
747+
panic!("only Milan or Rome is supported for dumping right now");
748+
}
739749
}
740750
let mut apcb_buffer = [0xFFu8; Apcb::MAX_SIZE];
741751
let mut apcb_buffer_option = Some(&mut apcb_buffer[..]);
752+
let processor_generation = if efs
753+
.compatible_with_processor_generation(ProcessorGeneration::Milan)
754+
{
755+
ProcessorGeneration::Milan
756+
} else {
757+
ProcessorGeneration::Rome
758+
};
742759
let config = SerdeConfig {
743-
processor_generation: ProcessorGeneration::Milan, // FIXME could be ambiguous
744-
spi_mode_bulldozer: efs.spi_mode_bulldozer().unwrap(),
745-
spi_mode_zen_naples: efs.spi_mode_zen_naples().unwrap(),
746-
spi_mode_zen_rome: efs.spi_mode_zen_rome().unwrap(),
760+
processor_generation,
761+
spi_mode_bulldozer: efs
762+
.spi_mode_bulldozer()
763+
.expect("Bulldozer SPI Mode"),
764+
spi_mode_zen_naples: efs
765+
.spi_mode_zen_naples()
766+
.expect("Naples SPI Mode"),
767+
spi_mode_zen_rome: efs.spi_mode_zen_rome().expect("Rome SPI Mode"),
747768
// TODO: psp_directory or psp_combo_directory
748769
psp: dump_psp_directory(
749770
&storage,
750-
&efs.psp_directory().unwrap(),
771+
&efs.psp_directory().expect("PSP directory"),
751772
&blob_dump_dirname,
752773
),
753774
// TODO: bhd_directory or bhd_combo_directory
754775
bhd: dump_bhd_directory(
755776
&storage,
756-
&efs.bhd_directory(None).unwrap(),
777+
&efs.bhd_directory(Some(processor_generation))
778+
.expect("BHD directory"),
757779
&mut apcb_buffer_option,
758780
&blob_dump_dirname,
759781
),
@@ -766,7 +788,11 @@ fn dump(
766788
let mut file = File::create(&path).expect("creation failed");
767789
writeln!(file, "{}", json5::to_string(&config).unwrap())?;
768790
} else {
769-
println!("{}", serde_json::to_string_pretty(&config)?);
791+
writeln!(
792+
output_config_file,
793+
"{}",
794+
serde_json::to_string_pretty(&config)?
795+
)?;
770796
}
771797
Ok(())
772798
}
@@ -1155,21 +1181,42 @@ fn run() -> std::io::Result<()> {
11551181
};
11561182
match opts {
11571183
Opts::Dump { input_filename, blob_dump_dirname } => {
1158-
dump(&input_filename, blob_dump_dirname)
1184+
dump(&input_filename, blob_dump_dirname, &mut stdout().lock())
11591185
}
11601186
Opts::Generate {
11611187
output_filename,
11621188
efs_configuration_filename,
11631189
reset_image_filename,
11641190
blobdirs,
11651191
verbose,
1166-
} => generate(
1167-
&output_filename,
1168-
&efs_configuration_filename,
1169-
&reset_image_filename,
1170-
blobdirs,
1171-
verbose,
1172-
),
1192+
} => {
1193+
let x = generate(
1194+
&output_filename,
1195+
&efs_configuration_filename,
1196+
&reset_image_filename,
1197+
blobdirs,
1198+
verbose,
1199+
);
1200+
1201+
// In order to make sure that we can dump it back out, try it.
1202+
struct DummyOutput {}
1203+
impl std::io::Write for DummyOutput {
1204+
fn write(
1205+
&mut self,
1206+
buf: &[u8],
1207+
) -> std::result::Result<usize, std::io::Error>
1208+
{
1209+
Ok(buf.len())
1210+
}
1211+
fn flush(&mut self) -> std::result::Result<(), std::io::Error> {
1212+
Ok(())
1213+
}
1214+
}
1215+
let mut dummy_output = DummyOutput {};
1216+
dump(&output_filename, None, &mut dummy_output)
1217+
.expect("read it back out from the image");
1218+
x
1219+
}
11731220
}
11741221
}
11751222

0 commit comments

Comments
 (0)