cbfstool: prefer fmap data over cbfs master header if it exists

Up to now, if both fmap and a master header existed, the master header
was used. Now, use the master header only if no fmap is found.

Change-Id: Iafbf2c9dc325597e23a9780b495549b5d912e9ad
Signed-off-by: Patrick Georgi <pgeorgi@chromium.org>
Reviewed-on: http://review.coreboot.org/11629
Tested-by: build bot (Jenkins)
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
This commit is contained in:
Patrick Georgi 2015-09-11 18:34:39 +02:00 committed by Patrick Georgi
parent 6dd99fcafe
commit 2f953d304e
4 changed files with 14 additions and 46 deletions

View File

@ -343,20 +343,22 @@ int cbfs_image_from_buffer(struct cbfs_image *out, struct buffer *in,
buffer_clone(&out->buffer, in); buffer_clone(&out->buffer, in);
out->has_header = false; out->has_header = false;
if (cbfs_is_valid_cbfs(out)) {
return 0;
}
void *header_loc = cbfs_find_header(in->data, in->size, offset); void *header_loc = cbfs_find_header(in->data, in->size, offset);
if (header_loc) { if (header_loc) {
cbfs_get_header(&out->header, header_loc); cbfs_get_header(&out->header, header_loc);
out->has_header = true; out->has_header = true;
cbfs_fix_legacy_size(out, header_loc); cbfs_fix_legacy_size(out, header_loc);
return 0;
} else if (offset != ~0u) { } else if (offset != ~0u) {
ERROR("The -H switch is only valid on legacy images having CBFS master headers.\n"); ERROR("The -H switch is only valid on legacy images having CBFS master headers.\n");
return 1; return 1;
} else if (!cbfs_is_valid_cbfs(out)) {
ERROR("Selected image region is not a valid CBFS.\n");
return 1;
} }
ERROR("Selected image region is not a valid CBFS.\n");
return 0; return 1;
} }
int cbfs_copy_instance(struct cbfs_image *image, size_t copy_offset, int cbfs_copy_instance(struct cbfs_image *image, size_t copy_offset,

View File

@ -881,12 +881,6 @@ static int cbfs_copy(void)
return cbfs_copy_instance(&image, param.copyoffset, param.size); return cbfs_copy_instance(&image, param.copyoffset, param.size);
} }
static bool cbfs_is_legacy_format(struct buffer *buffer)
{
// Legacy CBFSes are those containing the deprecated CBFS master header.
return cbfs_find_header(buffer->data, buffer->size, -1);
}
static const struct command commands[] = { static const struct command commands[] = {
{"add", "H:r:f:n:t:c:b:a:vh?", cbfs_add, true, true}, {"add", "H:r:f:n:t:c:b:a:vh?", cbfs_add, true, true},
{"add-flat-binary", "H:r:f:n:l:e:c:b:vh?", cbfs_add_flat_binary, true, {"add-flat-binary", "H:r:f:n:l:e:c:b:vh?", cbfs_add_flat_binary, true,
@ -1250,8 +1244,7 @@ int main(int argc, char **argv)
} }
} else { } else {
param.image_file = param.image_file =
partitioned_file_reopen(image_name, partitioned_file_reopen(image_name);
cbfs_is_legacy_format);
} }
if (!param.image_file) if (!param.image_file)
return 1; return 1;

View File

@ -165,8 +165,7 @@ partitioned_file_t *partitioned_file_create(const char *filename,
return file; return file;
} }
partitioned_file_t *partitioned_file_reopen(const char *filename, partitioned_file_t *partitioned_file_reopen(const char *filename)
partitioned_file_flat_decider_t flat_override)
{ {
assert(filename); assert(filename);
@ -174,11 +173,6 @@ partitioned_file_t *partitioned_file_reopen(const char *filename,
if (!file) if (!file)
return NULL; return NULL;
if (flat_override && flat_override(&file->buffer)) {
INFO("Opening image as a flat file in response to explicit request\n");
return file;
}
long fmap_region_offset = fmap_find((const uint8_t *)file->buffer.data, long fmap_region_offset = fmap_find((const uint8_t *)file->buffer.data,
file->buffer.size); file->buffer.size);
if (fmap_region_offset < 0) { if (fmap_region_offset < 0) {
@ -365,10 +359,3 @@ static bool select_parents_of(const struct fmap_area *parent, const void *arg)
} }
const partitioned_file_fmap_selector_t partitioned_file_fmap_select_parents_of = const partitioned_file_fmap_selector_t partitioned_file_fmap_select_parents_of =
select_parents_of; select_parents_of;
static bool open_as_flat(unused struct buffer *buffer)
{
return true;
}
const partitioned_file_flat_decider_t partitioned_file_open_as_flat =
open_as_flat;

View File

@ -28,15 +28,6 @@
typedef struct partitioned_file partitioned_file_t; typedef struct partitioned_file partitioned_file_t;
/** @return Whether the specific existing file should be opened in flat mode. */
typedef bool (*partitioned_file_flat_decider_t)(struct buffer *buffer);
/** Pass to partitioned_file_reopen() to force opening as a partitioned file. */
#define partitioned_file_open_as_partitioned NULL
/** Pass to partitioned_file_reopen() to force opening as a flat file. */
extern const partitioned_file_flat_decider_t partitioned_file_open_as_flat;
/** /**
* Create a new filesystem-backed flat buffer. * Create a new filesystem-backed flat buffer.
* This backwards-compatibility function creates a new in-memory buffer and * This backwards-compatibility function creates a new in-memory buffer and
@ -76,22 +67,17 @@ partitioned_file_t *partitioned_file_create(const char *filename,
/** /**
* Read a file back in from the disk. * Read a file back in from the disk.
* An in-memory buffer is created and populated with the file's contents. If * An in-memory buffer is created and populated with the file's
* flat_override is NULL and the image contains an FMAP, it will be opened as a * contents. If the image contains an FMAP, it will be opened as a
* full partitioned file; otherwise, it will be opened as a flat file as if it * full partitioned file; otherwise, it will be opened as a flat file as
* had been created by partitioned_file_create_flat(). This selection behavior * if it had been created by partitioned_file_create_flat().
* is extensible: if a flat_override function is provided, it is invoked before
* searching for an FMAP, and has the option of explicitly instructing the
* module to open the image as a flat file based on its contents.
* The partitioned_file_t returned from this function is separately owned by the * The partitioned_file_t returned from this function is separately owned by the
* caller, and must later be passed to partitioned_file_close(); * caller, and must later be passed to partitioned_file_close();
* *
* @param filename Name of the file to read in * @param filename Name of the file to read in
* @param flat_override Callback that can decide to open it as flat, or NULL
* @return Caller-owned partitioned file, or NULL on error * @return Caller-owned partitioned file, or NULL on error
*/ */
partitioned_file_t *partitioned_file_reopen(const char *filename, partitioned_file_t *partitioned_file_reopen(const char *filename);
partitioned_file_flat_decider_t flat_override);
/** /**
* Write a buffer's contents to its original region within a segmented file. * Write a buffer's contents to its original region within a segmented file.