Vladimir Serbinenko (phcoder@gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/6744
-gerrit
commit adb002d651754f851a011004d8773dba056ec5f3 Author: Vladimir Serbinenko phcoder@gmail.com Date: Fri Aug 22 23:38:45 2014 +0200
lbtdump: Allow printing only relevant info
Change-Id: I8d4c26cc01a112c8f9c7de09da4fa06cfa77a9ac Signed-off-by: Vladimir Serbinenko phcoder@gmail.com --- util/lbtdump/lbtdump.c | 79 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 64 insertions(+), 15 deletions(-)
diff --git a/util/lbtdump/lbtdump.c b/util/lbtdump/lbtdump.c index c5e4f28..34d1165 100644 --- a/util/lbtdump/lbtdump.c +++ b/util/lbtdump/lbtdump.c @@ -7,9 +7,14 @@ #include <string.h> #include <errno.h> #include <sys/mman.h> +#include <getopt.h> #include "../../src/include/boot/coreboot_tables.h"
-uint64_t print_lb_records(struct lb_record *rec, struct lb_record *last, unsigned long addr); +#define PRINT_ALL 0xffffffff + +static int verbose = 0; + +uint64_t print_lb_records(struct lb_record *rec, struct lb_record *last, unsigned long addr, uint32_t target);
unsigned long compute_checksum(void *addr, unsigned long length) { @@ -72,8 +77,9 @@ struct lb_header *find_lb_table(void *base, unsigned long start, unsigned long e struct lb_record *recs = (struct lb_record *)(((char*)base) + addr + sizeof(*head)); if (memcmp(head->signature, "LBIO", 4) != 0) continue; - fprintf(stdout, "Found candidate at: %08lx-%08lx\n", - addr, addr + head->table_bytes); + if (verbose) + fprintf(stdout, "Found candidate at: %08lx-%08lx\n", + addr, addr + head->table_bytes); if (head->header_bytes != sizeof(*head)) { fprintf(stderr, "Header bytes of %d are incorrect\n", head->header_bytes); @@ -94,7 +100,8 @@ struct lb_header *find_lb_table(void *base, unsigned long start, unsigned long e head->table_checksum); continue; } - fprintf(stdout, "Found coreboot table at: %08lx\n", addr); + if (verbose) + fprintf(stdout, "Found coreboot table at: %08lx\n", addr); return head;
}; @@ -196,7 +203,7 @@ void print_option_table(struct lb_record *ptr, unsigned long addr) last = (struct lb_record *)(((char *)hdr) + hdr->size); printf("cmos option header record = type %d, size %d, header length %d\n", hdr->tag, hdr->size, hdr->header_length); - print_lb_records(rec, last, addr + hdr->header_length); + print_lb_records(rec, last, addr + hdr->header_length, PRINT_ALL); #if 0 { unsigned char *data = (unsigned char *)ptr; @@ -266,6 +273,7 @@ struct { { LB_TAG_COMPILER, "Compiler", print_string }, { LB_TAG_LINKER, "Linker", print_string }, { LB_TAG_ASSEMBLER, "Assembler", print_string }, + { LB_TAG_MAINBOARD_ID, "Mainboard ID", print_string }, { LB_TAG_CMOS_OPTION_TABLE, "CMOS option table", print_option_table }, { LB_TAG_OPTION, "Option", print_option }, { LB_TAG_OPTION_ENUM, "Option Enumeration", print_option_enumeration }, @@ -281,7 +289,7 @@ static struct lb_record *next_record(struct lb_record *rec) }
uint64_t print_lb_records(struct lb_record *rec, struct lb_record *last, - unsigned long addr) + unsigned long addr, uint32_t target) { struct lb_record *next; int i; @@ -298,9 +306,10 @@ uint64_t print_lb_records(struct lb_record *rec, struct lb_record *last, break; } } - printf("lb_record #%d type %d @ 0x%08lx %s\n", - count, rec->tag, addr, lb_types[i].type_name); - if (lb_types[i].print) { + if (target == PRINT_ALL) + printf("lb_record #%d type %d @ 0x%08lx %s\n", + count, rec->tag, addr, lb_types[i].type_name); + if (lb_types[i].print && (target == PRINT_ALL || target == rec->tag)) { lb_types[i].print(rec, addr); } if (rec->tag == LB_TAG_FORWARD) @@ -326,7 +335,7 @@ static void *do_map(int fd, uint64_t addr, uint32_t len, void **mpaddr_out, size return ret + addr - mpaddr; }
-uint64_t print_lb_table(int fd, uint64_t addr) +uint64_t print_lb_table(int fd, uint64_t addr, uint32_t target) { struct lb_record *rec, *last; struct lb_header *head; @@ -344,19 +353,59 @@ uint64_t print_lb_table(int fd, uint64_t addr) rec = (struct lb_record *)(((char *)head) + head->header_bytes); last = (struct lb_record *)(((char *)rec) + head->table_bytes);
- printf("Coreboot header(%d) checksum: %04x table(%d) checksum: %04x entries: %d\n", - head->header_bytes, head->header_checksum, - head->table_bytes, head->table_checksum, head->table_entries); - forward = print_lb_records(rec, last, addr + head->header_bytes); + if (target == PRINT_ALL) + printf("Coreboot header(%d) checksum: %04x table(%d) checksum: %04x entries: %d\n", + head->header_bytes, head->header_checksum, + head->table_bytes, head->table_checksum, head->table_entries); + forward = print_lb_records(rec, last, addr + head->header_bytes, target); munmap (mp, mplen); return forward; }
+static void print_usage(const char *name) +{ + printf("usage: %s [-mh?]\n", name); + printf("\n" + " -w | --coreboot-version: dump coreboot version\n" + " -V | --verbose: verbose (debugging) output\n" + " -h | --help: print this help\n" + "\n"); + exit(1); +} + int main(int argc, char **argv) { unsigned char *low_1MB; struct lb_header *lb_table; int fd; + uint32_t target = PRINT_ALL; + int opt, option_index = 0; + + static struct option long_options[] = { + {"coreboot-version", 0, 0, 'w'}, + {"verbose", 0, 0, 'V'}, + {"help", 0, 0, 'h'}, + {0, 0, 0, 0} + }; + while ((opt = getopt_long(argc, argv, "Vmwh?", + long_options, &option_index)) != EOF) { + switch (opt) { + case 'w': + target = LB_TAG_VERSION; + break; + case 'V': + verbose = 1; + break; + case 'h': + case '?': + default: + print_usage(argv[0]); + exit(0); + break; + } + } + + fd = open("/dev/mem", O_RDONLY); if (fd < 0) { fprintf(stderr, "Can not open /dev/mem\n"); @@ -378,7 +427,7 @@ int main(int argc, char **argv) addr = ((char *)lb_table) - ((char *)low_1MB);
while (addr) - addr = print_lb_table(fd, addr); + addr = print_lb_table(fd, addr, target); } else { printf("lb_table not found\n");