Index: kernel/arch/arm32/src/mach/gta02/gta02.c
===================================================================
--- kernel/arch/arm32/src/mach/gta02/gta02.c	(revision d46732962adcfcbf946c2c3f032af0f7fadb285c)
+++ kernel/arch/arm32/src/mach/gta02/gta02.c	(revision adec5b450420e754be2635ab4e7587f68c0a3287)
@@ -102,6 +102,8 @@
 	s3c24xx_irqc_regs_t *irqc_regs;
 
-	gta02_timer = (void *) hw_map(S3C24XX_TIMER_ADDRESS, PAGE_SIZE);
-	irqc_regs = (void *) hw_map(S3C24XX_IRQC_ADDRESS, PAGE_SIZE);
+	gta02_timer = (void *) km_map(S3C24XX_TIMER_ADDRESS, PAGE_SIZE,
+	    PAGE_NOT_CACHEABLE);
+	irqc_regs = (void *) km_map(S3C24XX_IRQC_ADDRESS, PAGE_SIZE,
+	    PAGE_NOT_CACHEABLE);
 
 	/* Initialize interrupt controller. */
Index: kernel/arch/arm32/src/mach/integratorcp/integratorcp.c
===================================================================
--- kernel/arch/arm32/src/mach/integratorcp/integratorcp.c	(revision d46732962adcfcbf946c2c3f032af0f7fadb285c)
+++ kernel/arch/arm32/src/mach/integratorcp/integratorcp.c	(revision adec5b450420e754be2635ab4e7587f68c0a3287)
@@ -129,10 +129,12 @@
 void icp_init(void)
 {
-	icp_hw_map.uart = hw_map(ICP_UART, PAGE_SIZE);
-	icp_hw_map.kbd_ctrl = hw_map(ICP_KBD, PAGE_SIZE);
+	icp_hw_map.uart = km_map(ICP_UART, PAGE_SIZE,
+	    PAGE_WRITE | PAGE_NOT_CACHEABLE);
+	icp_hw_map.kbd_ctrl = km_map(ICP_KBD, PAGE_SIZE, PAGE_NOT_CACHEABLE);
 	icp_hw_map.kbd_stat = icp_hw_map.kbd_ctrl + ICP_KBD_STAT;
 	icp_hw_map.kbd_data = icp_hw_map.kbd_ctrl + ICP_KBD_DATA;
 	icp_hw_map.kbd_intstat = icp_hw_map.kbd_ctrl + ICP_KBD_INTR_STAT;
-	icp_hw_map.rtc = hw_map(ICP_RTC, PAGE_SIZE);
+	icp_hw_map.rtc = km_map(ICP_RTC, PAGE_SIZE,
+	    PAGE_WRITE | PAGE_NOT_CACHEABLE);
 	icp_hw_map.rtc1_load = icp_hw_map.rtc + ICP_RTC1_LOAD_OFFSET;
 	icp_hw_map.rtc1_read = icp_hw_map.rtc + ICP_RTC1_READ_OFFSET;
@@ -142,10 +144,13 @@
 	icp_hw_map.rtc1_intrstat = icp_hw_map.rtc + ICP_RTC1_INTRSTAT_OFFSET;
 
-	icp_hw_map.irqc = hw_map(ICP_IRQC, PAGE_SIZE);
+	icp_hw_map.irqc = km_map(ICP_IRQC, PAGE_SIZE,
+	    PAGE_WRITE | PAGE_NOT_CACHEABLE);
 	icp_hw_map.irqc_mask = icp_hw_map.irqc + ICP_IRQC_MASK_OFFSET;
 	icp_hw_map.irqc_unmask = icp_hw_map.irqc + ICP_IRQC_UNMASK_OFFSET;
-	icp_hw_map.cmcr = hw_map(ICP_CMCR, PAGE_SIZE);
+	icp_hw_map.cmcr = km_map(ICP_CMCR, PAGE_SIZE,
+	    PAGE_WRITE | PAGE_NOT_CACHEABLE);
 	icp_hw_map.sdramcr = icp_hw_map.cmcr + ICP_SDRAMCR_OFFSET;
-	icp_hw_map.vga = hw_map(ICP_VGA, PAGE_SIZE);
+	icp_hw_map.vga = km_map(ICP_VGA, PAGE_SIZE,
+	    PAGE_WRITE | PAGE_NOT_CACHEABLE);
 
 	hw_map_init_called = true;
Index: kernel/arch/arm32/src/mach/testarm/testarm.c
===================================================================
--- kernel/arch/arm32/src/mach/testarm/testarm.c	(revision d46732962adcfcbf946c2c3f032af0f7fadb285c)
+++ kernel/arch/arm32/src/mach/testarm/testarm.c	(revision adec5b450420e754be2635ab4e7587f68c0a3287)
@@ -72,7 +72,10 @@
 void gxemul_init(void)
 {
-	gxemul_kbd = (void *) hw_map(GXEMUL_KBD_ADDRESS, PAGE_SIZE);
-	gxemul_rtc = (void *) hw_map(GXEMUL_RTC_ADDRESS, PAGE_SIZE);
-	gxemul_irqc = (void *) hw_map(GXEMUL_IRQC_ADDRESS, PAGE_SIZE);
+	gxemul_kbd = (void *) km_map(GXEMUL_KBD_ADDRESS, PAGE_SIZE,
+	    PAGE_WRITE | PAGE_NOT_CACHEABLE);
+	gxemul_rtc = (void *) km_map(GXEMUL_RTC_ADDRESS, PAGE_SIZE,
+	    PAGE_WRITE | PAGE_NOT_CACHEABLE);
+	gxemul_irqc = (void *) km_map(GXEMUL_IRQC_ADDRESS, PAGE_SIZE,
+	    PAGE_WRITE | PAGE_NOT_CACHEABLE);
 }
 
Index: kernel/arch/ia32/src/smp/smp.c
===================================================================
--- kernel/arch/ia32/src/smp/smp.c	(revision d46732962adcfcbf946c2c3f032af0f7fadb285c)
+++ kernel/arch/ia32/src/smp/smp.c	(revision adec5b450420e754be2635ab4e7587f68c0a3287)
@@ -73,6 +73,8 @@
 	
 	if (config.cpu_count > 1) {
-		l_apic = (uint32_t *) hw_map((uintptr_t) l_apic, PAGE_SIZE);
-		io_apic = (uint32_t *) hw_map((uintptr_t) io_apic, PAGE_SIZE);
+		l_apic = (uint32_t *) km_map((uintptr_t) l_apic, PAGE_SIZE,
+		    PAGE_WRITE | PAGE_NOT_CACHEABLE);
+		io_apic = (uint32_t *) km_map((uintptr_t) io_apic, PAGE_SIZE,
+		    PAGE_WRITE | PAGE_NOT_CACHEABLE);
 	}
 }
Index: kernel/arch/ia64/src/ia64.c
===================================================================
--- kernel/arch/ia64/src/ia64.c	(revision d46732962adcfcbf946c2c3f032af0f7fadb285c)
+++ kernel/arch/ia64/src/ia64.c	(revision adec5b450420e754be2635ab4e7587f68c0a3287)
@@ -89,5 +89,6 @@
 static void iosapic_init(void)
 {
-	uintptr_t IOSAPIC = hw_map(iosapic_base, PAGE_SIZE);
+	uintptr_t IOSAPIC = km_map(iosapic_base, PAGE_SIZE,
+	    PAGE_WRITE | PAGE_NOT_CACHEABLE);
 	int i;
 	
@@ -117,5 +118,6 @@
 	if (config.cpu_active == 1) {
 		/* Map the page with legacy I/O. */
-		legacyio_virt_base = hw_map(LEGACYIO_PHYS_BASE, LEGACYIO_SIZE);
+		legacyio_virt_base = km_map(LEGACYIO_PHYS_BASE, LEGACYIO_SIZE,
+		    PAGE_WRITE | PAGE_NOT_CACHEABLE);
 
 		iosapic_init();
Index: kernel/arch/ppc32/src/drivers/pic.c
===================================================================
--- kernel/arch/ppc32/src/drivers/pic.c	(revision d46732962adcfcbf946c2c3f032af0f7fadb285c)
+++ kernel/arch/ppc32/src/drivers/pic.c	(revision adec5b450420e754be2635ab4e7587f68c0a3287)
@@ -42,5 +42,5 @@
 void pic_init(uintptr_t base, size_t size, cir_t *cir, void **cir_arg)
 {
-	pic = (uint32_t *) hw_map(base, size);
+	pic = (uint32_t *) km_map(base, size, PAGE_WRITE | PAGE_NOT_CACHEABLE);
 	*cir = pic_ack_interrupt;
 	*cir_arg = NULL;
Index: kernel/arch/ppc32/src/ppc32.c
===================================================================
--- kernel/arch/ppc32/src/ppc32.c	(revision d46732962adcfcbf946c2c3f032af0f7fadb285c)
+++ kernel/arch/ppc32/src/ppc32.c	(revision adec5b450420e754be2635ab4e7587f68c0a3287)
@@ -209,6 +209,6 @@
 		size_t size = 2 * PAGE_SIZE;
 		
-		cuda_t *cuda = (cuda_t *)
-		    (hw_map(aligned_addr, offset + size) + offset);
+		cuda_t *cuda = (cuda_t *) (km_map(aligned_addr, offset + size,
+		    PAGE_WRITE | PAGE_NOT_CACHEABLE) + offset);
 		
 		/* Initialize I/O controller */
Index: kernel/arch/sparc64/src/drivers/kbd.c
===================================================================
--- kernel/arch/sparc64/src/drivers/kbd.c	(revision d46732962adcfcbf946c2c3f032af0f7fadb285c)
+++ kernel/arch/sparc64/src/drivers/kbd.c	(revision adec5b450420e754be2635ab4e7587f68c0a3287)
@@ -114,6 +114,6 @@
 	size_t offset = pa - aligned_addr;
 	
-	ns16550_t *ns16550 = (ns16550_t *)
-	   (hw_map(aligned_addr, offset + size) + offset);
+	ns16550_t *ns16550 = (ns16550_t *) (km_map(aligned_addr, offset + size,
+	    PAGE_WRITE | PAGE_NOT_CACHEABLE) + offset);
 	
 	ns16550_instance_t *ns16550_instance = ns16550_init(ns16550, inr, cir, cir_arg);
Index: kernel/arch/sparc64/src/drivers/pci.c
===================================================================
--- kernel/arch/sparc64/src/drivers/pci.c	(revision d46732962adcfcbf946c2c3f032af0f7fadb285c)
+++ kernel/arch/sparc64/src/drivers/pci.c	(revision adec5b450420e754be2635ab4e7587f68c0a3287)
@@ -109,5 +109,6 @@
 	pci->model = PCI_SABRE;
 	pci->op = &pci_sabre_ops;
-	pci->reg = (uint64_t *) hw_map(paddr, reg[SABRE_INTERNAL_REG].size);
+	pci->reg = (uint64_t *) km_map(paddr, reg[SABRE_INTERNAL_REG].size,
+	    PAGE_WRITE | PAGE_NOT_CACHEABLE);
 
 	/*
@@ -156,5 +157,6 @@
 	pci->model = PCI_PSYCHO;
 	pci->op = &pci_psycho_ops;
-	pci->reg = (uint64_t *) hw_map(paddr, reg[PSYCHO_INTERNAL_REG].size);
+	pci->reg = (uint64_t *) km_map(paddr, reg[PSYCHO_INTERNAL_REG].size,
+	    PAGE_WRITE | PAGE_NOT_CACHEABLE);
 
 	/*
Index: kernel/genarch/src/drivers/ega/ega.c
===================================================================
--- kernel/genarch/src/drivers/ega/ega.c	(revision d46732962adcfcbf946c2c3f032af0f7fadb285c)
+++ kernel/genarch/src/drivers/ega/ega.c	(revision adec5b450420e754be2635ab4e7587f68c0a3287)
@@ -597,5 +597,6 @@
 	
 	instance->base = base;
-	instance->addr = (uint8_t *) hw_map(addr, EGA_VRAM_SIZE);
+	instance->addr = (uint8_t *) km_map(addr, EGA_VRAM_SIZE,
+	    PAGE_WRITE | PAGE_NOT_CACHEABLE);
 	if (!instance->addr) {
 		LOG("Unable to EGA video memory.");
Index: kernel/genarch/src/drivers/s3c24xx_uart/s3c24xx_uart.c
===================================================================
--- kernel/genarch/src/drivers/s3c24xx_uart/s3c24xx_uart.c	(revision d46732962adcfcbf946c2c3f032af0f7fadb285c)
+++ kernel/genarch/src/drivers/s3c24xx_uart/s3c24xx_uart.c	(revision adec5b450420e754be2635ab4e7587f68c0a3287)
@@ -114,5 +114,6 @@
 	uart_dev->data = uart;
 
-	uart->io = (s3c24xx_uart_io_t *) hw_map(paddr, PAGE_SIZE);
+	uart->io = (s3c24xx_uart_io_t *) km_map(paddr, PAGE_SIZE,
+	    PAGE_WRITE | PAGE_NOT_CACHEABLE);
 	uart->indev = NULL;
 
Index: kernel/genarch/src/fb/fb.c
===================================================================
--- kernel/genarch/src/fb/fb.c	(revision d46732962adcfcbf946c2c3f032af0f7fadb285c)
+++ kernel/genarch/src/fb/fb.c	(revision adec5b450420e754be2635ab4e7587f68c0a3287)
@@ -587,5 +587,6 @@
 	size_t glyphsize = FONT_GLYPHS * instance->glyphbytes;
 	
-	instance->addr = (uint8_t *) hw_map((uintptr_t) props->addr, fbsize);
+	instance->addr = (uint8_t *) km_map((uintptr_t) props->addr, fbsize,
+	    PAGE_WRITE | PAGE_NOT_CACHEABLE);
 	if (!instance->addr) {
 		LOG("Unable to map framebuffer.");
Index: kernel/generic/include/mm/km.h
===================================================================
--- kernel/generic/include/mm/km.h	(revision d46732962adcfcbf946c2c3f032af0f7fadb285c)
+++ kernel/generic/include/mm/km.h	(revision adec5b450420e754be2635ab4e7587f68c0a3287)
@@ -49,5 +49,5 @@
 extern bool km_is_non_identity(uintptr_t);
 
-extern uintptr_t hw_map(uintptr_t, size_t);
+extern uintptr_t km_map(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 d46732962adcfcbf946c2c3f032af0f7fadb285c)
+++ kernel/generic/src/mm/km.c	(revision adec5b450420e754be2635ab4e7587f68c0a3287)
@@ -124,24 +124,23 @@
 }
 
-uintptr_t hw_map(uintptr_t physaddr, size_t size)
-{
-	uintptr_t virtaddr;
+uintptr_t km_map(uintptr_t paddr, size_t size, unsigned int flags)
+{
+	uintptr_t vaddr;
 	size_t asize;
 	size_t align;
-	pfn_t i;
+	uintptr_t offs;
 
 	asize = ALIGN_UP(size, PAGE_SIZE);
 	align = ispwr2(size) ? size : (1U << (fnzb(size) + 1));
-	virtaddr = km_page_alloc(asize, max(PAGE_SIZE, align));
+	vaddr = km_page_alloc(asize, max(PAGE_SIZE, align));
 
 	page_table_lock(AS_KERNEL, true);
-	for (i = 0; i < ADDR2PFN(asize); i++) {
-		uintptr_t addr = PFN2ADDR(i);
-		page_mapping_insert(AS_KERNEL, virtaddr + addr, physaddr + addr,
-		    PAGE_NOT_CACHEABLE | PAGE_WRITE);
+	for (offs = 0; offs < asize; offs += PAGE_SIZE) {
+		page_mapping_insert(AS_KERNEL, vaddr + offs, paddr + offs,
+		    flags);
 	}
 	page_table_unlock(AS_KERNEL, true);
 	
-	return virtaddr;
+	return vaddr;
 }
 
