Index: kernel/genarch/include/ofw/ofw_tree.h
===================================================================
--- kernel/genarch/include/ofw/ofw_tree.h	(revision 8b9a4431d8b5bc4486328cb489f889d8803f8da1)
+++ kernel/genarch/include/ofw/ofw_tree.h	(revision de3db94a505b69fdd8a2d15b0eaa31f2fd7745a7)
@@ -68,4 +68,5 @@
 extern void ofw_tree_init(ofw_tree_node_t *);
 extern void ofw_tree_print(void);
+extern void ofw_sysinfo_map(void);
 
 extern const char *ofw_tree_node_name(const ofw_tree_node_t *);
Index: kernel/genarch/src/ofw/ofw_tree.c
===================================================================
--- kernel/genarch/src/ofw/ofw_tree.c	(revision 8b9a4431d8b5bc4486328cb489f889d8803f8da1)
+++ kernel/genarch/src/ofw/ofw_tree.c	(revision de3db94a505b69fdd8a2d15b0eaa31f2fd7745a7)
@@ -38,4 +38,5 @@
 #include <genarch/ofw/ofw_tree.h>
 #include <mm/slab.h>
+#include <sysinfo/sysinfo.h>
 #include <memstr.h>
 #include <str.h>
@@ -355,4 +356,38 @@
 }
 
+/** Map OpenFirmware device subtree rooted in a node into sysinfo.
+ *
+ * Child nodes are processed recursively and peer nodes are processed
+ * iteratively in order to avoid stack overflow.
+ *
+ * @param node Root of the subtree.
+ * @param path Current path, NULL for the very root of the entire tree.
+ *
+ */
+static void ofw_tree_node_sysinfo(ofw_tree_node_t *node, const char *path)
+{
+	char *cur_path = (char *) malloc(PATH_MAX_LEN, 0);
+	
+	for (ofw_tree_node_t *cur = node; cur; cur = cur->peer) {
+		if ((cur->parent) && (path))
+			snprintf(cur_path, PATH_MAX_LEN, "%s.%s", path, cur->da_name);
+		else
+			snprintf(cur_path, PATH_MAX_LEN, "firmware.%s", cur->da_name);
+		
+		sysinfo_set_item_undefined(cur_path, NULL);
+		
+		if (cur->child)
+			ofw_tree_node_sysinfo(cur->child, cur_path);
+	}
+	
+	free(cur_path);
+}
+
+/** Map the OpenFirmware device tree into sysinfo. */
+void ofw_sysinfo_map(void)
+{
+	ofw_tree_node_sysinfo(ofw_root, NULL);
+}
+
 /** @}
  */
