summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/binman/ftest.py20
-rw-r--r--tools/fit_image.c58
2 files changed, 56 insertions, 22 deletions
diff --git a/tools/binman/ftest.py b/tools/binman/ftest.py
index 21ec48d86fd..a53e37f31b3 100644
--- a/tools/binman/ftest.py
+++ b/tools/binman/ftest.py
@@ -4073,7 +4073,7 @@ class TestFunctional(unittest.TestCase):
external_data_size = len(U_BOOT_DATA) + 2
expected_size = (len(U_BOOT_DATA) + 0x400 +
tools.align(external_data_size, 4) +
- len(U_BOOT_NODTB_DATA))
+ len(U_BOOT_NODTB_DATA) + 8)
# The data should be outside the FIT
dtb = fdt.Fdt.FromData(fit_data)
@@ -4089,8 +4089,8 @@ class TestFunctional(unittest.TestCase):
self.assertEqual(expected_size, len(data))
actual_pos = len(U_BOOT_DATA) + fit_pos
- self.assertEqual(U_BOOT_DATA + b'aa',
- data[actual_pos:actual_pos + external_data_size])
+ self.assertEqual(U_BOOT_DATA + b'\x00\x00\x00\x00aa',
+ data[actual_pos:actual_pos + 4 + external_data_size])
def testFitExternalImagePos(self):
"""Test that we have correct image-pos for external FIT subentries"""
@@ -4103,13 +4103,13 @@ class TestFunctional(unittest.TestCase):
self.assertEqual({
'image-pos': 0,
'offset': 0,
- 'size': 1082,
+ 'size': 1090,
'u-boot:image-pos': 0,
'u-boot:offset': 0,
'u-boot:size': 4,
- 'fit:size': 1032,
+ 'fit:size': 1040,
'fit:offset': 4,
'fit:image-pos': 4,
@@ -4122,15 +4122,15 @@ class TestFunctional(unittest.TestCase):
'fit/images/kernel/u-boot:image-pos': 1028,
'fit/images/fdt-1:size': 2,
- 'fit/images/fdt-1:offset': 1028,
- 'fit/images/fdt-1:image-pos': 1032,
+ 'fit/images/fdt-1:offset': 1032,
+ 'fit/images/fdt-1:image-pos': 1036,
'fit/images/fdt-1/_testing:size': 2,
'fit/images/fdt-1/_testing:offset': 0,
- 'fit/images/fdt-1/_testing:image-pos': 1032,
+ 'fit/images/fdt-1/_testing:image-pos': 1036,
- 'u-boot-nodtb:image-pos': 1036,
- 'u-boot-nodtb:offset': 1036,
+ 'u-boot-nodtb:image-pos': 1044,
+ 'u-boot-nodtb:offset': 1044,
'u-boot-nodtb:size': 46,
}, props)
diff --git a/tools/fit_image.c b/tools/fit_image.c
index e865f65a400..1dbc14c63e4 100644
--- a/tools/fit_image.c
+++ b/tools/fit_image.c
@@ -651,10 +651,9 @@ static int fit_extract_data(struct image_tool_params *params, const char *fname)
int ret;
int images;
int node;
- int image_number;
- int align_size;
+ int align_size = 0;
+ int len = 0;
- align_size = params->bl_len ? params->bl_len : 4;
fd = mmap_fdt(params->cmdname, fname, 0, &fdt, &sbuf, false, false);
if (fd < 0)
return -EIO;
@@ -666,24 +665,58 @@ static int fit_extract_data(struct image_tool_params *params, const char *fname)
ret = -EINVAL;
goto err_munmap;
}
- image_number = fdtdec_get_child_count(fdt, images);
+
+ /* Add up all the alignments, we no longer need to count images. */
+ fdt_for_each_subnode(node, fdt, images) {
+ const char *type;
+ int len;
+
+ if (params->bl_len) {
+ align_size += params->bl_len;
+ continue;
+ }
+
+ type = fdt_getprop(fdt, node, FIT_TYPE_PROP, &len);
+ if (type && len == sizeof("flat_dt") && !memcmp(type, "flat_dt", len)) {
+ align_size += 8;
+ continue;
+ }
+
+ /* Default alignment to 4 Bytes */
+ align_size += 4;
+ }
/*
* Allocate space to hold the image data we will extract,
* extral space allocate for image alignment to prevent overflow.
*/
- buf = calloc(1, fit_size + (align_size * image_number));
+ buf = calloc(1, fit_size + align_size);
if (!buf) {
ret = -ENOMEM;
goto err_munmap;
}
buf_ptr = 0;
- for (node = fdt_first_subnode(fdt, images);
- node >= 0;
- node = fdt_next_subnode(fdt, node)) {
- const char *data;
- int len;
+ fdt_for_each_subnode(node, fdt, images) {
+ const char *data, *type;
+ int pl;
+
+ if (params->bl_len) {
+ align_size = params->bl_len;
+ } else {
+ type = fdt_getprop(fdt, node, FIT_TYPE_PROP, &pl);
+ if (type && pl == sizeof("flat_dt") && !memcmp(type, "flat_dt", pl))
+ align_size = 8;
+ else /* Default alignment to 4 Bytes */
+ align_size = 4;
+ }
+
+ /*
+ * The 'len' is 0 in the first round, so 'buf_ptr' is
+ * not incremented. Otherwise, 'len' is passed over
+ * from the previous round.
+ */
+ buf_ptr += ALIGN(len, align_size);
data = fdt_getprop(fdt, node, FIT_DATA_PROP, &len);
if (!data)
@@ -716,10 +749,11 @@ static int fit_extract_data(struct image_tool_params *params, const char *fname)
ret = -EINVAL;
goto err_munmap;
}
-
- buf_ptr += ALIGN(len, align_size);
}
+ /* Increment 'buf_ptr' for the trailing image. */
+ buf_ptr += ALIGN(len, align_size);
+
/* Pack the FDT and place the data after it */
fdt_pack(fdt);