cbfstool: Support top-aligned addresses for new-format images
The cbfstool handling of new-style FMAP-driven "partitioned" images originally disallowed the use of x86-style top-aligned addresses with the add.* and layout actions because it wasn't obvious how they should work, especially since the normal addressing is done relative to each individual region for these types of images. Not surprisingly, however, the x86 portions of the build system make copious use of top-aligned addresses, so this allows their use with new images and specifies their behavior as being relative to the *image* end---not the region end---just as it is for legacy images. Change-Id: Icecc843f4f8b6bb52aa0ea16df771faa278228d2 Signed-off-by: Sol Boucher <solb@chromium.org> Reviewed-on: http://review.coreboot.org/10136 Tested-by: build bot (Jenkins) Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
This commit is contained in:
committed by
Stefan Reinauer
parent
67a0a864be
commit
67d5998d97
@@ -526,6 +526,12 @@ static int cbfs_add_entry_at(struct cbfs_image *image,
|
||||
int cbfs_add_entry(struct cbfs_image *image, struct buffer *buffer,
|
||||
const char *name, uint32_t type, uint32_t content_offset)
|
||||
{
|
||||
assert(image);
|
||||
assert(buffer);
|
||||
assert(buffer->data);
|
||||
assert(name);
|
||||
assert(!IS_TOP_ALIGNED_ADDRESS(content_offset));
|
||||
|
||||
uint32_t entry_type;
|
||||
uint32_t addr, addr_next;
|
||||
struct cbfs_file *entry, *next;
|
||||
@@ -537,19 +543,6 @@ int cbfs_add_entry(struct cbfs_image *image, struct buffer *buffer,
|
||||
DEBUG("cbfs_add_entry('%s'@0x%x) => need_size = %u+%zu=%u\n",
|
||||
name, content_offset, header_size, buffer->size, need_size);
|
||||
|
||||
if (IS_TOP_ALIGNED_ADDRESS(content_offset)) {
|
||||
if (!cbfs_is_legacy_cbfs(image)) {
|
||||
ERROR("Top-aligned offsets are only supported for legacy CBFSes (with master headers)\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
// legacy cbfstool takes top-aligned address.
|
||||
uint32_t theromsize = image->header.romsize;
|
||||
INFO("Converting top-aligned address 0x%x to offset: 0x%x\n",
|
||||
content_offset, content_offset + theromsize);
|
||||
content_offset = theromsize + (int32_t)content_offset;
|
||||
}
|
||||
|
||||
// Merge empty entries.
|
||||
DEBUG("(trying to merge empty entries...)\n");
|
||||
cbfs_walk(image, cbfs_merge_empty_entry, NULL);
|
||||
|
Reference in New Issue
Block a user