diff options
author | Stefan Reinauer <stefan.reinauer@coreboot.org> | 2013-01-07 16:26:10 -0800 |
---|---|---|
committer | Ronald G. Minnich <rminnich@gmail.com> | 2013-01-08 20:40:26 +0100 |
commit | c01990789f533316e10c5fc3b5ca08ae866b8033 (patch) | |
tree | 20d2dadf7a04fe9107200925b344149c6c2004f7 | |
parent | d7144dcd578215e345b10df5a6cdac7bd44ac3ad (diff) | |
download | coreboot-c01990789f533316e10c5fc3b5ca08ae866b8033.tar.xz |
cbmem utility: Find actual CBMEM area
... without the need for a coreboot table entry for each of them.
Change-Id: I2917710fb9d00c4533d81331a362bf0c40a30353
Signed-off-by: Stefan Reinauer <reinauer@google.com>
Reviewed-on: http://review.coreboot.org/2117
Tested-by: build bot (Jenkins)
Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
-rw-r--r-- | util/cbmem/cbmem.c | 84 |
1 files changed, 83 insertions, 1 deletions
diff --git a/util/cbmem/cbmem.c b/util/cbmem/cbmem.c index 59d054046e..a777a8f302 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; @@ -320,6 +337,61 @@ 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); + + printf("CBMEM table of contents:\n"); + printf(" ID START LENGTH\n"); + for (i=0; i<MAX_CBMEM_ENTRIES; i++) { + if (entries[i].magic != CBMEM_MAGIC) + break; + + printf("%2d. ", i); + switch (entries[i].id) { + case CBMEM_ID_FREESPACE: printf("FREE SPACE "); break; + case CBMEM_ID_GDT: printf("GDT "); break; + case CBMEM_ID_ACPI: printf("ACPI "); break; + case CBMEM_ID_ACPI_GNVS: printf("ACPI GNVS "); break; + case CBMEM_ID_CBTABLE: printf("COREBOOTE "); break; + case CBMEM_ID_PIRQ: printf("IRQ TABLE "); break; + case CBMEM_ID_MPTABLE: printf("SMP TABLE "); break; + case CBMEM_ID_RESUME: printf("ACPI RESUME "); break; + case CBMEM_ID_RESUME_SCRATCH: printf("ACPI SCRATCH"); break; + case CBMEM_ID_SMBIOS: printf("SMBIOS "); break; + case CBMEM_ID_TIMESTAMP: printf("TIME STAMP "); break; + case CBMEM_ID_MRCDATA: printf("MRC DATA "); break; + case CBMEM_ID_CONSOLE: printf("CONSOLE "); break; + case CBMEM_ID_ELOG: printf("ELOG "); break; + default: printf("%08x ", + entries[i].id); break; + } + printf(" 0x%08jx 0x%08jx\n", (uintmax_t)entries[i].base, + (uintmax_t)entries[i].size); + } + unmap_memory(); +} void print_version(void) { @@ -342,6 +414,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" @@ -357,24 +430,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; @@ -411,6 +490,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(); |