aboutsummaryrefslogtreecommitdiff
path: root/util/cbfstool/common.c
diff options
context:
space:
mode:
authorAurelien Guillaume <aurelien@iwi.me>2011-01-13 09:09:21 +0000
committerPatrick Georgi <patrick.georgi@coresystems.de>2011-01-13 09:09:21 +0000
commitfe7d6b9a4a784f0b92b3c9dc5b6c6070b4c2e10c (patch)
treed4cfb2ab5f100fb49539f60ca7fe5dca876145ba /util/cbfstool/common.c
parentfb433bea6a886e8c00620bf4c799feae0d6c7072 (diff)
Add "cbfstool extract" function.
It dumps everything you ask for, but you might not get what you expect if the file is compressed or otherwise converted (eg. payloads in SELF format). (Originally it would only extract "raw" files. This is a change by me, as filetypes are commonly used to differentiate raw data files --Patrick) Signed-off-by: Aurelien Guillaume <aurelien@iwi.me> Signed-off-by: Patrick Georgi <patrick.georgi@secunet.com> Acked-by: Patrick Georgi <patrick.georgi@secunet.com> git-svn-id: svn://svn.coreboot.org/coreboot/trunk@6250 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
Diffstat (limited to 'util/cbfstool/common.c')
-rw-r--r--util/cbfstool/common.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/util/cbfstool/common.c b/util/cbfstool/common.c
index 8478c5a492..a42585b776 100644
--- a/util/cbfstool/common.c
+++ b/util/cbfstool/common.c
@@ -207,6 +207,69 @@ void print_cbfs_directory(const char *filename)
}
}
+int extract_file_from_cbfs(const char *filename, const char *payloadname, const char *outpath)
+{
+ // Identify the coreboot image.
+ printf(
+ "%s: %d kB, bootblocksize %d, romsize %d, offset 0x%x\nAlignment: %d bytes\n\n",
+ basename((char *)filename), romsize / 1024, ntohl(master_header->bootblocksize),
+ romsize, ntohl(master_header->offset), align);
+
+ FILE *outfile = NULL;
+ uint32_t current = phys_start;
+ while (current < phys_end) {
+ if (!cbfs_file_header(current)) {
+ current += align;
+ continue;
+ }
+
+ // Locate the file start struct
+ struct cbfs_file *thisfile =
+ (struct cbfs_file *)phys_to_virt(current);
+ // And its length
+ uint32_t length = ntohl(thisfile->len);
+ // Locate the file name
+ char *fname = (char *)(phys_to_virt(current) + sizeof(struct cbfs_file));
+ // It's not the file we are looking for..
+ if (strcmp(fname, payloadname) != 0)
+ {
+ current =
+ ALIGN(current + ntohl(thisfile->len) +
+ ntohl(thisfile->offset), align);
+ continue;
+ }
+
+ // Else, it's our file.
+ printf("Found %.30s payload at 0x%x, type %.12s, size %d\n", fname,
+ current - phys_start, strfiletype(ntohl(thisfile->type)),
+ length);
+
+ // If we are not dumping to stdout, open the out file.
+ outfile = fopen(outpath, "wb");
+ if (!outfile)
+ {
+ printf("Could not open the file %s for writing. Aborting.\n", outpath);
+ return 1;
+ }
+
+ if (ntohl(thisfile->type) != CBFS_COMPONENT_RAW)
+ {
+ printf("Warning: only 'raw' files are safe to extract.\n");
+ }
+
+ fwrite(((char *)thisfile)
+ + ntohl(thisfile->offset), length, 1, outfile);
+
+ fclose(outfile);
+ printf("Successfully dumped the payload.\n");
+
+ // We'll only dump one file.
+ return 0;
+ }
+
+}
+
+
int add_file_to_cbfs(void *content, uint32_t contentsize, uint32_t location)
{
uint32_t current = phys_start;