[coreboot-gerrit] Change in coreboot[master]: lib/bootmem: Add method to walk OS POV memory tables

Patrick Rudolph (Code Review) gerrit at coreboot.org
Fri Apr 20 11:46:11 CEST 2018


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 at 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;

-- 
To view, visit https://review.coreboot.org/25747
To unsubscribe, or for help writing mail filters, visit https://review.coreboot.org/settings

Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: Iee332a9821d12a7d9a684063b77b0502febd8d7d
Gerrit-Change-Number: 25747
Gerrit-PatchSet: 1
Gerrit-Owner: Patrick Rudolph <patrick.rudolph at 9elements.com>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.coreboot.org/pipermail/coreboot-gerrit/attachments/20180420/1bde4c45/attachment.html>


More information about the coreboot-gerrit mailing list