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
This commit is contained in:
parent
fe62016512
commit
72631a01fa
|
@ -58,7 +58,8 @@ struct rom {
|
||||||
/* util.c */
|
/* util.c */
|
||||||
int open_rom(struct rom *rom, const char *filename);
|
int open_rom(struct rom *rom, const char *filename);
|
||||||
int create_rom(struct rom *rom, const unsigned char *filename, int size,
|
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 size_and_open(const char *filename, unsigned int *size);
|
||||||
int copy_from_fd(int fd, void *ptr, int size);
|
int copy_from_fd(int fd, void *ptr, int size);
|
||||||
int get_size(const char *size);
|
int get_size(const char *size);
|
||||||
|
|
|
@ -59,11 +59,8 @@ int create_handler(struct rom *rom, int argc, char **argv)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (create_rom(rom, rom->name, size, bootblocksize, align))
|
if (create_rom(rom, rom->name, size, bootblock, bootblocksize, align))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (bootblock != NULL)
|
|
||||||
return add_bootblock(rom, bootblock);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -168,7 +168,8 @@ err:
|
||||||
}
|
}
|
||||||
|
|
||||||
int create_rom(struct rom *rom, const unsigned char *filename,
|
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';
|
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 */
|
/* Remember the size of the entire ROM */
|
||||||
rom->size = romsize;
|
rom->size = romsize;
|
||||||
|
|
||||||
/* The size of the archive section is everything but the bootblock */
|
/* The size of the archive section is everything but the bootblock and
|
||||||
rom->fssize = romsize - bootblocksize;
|
* the cbfs master header. */
|
||||||
|
rom->fssize = romsize - bootblocksize - sizeof(struct cbfs_header);
|
||||||
|
|
||||||
/* Open the file descriptor */
|
/* Open the file descriptor */
|
||||||
|
|
||||||
|
@ -201,29 +203,27 @@ int create_rom(struct rom *rom, const unsigned char *filename,
|
||||||
return -1;
|
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 */
|
/* This is a pointer to the header for easy access */
|
||||||
rom->header = (struct cbfs_header *)
|
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->magic = htonl(HEADER_MAGIC);
|
||||||
rom->header->romsize = htonl(romsize);
|
rom->header->romsize = htonl(romsize);
|
||||||
rom->header->bootblocksize = htonl(bootblocksize);
|
rom->header->bootblocksize = htonl(bootblocksize);
|
||||||
rom->header->align = htonl(align);
|
rom->header->align = htonl(align);
|
||||||
rom->header->offset = htonl(0);
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int add_bootblock(struct rom *rom, const char *filename)
|
int add_bootblock(struct rom *rom, const char *filename)
|
||||||
{
|
{
|
||||||
unsigned int size;
|
unsigned int size;
|
||||||
//unsigned int offset;
|
|
||||||
int fd = size_and_open(filename, &size);
|
int fd = size_and_open(filename, &size);
|
||||||
int ret;
|
int ret;
|
||||||
struct cbfs_header tmp;
|
struct cbfs_header tmp;
|
||||||
|
@ -237,11 +237,7 @@ int add_bootblock(struct rom *rom, const char *filename)
|
||||||
return -1;
|
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 */
|
/* 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);
|
ret = copy_from_fd(fd, ROM_PTR(rom, rom->size - ntohl(rom->header->bootblocksize)), size);
|
||||||
|
|
||||||
close(fd);
|
close(fd);
|
||||||
|
@ -251,26 +247,6 @@ int add_bootblock(struct rom *rom, const char *filename)
|
||||||
return -1;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue