summaryrefslogtreecommitdiff
path: root/src/lib/timestamp.c
diff options
context:
space:
mode:
authorAaron Durbin <adurbin@chromium.org>2015-07-10 01:51:14 -0500
committerAaron Durbin <adurbin@chromium.org>2015-07-10 15:23:53 +0200
commitbd1499d338659b5f483793e96c7e0f43c1c11f4d (patch)
tree14520b6ee8bb036d14fa25e75fbae9ef61217c4c /src/lib/timestamp.c
parentacf411d364d013dfc1b60878280ecc3b67bcb072 (diff)
downloadcoreboot-bd1499d338659b5f483793e96c7e0f43c1c11f4d.tar.xz
timestamps: don't drop ramstage timestamps with EARLY_CBMEM_INIT
While running ramstage with the EARLY_CBMEM_INIT config the timestamp cache was re-initialized and subsequently used. The result was that the ramstage timestamps would be dropped from cbmem. The reason is that the ramstage timestamps perpetually lived in ramstage BSS never getting sync'd back into cbmem. The fix is to honor the cache state in ramstage in the timestamp_init() path. Also, make cache_state a fixed bit width to allow for different architectures across the pre-ramstage stages. TEST=Used qemu-armv7 as a test harness with debugging info. Change-Id: Ibb276e513278e81cb741b1e1f6dbd1e8051cc907 Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: http://review.coreboot.org/10880 Tested-by: build bot (Jenkins) Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net> Reviewed-by: Patrick Georgi <pgeorgi@google.com>
Diffstat (limited to 'src/lib/timestamp.c')
-rw-r--r--src/lib/timestamp.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/lib/timestamp.c b/src/lib/timestamp.c
index 51e63b2b85..7ead3831bb 100644
--- a/src/lib/timestamp.c
+++ b/src/lib/timestamp.c
@@ -34,7 +34,7 @@
#define MAX_TIMESTAMP_CACHE 16
struct __attribute__((__packed__)) timestamp_cache {
- int cache_state;
+ uint32_t cache_state;
struct timestamp_table table;
/* The struct timestamp_table has a 0 length array as its last field.
* The following 'entries' array serves as the storage space for the
@@ -199,6 +199,13 @@ void timestamp_init(uint64_t base)
return;
}
+ /* In the EARLY_CBMEM_INIT case timestamps could have already been
+ * recovered. In those circumstances honor the cache which sits in BSS
+ * as it has already been initialized. */
+ if (ENV_RAMSTAGE &&
+ ts_cache->cache_state != TIMESTAMP_CACHE_UNINITIALIZED)
+ return;
+
timestamp_cache_init(ts_cache, base);
}