[Skiboot] [PATCH 4/7 v3] core: Add mem_region_next

Jeremy Kerr jk at ozlabs.org
Tue May 19 19:05:38 AEST 2015


This change adds a function to iterate mem_regions.

Signed-off-by: Jeremy Kerr <jk at ozlabs.org>

---
 core/mem_region.c               |   14 +++
 core/test/Makefile.check        |    1 
 core/test/run-mem_region_next.c |  117 ++++++++++++++++++++++++++++++++
 include/skiboot.h               |    3 
 4 files changed, 135 insertions(+)

diff --git a/core/mem_region.c b/core/mem_region.c
index 40f3293..5e9393d 100644
--- a/core/mem_region.c
+++ b/core/mem_region.c
@@ -1052,3 +1052,17 @@ void mem_region_add_dt_reserved(void)
 	free(names);
 	free(ranges);
 }
+
+struct mem_region *mem_region_next(struct mem_region *region)
+{
+	struct list_node *node;
+
+	assert(lock_held_by_me(&mem_region_lock));
+
+	node = region ? &region->list : &regions.n;
+
+	if (node->next == &regions.n)
+		return NULL;
+
+	return list_entry(node->next, struct mem_region, list);
+}
diff --git a/core/test/Makefile.check b/core/test/Makefile.check
index c6cf835..939add6 100644
--- a/core/test/Makefile.check
+++ b/core/test/Makefile.check
@@ -4,6 +4,7 @@ CORE_TEST := core/test/run-device \
 	core/test/run-malloc \
 	core/test/run-malloc-speed \
 	core/test/run-mem_region_init \
+	core/test/run-mem_region_next \
 	core/test/run-mem_region_release_unused \
 	core/test/run-mem_region_release_unused_noalloc \
 	core/test/run-mem_region_reservations \
diff --git a/core/test/run-mem_region_next.c b/core/test/run-mem_region_next.c
new file mode 100644
index 0000000..209ce67
--- /dev/null
+++ b/core/test/run-mem_region_next.c
@@ -0,0 +1,117 @@
+/* Copyright 2013-2015 IBM Corp.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * 	http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ * implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <config.h>
+
+#define BITS_PER_LONG (sizeof(long) * 8)
+/* Don't include this, it's PPC-specific */
+#define __CPU_H
+static unsigned int cpu_max_pir = 1;
+struct cpu_thread {
+	unsigned int			chip_id;
+};
+
+#include <stdlib.h>
+#include <string.h>
+
+/* Use these before we override definitions below. */
+static void *real_malloc(size_t size)
+{
+	return malloc(size);
+}
+
+static void real_free(void *p)
+{
+	return free(p);
+}
+
+#undef malloc
+#undef free
+
+#include <skiboot.h>
+
+#define is_rodata(p) true
+
+#include "../mem_region.c"
+#include "../malloc.c"
+#include "../device.c"
+
+#include <assert.h>
+#include <stdio.h>
+
+void lock(struct lock *l)
+{
+	assert(!l->lock_val);
+	l->lock_val++;
+}
+
+void unlock(struct lock *l)
+{
+	assert(l->lock_val);
+	l->lock_val--;
+}
+
+bool lock_held_by_me(struct lock *l)
+{
+	return l->lock_val;
+}
+
+
+#define TEST_HEAP_ORDER 12
+#define TEST_HEAP_SIZE (1ULL << TEST_HEAP_ORDER)
+
+int main(void)
+{
+	struct mem_region *r;
+	char *test_heap;
+
+	/* Use malloc for the heap, so valgrind can find issues. */
+	test_heap = real_malloc(TEST_HEAP_SIZE);
+	skiboot_heap.start = (unsigned long)test_heap;
+	skiboot_heap.len = TEST_HEAP_SIZE;
+
+	lock(&mem_region_lock);
+
+	/* empty regions */
+	r = mem_region_next(NULL);
+	assert(!r);
+
+	r = new_region("test.1", 0x1000, 0x1000, NULL, REGION_RESERVED);
+	assert(add_region(r));
+	r = new_region("test.2", 0x2000, 0x1000, NULL, REGION_RESERVED);
+	assert(add_region(r));
+	mem_regions_finalised = true;
+
+	r = mem_region_next(NULL);
+	assert(r);
+	assert(r->start = 0x1000);
+	assert(r->len = 0x1000);
+	assert(r->type = REGION_RESERVED);
+
+	r = mem_region_next(r);
+	assert(r);
+	assert(r->start = 0x2000);
+	assert(r->len = 0x1000);
+	assert(r->type = REGION_RESERVED);
+
+	r = mem_region_next(r);
+	assert(!r);
+
+	unlock(&mem_region_lock);
+	real_free(test_heap);
+
+	return 0;
+}
diff --git a/include/skiboot.h b/include/skiboot.h
index 9751a31..e92d38e 100644
--- a/include/skiboot.h
+++ b/include/skiboot.h
@@ -46,6 +46,9 @@
 /* Readonly section start and end. */
 extern char __rodata_start[], __rodata_end[];
 
+struct mem_region;
+extern struct mem_region *mem_region_next(struct mem_region *region);
+
 static inline bool is_rodata(const void *p)
 {
 	return ((const char *)p >= __rodata_start && (const char *)p < __rodata_end);


More information about the Skiboot mailing list