Index: kernel/generic/src/mm/km.c
===================================================================
--- kernel/generic/src/mm/km.c	(revision 0abc2aea144199fee5fb2b5b1ffcf9f0ac6528ce)
+++ kernel/generic/src/mm/km.c	(revision 954c0240b720c64358bccbdcdcb035fdd5a6f347)
@@ -130,15 +130,17 @@
 
 static uintptr_t
-km_map_aligned(uintptr_t paddr, size_t size, unsigned int flags)
+km_map_aligned(uintptr_t paddr, size_t size, size_t align, unsigned int flags)
 {
 	uintptr_t vaddr;
-	size_t align;
 	uintptr_t offs;
+
+	if (align == KM_NATURAL_ALIGNMENT)
+		align = ispwr2(size) ? size : (1U << (fnzb(size) + 1));
 
 	assert(ALIGN_DOWN(paddr, FRAME_SIZE) == paddr);
 	assert(ALIGN_UP(size, FRAME_SIZE) == size);
-
-	/* Enforce natural or at least PAGE_SIZE alignment. */
-	align = ispwr2(size) ? size : (1U << (fnzb(size) + 1));
+	assert(ispwr2(align));
+
+	/* Enforce at least PAGE_SIZE alignment. */
 	vaddr = km_page_alloc(size, max(PAGE_SIZE, align));
 
@@ -185,5 +187,5 @@
  * @return New virtual address mapped to paddr.
  */
-uintptr_t km_map(uintptr_t paddr, size_t size, unsigned int flags)
+uintptr_t km_map(uintptr_t paddr, size_t size, size_t align, unsigned int flags)
 {
 	uintptr_t page;
@@ -192,5 +194,5 @@
 	offs = paddr - ALIGN_DOWN(paddr, FRAME_SIZE);
 	page = km_map_aligned(ALIGN_DOWN(paddr, FRAME_SIZE),
-	    ALIGN_UP(size + offs, FRAME_SIZE), flags);
+	    ALIGN_UP(size + offs, FRAME_SIZE), align, flags);
 
 	return page + offs;
@@ -256,5 +258,5 @@
 	frame = frame_alloc(1, FRAME_HIGHMEM | FRAME_ATOMIC | flags, 0);
 	if (frame) {
-		page = km_map(frame, PAGE_SIZE,
+		page = km_map(frame, PAGE_SIZE, PAGE_SIZE,
 		    PAGE_READ | PAGE_WRITE | PAGE_CACHEABLE);
 		if (!page) {
