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>
This commit is contained in:
parent
d7144dcd57
commit
c01990789f
|
@ -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();
|
||||
|
||||
|
|
Loading…
Reference in New Issue