diff options
author | Myles Watson <mylesgw@gmail.com> | 2009-04-25 12:39:04 +0000 |
---|---|---|
committer | Myles Watson <mylesgw@gmail.com> | 2009-04-25 12:39:04 +0000 |
commit | 72631a01fa42cd419f8b40351cc7306fe149e334 (patch) | |
tree | fab3aade85bc7907ec688a46c63c8242419934d9 | |
parent | fe6201651233fbeff7aaef84211286e7716bf8a9 (diff) | |
download | coreboot-72631a01fa42cd419f8b40351cc7306fe149e334.tar.xz |
The master cbfs record was located at the end of the flash and overwrote
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
-rw-r--r-- | util/cbfstool/cbfstool.h | 3 | ||||
-rw-r--r-- | util/cbfstool/create.c | 5 | ||||
-rw-r--r-- | util/cbfstool/util.c | 48 |
3 files changed, 15 insertions, 41 deletions
diff --git a/util/cbfstool/cbfstool.h b/util/cbfstool/cbfstool.h index f36b28684c..f90b5670d0 100644 --- a/util/cbfstool/cbfstool.h +++ b/util/cbfstool/cbfstool.h @@ -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); diff --git a/util/cbfstool/create.c b/util/cbfstool/create.c index 23e7850952..ecfb21c956 100644 --- a/util/cbfstool/create.c +++ b/util/cbfstool/create.c @@ -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; } diff --git a/util/cbfstool/util.c b/util/cbfstool/util.c index 51905a6d60..5dd946b5d7 100644 --- a/util/cbfstool/util.c +++ b/util/cbfstool/util.c @@ -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; } |