summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRonald G. Minnich <rminnich@gmail.com>2003-06-20 16:46:48 +0000
committerRonald G. Minnich <rminnich@gmail.com>2003-06-20 16:46:48 +0000
commita946e4a596f3f93ee3b9cc6b0a4285882bf4e1f1 (patch)
tree77c26ed9060b1ac5e1912ac7437f159a664f327d
parent153ea3548f5ac80d30103ace2655faaf05aa2ccb (diff)
downloadcoreboot-a946e4a596f3f93ee3b9cc6b0a4285882bf4e1f1.tar.xz
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.c93
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;
+}