Index: kernel/generic/src/mm/page.c
===================================================================
--- kernel/generic/src/mm/page.c	(revision 7c3e482c391f80c59181faa47a647ba2f19ce614)
+++ kernel/generic/src/mm/page.c	(revision 1f5714e5345e349ecb06ffbe3ed854e2db5db9ac)
@@ -65,4 +65,5 @@
 #include <arch/mm/asid.h>
 #include <mm/as.h>
+#include <mm/km.h>
 #include <mm/frame.h>
 #include <arch/barrier.h>
@@ -179,9 +180,13 @@
 uintptr_t hw_map(uintptr_t physaddr, size_t size)
 {
-	uintptr_t virtaddr = (uintptr_t) NULL;	// FIXME
+	uintptr_t virtaddr;
+	size_t asize;
 	pfn_t i;
 
+	asize = ALIGN_UP(size, PAGE_SIZE);
+	virtaddr = km_page_alloc(asize, PAGE_SIZE);
+
 	page_table_lock(AS_KERNEL, true);
-	for (i = 0; i < ADDR2PFN(ALIGN_UP(size, PAGE_SIZE)); i++) {
+	for (i = 0; i < ADDR2PFN(asize); i++) {
 		uintptr_t addr = PFN2ADDR(i);
 		page_mapping_insert(AS_KERNEL, virtaddr + addr, physaddr + addr,
