diff options
author | Ronald G. Minnich <rminnich@gmail.com> | 2003-06-20 16:46:48 +0000 |
---|---|---|
committer | Ronald G. Minnich <rminnich@gmail.com> | 2003-06-20 16:46:48 +0000 |
commit | a946e4a596f3f93ee3b9cc6b0a4285882bf4e1f1 (patch) | |
tree | 77c26ed9060b1ac5e1912ac7437f159a664f327d | |
parent | 153ea3548f5ac80d30103ace2655faaf05aa2ccb (diff) |
tool for building roms, to eliminate icky shell scripts.
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@887 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
-rw-r--r-- | util/buildrom/buildrom.c | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/util/buildrom/buildrom.c b/util/buildrom/buildrom.c new file mode 100644 index 0000000000..44f0c44186 --- /dev/null +++ b/util/buildrom/buildrom.c @@ -0,0 +1,93 @@ +#include <stdio.h> +#include <stdlib.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <unistd.h> + + +/* this is the beginning of a tool which will eventually + * be able to build rom images with both fallback and + * normal. For now it just builds a single image + * into a rom iamge + */ +/* one switch we already need: -zero allowing you to tell what + * to do with numbers that are "zero": make them 0xff or whatever + * for flash + * For now we assume "zero" is 0xff + */ + +void +usage(){ + fprintf(stderr, "Usage: buildrom <input> <output> <payload> "); + fprintf(stderr, " <linuxbios-size> <total-size\n"); + exit(1); +} + +void +fatal(char *s){ + perror(s); + exit(2); +} +int +main(int argc, char *argv[]) { + int infd, payloadfd, outfd, size, insize, readlen, writelen, i; + int romsize; + unsigned char *cp; + struct stat inbuf, payloadbuf; + char zero = 0xff; + + if (argc != 6) + usage(); + + + infd = open(argv[1], O_RDONLY); + if (infd < 0) + fatal(argv[1]); + outfd = open(argv[2], O_RDWR|O_CREAT, 0666); + if (outfd < 0) + fatal(argv[2]); + payloadfd = open(argv[3], O_RDONLY); + if (payloadfd < 0) + fatal(argv[3]); + size = strtol(argv[4], 0, 0); + romsize = strtol(argv[5], 0, 0); + + if (fstat(infd, &inbuf) < 0) + fatal("stat of infile"); + if (inbuf.st_size > size) + fatal("input file larger than allowed size!\n"); + + if (fstat(payloadfd, &payloadbuf) < 0) + fatal("stat of infile"); + if (payloadbuf.st_size > (romsize - size)) + fatal("payload + linuxbios size larger than ROM size!\n"); + + cp = malloc(romsize); + if (! cp) + fatal("malloc buffer"); + + for(i = 0; i < romsize; i++) + cp[i] = zero; + /* read the input file in at the END of the array */ + readlen = read(infd, &cp[romsize - inbuf.st_size], inbuf.st_size); + if (readlen < inbuf.st_size) { + fprintf(stderr, "Wanted %d, got %d\n", inbuf.st_size, readlen); + fatal("Read input file"); + } + + /* read the payload file in at the START of the array */ + readlen = read(payloadfd, cp, payloadbuf.st_size); + if (readlen < payloadbuf.st_size) { + fprintf(stderr, "Wanted %d, got %d\n", + payloadbuf.st_size, readlen); + fatal("Read payload file"); + } + writelen = write(outfd, cp, romsize); + if (writelen < size) { + fprintf(stderr, "Wanted %d, got %d\n", size, writelen); + fatal("Write output file"); + } + + return 0; +} |