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 timestamps;
|
||||||
static struct lb_cbmem_ref console;
|
static struct lb_cbmem_ref console;
|
||||||
|
static struct lb_memory_range cbmem;
|
||||||
|
|
||||||
static int parse_cbtable(u64 address)
|
static int parse_cbtable(u64 address)
|
||||||
{
|
{
|
||||||
|
@ -157,6 +158,22 @@ static int parse_cbtable(u64 address)
|
||||||
lbr_p = (struct lb_record*) ((char *)lbtable + j);
|
lbr_p = (struct lb_record*) ((char *)lbtable + j);
|
||||||
debug(" coreboot table entry 0x%02x\n", lbr_p->tag);
|
debug(" coreboot table entry 0x%02x\n", lbr_p->tag);
|
||||||
switch (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: {
|
case LB_TAG_TIMESTAMPS: {
|
||||||
debug(" Found timestamp table.\n");
|
debug(" Found timestamp table.\n");
|
||||||
timestamps = *(struct lb_cbmem_ref *) lbr_p;
|
timestamps = *(struct lb_cbmem_ref *) lbr_p;
|
||||||
|
@ -320,6 +337,61 @@ static void dump_console(void)
|
||||||
unmap_memory();
|
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)
|
void print_version(void)
|
||||||
{
|
{
|
||||||
|
@ -342,6 +414,7 @@ void print_usage(const char *name)
|
||||||
printf("usage: %s [-vh?]\n", name);
|
printf("usage: %s [-vh?]\n", name);
|
||||||
printf("\n"
|
printf("\n"
|
||||||
" -c | --console: print cbmem console\n"
|
" -c | --console: print cbmem console\n"
|
||||||
|
" -l | --list: print cbmem table of contents\n"
|
||||||
" -t | --timestamps: print timestamp information\n"
|
" -t | --timestamps: print timestamp information\n"
|
||||||
" -V | --verbose: verbose (debugging) output\n"
|
" -V | --verbose: verbose (debugging) output\n"
|
||||||
" -v | --version: print the version\n"
|
" -v | --version: print the version\n"
|
||||||
|
@ -357,24 +430,30 @@ int main(int argc, char** argv)
|
||||||
|
|
||||||
int print_defaults = 1;
|
int print_defaults = 1;
|
||||||
int print_console = 0;
|
int print_console = 0;
|
||||||
|
int print_list = 0;
|
||||||
int print_timestamps = 0;
|
int print_timestamps = 0;
|
||||||
|
|
||||||
int opt, option_index = 0;
|
int opt, option_index = 0;
|
||||||
static struct option long_options[] = {
|
static struct option long_options[] = {
|
||||||
{"console", 0, 0, 'c'},
|
{"console", 0, 0, 'c'},
|
||||||
|
{"list", 0, 0, 'l'},
|
||||||
{"timestamps", 0, 0, 't'},
|
{"timestamps", 0, 0, 't'},
|
||||||
{"verbose", 0, 0, 'V'},
|
{"verbose", 0, 0, 'V'},
|
||||||
{"version", 0, 0, 'v'},
|
{"version", 0, 0, 'v'},
|
||||||
{"help", 0, 0, 'h'},
|
{"help", 0, 0, 'h'},
|
||||||
{0, 0, 0, 0}
|
{0, 0, 0, 0}
|
||||||
};
|
};
|
||||||
while ((opt = getopt_long(argc, argv, "ctVvh?",
|
while ((opt = getopt_long(argc, argv, "cltVvh?",
|
||||||
long_options, &option_index)) != EOF) {
|
long_options, &option_index)) != EOF) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
case 'c':
|
case 'c':
|
||||||
print_console = 1;
|
print_console = 1;
|
||||||
print_defaults = 0;
|
print_defaults = 0;
|
||||||
break;
|
break;
|
||||||
|
case 'l':
|
||||||
|
print_list = 1;
|
||||||
|
print_defaults = 0;
|
||||||
|
break;
|
||||||
case 't':
|
case 't':
|
||||||
print_timestamps = 1;
|
print_timestamps = 1;
|
||||||
print_defaults = 0;
|
print_defaults = 0;
|
||||||
|
@ -411,6 +490,9 @@ int main(int argc, char** argv)
|
||||||
if (print_console)
|
if (print_console)
|
||||||
dump_console();
|
dump_console();
|
||||||
|
|
||||||
|
if (print_list)
|
||||||
|
dump_cbmem_toc();
|
||||||
|
|
||||||
if (print_defaults || print_timestamps)
|
if (print_defaults || print_timestamps)
|
||||||
dump_timestamps();
|
dump_timestamps();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue