The master cbfs record was located at the end of the flash and overwrote
authorMyles Watson <mylesgw@gmail.com>
Sat, 25 Apr 2009 12:39:04 +0000 (12:39 +0000)
committerMyles Watson <mylesgw@gmail.com>
Sat, 25 Apr 2009 12:39:04 +0000 (12:39 +0000)
anything that was there.  For ck804 or mcp55-based machines that was the
romstrap.

The fix is simple:
1. Put the master cbfs record above the bootblock instead of on it.

Signed-off-by: Myles Watson <mylesgw@gmail.com>
Acked-by: Peter Stuge <peter@stuge.se>
Acked-by: Ronald G. Minnich <rminnich@gmail.com>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@4209 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1

util/cbfstool/cbfstool.h
util/cbfstool/create.c
util/cbfstool/util.c

index f36b28684c5019e2d2d82509af4f272a410e028a..f90b5670d026b3c561ea59f8152381a3e4e3a7f5 100644 (file)
@@ -58,7 +58,8 @@ struct rom {
 /* util.c */
 int open_rom(struct rom *rom, const char *filename);
 int create_rom(struct rom *rom, const unsigned char *filename, int size,
-       int bootblocksize,  int align);
+              const unsigned char *bootblockname, int bootblocksize,
+              int align);
 int size_and_open(const char *filename, unsigned int *size);
 int copy_from_fd(int fd, void *ptr, int size);
 int get_size(const char *size);
index 23e7850952e77ee38f2db897874d67e5f3ea995c..ecfb21c956de773d0c64a87ee5fa88fb085c59ab 100644 (file)
@@ -59,11 +59,8 @@ int create_handler(struct rom *rom, int argc, char **argv)
                return -1;
        }
 
-       if (create_rom(rom, rom->name, size, bootblocksize, align))
+       if (create_rom(rom, rom->name, size, bootblock, bootblocksize, align))
                return -1;
 
-       if (bootblock != NULL)
-               return add_bootblock(rom, bootblock);
-
        return 0;
 }
index 51905a6d600ef058e175b729d01a0a73ef503679..5dd946b5d7915efd595e7e230ec8c4c53c33daae 100644 (file)
@@ -168,7 +168,8 @@ err:
 }
 
 int create_rom(struct rom *rom, const unsigned char *filename,
-              int romsize, int bootblocksize, int align)
+              int romsize, const unsigned char *bootblockname,
+              int bootblocksize, int align)
 {
        unsigned char null = '\0';
 
@@ -180,8 +181,9 @@ int create_rom(struct rom *rom, const unsigned char *filename,
        /* Remember the size of the entire ROM */
        rom->size = romsize;
 
-       /* The size of the archive section is everything but the bootblock */
-       rom->fssize = romsize - bootblocksize;
+       /* The size of the archive section is everything but the bootblock and
+        * the cbfs master header. */
+       rom->fssize = romsize - bootblocksize - sizeof(struct cbfs_header);
 
        /* Open the file descriptor */
 
@@ -201,29 +203,27 @@ int create_rom(struct rom *rom, const unsigned char *filename,
                return -1;
        }
 
-       /* Clear the reset vector */
-       memset(rom->ptr + rom->size - 16, 0, 16);
-
-       ROM_WRITEL(rom, rom->size - 4,
-                  0xFFFFFFF0 - sizeof(struct cbfs_header));
-
        /* This is a pointer to the header for easy access */
        rom->header = (struct cbfs_header *)
-           ROM_PTR(rom, rom->size - 16 - sizeof(struct cbfs_header));
-
+           ROM_PTR(rom, rom->size - 16 - bootblocksize - sizeof(struct cbfs_header));
        rom->header->magic = htonl(HEADER_MAGIC);
        rom->header->romsize = htonl(romsize);
        rom->header->bootblocksize = htonl(bootblocksize);
        rom->header->align = htonl(align);
        rom->header->offset = htonl(0);
 
+       add_bootblock(rom, bootblockname);
+
+       /* Write the cbfs master header address at the end of the ROM. */
+
+       ROM_WRITEL(rom, rom->size - 4,
+                  0xFFFFFFF0 - bootblocksize - sizeof(struct cbfs_header));
        return 0;
 }
 
 int add_bootblock(struct rom *rom, const char *filename)
 {
        unsigned int size;
-       //unsigned int offset;
        int fd = size_and_open(filename, &size);
        int ret;
        struct cbfs_header tmp;
@@ -237,11 +237,7 @@ int add_bootblock(struct rom *rom, const char *filename)
                return -1;
        }
 
-       /* Copy the current header into a temporary buffer */
-       memcpy(&tmp, rom->header, sizeof(struct cbfs_header));
-
        /* Copy the bootblock into place at the end of the file */
-
        ret = copy_from_fd(fd, ROM_PTR(rom, rom->size - ntohl(rom->header->bootblocksize)), size);
 
        close(fd);
@@ -251,26 +247,6 @@ int add_bootblock(struct rom *rom, const char *filename)
                return -1;
        }
 
-       /* FIXME: This should point to a location defined by coreboot */
-
-       ROM_WRITEL(rom, rom->size - 4,
-                  0xFFFFFFF0 - sizeof(struct cbfs_header));
-
-       /* This is a pointer to the header for easy access */
-       rom->header = (struct cbfs_header *)
-           ROM_PTR(rom, rom->size - 16 - sizeof(struct cbfs_header));
-
-#if 0
-       /* Figure out the new location for the header */
-       offset = ROM_READL(rom, rom->size - 4);
-
-       rom->header = (struct cbfs_header *)
-           ROM_PTR(rom, offset - (0xFFFFFFFF - rom->size));
-#endif
-
-       /* Replace the LAR header */
-       memcpy(rom->header, &tmp, sizeof(struct cbfs_header));
-
        return 0;
 }