Patrick Rudolph has uploaded this change for review. ( https://review.coreboot.org/25747
Change subject: lib/bootmem: Add method to walk OS POV memory tables ......................................................................
lib/bootmem: Add method to walk OS POV memory tables
Add method to walk memory tables from OS point of view. The tables don't change when modifiying bootmem entries and doesn't contain bootmem specific tags.
Change-Id: Iee332a9821d12a7d9a684063b77b0502febd8d7d Signed-off-by: Patrick Rudolph patrick.rudolph@9elements.com --- M src/include/bootmem.h M src/lib/bootmem.c 2 files changed, 40 insertions(+), 12 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/47/25747/1
diff --git a/src/include/bootmem.h b/src/include/bootmem.h index b95e383..4026c5c 100644 --- a/src/include/bootmem.h +++ b/src/include/bootmem.h @@ -71,6 +71,16 @@ typedef bool (*range_action_t)(const struct range_entry *r, void *arg);
/** + * Walk memory tables from OS point of view and call the provided function, + * for every region. The caller has to return false to break out of the loop any + * time, or return true to continue. + * + * @param action The function to call for each memory range. + * @param Pointer passed to function @action. Set to NULL if unused. + */ +void bootmem_walk_os_mem(range_action_t action, void *arg); + +/** * Walk memory tables and call the provided function, for every region. * The caller has to return false to break out of the loop any time, or * return true to continue. diff --git a/src/lib/bootmem.c b/src/lib/bootmem.c index daad9a8..efb8c82 100644 --- a/src/lib/bootmem.c +++ b/src/lib/bootmem.c @@ -25,6 +25,7 @@ static int initialized; static int table_written; static struct memranges bootmem; +static struct memranges bootmem_os;
static int bootmem_is_initialized(void) { @@ -65,6 +66,17 @@ } }
+static void bootmem_convert_ranges(void) +{ + /** + * Convert BM_MEM_RAMSTAGE and BM_MEM_PAYLOAD to BM_MEM_RAM and + * merge ranges. The payload doesn't care about memory used by firmware. + */ + memranges_clone(&bootmem_os, &bootmem); + memranges_update_tag(&bootmem_os, BM_MEM_RAMSTAGE, BM_MEM_RAM); + memranges_update_tag(&bootmem_os, BM_MEM_PAYLOAD, BM_MEM_RAM); +} + static void bootmem_init(void) { const unsigned long cacheable = IORESOURCE_CACHEABLE; @@ -90,6 +102,8 @@
bootmem_arch_add_ranges(); bootmem_platform_add_ranges(); + + bootmem_convert_ranges(); }
void bootmem_add_range(uint64_t start, uint64_t size, @@ -118,22 +132,13 @@ { const struct range_entry *r; struct lb_memory_range *lb_r; - struct memranges bm;
lb_r = &mem->map[0];
bootmem_init(); bootmem_dump_ranges();
- /** - * Convert BM_MEM_RAMSTAGE and BM_MEM_PAYLOAD to BM_MEM_RAM and - * merge ranges. The payload doesn't care about memory used by firmware. - */ - memranges_clone(&bm, &bootmem); - memranges_update_tag(&bm, BM_MEM_RAMSTAGE, BM_MEM_RAM); - memranges_update_tag(&bm, BM_MEM_PAYLOAD, BM_MEM_RAM); - - memranges_each_entry(r, &bm) { + memranges_each_entry(r, &bootmem_os) { lb_r->start = pack_lb64(range_entry_base(r)); lb_r->size = pack_lb64(range_entry_size(r)); lb_r->type = bootmem_to_lb_tag(range_entry_tag(r)); @@ -142,8 +147,6 @@ mem->size += sizeof(struct lb_memory_range); }
- memranges_teardown(&bm); - table_written = 1; }
@@ -190,6 +193,21 @@ } }
+void bootmem_walk_os_mem(range_action_t action, void *arg) +{ + const struct range_entry *r; + + if (!bootmem_is_initialized()) { + printk(BIOS_ERR, "%s: lib unitialized!\n", __func__); + return; + } + + memranges_each_entry(r, &bootmem_os) { + if (!action(r, arg)) + return; + } +} + void bootmem_walk(range_action_t action, void *arg) { const struct range_entry *r;