2 * cbfstool, CLI utility for CBFS file manipulation
4 * Copyright (C) 2009 coresystems GmbH
5 * written by Patrick Georgi <patrick.georgi@coresystems.de>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; version 2 of the License.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA, 02110-1301 USA
38 int (*function) (int argc, char **argv);
41 static int cbfs_add(int argc, char **argv)
43 char *romname = argv[1];
45 void *rom = loadrom(romname);
48 printf("Could not load ROM image '%s'.\n", romname);
53 printf("not enough arguments to '%s'.\n", cmd);
57 char *filename = argv[3];
58 char *cbfsname = argv[4];
60 uint32_t filesize = 0;
61 void *filedata = loadfile(filename, &filesize, 0, SEEK_SET);
62 if (filedata == NULL) {
63 printf("Could not load file '%s'.\n", filename);
68 void *cbfsfile = NULL;
71 printf("not enough arguments to 'add'.\n");
75 if (intfiletype(argv[5]) != ((uint64_t) - 1))
76 type = intfiletype(argv[5]);
78 type = strtoul(argv[5], NULL, 0);
80 base = strtoul(argv[6], NULL, 0);
82 cbfsfile = create_cbfs_file(cbfsname, filedata, &filesize, type, &base);
83 if (add_file_to_cbfs(cbfsfile, filesize, base))
85 if (writerom(romname, rom, romsize))
90 static int cbfs_add_payload(int argc, char **argv)
92 char *romname = argv[1];
94 void *rom = loadrom(romname);
97 printf("Could not load ROM image '%s'.\n", romname);
102 printf("not enough arguments to '%s'.\n", cmd);
106 char *filename = argv[3];
107 char *cbfsname = argv[4];
109 uint32_t filesize = 0;
110 void *filedata = loadfile(filename, &filesize, 0, SEEK_SET);
111 if (filedata == NULL) {
112 printf("Could not load file '%s'.\n", filename);
117 void *cbfsfile = NULL;
119 comp_algo algo = CBFS_COMPRESS_NONE;
121 if (argv[5][0] == 'l')
122 algo = CBFS_COMPRESS_LZMA;
125 base = strtoul(argv[6], NULL, 0);
127 unsigned char *payload;
128 filesize = parse_elf_to_payload(filedata, &payload, algo);
130 create_cbfs_file(cbfsname, payload, &filesize,
131 CBFS_COMPONENT_PAYLOAD, &base);
132 if (add_file_to_cbfs(cbfsfile, filesize, base))
134 if (writerom(romname, rom, romsize))
139 static int cbfs_add_stage(int argc, char **argv)
141 char *romname = argv[1];
143 void *rom = loadrom(romname);
146 printf("Could not load ROM image '%s'.\n", romname);
151 printf("not enough arguments to '%s'.\n", cmd);
155 char *filename = argv[3];
156 char *cbfsname = argv[4];
158 uint32_t filesize = 0;
159 void *filedata = loadfile(filename, &filesize, 0, SEEK_SET);
160 if (filedata == NULL) {
161 printf("Could not load file '%s'.\n", filename);
166 void *cbfsfile = NULL;
168 comp_algo algo = CBFS_COMPRESS_NONE;
170 if (argv[5][0] == 'l')
171 algo = CBFS_COMPRESS_LZMA;
174 base = strtoul(argv[6], NULL, 0);
176 unsigned char *stage;
177 filesize = parse_elf_to_stage(filedata, &stage, algo, &base);
179 create_cbfs_file(cbfsname, stage, &filesize,
180 CBFS_COMPONENT_STAGE, &base);
182 if (add_file_to_cbfs(cbfsfile, filesize, base))
184 if (writerom(romname, rom, romsize))
189 static int cbfs_create(int argc, char **argv)
191 char *romname = argv[1];
194 printf("not enough arguments to 'create'.\n");
199 uint32_t size = strtoul(argv[3], &suffix, 0);
200 if (tolower(suffix[0])=='k') {
203 if (tolower(suffix[0])=='m') {
206 char *bootblock = argv[4];
210 align = strtoul(argv[5], NULL, 0);
212 return create_cbfs_image(romname, size, bootblock, align);
215 static int cbfs_locate(int argc, char **argv)
217 char *romname = argv[1];
219 printf("not enough arguments to 'locate'.\n");
223 const char *file = argv[3];
224 uint32_t filesize = getfilesize(file);
225 const char *filename = argv[4];
226 int align = strtoul(argv[5], NULL, 0);
228 printf("%x\n", cbfs_find_location(romname, filesize, filename, align));
232 static int cbfs_print(int argc, char **argv)
234 char *romname = argv[1];
236 void *rom = loadrom(romname);
239 printf("Could not load ROM image '%s'.\n", romname);
243 print_cbfs_directory(romname);
247 struct command commands[] = {
248 {CMD_ADD, "add", cbfs_add},
249 {CMD_ADD_PAYLOAD, "add-payload", cbfs_add_payload},
250 {CMD_ADD_STAGE, "add-stage", cbfs_add_stage},
251 {CMD_CREATE, "create", cbfs_create},
252 {CMD_LOCATE, "locate", cbfs_locate},
253 {CMD_PRINT, "print", cbfs_print}
259 ("cbfstool: Management utility for CBFS formatted ROM images\n\n"
260 "USAGE:\n" " cbfstool [-h]\n"
261 " cbfstool FILE COMMAND [PARAMETERS]...\n\n" "OPTIONs:\n"
262 " -h Display this help message\n\n"
264 " add FILE NAME TYPE [base address] Add a component\n"
265 " add-payload FILE NAME [COMP] [base] Add a payload to the ROM\n"
266 " add-stage FILE NAME [COMP] [base] Add a stage to the ROM\n"
267 " create SIZE BOOTBLOCK [ALIGN] Create a ROM file\n"
268 " locate FILE NAME ALIGN Find a place for a file of that size\n"
269 " print Show the contents of the ROM\n\n"
272 print_supported_filetypes();
275 int main(int argc, char **argv)
286 for (i = 0; i < ARRAY_SIZE(commands); i++) {
287 if (strcmp(cmd, commands[i].name) != 0)
289 return commands[i].function(argc, argv);
292 printf("Unknown command '%s'.\n", cmd);