[coreboot-gerrit] New patch to review for coreboot: de0706b Make elog_shrink not depend on having seperate memory/flash descriptors.

Stefan Reinauer (stefan.reinauer@coreboot.org) gerrit at coreboot.org
Wed Nov 20 02:22:14 CET 2013


Stefan Reinauer (stefan.reinauer at coreboot.org) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/4240

-gerrit

commit de0706b7bc7338b58e53c4116ed4229b9c31393a
Author: Gabe Black <gabeblack at google.com>
Date:   Wed Apr 24 03:16:21 2013 -0700

    Make elog_shrink not depend on having seperate memory/flash descriptors.
    
    The way elog_shrink currently works is that it completely clears the data in
    the flash/flash descriptor and then recreates it using the part of the log
    it's going to keep as stored in the memory descriptor. That scheme depends on
    there being to independent copies of the log.
    
    This change reworks elog_shrink so that it moves the data it wants to keep
    within a single descriptor and then propogates it to the other and to flash
    intact. This way, when one of the descriptors goes away, all we have to do is
    remove the code that would update it.
    
    Built and booted into ChromeOS on Link. Ran mosys eventlog list. Added
    2000 events to the log and ran mosys eventlog list again. Echoed a 1 into
    /sys/firmware/gsmi/clear_eventlog and ran mosys eventlog list.
    BRANCH=None
    
    Change-Id: I50d77a4f00ea3c6b3e0ec8996dab1a3b31580205
    Signed-off-by: Gabe Black <gabeblack at google.com>
    Reviewed-on: https://gerrit.chromium.org/gerrit/49305
    Reviewed-by: Duncan Laurie <dlaurie at chromium.org>
    Commit-Queue: Gabe Black <gabeblack at chromium.org>
    Tested-by: Gabe Black <gabeblack at chromium.org>
---
 src/drivers/elog/elog.c | 25 ++++++++++++-------------
 1 file changed, 12 insertions(+), 13 deletions(-)

diff --git a/src/drivers/elog/elog.c b/src/drivers/elog/elog.c
index fd638a5..ab255d8 100644
--- a/src/drivers/elog/elog.c
+++ b/src/drivers/elog/elog.c
@@ -621,9 +621,11 @@ static int elog_flash_area_bootstrap(void)
 static int elog_shrink(void)
 {
 	struct elog_descriptor *mem = elog_get_mem();
+	struct elog_descriptor *flash = elog_get_flash();
 	struct event_header *event;
 	u16 discard_count = 0;
 	u16 offset = 0;
+	u16 new_size = 0;
 
 	elog_debug("elog_shrink()\n");
 
@@ -645,25 +647,22 @@ static int elog_shrink(void)
 		discard_count++;
 	}
 
-	/* Erase flash area */
-	elog_flash_erase_area();
+	new_size = mem->next_event_offset - offset;
+	memmove(&mem->data[0], &mem->data[offset], new_size);
+	memset(&mem->data[new_size], ELOG_TYPE_EOL, mem->data_size - new_size);
+	elog_reinit_descriptor(mem);
+
+	elog_flash_erase(flash->backing_store, flash->total_size);
 
 	/* Ensure the area was successfully erased */
-	if (elog_get_flash()->next_event_offset >= CONFIG_ELOG_FULL_THRESHOLD) {
+	if (mem->next_event_offset >= CONFIG_ELOG_FULL_THRESHOLD) {
 		printk(BIOS_ERR, "ELOG: Flash area was not erased!\n");
 		return -1;
 	}
 
-	/* Write new flash area */
-	elog_prepare_empty(elog_get_flash(),
-			   (u8*)elog_get_event_base(mem, offset),
-			   mem->next_event_offset - offset);
-
-	/* Update memory area from flash */
-	if (elog_sync_flash_to_mem() < 0) {
-		printk(BIOS_ERR, "Unable to update memory area from flash\n");
-		return -1;
-	}
+	elog_flash_write(flash->backing_store, mem->backing_store,
+			 mem->total_size);
+	elog_reinit_descriptor(flash);
 
 	/* Add clear event */
 	elog_add_event_word(ELOG_TYPE_LOG_CLEAR, offset);



More information about the coreboot-gerrit mailing list