Index: kernel/generic/include/mm/km.h
===================================================================
--- kernel/generic/include/mm/km.h	(revision 221c9ec0fbbc7f15c19b6c609e290af3d4ea2b17)
+++ kernel/generic/include/mm/km.h	(revision babb57e107b5fa2ef328a5cae2988923b6352f36)
@@ -50,4 +50,5 @@
 
 extern uintptr_t km_map(uintptr_t, size_t, unsigned int);
+extern uintptr_t km_map_structure(uintptr_t, size_t, unsigned int);
 
 extern uintptr_t km_temporary_page_get(uintptr_t *, frame_flags_t);
Index: kernel/generic/src/mm/km.c
===================================================================
--- kernel/generic/src/mm/km.c	(revision 221c9ec0fbbc7f15c19b6c609e290af3d4ea2b17)
+++ kernel/generic/src/mm/km.c	(revision babb57e107b5fa2ef328a5cae2988923b6352f36)
@@ -145,4 +145,12 @@
 }
 
+uintptr_t km_map_structure(uintptr_t paddr, size_t size, unsigned int flags)
+{
+	size_t offs = paddr - ALIGN_DOWN(paddr, FRAME_SIZE); 
+	uintptr_t page;
+
+	page = km_map(ALIGN_DOWN(paddr, FRAME_SIZE), size + offs, flags);
+	return page + offs;
+}
 
 /** Unmap kernen non-identity page.
