[coreboot-gerrit] Patch set updated for coreboot: lib/selfboot: clear BSS segments
Aaron Durbin (adurbin@chromium.org)
gerrit at coreboot.org
Mon Jul 11 22:44:59 CEST 2016
Aaron Durbin (adurbin at chromium.org) just uploaded a new patch set to gerrit, which you can find at https://review.coreboot.org/15603
-gerrit
commit dd2175e4938c1bff280b02f641c8a33af296d945
Author: Aaron Durbin <adurbin at chromium.org>
Date: Mon Jul 11 15:36:50 2016 -0500
lib/selfboot: clear BSS segments
For some reason the self loader wasn't clearing segments
marked as BSS type. Other segments which weren't fully
written by the file-backed content were being cleared up
to the indicated memsize. Treat segments marked BSS
similarly by clearing their content.
Change-Id: I9296c11a89455a02e5dd18bba13d4911517c04f6
Signed-off-by: Aaron Durbin <adurbin at chromium.org>
---
src/lib/selfboot.c | 24 +++++++++++-------------
1 file changed, 11 insertions(+), 13 deletions(-)
diff --git a/src/lib/selfboot.c b/src/lib/selfboot.c
index 832dad5..1b4b139 100644
--- a/src/lib/selfboot.c
+++ b/src/lib/selfboot.c
@@ -296,6 +296,7 @@ static int build_self_segment_list(
+ segment.offset;
new->s_dstaddr = segment.load_addr;
new->s_memsz = segment.mem_len;
+ new->compression = CBFS_COMPRESS_NONE;
break;
case PAYLOAD_SEGMENT_ENTRY:
@@ -332,16 +333,9 @@ static int load_self_segments(
struct prog *payload)
{
struct segment *ptr;
- struct segment *last_non_empty;
const unsigned long one_meg = (1UL << 20);
unsigned long bounce_high = lb_end;
- /* Determine last non-empty loaded segment. */
- last_non_empty = NULL;
- for(ptr = head->next; ptr != head; ptr = ptr->next)
- if (ptr->s_filesz != 0)
- last_non_empty = ptr;
-
for(ptr = head->next; ptr != head; ptr = ptr->next) {
if (bootmem_region_targets_usable_ram(ptr->s_dstaddr,
ptr->s_memsz))
@@ -470,13 +464,17 @@ static int load_self_segments(
}
}
- /*
- * Each architecture can perform additonal operations
- * on the loaded segment
- */
- prog_segment_loaded((uintptr_t)dest, ptr->s_memsz,
- last_non_empty == ptr ? SEG_FINAL : 0);
+ } else {
+ /* BSS segment */
+ memset(dest, 0, ptr->s_memsz);
}
+
+ /*
+ * Each architecture can perform additonal operations
+ * on the loaded segment
+ */
+ prog_segment_loaded((uintptr_t)dest, ptr->s_memsz,
+ ptr->next == head ? SEG_FINAL : 0);
}
return 1;
More information about the coreboot-gerrit
mailing list