X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=util%2Fcbfstool%2Fcbfstool.c;h=b8abb515bf42cdddcb3dbb9a2f7b49c9958468ac;hb=a1e4824f73602a411826b27160a8818049ce0f97;hp=1d8b7c6b744f8e90abb71b510da214e592b27b65;hpb=0704058327e5a8fa00ea32bbe10be748d7824fc1;p=coreboot.git diff --git a/util/cbfstool/cbfstool.c b/util/cbfstool/cbfstool.c index 1d8b7c6b7..b8abb515b 100644 --- a/util/cbfstool/cbfstool.c +++ b/util/cbfstool/cbfstool.c @@ -19,8 +19,9 @@ */ #include -#include +#include #include +#include #include "common.h" #include "cbfs.h" @@ -30,7 +31,8 @@ typedef enum { CMD_ADD_STAGE, CMD_CREATE, CMD_LOCATE, - CMD_PRINT + CMD_PRINT, + CMD_EXTRACT, } cmd_t; struct command { @@ -81,9 +83,12 @@ static int cbfs_add(int argc, char **argv) base = strtoul(argv[6], NULL, 0); } cbfsfile = create_cbfs_file(cbfsname, filedata, &filesize, type, &base); - if (add_file_to_cbfs(cbfsfile, filesize, base)) + if (add_file_to_cbfs(cbfsfile, filesize, base)) { + printf("Adding file '%s' failed.\n", filename); + return 1; + } + if (writerom(romname, rom, romsize)) return 1; - writerom(romname, rom, romsize); return 0; } @@ -129,9 +134,12 @@ static int cbfs_add_payload(int argc, char **argv) cbfsfile = create_cbfs_file(cbfsname, payload, &filesize, CBFS_COMPONENT_PAYLOAD, &base); - if (add_file_to_cbfs(cbfsfile, filesize, base)) + if (add_file_to_cbfs(cbfsfile, filesize, base)) { + printf("Adding payload '%s' failed.\n", filename); + return 1; + } + if (writerom(romname, rom, romsize)) return 1; - writerom(romname, rom, romsize); return 0; } @@ -178,16 +186,18 @@ static int cbfs_add_stage(int argc, char **argv) create_cbfs_file(cbfsname, stage, &filesize, CBFS_COMPONENT_STAGE, &base); - if (add_file_to_cbfs(cbfsfile, filesize, base)) + if (add_file_to_cbfs(cbfsfile, filesize, base)) { + printf("Adding stage '%s' failed.\n", filename); + return 1; + } + if (writerom(romname, rom, romsize)) return 1; - writerom(romname, rom, romsize); return 0; } static int cbfs_create(int argc, char **argv) { char *romname = argv[1]; - char *cmd = argv[2]; if (argc < 5) { printf("not enough arguments to 'create'.\n"); return 1; @@ -230,7 +240,6 @@ static int cbfs_locate(int argc, char **argv) static int cbfs_print(int argc, char **argv) { char *romname = argv[1]; - char *cmd = argv[2]; void *rom = loadrom(romname); if (rom == NULL) { @@ -242,16 +251,36 @@ static int cbfs_print(int argc, char **argv) return 0; } -struct command commands[] = { +static int cbfs_extract(int argc, char **argv) +{ + char *romname = argv[1]; + void *rom = loadrom(romname); + + if (rom == NULL) { + printf("Could not load ROM image '%s'.\n", romname); + return 1; + } + + if (argc != 5) + { + printf("Error: you must specify a CBFS name and a file to dump it in.\n"); + return 1; + } + + return extract_file_from_cbfs(romname, argv[3], argv[4]); +} + +static const struct command commands[] = { {CMD_ADD, "add", cbfs_add}, {CMD_ADD_PAYLOAD, "add-payload", cbfs_add_payload}, {CMD_ADD_STAGE, "add-stage", cbfs_add_stage}, {CMD_CREATE, "create", cbfs_create}, {CMD_LOCATE, "locate", cbfs_locate}, - {CMD_PRINT, "print", cbfs_print} + {CMD_PRINT, "print", cbfs_print}, + {CMD_EXTRACT, "extract", cbfs_extract}, }; -void usage(void) +static void usage(void) { printf ("cbfstool: Management utility for CBFS formatted ROM images\n\n" @@ -264,12 +293,28 @@ void usage(void) " add-stage FILE NAME [COMP] [base] Add a stage to the ROM\n" " create SIZE BOOTBLOCK [ALIGN] Create a ROM file\n" " locate FILE NAME ALIGN Find a place for a file of that size\n" - " print Show the contents of the ROM\n\n" + " print Show the contents of the ROM\n" + " extract NAME FILE Extracts a raw payload from ROM\n" + "\n" "TYPEs:\n" ); print_supported_filetypes(); } +/* Small, OS/libc independent runtime check + * for endianess + */ +int host_bigendian = 0; + +static void which_endian(void) +{ + char test[4] = "1234"; + uint32_t inttest = *(uint32_t *) test; + if (inttest == 0x31323334) { + host_bigendian = 1; + } +} + int main(int argc, char **argv) { int i; @@ -279,6 +324,8 @@ int main(int argc, char **argv) return 1; } + which_endian(); + char *cmd = argv[2]; for (i = 0; i < ARRAY_SIZE(commands); i++) {