Nico Huber merged this change.

View Change

Approvals: build bot (Jenkins): Verified Philipp Deppenwiese: Looks good to me, approved
Fix verification with sparse layouts

The full verification step was not accounting for sparse layouts.
Instead of the old contents, combine_image_by_layout() implicitly
assumed the new contents for unspecified regions.

Change-Id: I44e0cea621f2a3d4dc70fa7e93c52ed95e54014a
Signed-off-by: Nico Huber <nico.h@gmx.de>
Reviewed-on: https://review.coreboot.org/c/flashrom/+/30370
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Philipp Deppenwiese <zaolin.daisuki@gmail.com>
---
M flashrom.c
M layout.c
M layout.h
3 files changed, 34 insertions(+), 9 deletions(-)

diff --git a/flashrom.c b/flashrom.c
index b9e2b41..135cc3e 100644
--- a/flashrom.c
+++ b/flashrom.c
@@ -2430,17 +2430,23 @@
uint8_t *const newcontents, const uint8_t *const oldcontents)
{
const struct flashrom_layout *const layout = get_layout(flashctx);
+ const struct romentry *included;
+ chipoff_t start = 0;

- size_t i;
- for (i = 0; i < layout->num_entries; ++i) {
- if (layout->entries[i].included)
- continue;
-
- const chipoff_t region_start = layout->entries[i].start;
- const chipsize_t region_len = layout->entries[i].end - layout->entries[i].start + 1;
-
- memcpy(newcontents + region_start, oldcontents + region_start, region_len);
+ while ((included = layout_next_included_region(layout, start))) {
+ if (included->start > start) {
+ /* copy everything up to the start of this included region */
+ memcpy(newcontents + start, oldcontents + start, included->start - start);
+ }
+ /* skip this included region */
+ start = included->end + 1;
+ if (start == 0)
+ return;
}
+
+ /* copy the rest of the chip */
+ const chipsize_t copy_len = flashctx->chip->total_size * 1024 - start;
+ memcpy(newcontents + start, oldcontents + start, copy_len);
}

/**
diff --git a/layout.c b/layout.c
index e10bb73..5080e3e 100644
--- a/layout.c
+++ b/layout.c
@@ -227,3 +227,21 @@

return ret;
}
+
+const struct romentry *layout_next_included_region(
+ const struct flashrom_layout *const l, const chipoff_t where)
+{
+ unsigned int i;
+ const struct romentry *lowest = NULL;
+
+ for (i = 0; i < l->num_entries; ++i) {
+ if (!l->entries[i].included)
+ continue;
+ if (l->entries[i].end < where)
+ continue;
+ if (!lowest || lowest->start > l->entries[i].start)
+ lowest = &l->entries[i];
+ }
+
+ return lowest;
+}
diff --git a/layout.h b/layout.h
index 770224b..5c07407 100644
--- a/layout.h
+++ b/layout.h
@@ -59,5 +59,6 @@
const struct flashrom_layout *get_layout(const struct flashrom_flashctx *const flashctx);

int process_include_args(struct flashrom_layout *);
+const struct romentry *layout_next_included_region(const struct flashrom_layout *, chipoff_t);

#endif /* !__LAYOUT_H__ */

To view, visit change 30370. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: flashrom
Gerrit-Branch: master
Gerrit-Change-Id: I44e0cea621f2a3d4dc70fa7e93c52ed95e54014a
Gerrit-Change-Number: 30370
Gerrit-PatchSet: 7
Gerrit-Owner: Nico Huber <nico.h@gmx.de>
Gerrit-Reviewer: Arthur Heymans <arthur@aheymans.xyz>
Gerrit-Reviewer: David Hendricks <david.hendricks@gmail.com>
Gerrit-Reviewer: Nico Huber <nico.h@gmx.de>
Gerrit-Reviewer: Philipp Deppenwiese <zaolin.daisuki@gmail.com>
Gerrit-Reviewer: build bot (Jenkins) <no-reply@coreboot.org>
Gerrit-CC: Paul Menzel <paulepanter@users.sourceforge.net>
Gerrit-CC: Thomas Heijligen <src@posteo.de>
Gerrit-MessageType: merged