X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=util%2Fcbfstool%2Fcbfstool.c;h=f017b2e2e07f3d58e2c1d938b0e4ba09edd0693b;hb=fbadc499a6268f5d69d4aa1844153d6ae1e82cf0;hp=7fa7a8510aa9be9cbc07d518a8185a96e98cde38;hpb=3fec29cc963c95d44ff45151a1bc64d8988073ab;p=coreboot.git diff --git a/util/cbfstool/cbfstool.c b/util/cbfstool/cbfstool.c index 7fa7a8510..f017b2e2e 100644 --- a/util/cbfstool/cbfstool.c +++ b/util/cbfstool/cbfstool.c @@ -19,7 +19,7 @@ */ #include -#include +#include #include "common.h" #include "cbfs.h" @@ -28,7 +28,9 @@ typedef enum { CMD_ADD_PAYLOAD, CMD_ADD_STAGE, CMD_CREATE, - CMD_PRINT + CMD_LOCATE, + CMD_PRINT, + CMD_EXTRACT, } cmd_t; struct command { @@ -78,10 +80,13 @@ static int cbfs_add(int argc, char **argv) if (argc > 6) { base = strtoul(argv[6], NULL, 0); } - cbfsfile = - create_cbfs_file(cbfsname, filedata, &filesize, type, &base); - add_file_to_cbfs(cbfsfile, filesize, base); - writerom(romname, rom, romsize); + cbfsfile = create_cbfs_file(cbfsname, filedata, &filesize, type, &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; return 0; } @@ -127,8 +132,12 @@ static int cbfs_add_payload(int argc, char **argv) cbfsfile = create_cbfs_file(cbfsname, payload, &filesize, CBFS_COMPONENT_PAYLOAD, &base); - add_file_to_cbfs(cbfsfile, filesize, base); - writerom(romname, rom, romsize); + if (add_file_to_cbfs(cbfsfile, filesize, base)) { + printf("Adding payload '%s' failed.\n", filename); + return 1; + } + if (writerom(romname, rom, romsize)) + return 1; return 0; } @@ -175,8 +184,12 @@ static int cbfs_add_stage(int argc, char **argv) create_cbfs_file(cbfsname, stage, &filesize, CBFS_COMPONENT_STAGE, &base); - add_file_to_cbfs(cbfsfile, filesize, base); - writerom(romname, rom, romsize); + if (add_file_to_cbfs(cbfsfile, filesize, base)) { + printf("Adding stage '%s' failed.\n", filename); + return 1; + } + if (writerom(romname, rom, romsize)) + return 1; return 0; } @@ -184,22 +197,45 @@ static int cbfs_create(int argc, char **argv) { char *romname = argv[1]; char *cmd = argv[2]; - if (argc < 6) { + if (argc < 5) { printf("not enough arguments to 'create'.\n"); return 1; } - uint32_t size = strtoul(argv[3], NULL, 0); - /* ignore bootblock size. we use whatever we get and won't allocate any larger */ - char *bootblock = argv[5]; + char* suffix; + uint32_t size = strtoul(argv[3], &suffix, 0); + if (tolower(suffix[0])=='k') { + size *= 1024; + } + if (tolower(suffix[0])=='m') { + size *= 1024 * 1024; + } + char *bootblock = argv[4]; uint32_t align = 0; - if (argc > 6) - align = strtoul(argv[6], NULL, 0); + if (argc > 5) + align = strtoul(argv[5], NULL, 0); return create_cbfs_image(romname, size, bootblock, align); } +static int cbfs_locate(int argc, char **argv) +{ + char *romname = argv[1]; + if (argc < 6) { + printf("not enough arguments to 'locate'.\n"); + return 1; + } + + const char *file = argv[3]; + uint32_t filesize = getfilesize(file); + const char *filename = argv[4]; + int align = strtoul(argv[5], NULL, 0); + + printf("%x\n", cbfs_find_location(romname, filesize, filename, align)); + return 0; +} + static int cbfs_print(int argc, char **argv) { char *romname = argv[1]; @@ -215,27 +251,55 @@ static int cbfs_print(int argc, char **argv) return 0; } +static int cbfs_extract(int argc, char **argv) +{ + char *romname = argv[1]; + char *cmd = argv[2]; + 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]); +} + 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_PRINT, "print", cbfs_print} + {CMD_LOCATE, "locate", cbfs_locate}, + {CMD_PRINT, "print", cbfs_print}, + {CMD_EXTRACT, "extract", cbfs_extract}, }; void usage(void) { printf - ("cbfstool: Management utility for CBFS formatted ROM images\n" - "USAGE:\n" "cbfstool [-h]\n" - "cbfstool FILE COMMAND [PARAMETERS]...\n\n" "OPTIONs:\n" - " -h Display this help message\n\n" + ("cbfstool: Management utility for CBFS formatted ROM images\n\n" + "USAGE:\n" " cbfstool [-h]\n" + " cbfstool FILE COMMAND [PARAMETERS]...\n\n" "OPTIONs:\n" + " -h Display this help message\n\n" "COMMANDs:\n" - "add FILE NAME TYPE [base address] Add a component\n" - "add-payload FILE NAME [COMP] [base] Add a payload to the ROM\n" - "add-stage FILE NAME [COMP] [base] Add a stage to the ROM\n" - "create SIZE BSIZE BOOTBLOCK [ALIGN] Create a ROM file\n" - "print Show the contents of the ROM\n"); + " add FILE NAME TYPE [base address] Add a component\n" + " add-payload FILE NAME [COMP] [base] Add a payload to the ROM\n" + " 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" + " extract NAME FILE Extracts a raw payload from ROM\n" + "\n" + "TYPEs:\n" + ); + print_supported_filetypes(); } int main(int argc, char **argv)