[coreboot-gerrit] Change in coreboot[master]: cbfstool: add unprocessed flag for file exporting
Joel Kitching (Code Review)
gerrit at coreboot.org
Tue Nov 13 04:52:50 CET 2018
Joel Kitching has uploaded this change for review. ( https://review.coreboot.org/29616
Change subject: cbfstool: add unprocessed flag for file exporting
......................................................................
cbfstool: add unprocessed flag for file exporting
Add an unprocessed flag (-U) which modifies how files are exported.
In the case of a compressed raw file, extract without decompressing.
In the case of a stage or payload, extract without decompressing or
converting to an ELF.
This can be useful for verifying the integrity of a stage or payload,
since converting to an ELF may not be a deterministic process on
different platforms or coreboot versions.
BUG=b:111577108
TEST=USE=cb_legacy_tianocore emerge-eve edk2 coreboot-utils chromeos-bootimage
cd /build/eve/firmware
/build/eve/usr/bin/cbfstool image.bin extract -r RW_LEGACY \
-n payload -f /tmp/payload_1 -U
START=$((16#`xxd -s 20 -l 4 -p tianocore.cbfs`))
SIZE=$((16#`xxd -s 8 -l 4 -p tianocore.cbfs`))
dd if=tianocore.cbfs skip=$START count=$SIZE bs=1 > /tmp/payload_2
diff /tmp/payload_1 /tmp/payload_2
rm /tmp/payload_1 /tmp/payload_2
Change-Id: I351d471d699daedd51adf4a860661877f25607e6
Signed-off-by: Joel Kitching <kitching at chromium.org>
---
M util/cbfstool/cbfs_image.c
M util/cbfstool/cbfs_image.h
M util/cbfstool/cbfstool.c
3 files changed, 42 insertions(+), 23 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/16/29616/1
diff --git a/util/cbfstool/cbfs_image.c b/util/cbfstool/cbfs_image.c
index 74572a9..d50ebbb 100644
--- a/util/cbfstool/cbfs_image.c
+++ b/util/cbfstool/cbfs_image.c
@@ -1283,7 +1283,7 @@
}
int cbfs_export_entry(struct cbfs_image *image, const char *entry_name,
- const char *filename, uint32_t arch)
+ const char *filename, uint32_t arch, bool do_processing)
{
struct cbfs_file *entry = cbfs_get_entry(image, entry_name);
struct buffer buffer;
@@ -1292,26 +1292,33 @@
return -1;
}
+ unsigned int compressed_size = ntohl(entry->len);
unsigned int decompressed_size = 0;
unsigned int compression = cbfs_file_get_compression_info(entry,
&decompressed_size);
-
- decomp_func_ptr decompress = decompression_function(compression);
- if (!decompress) {
- ERROR("looking up decompression routine failed\n");
- return -1;
+ /* Force nop decompression */
+ decomp_func_ptr decompress = decompression_function(CBFS_COMPRESS_NONE);
+ if (do_processing) {
+ decompress = decompression_function(compression);
+ if (!decompress) {
+ ERROR("looking up decompression routine failed\n");
+ return -1;
+ }
}
- LOG("Found file %.30s at 0x%x, type %.12s, size %d\n",
+ LOG("Found file %.30s at 0x%x, type %.12s, compressed %d, size %d\n",
entry_name, cbfs_get_entry_addr(image, entry),
- get_cbfs_entry_type_name(ntohl(entry->type)), decompressed_size);
+ get_cbfs_entry_type_name(ntohl(entry->type)), compressed_size,
+ decompressed_size);
+ unsigned int buffer_size =
+ do_processing ? decompressed_size : compressed_size;
buffer_init(&buffer, strdup("(cbfs_export_entry)"), NULL, 0);
+ buffer.data = malloc(buffer_size);
+ buffer.size = buffer_size;
- buffer.data = malloc(decompressed_size);
- buffer.size = decompressed_size;
- if (decompress(CBFS_SUBHEADER(entry), ntohl(entry->len),
- buffer.data, buffer.size, NULL)) {
+ if (decompress(CBFS_SUBHEADER(entry), compressed_size,
+ buffer.data, buffer.size, NULL)) {
ERROR("decompression failed for %s\n", entry_name);
buffer_delete(&buffer);
return -1;
@@ -1323,13 +1330,19 @@
* one has to do a second pass for stages to potentially decompress
* the stage data to make it more meaningful.
*/
- if (ntohl(entry->type) == CBFS_COMPONENT_STAGE) {
- if (cbfs_stage_make_elf(&buffer, arch)) {
- buffer_delete(&buffer);
- return -1;
+ if (do_processing) {
+ int (*make_elf)(struct buffer *, uint32_t) = NULL;
+ switch (ntohl(entry->type)) {
+ case CBFS_COMPONENT_STAGE:
+ make_elf = cbfs_stage_make_elf;
+ break;
+ case CBFS_COMPONENT_SELF:
+ make_elf = cbfs_payload_make_elf;
+ break;
}
- } else if (ntohl(entry->type) == CBFS_COMPONENT_SELF) {
- if (cbfs_payload_make_elf(&buffer, arch)) {
+ if (make_elf && make_elf(&buffer, arch)) {
+ ERROR("Failed to write %s into %s.\n",
+ entry_name, filename);
buffer_delete(&buffer);
return -1;
}
diff --git a/util/cbfstool/cbfs_image.h b/util/cbfstool/cbfs_image.h
index 5772b1b..0cffb9c 100644
--- a/util/cbfstool/cbfs_image.h
+++ b/util/cbfstool/cbfs_image.h
@@ -98,7 +98,7 @@
/* Exports an entry to external file.
* Returns 0 on success, otherwise (ex, not found) non-zero. */
int cbfs_export_entry(struct cbfs_image *image, const char *entry_name,
- const char *filename, uint32_t arch);
+ const char *filename, uint32_t arch, bool do_processing);
/* Adds an entry to CBFS image by given name and type. If content_offset is
* non-zero, try to align "content" (CBFS_SUBHEADER(p)) at content_offset.
diff --git a/util/cbfstool/cbfstool.c b/util/cbfstool/cbfstool.c
index 28e0e5d..f0fbf5a 100644
--- a/util/cbfstool/cbfstool.c
+++ b/util/cbfstool/cbfstool.c
@@ -83,6 +83,7 @@
bool stage_xip;
bool autogen_attr;
bool machine_parseable;
+ bool unprocessed;
int fit_empty_entries;
enum comp_algo compression;
int precompression;
@@ -1095,7 +1096,7 @@
return 1;
return cbfs_export_entry(&image, param.name, param.filename,
- param.arch);
+ param.arch, !param.unprocessed);
}
static int cbfs_write(void)
@@ -1314,7 +1315,7 @@
{"compact", "r:h?", cbfs_compact, true, true},
{"copy", "r:R:h?", cbfs_copy, true, true},
{"create", "M:r:s:B:b:H:o:m:vh?", cbfs_create, true, true},
- {"extract", "H:r:m:n:f:vh?", cbfs_extract, true, false},
+ {"extract", "H:r:m:n:f:Uvh?", cbfs_extract, true, false},
{"layout", "wvh?", cbfs_layout, false, false},
{"print", "H:r:vkh?", cbfs_print, true, false},
{"read", "r:f:vh?", cbfs_read, true, false},
@@ -1362,6 +1363,7 @@
{"xip", no_argument, 0, 'y' },
{"gen-attribute", no_argument, 0, 'g' },
{"mach-parseable",no_argument, 0, 'k' },
+ {"unprocessed", no_argument, 0, 'U' },
{NULL, 0, 0, 0 }
};
@@ -1428,6 +1430,7 @@
" -d Accept short data; fill downward/from top\n"
" -F Force action\n"
" -g Generate position and alignment arguments\n"
+ " -U Unprocessed; don't decompress or make ELF\n"
" -v Provide verbose output\n"
" -h Display this help message\n\n"
"COMMANDs:\n"
@@ -1473,8 +1476,8 @@
"List mutable (or, with -w, readable) image regions\n"
" print [-r image,regions] "
"Show the contents of the ROM\n"
- " extract [-r image,regions] [-m ARCH] -n NAME -f FILE "
- "Extracts a raw payload from ROM\n"
+ " extract [-r image,regions] [-m ARCH] -n NAME -f FILE [-U] "
+ "Extracts a file from ROM\n"
" write [-F] -r image,regions -f file [-u | -d] [-i int] "
"Write file into same-size [or larger] raw region\n"
" read [-r fmap-region] -f file "
@@ -1770,6 +1773,9 @@
case 'k':
param.machine_parseable = true;
break;
+ case 'U':
+ param.unprocessed = true;
+ break;
case 'h':
case '?':
usage(argv[0]);
--
To view, visit https://review.coreboot.org/29616
To unsubscribe, or for help writing mail filters, visit https://review.coreboot.org/settings
Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: I351d471d699daedd51adf4a860661877f25607e6
Gerrit-Change-Number: 29616
Gerrit-PatchSet: 1
Gerrit-Owner: Joel Kitching <kitching at google.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.coreboot.org/pipermail/coreboot-gerrit/attachments/20181113/2e6369cb/attachment-0001.html>
More information about the coreboot-gerrit
mailing list