cbfstool: Make update-fit action work on new-style images

Because new images place the bootblock in a separate region from the
primary CBFS, performing an update-fit operation requires reading an
additional section and choosing a different destination for the write
based on the image type. Since other actions are not affected by these
requirements, the logic for the optional read and all writing is
implemented in the cbfs_update_fit() function itself, rather than
relying on the main() function for writing as the other actions do.

Change-Id: I2024c59715120ecc3b9b158e007ebce75acff023
Signed-off-by: Sol Boucher <solb@chromium.org>
Reviewed-on: http://review.coreboot.org/10137
Tested-by: build bot (Jenkins)
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
This commit is contained in:
Sol Boucher
2015-05-06 14:44:40 -07:00
committed by Stefan Reinauer
parent 8307050412
commit 32532ac92d
3 changed files with 65 additions and 29 deletions

View File

@@ -33,6 +33,8 @@
#include "fit.h"
#include "partitioned_file.h"
#define SECTION_WITH_FIT_TABLE "BOOTBLOCK"
struct command {
const char *name;
const char *optstring;
@@ -677,12 +679,29 @@ static int cbfs_update_fit(void)
return 1;
}
// Decide which region to read/write the FIT table from/to.
struct buffer bootblock;
if (partitioned_file_is_partitioned(param.image_file)) {
if (!partitioned_file_read_region(&bootblock, param.image_file,
SECTION_WITH_FIT_TABLE))
return 1;
} else {
// In legacy images, the bootblock is part of the CBFS.
buffer_clone(&bootblock, param.image_region);
}
struct cbfs_image image;
if (cbfs_image_from_buffer(&image, param.image_region,
param.headeroffset))
return 1;
return fit_update_table(&image, param.fit_empty_entries, param.name);
if (fit_update_table(&bootblock, &image, param.name,
param.fit_empty_entries, convert_to_from_top_aligned))
return 1;
// The region to be written depends on the type of image, so we write it
// here rather than having main() write the CBFS region back as usual.
return !partitioned_file_write_region(param.image_file, &bootblock);
}
static int cbfs_copy(void)
@@ -731,7 +750,7 @@ static const struct command commands[] = {
{"print", "H:r:vh?", cbfs_print, true, false},
{"read", "r:f:vh?", cbfs_read, true, false},
{"remove", "H:r:n:vh?", cbfs_remove, true, true},
{"update-fit", "H:r:n:x:vh?", cbfs_update_fit, true, true},
{"update-fit", "H:r:n:x:vh?", cbfs_update_fit, true, false},
{"write", "r:f:udvh?", cbfs_write, true, true},
};