[coreboot-gerrit] Patch set updated for coreboot: util/cbmem: Add --rawdump <cbtable ID> and extend -l output

Patrick Georgi (pgeorgi@google.com) gerrit at coreboot.org
Thu Nov 19 17:29:30 CET 2015


Patrick Georgi (pgeorgi at google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/12482

-gerrit

commit 9fc3515be20bb7b33b18d81a1070b15c9a0d5d70
Author: Pratik Prajapati <pratikkumar.v.prajapati at intel.com>
Date:   Thu Sep 3 12:58:44 2015 -0700

    util/cbmem: Add --rawdump <cbtable ID> and extend -l output
    
    Changed following things,
    
    (1) cbmem -l would give both ID and Name for coreboot table along with
    START and LENGTH of each entry
    
    e.g.
    localhost ~ # cbmem -l
    CBMEM table of contents:
        NAME          ID           START      LENGTH
    <.....>
     3. TIME STAMP  54494d45  77ddd000   000002e0
     4. MRC DATA    4d524344  77ddb000   00001880
     5. ROMSTG STCK 90357ac4  77dd6000   00005000
     6. VBOOT WORK  78007343  77dd2000   00004000
     7. VBOOT       780074f0  77dd1000   00000c3c
     8. RAMSTAGE    9a357a9e  77d13000   000be000
     9. REFCODE     04efc0de  77c01000   00112000
    10. ACPI GNVS   474e5653  77c00000   00001000
    11. SMM BACKUP  07e9acee  77bf0000   00010000
    <..etc..>
    
    (2) With this patch, new command line arg "rawdump" or "-r" will be
    added to cbmem
    
    user can grab the ID with "cbmem -l" and execute "cbmem -r <ID>" to get
    raw dump of cbtable for the <ID> in interest.
    
    This change is needed to get MMA results data from cbtable. Coreboot
    stores the MMA results in cbmem. Separate post processing scripts uses
    cbmem utility to get the these data.
    
    This feature in the cbmem tool can also help debugging some issues where
    some specific ID of cbtable needs examination.
    
    BRANCH=none
    BUG=chrome-os-partner:43731
    TEST=Build and Boot kunimitsu (FAB3). Cbmem -r and -l works as described.
    Not tested on Glados
    
    CQ-DEPEND=CL:299476,CL:299475,CL:299473,CL:299509,CL:299508,CL:299507,CL:*230478,CL:*230479
    
    Change-Id: I70ba148113b4e918646b99997a9074300a9c7876
    Signed-off-by: Patrick Georgi <pgeorgi at chromium.org>
    Original-Commit-Id: f60c79d845d4d4afca480b6884c564a0d5e5caf8
    Original-Change-Id: I1dde50856f0aa8d4cdd3ecf013bd58d37d76eb72
    Original-Signed-off-by: Pratik Prajapati <pratikkumar.v.prajapati at intel.com>
    Original-Signed-off-by: Icarus Sparry <icarus.w.sparry at intel.com>
    Original-Reviewed-on: https://chromium-review.googlesource.com/299474
    Original-Commit-Ready: Pratikkumar V Prajapati <pratikkumar.v.prajapati at intel.com>
    Original-Tested-by: Pratikkumar V Prajapati <pratikkumar.v.prajapati at intel.com>
    Original-Reviewed-by: Aaron Durbin <adurbin at chromium.org>
    Original-Reviewed-by: Pratikkumar V Prajapati <pratikkumar.v.prajapati at intel.com>
---
 util/cbmem/cbmem.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 72 insertions(+), 3 deletions(-)

diff --git a/util/cbmem/cbmem.c b/util/cbmem/cbmem.c
index 3c7f49b..ac8cb2a 100644
--- a/util/cbmem/cbmem.c
+++ b/util/cbmem/cbmem.c
@@ -759,6 +759,63 @@ static void dump_cbmem_hex(void)
 	hexdump(unpack_lb64(cbmem.start), unpack_lb64(cbmem.size));
 }
 
+void rawdump(uint64_t base, uint64_t size)
+{
+	int i;
+	uint8_t *m;
+
+	m = map_memory_size((intptr_t)base, size, 1);
+	if (!m) {
+		fprintf(stderr, "Failed to map memory");
+		return;
+	}
+
+	for (i = 0 ; i < size; i++)
+		printf("%c", m[i]);
+	unmap_memory();
+}
+
+static void dump_cbmem_raw(unsigned int id)
+{
+	uint8_t *table;
+	size_t offset;
+	uint64_t base = 0;
+	uint64_t size = 0;
+
+	table = map_lbtable();
+
+	if (table == NULL)
+		return;
+
+	offset = 0;
+
+	while (offset < lbtable_size) {
+		struct lb_record *lbr;
+		struct lb_cbmem_entry *lbe;
+
+		lbr = (void *)(table + offset);
+		offset += lbr->size;
+
+		if (lbr->tag != LB_TAG_CBMEM_ENTRY)
+			continue;
+
+		lbe = (void *)lbr;
+		if (lbe->id == id) {
+			debug("found id for raw dump %0x", lbe->id);
+			base = lbe->address;
+			size = lbe->entry_size;
+			break;
+		}
+	}
+
+	unmap_lbtable();
+
+	if (!base)
+		fprintf(stderr, "id %0x not found in cbtable\n", id);
+	else
+		rawdump(base, size);
+}
+
 struct cbmem_id_to_name {
 	uint32_t id;
 	const char *name;
@@ -782,7 +839,7 @@ void cbmem_print_entry(int n, uint32_t id, uint64_t base, uint64_t size)
 	if (name == NULL)
 		printf("%08x ", id);
 	else
-		printf("%s", name);
+		printf("%s\t%08x", name, id);
 	printf("  %08" PRIx64 " ", base);
 	printf("  %08" PRIx64 "\n", size);
 }
@@ -799,7 +856,7 @@ static void dump_cbmem_toc(void)
 		return;
 
 	printf("CBMEM table of contents:\n");
-	printf("    ID           START      LENGTH\n");
+	printf("    NAME          ID           START      LENGTH\n");
 
 	i = 0;
 	offset = 0;
@@ -927,6 +984,7 @@ static void print_usage(const char *name)
 	     "   -C | --coverage:                  dump coverage information\n"
 	     "   -l | --list:                      print cbmem table of contents\n"
 	     "   -x | --hexdump:                   print hexdump of cbmem area\n"
+	     "   -r | --rawdump ID:                print rawdump of specific ID (in hex) of cbtable\n"
 	     "   -t | --timestamps:                print timestamp information\n"
 	     "   -T | --parseable-timestamps:      print parseable timestamps\n"
 	     "   -V | --verbose:                   verbose (debugging) output\n"
@@ -1058,8 +1116,10 @@ int main(int argc, char** argv)
 	int print_coverage = 0;
 	int print_list = 0;
 	int print_hexdump = 0;
+	int print_rawdump = 0;
 	int print_timestamps = 0;
 	int machine_readable_timestamps = 0;
+	unsigned int rawdump_id = 0;
 
 	int opt, option_index = 0;
 	static struct option long_options[] = {
@@ -1069,12 +1129,13 @@ int main(int argc, char** argv)
 		{"timestamps", 0, 0, 't'},
 		{"parseable-timestamps", 0, 0, 'T'},
 		{"hexdump", 0, 0, 'x'},
+		{"rawdump", required_argument, 0, 'r'},
 		{"verbose", 0, 0, 'V'},
 		{"version", 0, 0, 'v'},
 		{"help", 0, 0, 'h'},
 		{0, 0, 0, 0}
 	};
-	while ((opt = getopt_long(argc, argv, "cCltTxVvh?",
+	while ((opt = getopt_long(argc, argv, "cCltTxVvh?r:",
 				  long_options, &option_index)) != EOF) {
 		switch (opt) {
 		case 'c':
@@ -1093,6 +1154,11 @@ int main(int argc, char** argv)
 			print_hexdump = 1;
 			print_defaults = 0;
 			break;
+		case 'r':
+			print_rawdump = 1;
+			print_defaults = 0;
+			rawdump_id = strtoul(optarg, NULL, 16);
+			break;
 		case 't':
 			print_timestamps = 1;
 			print_defaults = 0;
@@ -1200,6 +1266,9 @@ int main(int argc, char** argv)
 	if (print_hexdump)
 		dump_cbmem_hex();
 
+	if (print_rawdump)
+		dump_cbmem_raw(rawdump_id);
+
 	if (print_defaults || print_timestamps)
 		dump_timestamps(machine_readable_timestamps);
 



More information about the coreboot-gerrit mailing list