@@ -19,6 +19,7 @@ use std::cmp::min;
1919use std:: collections:: HashSet ;
2020use std:: fs;
2121use std:: fs:: File ;
22+ use std:: io:: stdout;
2223use std:: io:: BufReader ;
2324use std:: io:: Read ;
2425use 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>(
727733fn 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