[coreboot-gerrit] New patch to review for coreboot: lib/selfboot: clear BSS segments

Aaron Durbin (adurbin@chromium.org) gerrit at coreboot.org
Mon Jul 11 22:40:21 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 7b28cbd4936f29e58e6cd03215b96db14bdee42a
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 | 23 ++++++++++-------------
 1 file changed, 10 insertions(+), 13 deletions(-)

diff --git a/src/lib/selfboot.c b/src/lib/selfboot.c
index 832dad5..5649d2f 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,16 @@ 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,
+				prt->next == head ? SEG_FINAL : 0);
 	}
 
 	return 1;



More information about the coreboot-gerrit mailing list