summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Durbin <adurbin@chromium.org>2018-04-03 00:08:12 -0600
committerPatrick Georgi <pgeorgi@google.com>2018-04-16 08:39:21 +0000
commit4677f6bbfa412bbdaa6f2fdf65e45e83eb9f6fb3 (patch)
treef32f28f3c3ab815adf4672c15bef203e59be7269
parent99b65668f990a04ef524c2303e2894d783aa1730 (diff)
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>
-rw-r--r--src/include/bootmem.h15
-rw-r--r--src/lib/bootmem.c21
-rw-r--r--src/lib/coreboot_table.c6
3 files changed, 27 insertions, 15 deletions
diff --git a/src/include/bootmem.h b/src/include/bootmem.h
index 10c8d51b77..6e7d127f62 100644
--- a/src/include/bootmem.h
+++ b/src/include/bootmem.h
@@ -20,21 +20,18 @@
#include <stdint.h>
#include <boot/coreboot_tables.h>
-/*
- * Initialize the memory address space prior to payload loading. The bootmem
- * serves as the source for the lb_mem table.
- */
-void bootmem_init(void);
+/* Write memory coreboot table. Current resource map is serialized into
+ * memtable (LB_MEM_* types). bootmem library is unusable until this function
+ * is called first in the write tables path before payload is loaded. */
+void bootmem_write_memory_table(struct lb_memory *mem);
-/* Architecture hook to add bootmem areas the architecture controls. */
+/* Architecture hook to add bootmem areas the architecture controls when
+ * bootmem_write_memory_table() is called. */
void bootmem_arch_add_ranges(void);
/* Add a range of a given type to the bootmem address space. */
void bootmem_add_range(uint64_t start, uint64_t size, uint32_t type);
-/* Write memory coreboot table. */
-void bootmem_write_memory_table(struct lb_memory *mem);
-
/* Print current range map of boot memory. */
void bootmem_dump_ranges(void);
diff --git a/src/lib/bootmem.c b/src/lib/bootmem.c
index ea02a16ddc..07391a50de 100644
--- a/src/lib/bootmem.c
+++ b/src/lib/bootmem.c
@@ -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;
diff --git a/src/lib/coreboot_table.c b/src/lib/coreboot_table.c
index d03b771f48..e786443cf6 100644
--- a/src/lib/coreboot_table.c
+++ b/src/lib/coreboot_table.c
@@ -524,11 +524,7 @@ static uintptr_t write_coreboot_table(uintptr_t rom_table_end)
}
#endif
- /* Initialize the memory map at boot time. */
- bootmem_init();
-
- /* No other memory areas can be added after the memory table has been
- * committed as the entries won't show up in the serialize mem table. */
+ /* Serialize resource map into mem table types (LB_MEM_*) */
bootmem_write_memory_table(lb_memory(head));
/* Record our motherboard */