Index: kernel/generic/src/mm/as.c
===================================================================
--- kernel/generic/src/mm/as.c	(revision 41df2827457b04499fb5258c1cecc1ba5c7670bd)
+++ kernel/generic/src/mm/as.c	(revision bc310a05ba9e9da83dfe5f2096a36e10f288e414)
@@ -1920,4 +1920,70 @@
 }
 
+/** Get list of adress space areas.
+ *
+ * @param as		Address space.
+ * @param obuf		Place to save pointer to returned buffer.
+ * @param osize		Place to save size of returned buffer.
+ */
+void as_get_area_info(as_t *as, as_area_info_t **obuf, size_t *osize)
+{
+	ipl_t ipl;
+	size_t area_cnt, area_idx, i;
+	link_t *cur;
+
+	as_area_info_t *info;
+	size_t isize;
+
+	ipl = interrupts_disable();
+	mutex_lock(&as->lock);
+
+	/* First pass, count number of areas. */
+
+	area_cnt = 0;
+
+	for (cur = as->as_area_btree.leaf_head.next;
+	    cur != &as->as_area_btree.leaf_head; cur = cur->next) {
+		btree_node_t *node;
+
+		node = list_get_instance(cur, btree_node_t, leaf_link);
+		area_cnt += node->keys;
+	}
+
+        isize = area_cnt * sizeof(as_area_info_t);
+	info = malloc(isize, 0);
+
+	/* Second pass, record data. */
+
+	area_idx = 0;
+
+	for (cur = as->as_area_btree.leaf_head.next;
+	    cur != &as->as_area_btree.leaf_head; cur = cur->next) {
+		btree_node_t *node;
+
+		node = list_get_instance(cur, btree_node_t, leaf_link);
+
+		for (i = 0; i < node->keys; i++) {
+			as_area_t *area = node->value[i];
+
+			ASSERT(area_idx < area_cnt);
+			mutex_lock(&area->lock);
+
+			info[area_idx].start_addr = area->base;
+			info[area_idx].size = FRAMES2SIZE(area->pages);
+			info[area_idx].flags = area->flags;
+			++area_idx;
+
+			mutex_unlock(&area->lock);
+		}
+	}
+
+	mutex_unlock(&as->lock);
+	interrupts_restore(ipl);
+
+	*obuf = info;
+	*osize = isize;
+}
+
+
 /** Print out information about address space.
  *
