summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--util/cbfstool/cbfs_image.c55
-rw-r--r--util/cbfstool/cbfs_image.h1
-rw-r--r--util/cbfstool/cbfstool.c13
3 files changed, 66 insertions, 3 deletions
diff --git a/util/cbfstool/cbfs_image.c b/util/cbfstool/cbfs_image.c
index 95b2db7083..64266b0b5a 100644
--- a/util/cbfstool/cbfs_image.c
+++ b/util/cbfstool/cbfs_image.c
@@ -1076,6 +1076,41 @@ int cbfs_print_entry_info(struct cbfs_image *image, struct cbfs_file *entry,
return 0;
}
+static int cbfs_print_parseable_entry_info(struct cbfs_image *image,
+ struct cbfs_file *entry, void *arg)
+{
+ FILE *fp = (FILE *)arg;
+ const char *name;
+ const char *type;
+ size_t offset;
+ size_t metadata_size;
+ size_t data_size;
+ const char *sep = "\t";
+
+ if (!cbfs_is_valid_entry(image, entry)) {
+ ERROR("cbfs_print_entry_info: Invalid entry at 0x%x\n",
+ cbfs_get_entry_addr(image, entry));
+ return -1;
+ }
+
+ name = entry->filename;
+ if (*name == '\0')
+ name = "(empty)";
+ type = get_cbfs_entry_type_name(ntohl(entry->type)),
+ metadata_size = ntohl(entry->offset);
+ data_size = ntohl(entry->len);
+ offset = cbfs_get_entry_addr(image, entry);
+
+ fprintf(fp, "%s%s", name, sep);
+ fprintf(fp, "0x%zx%s", offset, sep);
+ fprintf(fp, "%s%s", type, sep);
+ fprintf(fp, "0x%zx%s", metadata_size, sep);
+ fprintf(fp, "0x%zx%s", data_size, sep);
+ fprintf(fp, "0x%zx\n", metadata_size + data_size);
+
+ return 0;
+}
+
int cbfs_print_directory(struct cbfs_image *image)
{
if (cbfs_is_legacy_cbfs(image))
@@ -1085,6 +1120,26 @@ int cbfs_print_directory(struct cbfs_image *image)
return 0;
}
+int cbfs_print_parseable_directory(struct cbfs_image *image)
+{
+ int i;
+ const char *header[] = {
+ "Name",
+ "Offset",
+ "Type",
+ "Metadata Size",
+ "Data Size",
+ "Total Size",
+ };
+ const char *sep = "\t";
+
+ for (i = 0; i < ARRAY_SIZE(header) - 1; i++)
+ fprintf(stdout, "%s%s", header[i], sep);
+ fprintf(stdout, "%s\n", header[i]);
+ cbfs_walk(image, cbfs_print_parseable_entry_info, stdout);
+ return 0;
+}
+
int cbfs_merge_empty_entry(struct cbfs_image *image, struct cbfs_file *entry,
unused void *arg)
{
diff --git a/util/cbfstool/cbfs_image.h b/util/cbfstool/cbfs_image.h
index 00adcc8371..38510d2cfc 100644
--- a/util/cbfstool/cbfs_image.h
+++ b/util/cbfstool/cbfs_image.h
@@ -158,6 +158,7 @@ int cbfs_is_valid_entry(struct cbfs_image *image, struct cbfs_file *entry);
/* Print CBFS component information. */
int cbfs_print_directory(struct cbfs_image *image);
+int cbfs_print_parseable_directory(struct cbfs_image *image);
int cbfs_print_header_info(struct cbfs_image *image);
int cbfs_print_entry_info(struct cbfs_image *image, struct cbfs_file *entry,
void *arg);
diff --git a/util/cbfstool/cbfstool.c b/util/cbfstool/cbfstool.c
index 23787d89f4..13a9956045 100644
--- a/util/cbfstool/cbfstool.c
+++ b/util/cbfstool/cbfstool.c
@@ -75,6 +75,7 @@ static struct param {
bool show_immutable;
bool stage_xip;
bool autogen_attr;
+ bool machine_parseable;
int fit_empty_entries;
enum comp_algo compression;
enum vb2_hash_algorithm hash;
@@ -838,8 +839,10 @@ static int cbfs_print(void)
if (cbfs_image_from_buffer(&image, param.image_region,
param.headeroffset))
return 1;
- cbfs_print_directory(&image);
- return 0;
+ if (param.machine_parseable)
+ return cbfs_print_parseable_directory(&image);
+ else
+ return cbfs_print_directory(&image);
}
/* Forward declared so there aren't type collisions with cbfstool proper
@@ -1066,7 +1069,7 @@ static const struct command commands[] = {
{"hashcbfs", "r:R:A:vh?", cbfs_hash, true, true},
{"extract", "H:r:m:n:f:vh?", cbfs_extract, true, false},
{"layout", "wvh?", cbfs_layout, false, false},
- {"print", "H:r:vh?", cbfs_print, true, false},
+ {"print", "H:r:vkh?", 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},
@@ -1105,6 +1108,7 @@ static struct option long_options[] = {
{"with-readonly", no_argument, 0, 'w' },
{"xip", no_argument, 0, 'y' },
{"gen-attribute", no_argument, 0, 'g' },
+ {"mach-parseable",no_argument, 0, 'k' },
{NULL, 0, 0, 0 }
};
@@ -1407,6 +1411,9 @@ int main(int argc, char **argv)
case 'g':
param.autogen_attr = true;
break;
+ case 'k':
+ param.machine_parseable = true;
+ break;
case 'h':
case '?':
usage(argv[0]);