summaryrefslogtreecommitdiff
path: root/util/cbfstool/cbfstool.c
diff options
context:
space:
mode:
Diffstat (limited to 'util/cbfstool/cbfstool.c')
-rw-r--r--util/cbfstool/cbfstool.c32
1 files changed, 23 insertions, 9 deletions
diff --git a/util/cbfstool/cbfstool.c b/util/cbfstool/cbfstool.c
index 77dbf72e97..1f71906ef6 100644
--- a/util/cbfstool/cbfstool.c
+++ b/util/cbfstool/cbfstool.c
@@ -27,6 +27,7 @@
#include "cbfs.h"
#include "cbfs_image.h"
#include "cbfs_sections.h"
+#include "elfparsing.h"
#include "fit.h"
#include "partitioned_file.h"
#include <commonlib/fsp.h>
@@ -147,7 +148,8 @@ static unsigned convert_to_from_top_aligned(const struct buffer *region,
return convert_to_from_absolute_top_aligned(region, offset);
}
-static int do_cbfs_locate(int32_t *cbfs_addr, size_t metadata_size)
+static int do_cbfs_locate(int32_t *cbfs_addr, size_t metadata_size,
+ size_t data_size)
{
if (!param.filename) {
ERROR("You need to specify -f/--filename.\n");
@@ -167,12 +169,18 @@ static int do_cbfs_locate(int32_t *cbfs_addr, size_t metadata_size)
if (cbfs_get_entry(&image, param.name))
WARN("'%s' already in CBFS.\n", param.name);
- struct buffer buffer;
- if (buffer_from_file(&buffer, param.filename) != 0) {
- ERROR("Cannot load %s.\n", param.filename);
- return 1;
+ if (!data_size) {
+ struct buffer buffer;
+ if (buffer_from_file(&buffer, param.filename) != 0) {
+ ERROR("Cannot load %s.\n", param.filename);
+ return 1;
+ }
+ data_size = buffer.size;
+ buffer_delete(&buffer);
}
+ DEBUG("File size is %zd (0x%zx)\n", data_size, data_size);
+
/* Include cbfs_file size along with space for with name. */
metadata_size += cbfs_calculate_file_header_size(param.name);
/* Adjust metadata_size if additional attributes were added */
@@ -187,9 +195,8 @@ static int do_cbfs_locate(int32_t *cbfs_addr, size_t metadata_size)
if (param.hash != VB2_HASH_INVALID)
metadata_size += sizeof(struct cbfs_file_attr_hash);
- int32_t address = cbfs_locate_entry(&image, buffer.size, param.pagesize,
+ int32_t address = cbfs_locate_entry(&image, data_size, param.pagesize,
param.alignment, metadata_size);
- buffer_delete(&buffer);
if (address == -1) {
ERROR("'%s' can't fit in CBFS for page-size %#x, align %#x.\n",
@@ -579,8 +586,15 @@ static int cbfstool_convert_mkstage(struct buffer *buffer, uint32_t *offset,
if (param.stage_xip) {
int32_t address;
+ size_t data_size;
+
+ if (elf_program_file_size(buffer, &data_size) < 0) {
+ ERROR("Could not obtain ELF size\n");
+ return 1;
+ }
- if (do_cbfs_locate(&address, sizeof(struct cbfs_stage))) {
+ if (do_cbfs_locate(&address, sizeof(struct cbfs_stage),
+ data_size)) {
ERROR("Could not find location for XIP stage.\n");
return 1;
}
@@ -684,7 +698,7 @@ static int cbfs_add(void)
if (param.alignment) {
/* CBFS compression file attribute is unconditionally added. */
size_t metadata_sz = sizeof(struct cbfs_file_attr_compression);
- if (do_cbfs_locate(&address, metadata_sz))
+ if (do_cbfs_locate(&address, metadata_sz, 0))
return 1;
local_baseaddress = address;
}