Index: kernel/generic/include/mm/km.h
===================================================================
--- kernel/generic/include/mm/km.h	(revision c24b272fcbf6693fea8f6277ecf6b9aa45a5e089)
+++ kernel/generic/include/mm/km.h	(revision 7c3e482c391f80c59181faa47a647ba2f19ce614)
@@ -43,4 +43,7 @@
 extern void km_non_identity_span_add(uintptr_t, size_t);
 
+extern uintptr_t km_page_alloc(size_t, size_t);
+extern void km_page_free(uintptr_t, size_t);
+
 #endif
 
Index: kernel/generic/src/mm/km.c
===================================================================
--- kernel/generic/src/mm/km.c	(revision c24b272fcbf6693fea8f6277ecf6b9aa45a5e089)
+++ kernel/generic/src/mm/km.c	(revision 7c3e482c391f80c59181faa47a647ba2f19ce614)
@@ -40,4 +40,8 @@
 #include <config.h>
 #include <typedefs.h>
+#include <lib/ra.h>
+#include <debug.h>
+
+static ra_arena_t *km_ni_arena;
 
 /** Architecture dependent setup of identity-mapped kernel memory. */
@@ -51,4 +55,6 @@
 void km_non_identity_init(void)
 {
+	km_ni_arena = ra_arena_create();
+	ASSERT(km_ni_arena != NULL);
 	km_non_identity_arch_init();
 	config.non_identity_configured = true;
@@ -57,5 +63,20 @@
 void km_non_identity_span_add(uintptr_t base, size_t size)
 {
+	bool span_added;
+
+	span_added = ra_span_add(km_ni_arena, base, size);
+	ASSERT(span_added);
 }
+
+uintptr_t km_page_alloc(size_t size, size_t align)
+{
+	return ra_alloc(km_ni_arena, size, align);
+}
+
+void km_page_free(uintptr_t page, size_t size)
+{
+	ra_free(km_ni_arena, page, size);
+}
+
 
 /** @}
