summaryrefslogtreecommitdiff
path: root/util/cbfstool/util.c
diff options
context:
space:
mode:
authorMyles Watson <mylesgw@gmail.com>2009-04-25 12:39:04 +0000
committerMyles Watson <mylesgw@gmail.com>2009-04-25 12:39:04 +0000
commit72631a01fa42cd419f8b40351cc7306fe149e334 (patch)
treefab3aade85bc7907ec688a46c63c8242419934d9 /util/cbfstool/util.c
parentfe6201651233fbeff7aaef84211286e7716bf8a9 (diff)
downloadcoreboot-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
Diffstat (limited to 'util/cbfstool/util.c')
-rw-r--r--util/cbfstool/util.c48
1 files changed, 12 insertions, 36 deletions
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;
}