Index: kernel/arch/abs32le/src/mm/page.c
===================================================================
--- kernel/arch/abs32le/src/mm/page.c	(revision 9aed1447765df907632291e993be7acf559d0057)
+++ kernel/arch/abs32le/src/mm/page.c	(revision 1c01e6cdfeee9466652e3b2b78ee532b3b041b26)
@@ -56,10 +56,4 @@
 }
 
-
-uintptr_t hw_map(uintptr_t physaddr, size_t size)
-{
-	return physaddr;
-}
-
 void page_fault(unsigned int n __attribute__((unused)), istate_t *istate)
 {
Index: kernel/arch/amd64/src/mm/page.c
===================================================================
--- kernel/arch/amd64/src/mm/page.c	(revision 9aed1447765df907632291e993be7acf559d0057)
+++ kernel/arch/amd64/src/mm/page.c	(revision 1c01e6cdfeee9466652e3b2b78ee532b3b041b26)
@@ -98,25 +98,4 @@
 }
 
-uintptr_t hw_map(uintptr_t physaddr, size_t size)
-{
-	if (last_frame + ALIGN_UP(size, PAGE_SIZE) > KA2PA(KERNEL_ADDRESS_SPACE_END_ARCH))
-		panic("Unable to map physical memory %p (%zu bytes).",
-		    (void *) physaddr, size);
-	
-	uintptr_t virtaddr = PA2KA(last_frame);
-	pfn_t i;
-	
-	page_table_lock(AS_KERNEL, true);
-	
-	for (i = 0; i < ADDR2PFN(ALIGN_UP(size, PAGE_SIZE)); i++)
-		page_mapping_insert(AS_KERNEL, virtaddr + PFN2ADDR(i), physaddr + PFN2ADDR(i), PAGE_NOT_CACHEABLE | PAGE_WRITE);
-	
-	page_table_unlock(AS_KERNEL, true);
-	
-	last_frame = ALIGN_UP(last_frame + size, FRAME_SIZE);
-	
-	return virtaddr;
-}
-
 /** @}
  */
Index: kernel/arch/arm32/src/mm/page.c
===================================================================
--- kernel/arch/arm32/src/mm/page.c	(revision 9aed1447765df907632291e993be7acf559d0057)
+++ kernel/arch/arm32/src/mm/page.c	(revision 1c01e6cdfeee9466652e3b2b78ee532b3b041b26)
@@ -82,37 +82,4 @@
 }
 
-/** Maps device into the kernel space.
- *
- * Maps physical address of device into kernel virtual address space (so it can
- * be accessed only by kernel through virtual address).
- *
- * @param physaddr Physical address where device is connected.
- * @param size Length of area where device is present.
- *
- * @return Virtual address where device will be accessible.
- */
-uintptr_t hw_map(uintptr_t physaddr, size_t size)
-{
-	if (last_frame + ALIGN_UP(size, PAGE_SIZE) >
-	    KA2PA(KERNEL_ADDRESS_SPACE_END_ARCH)) {
-		panic("Unable to map physical memory %p (%d bytes).",
-		    (void *) physaddr, size);
-	}
-	
-	uintptr_t virtaddr = PA2KA(last_frame);
-	pfn_t i;
-
-	page_table_lock(AS_KERNEL, true);
-	for (i = 0; i < ADDR2PFN(ALIGN_UP(size, PAGE_SIZE)); i++) {
-		page_mapping_insert(AS_KERNEL, virtaddr + PFN2ADDR(i),
-		    physaddr + PFN2ADDR(i),
-		    PAGE_NOT_CACHEABLE | PAGE_READ | PAGE_WRITE | PAGE_KERNEL);
-	}
-	page_table_unlock(AS_KERNEL, true);
-	
-	last_frame = ALIGN_UP(last_frame + size, FRAME_SIZE);
-	return virtaddr;
-}
-
 /** @}
  */
Index: kernel/arch/ia32/src/mm/page.c
===================================================================
--- kernel/arch/ia32/src/mm/page.c	(revision 9aed1447765df907632291e993be7acf559d0057)
+++ kernel/arch/ia32/src/mm/page.c	(revision 1c01e6cdfeee9466652e3b2b78ee532b3b041b26)
@@ -85,25 +85,4 @@
 }
 
-
-uintptr_t hw_map(uintptr_t physaddr, size_t size)
-{
-	if (last_frame + ALIGN_UP(size, PAGE_SIZE) > KA2PA(KERNEL_ADDRESS_SPACE_END_ARCH))
-		panic("Unable to map physical memory %p (%zu bytes).",
-		    (void *) physaddr, size);
-	
-	uintptr_t virtaddr = PA2KA(last_frame);
-	pfn_t i;
-	page_table_lock(AS_KERNEL, true);
-	for (i = 0; i < ADDR2PFN(ALIGN_UP(size, PAGE_SIZE)); i++) {
-		uintptr_t addr = PFN2ADDR(i);
-		page_mapping_insert(AS_KERNEL, virtaddr + addr, physaddr + addr, PAGE_NOT_CACHEABLE | PAGE_WRITE);
-	}
-	page_table_unlock(AS_KERNEL, true);
-	
-	last_frame = ALIGN_UP(last_frame + size, FRAME_SIZE);
-	
-	return virtaddr;
-}
-
 void page_fault(unsigned int n __attribute__((unused)), istate_t *istate)
 {
Index: kernel/arch/ia64/src/mm/page.c
===================================================================
--- kernel/arch/ia64/src/mm/page.c	(revision 9aed1447765df907632291e993be7acf559d0057)
+++ kernel/arch/ia64/src/mm/page.c	(revision 1c01e6cdfeee9466652e3b2b78ee532b3b041b26)
@@ -255,10 +255,4 @@
 }
 
-uintptr_t hw_map(uintptr_t physaddr, size_t size __attribute__ ((unused)))
-{
-	/* THIS is a dirty hack. */
-	return (uintptr_t)((uint64_t)(PA2KA(physaddr)) + VIO_OFFSET);
-}
-
 /** @}
  */
Index: kernel/arch/mips32/src/mm/page.c
===================================================================
--- kernel/arch/mips32/src/mm/page.c	(revision 9aed1447765df907632291e993be7acf559d0057)
+++ kernel/arch/mips32/src/mm/page.c	(revision 1c01e6cdfeee9466652e3b2b78ee532b3b041b26)
@@ -43,13 +43,4 @@
 }
 
-/** Map device into kernel space
- * - on mips, all devices are already mapped into kernel space,
- *   translate the physical address to uncached area
- */
-uintptr_t hw_map(uintptr_t physaddr, size_t size)
-{
-	return physaddr + 0xa0000000;
-}
-
 /** @}
  */
Index: kernel/arch/mips64/src/mm/page.c
===================================================================
--- kernel/arch/mips64/src/mm/page.c	(revision 9aed1447765df907632291e993be7acf559d0057)
+++ kernel/arch/mips64/src/mm/page.c	(revision 1c01e6cdfeee9466652e3b2b78ee532b3b041b26)
@@ -43,13 +43,4 @@
 }
 
-/** Map device into kernel space
- * - on mips, all devices are already mapped into kernel space,
- *   translate the physical address to uncached area
- */
-uintptr_t hw_map(uintptr_t physaddr, size_t size)
-{
-	return physaddr + 0xffffffffa0000000;
-}
-
 /** @}
  */
Index: kernel/arch/ppc32/src/mm/page.c
===================================================================
--- kernel/arch/ppc32/src/mm/page.c	(revision 9aed1447765df907632291e993be7acf559d0057)
+++ kernel/arch/ppc32/src/mm/page.c	(revision 1c01e6cdfeee9466652e3b2b78ee532b3b041b26)
@@ -46,24 +46,4 @@
 }
 
-uintptr_t hw_map(uintptr_t physaddr, size_t size)
-{
-	if (last_frame + ALIGN_UP(size, PAGE_SIZE) >
-	    KA2PA(KERNEL_ADDRESS_SPACE_END_ARCH))
-		panic("Unable to map physical memory %p (%zu bytes).",
-		    (void *) physaddr, size);
-	
-	uintptr_t virtaddr = PA2KA(last_frame);
-	pfn_t i;
-	page_table_lock(AS_KERNEL, true);
-	for (i = 0; i < ADDR2PFN(ALIGN_UP(size, PAGE_SIZE)); i++)
-		page_mapping_insert(AS_KERNEL, virtaddr + PFN2ADDR(i),
-		    physaddr + PFN2ADDR(i), PAGE_NOT_CACHEABLE | PAGE_WRITE);
-	page_table_unlock(AS_KERNEL, true);
-	
-	last_frame = ALIGN_UP(last_frame + size, FRAME_SIZE);
-	
-	return virtaddr;
-}
-
 /** @}
  */
Index: kernel/arch/sparc64/src/mm/page.c
===================================================================
--- kernel/arch/sparc64/src/mm/page.c	(revision 9aed1447765df907632291e993be7acf559d0057)
+++ kernel/arch/sparc64/src/mm/page.c	(revision 1c01e6cdfeee9466652e3b2b78ee532b3b041b26)
@@ -51,20 +51,4 @@
 }
 
-/** Map memory-mapped device into virtual memory.
- *
- * We are currently using identity mapping for mapping device registers.
- *
- * @param physaddr Physical address of the page where the device is
- *                 located.
- * @param size     Size of the device's registers.
- *
- * @return Virtual address of the page where the device is mapped.
- *
- */
-uintptr_t hw_map(uintptr_t physaddr, size_t size)
-{
-	return PA2KA(physaddr);
-}
-
 /** @}
  */
Index: kernel/generic/src/mm/page.c
===================================================================
--- kernel/generic/src/mm/page.c	(revision 9aed1447765df907632291e993be7acf559d0057)
+++ kernel/generic/src/mm/page.c	(revision 1c01e6cdfeee9466652e3b2b78ee532b3b041b26)
@@ -74,4 +74,5 @@
 #include <syscall/copy.h>
 #include <errno.h>
+#include <align.h>
 
 /** Virtual operations for page subsystem. */
@@ -175,4 +176,21 @@
 	return page_mapping_operations->mapping_find(as, page, nolock);
 }
+
+uintptr_t hw_map(uintptr_t physaddr, size_t size)
+{
+	uintptr_t virtaddr = (uintptr_t) NULL;	// FIXME
+	pfn_t i;
+
+	page_table_lock(AS_KERNEL, true);
+	for (i = 0; i < ADDR2PFN(ALIGN_UP(size, PAGE_SIZE)); i++) {
+		uintptr_t addr = PFN2ADDR(i);
+		page_mapping_insert(AS_KERNEL, virtaddr + addr, physaddr + addr,
+		    PAGE_NOT_CACHEABLE | PAGE_WRITE);
+	}
+	page_table_unlock(AS_KERNEL, true);
+	
+	return virtaddr;
+}
+
 
 /** Syscall wrapper for getting mapping of a virtual page.
