diff --git a/payloads/libpayload/i386/coreboot.c b/payloads/libpayload/i386/coreboot.c index 66e02f11b7..95d8f16f76 100644 --- a/payloads/libpayload/i386/coreboot.c +++ b/payloads/libpayload/i386/coreboot.c @@ -57,8 +57,10 @@ static void cb_parse_memory(unsigned char *ptr, struct sysinfo_t *info) struct cb_memory_range *range = (struct cb_memory_range *)MEM_RANGE_PTR(mem, i); +#if MEMMAP_RAM_ONLY if (range->type != CB_MEM_RAM) continue; +#endif info->memrange[info->n_memranges].base = UNPACK_CB64(range->start); @@ -66,6 +68,8 @@ static void cb_parse_memory(unsigned char *ptr, struct sysinfo_t *info) info->memrange[info->n_memranges].size = UNPACK_CB64(range->size); + info->memrange[info->n_memranges].type = range->type; + info->n_memranges++; } } diff --git a/payloads/libpayload/i386/multiboot.c b/payloads/libpayload/i386/multiboot.c index 290283e8ed..82736b14fe 100644 --- a/payloads/libpayload/i386/multiboot.c +++ b/payloads/libpayload/i386/multiboot.c @@ -45,15 +45,20 @@ static void mb_parse_mmap(struct multiboot_header *table, while(ptr < (start + table->mmap_length)) { struct multiboot_mmap *mmap = (struct multiboot_mmap *) ptr; +#if MEMMAP_RAM_ONLY /* 1 == normal RAM. Ignore everything else for now */ if (mmap->type == 1) { +#endif info->memrange[info->n_memranges].base = mmap->addr; info->memrange[info->n_memranges].size = mmap->length; + info->memrange[info->n_memranges].type = mmap->type; if (++info->n_memranges == SYSINFO_MAX_MEM_RANGES) return; +#if MEMMAP_RAM_ONLY } +#endif ptr += (mmap->size + sizeof(mmap->size)); } diff --git a/payloads/libpayload/i386/sysinfo.c b/payloads/libpayload/i386/sysinfo.c index 02e1d3daec..599a81140d 100644 --- a/payloads/libpayload/i386/sysinfo.c +++ b/payloads/libpayload/i386/sysinfo.c @@ -29,6 +29,7 @@ #include #include +#include #include /** @@ -63,9 +64,13 @@ void lib_get_sysinfo(void) if (!lib_sysinfo.n_memranges) { /* If we can't get a good memory range, use the default. */ lib_sysinfo.n_memranges = 2; + lib_sysinfo.memrange[0].base = 0; lib_sysinfo.memrange[0].size = 640 * 1024; + lib_sysinfo.memrange[0].type = CB_MEM_RAM; + lib_sysinfo.memrange[1].base = 1024 * 1024; lib_sysinfo.memrange[1].size = 31 * 1024 * 1024; + lib_sysinfo.memrange[1].type = CB_MEM_RAM; } } diff --git a/payloads/libpayload/include/sysinfo.h b/payloads/libpayload/include/sysinfo.h index 3b2c69c61d..bcc3d5fbab 100644 --- a/payloads/libpayload/include/sysinfo.h +++ b/payloads/libpayload/include/sysinfo.h @@ -42,6 +42,7 @@ struct sysinfo_t { struct memrange { unsigned long long base; unsigned long long size; + unsigned int type; } memrange[SYSINFO_MAX_MEM_RANGES]; struct cb_cmos_option_table *option_table;