lib/bootmem: tightly couple bootmem_init to bootmem_write_memory_table

In https://review.coreboot.org/25383 people were confused about the
ordering of bootmem calls w.r.t. when entries are exposed to the OS. To
alleviate this add a notion of bootmem being initialized. In addition to
that, only mark bootmem initialized when bootmem_write_memory_table() is
called. Any other calls to bootmem before that will report an error on
the console.

Change-Id: I5bc31f555038ccabb82d902c54f95858679b1695
Signed-off-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-on: https://review.coreboot.org/25503
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Julius Werner <jwerner@chromium.org>
This commit is contained in:
Aaron Durbin
2018-04-03 00:08:12 -06:00
committed by Patrick Georgi
parent 99b65668f9
commit 4677f6bbfa
3 changed files with 27 additions and 15 deletions

View File

@@ -21,14 +21,22 @@
#include <device/resource.h>
#include <stdlib.h>
static int initialized;
static struct memranges bootmem;
void bootmem_init(void)
static int bootmem_is_initialized(void)
{
return initialized;
}
static void bootmem_init(void)
{
const unsigned long cacheable = IORESOURCE_CACHEABLE;
const unsigned long reserved = IORESOURCE_RESERVE;
struct memranges *bm = &bootmem;
initialized = 1;
/*
* Fill the memory map out. The order of operations is important in
* that each overlapping range will take over the next. Therefore,
@@ -45,6 +53,11 @@ void bootmem_init(void)
void bootmem_add_range(uint64_t start, uint64_t size, uint32_t type)
{
if (!bootmem_is_initialized()) {
printk(BIOS_ERR, "%s: lib unitialized!\n", __func__);
return;
}
memranges_insert(&bootmem, start, size, type);
}
@@ -55,6 +68,7 @@ void bootmem_write_memory_table(struct lb_memory *mem)
lb_r = &mem->map[0];
bootmem_init();
bootmem_dump_ranges();
memranges_each_entry(r, &bootmem) {
@@ -135,6 +149,11 @@ void *bootmem_allocate_buffer(size_t size)
resource_t begin;
resource_t end;
if (!bootmem_is_initialized()) {
printk(BIOS_ERR, "%s: lib unitialized!\n", __func__);
return NULL;
}
/* 4KiB alignment. */
size = ALIGN(size, 4096);
region = NULL;