[coreboot] New patch to review for coreboot: da023a4 cbmem utility: Find actual CBMEM area

Stefan Reinauer (stefan.reinauer@coreboot.org) gerrit at coreboot.org
Tue Jan 8 01:28:36 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/2117

-gerrit

commit da023a4f3c6a5bc89b1b0590fb8a28c4c67c0dbc
Author: Stefan Reinauer <stefan.reinauer at coreboot.org>
Date:   Mon Jan 7 16:26:10 2013 -0800

    cbmem utility: Find actual CBMEM area
    
    without the need for a coreboot table entry for each of them.
    
    WIP. This will be used to extract code coverage data
    
    Change-Id: I2917710fb9d00c4533d81331a362bf0c40a30353
    Signed-off-by: Stefan Reinauer <reinauer at google.com>
---
 util/cbmem/cbmem.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 61 insertions(+), 1 deletion(-)

diff --git a/util/cbmem/cbmem.c b/util/cbmem/cbmem.c
index 4c0bd68..269a29c 100644
--- a/util/cbmem/cbmem.c
+++ b/util/cbmem/cbmem.c
@@ -118,6 +118,7 @@ static void unmap_memory(void)
 
 static struct lb_cbmem_ref timestamps;
 static struct lb_cbmem_ref console;
+static struct lb_memory_range cbmem;
 
 static int parse_cbtable(u64 address)
 {
@@ -157,6 +158,22 @@ static int parse_cbtable(u64 address)
 			lbr_p = (struct lb_record*) ((char *)lbtable + j);
 			debug("  coreboot table entry 0x%02x\n", lbr_p->tag);
 			switch (lbr_p->tag) {
+			case LB_TAG_MEMORY: {
+				int i = 0;
+				debug("    Found memory map.\n");
+				struct lb_memory *memory =
+						(struct lb_memory *)lbr_p;
+				while ((char *)&memory->map[i] < ((char *)lbtable
+							    + lbr_p->size)) {
+					if (memory->map[i].type == LB_MEM_TABLE) {
+						debug("      LB_MEM_TABLE found.\n");
+						/* The last one found is CBMEM */
+						cbmem = memory->map[i];
+					}
+					i++;
+				}
+				continue;
+			}
 			case LB_TAG_TIMESTAMPS: {
 				debug("Found timestamp table\n");
 				timestamps = *(struct lb_cbmem_ref *) lbr_p;
@@ -319,6 +336,39 @@ static void dump_console(void)
 	unmap_memory();
 }
 
+#define CBMEM_MAGIC 0x434f5245
+#define MAX_CBMEM_ENTRIES 16
+
+struct cbmem_entry {
+	uint32_t magic;
+	uint32_t id;
+	uint64_t base;
+	uint64_t size;
+};
+
+void dump_cbmem_toc(void)
+{
+	int i;
+	uint64_t start;
+	struct cbmem_entry *entries;
+
+	if (cbmem.type != LB_MEM_TABLE) {
+		fprintf(stderr, "No coreboot table area found!\n");
+		return;
+	}
+
+	start = unpack_lb64(cbmem.start);
+
+	entries = (struct cbmem_entry *)map_memory(start);
+
+	for (i=0; i<MAX_CBMEM_ENTRIES; i++) {
+		if (entries[i].magic != CBMEM_MAGIC)
+			break;
+		printf("CBMEM entry %d %08x\n",
+			i, entries[i].id);
+	}
+	unmap_memory();
+}
 
 void print_version(void)
 {
@@ -341,6 +391,7 @@ void print_usage(const char *name)
 	printf("usage: %s [-vh?]\n", name);
 	printf("\n"
 	     "   -c | --console:                   print cbmem console\n"
+	     "   -l | --list:                      print cbmem table of contents\n"
 	     "   -t | --timestamps:                print timestamp information\n"
 	     "   -V | --verbose:                   verbose (debugging) output\n"
 	     "   -v | --version:                   print the version\n"
@@ -356,24 +407,30 @@ int main(int argc, char** argv)
 
 	int print_defaults = 1;
 	int print_console = 0;
+	int print_list = 0;
 	int print_timestamps = 0;
 
 	int opt, option_index = 0;
 	static struct option long_options[] = {
 		{"console", 0, 0, 'c'},
+		{"list", 0, 0, 'l'},
 		{"timestamps", 0, 0, 't'},
 		{"verbose", 0, 0, 'V'},
 		{"version", 0, 0, 'v'},
 		{"help", 0, 0, 'h'},
 		{0, 0, 0, 0}
 	};
-	while ((opt = getopt_long(argc, argv, "ctVvh?",
+	while ((opt = getopt_long(argc, argv, "cltVvh?",
 				  long_options, &option_index)) != EOF) {
 		switch (opt) {
 		case 'c':
 			print_console = 1;
 			print_defaults = 0;
 			break;
+		case 'l':
+			print_list = 1;
+			print_defaults = 0;
+			break;
 		case 't':
 			print_timestamps = 1;
 			print_defaults = 0;
@@ -410,6 +467,9 @@ int main(int argc, char** argv)
 	if (print_console)
 		dump_console();
 
+	if (print_list)
+		dump_cbmem_toc();
+
 	if (print_defaults || print_timestamps)
 		dump_timestamps();
 



More information about the coreboot mailing list