Index: kernel/arch/amd64/src/vreg.c
===================================================================
--- kernel/arch/amd64/src/vreg.c	(revision b1834a01038fc2eeb50637bb5cb48a741a03b9fb)
+++ kernel/arch/amd64/src/vreg.c	(revision a1b9f63c506357f379bb6f1d9f633d5a740e941c)
@@ -66,5 +66,5 @@
 		panic("Cannot allocate VREG frame.");
 
-	page = (uint64_t *) km_map(frame, PAGE_SIZE,
+	page = (uint64_t *) km_map(frame, PAGE_SIZE, PAGE_SIZE,
 	    PAGE_READ | PAGE_WRITE | PAGE_USER | PAGE_CACHEABLE);
 
Index: kernel/arch/arm32/src/mach/beagleboardxm/beagleboardxm.c
===================================================================
--- kernel/arch/arm32/src/mach/beagleboardxm/beagleboardxm.c	(revision b1834a01038fc2eeb50637bb5cb48a741a03b9fb)
+++ kernel/arch/arm32/src/mach/beagleboardxm/beagleboardxm.c	(revision a1b9f63c506357f379bb6f1d9f633d5a740e941c)
@@ -102,5 +102,5 @@
 	beagleboard.irc_addr =
 	    (void *) km_map(AMDM37x_IRC_BASE_ADDRESS, AMDM37x_IRC_SIZE,
-	    PAGE_NOT_CACHEABLE);
+	    KM_NATURAL_ALIGNMENT, PAGE_NOT_CACHEABLE);
 	assert(beagleboard.irc_addr);
 	omap_irc_init(beagleboard.irc_addr);
Index: kernel/arch/arm32/src/mach/beaglebone/beaglebone.c
===================================================================
--- kernel/arch/arm32/src/mach/beaglebone/beaglebone.c	(revision b1834a01038fc2eeb50637bb5cb48a741a03b9fb)
+++ kernel/arch/arm32/src/mach/beaglebone/beaglebone.c	(revision a1b9f63c506357f379bb6f1d9f633d5a740e941c)
@@ -88,14 +88,15 @@
 {
 	bbone.irc_addr = (void *) km_map(AM335x_IRC_BASE_ADDRESS,
-	    AM335x_IRC_SIZE, PAGE_NOT_CACHEABLE);
+	    AM335x_IRC_SIZE, KM_NATURAL_ALIGNMENT, PAGE_NOT_CACHEABLE);
 
 	bbone.cm_per_addr = (void *) km_map(AM335x_CM_PER_BASE_ADDRESS,
-	    AM335x_CM_PER_SIZE, PAGE_NOT_CACHEABLE);
+	    AM335x_CM_PER_SIZE, KM_NATURAL_ALIGNMENT, PAGE_NOT_CACHEABLE);
 
 	bbone.cm_dpll_addr = (void *) km_map(AM335x_CM_DPLL_BASE_ADDRESS,
-	    AM335x_CM_DPLL_SIZE, PAGE_NOT_CACHEABLE);
+	    AM335x_CM_DPLL_SIZE, KM_NATURAL_ALIGNMENT, PAGE_NOT_CACHEABLE);
 
 	bbone.ctrl_module = (void *) km_map(AM335x_CTRL_MODULE_BASE_ADDRESS,
-	    AM335x_CTRL_MODULE_SIZE, PAGE_NOT_CACHEABLE);
+	    AM335x_CTRL_MODULE_SIZE, KM_NATURAL_ALIGNMENT,
+	    PAGE_NOT_CACHEABLE);
 
 	assert(bbone.irc_addr != NULL);
Index: kernel/arch/arm32/src/mach/gta02/gta02.c
===================================================================
--- kernel/arch/arm32/src/mach/gta02/gta02.c	(revision b1834a01038fc2eeb50637bb5cb48a741a03b9fb)
+++ kernel/arch/arm32/src/mach/gta02/gta02.c	(revision a1b9f63c506357f379bb6f1d9f633d5a740e941c)
@@ -103,6 +103,6 @@
 
 	gta02_timer = (void *) km_map(S3C24XX_TIMER_ADDRESS, PAGE_SIZE,
-	    PAGE_NOT_CACHEABLE);
-	irqc_regs = (void *) km_map(S3C24XX_IRQC_ADDRESS, PAGE_SIZE,
+	    PAGE_SIZE, PAGE_NOT_CACHEABLE);
+	irqc_regs = (void *) km_map(S3C24XX_IRQC_ADDRESS, PAGE_SIZE, PAGE_SIZE,
 	    PAGE_NOT_CACHEABLE);
 
Index: kernel/arch/arm32/src/mach/integratorcp/integratorcp.c
===================================================================
--- kernel/arch/arm32/src/mach/integratorcp/integratorcp.c	(revision b1834a01038fc2eeb50637bb5cb48a741a03b9fb)
+++ kernel/arch/arm32/src/mach/integratorcp/integratorcp.c	(revision a1b9f63c506357f379bb6f1d9f633d5a740e941c)
@@ -135,11 +135,12 @@
 void icp_init(void)
 {
-	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.uart = km_map(ICP_UART, PAGE_SIZE, PAGE_SIZE,
+	    PAGE_WRITE | PAGE_NOT_CACHEABLE);
+	icp.hw_map.kbd_ctrl = km_map(ICP_KBD, PAGE_SIZE, 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 = km_map(ICP_RTC, PAGE_SIZE,
+	icp.hw_map.rtc = km_map(ICP_RTC, PAGE_SIZE, PAGE_SIZE,
 	    PAGE_WRITE | PAGE_NOT_CACHEABLE);
 	icp.hw_map.rtc1_load = icp.hw_map.rtc + ICP_RTC1_LOAD_OFFSET;
@@ -150,12 +151,12 @@
 	icp.hw_map.rtc1_intrstat = icp.hw_map.rtc + ICP_RTC1_INTRSTAT_OFFSET;
 
-	icp.hw_map.irqc = km_map(ICP_IRQC, PAGE_SIZE,
+	icp.hw_map.irqc = km_map(ICP_IRQC, PAGE_SIZE, 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 = km_map(ICP_CMCR, PAGE_SIZE,
+	icp.hw_map.cmcr = km_map(ICP_CMCR, PAGE_SIZE, PAGE_SIZE,
 	    PAGE_WRITE | PAGE_NOT_CACHEABLE);
 	icp.hw_map.sdramcr = icp.hw_map.cmcr + ICP_SDRAMCR_OFFSET;
-	icp.hw_map.vga = km_map(ICP_VGA, PAGE_SIZE,
+	icp.hw_map.vga = km_map(ICP_VGA, PAGE_SIZE, PAGE_SIZE,
 	    PAGE_WRITE | PAGE_NOT_CACHEABLE);
 
Index: kernel/arch/arm32/src/mach/raspberrypi/raspberrypi.c
===================================================================
--- kernel/arch/arm32/src/mach/raspberrypi/raspberrypi.c	(revision b1834a01038fc2eeb50637bb5cb48a741a03b9fb)
+++ kernel/arch/arm32/src/mach/raspberrypi/raspberrypi.c	(revision a1b9f63c506357f379bb6f1d9f633d5a740e941c)
@@ -103,5 +103,5 @@
 	/* Initialize interrupt controller */
 	raspi.irc = (void *) km_map(BCM2835_IRC_ADDR, sizeof(bcm2835_irc_t),
-	    PAGE_NOT_CACHEABLE);
+	    KM_NATURAL_ALIGNMENT, PAGE_NOT_CACHEABLE);
 	assert(raspi.irc);
 	bcm2835_irc_init(raspi.irc);
@@ -109,6 +109,5 @@
 	/* Initialize system timer */
 	raspi.timer = (void *) km_map(BCM2835_TIMER_ADDR,
-	    sizeof(bcm2835_timer_t),
-	    PAGE_NOT_CACHEABLE);
+	    sizeof(bcm2835_timer_t), KM_NATURAL_ALIGNMENT, PAGE_NOT_CACHEABLE);
 }
 
Index: kernel/arch/arm32/src/ras.c
===================================================================
--- kernel/arch/arm32/src/ras.c	(revision b1834a01038fc2eeb50637bb5cb48a741a03b9fb)
+++ kernel/arch/arm32/src/ras.c	(revision a1b9f63c506357f379bb6f1d9f633d5a740e941c)
@@ -56,6 +56,6 @@
 		frame = frame_alloc(1, FRAME_LOWMEM, 0);
 
-	ras_page = (uintptr_t *) km_map(frame,
-	    PAGE_SIZE, PAGE_READ | PAGE_WRITE | PAGE_USER | PAGE_CACHEABLE);
+	ras_page = (uintptr_t *) km_map(frame, PAGE_SIZE, PAGE_SIZE,
+	    PAGE_READ | PAGE_WRITE | PAGE_USER | PAGE_CACHEABLE);
 
 	memsetb(ras_page, PAGE_SIZE, 0);
Index: kernel/arch/ia32/src/smp/smp.c
===================================================================
--- kernel/arch/ia32/src/smp/smp.c	(revision b1834a01038fc2eeb50637bb5cb48a741a03b9fb)
+++ kernel/arch/ia32/src/smp/smp.c	(revision a1b9f63c506357f379bb6f1d9f633d5a740e941c)
@@ -76,7 +76,7 @@
 	if (config.cpu_count > 1) {
 		l_apic = (uint32_t *) km_map((uintptr_t) l_apic, PAGE_SIZE,
-		    PAGE_WRITE | PAGE_NOT_CACHEABLE);
+		    PAGE_SIZE, PAGE_WRITE | PAGE_NOT_CACHEABLE);
 		io_apic = (uint32_t *) km_map((uintptr_t) io_apic, PAGE_SIZE,
-		    PAGE_WRITE | PAGE_NOT_CACHEABLE);
+		    PAGE_SIZE, PAGE_WRITE | PAGE_NOT_CACHEABLE);
 	}
 }
Index: kernel/arch/ia32/src/vreg.c
===================================================================
--- kernel/arch/ia32/src/vreg.c	(revision b1834a01038fc2eeb50637bb5cb48a741a03b9fb)
+++ kernel/arch/ia32/src/vreg.c	(revision a1b9f63c506357f379bb6f1d9f633d5a740e941c)
@@ -67,5 +67,5 @@
 		panic("Cannot allocate VREG frame.");
 
-	page = (uint32_t *) km_map(frame, PAGE_SIZE,
+	page = (uint32_t *) km_map(frame, PAGE_SIZE, PAGE_SIZE,
 	    PAGE_READ | PAGE_WRITE | PAGE_USER | PAGE_CACHEABLE);
 
Index: kernel/arch/ia64/src/ia64.c
===================================================================
--- kernel/arch/ia64/src/ia64.c	(revision b1834a01038fc2eeb50637bb5cb48a741a03b9fb)
+++ kernel/arch/ia64/src/ia64.c	(revision a1b9f63c506357f379bb6f1d9f633d5a740e941c)
@@ -106,5 +106,5 @@
 static void iosapic_init(void)
 {
-	uintptr_t IOSAPIC = km_map(iosapic_base, PAGE_SIZE,
+	uintptr_t IOSAPIC = km_map(iosapic_base, PAGE_SIZE, PAGE_SIZE,
 	    PAGE_WRITE | PAGE_NOT_CACHEABLE);
 	int i;
@@ -136,5 +136,5 @@
 		/* Map the page with legacy I/O. */
 		legacyio_virt_base = km_map(LEGACYIO_PHYS_BASE, LEGACYIO_SIZE,
-		    PAGE_WRITE | PAGE_NOT_CACHEABLE);
+		    KM_NATURAL_ALIGNMENT, PAGE_WRITE | PAGE_NOT_CACHEABLE);
 
 		iosapic_init();
Index: kernel/arch/ppc32/src/drivers/pic.c
===================================================================
--- kernel/arch/ppc32/src/drivers/pic.c	(revision b1834a01038fc2eeb50637bb5cb48a741a03b9fb)
+++ kernel/arch/ppc32/src/drivers/pic.c	(revision a1b9f63c506357f379bb6f1d9f633d5a740e941c)
@@ -42,5 +42,6 @@
 void pic_init(uintptr_t base, size_t size, cir_t *cir, void **cir_arg)
 {
-	pic = (uint32_t *) km_map(base, size, PAGE_WRITE | PAGE_NOT_CACHEABLE);
+	pic = (uint32_t *) km_map(base, size, KM_NATURAL_ALIGNMENT,
+	    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 b1834a01038fc2eeb50637bb5cb48a741a03b9fb)
+++ kernel/arch/ppc32/src/ppc32.c	(revision a1b9f63c506357f379bb6f1d9f633d5a740e941c)
@@ -242,4 +242,5 @@
 
 		cuda_t *cuda = (cuda_t *) (km_map(aligned_addr, offset + size,
+		    KM_NATURAL_ALIGNMENT,
 		    PAGE_WRITE | PAGE_NOT_CACHEABLE) + offset);
 
Index: kernel/arch/sparc64/src/drivers/kbd.c
===================================================================
--- kernel/arch/sparc64/src/drivers/kbd.c	(revision b1834a01038fc2eeb50637bb5cb48a741a03b9fb)
+++ kernel/arch/sparc64/src/drivers/kbd.c	(revision a1b9f63c506357f379bb6f1d9f633d5a740e941c)
@@ -119,5 +119,5 @@
 
 	ioport8_t *ns16550 = (ioport8_t *) (km_map(aligned_addr, offset + size,
-	    PAGE_WRITE | PAGE_NOT_CACHEABLE) + offset);
+	    KM_NATURAL_ALIGNMENT, PAGE_WRITE | PAGE_NOT_CACHEABLE) + offset);
 
 	ns16550_instance_t *ns16550_instance = ns16550_init(ns16550, 0, inr, cir,
Index: kernel/arch/sparc64/src/drivers/pci.c
===================================================================
--- kernel/arch/sparc64/src/drivers/pci.c	(revision b1834a01038fc2eeb50637bb5cb48a741a03b9fb)
+++ kernel/arch/sparc64/src/drivers/pci.c	(revision a1b9f63c506357f379bb6f1d9f633d5a740e941c)
@@ -110,5 +110,5 @@
 	pci->op = &pci_sabre_ops;
 	pci->reg = (uint64_t *) km_map(paddr, reg[SABRE_INTERNAL_REG].size,
-	    PAGE_WRITE | PAGE_NOT_CACHEABLE);
+	    KM_NATURAL_ALIGNMENT, PAGE_WRITE | PAGE_NOT_CACHEABLE);
 
 	return pci;
@@ -152,5 +152,5 @@
 	pci->op = &pci_psycho_ops;
 	pci->reg = (uint64_t *) km_map(paddr, reg[PSYCHO_INTERNAL_REG].size,
-	    PAGE_WRITE | PAGE_NOT_CACHEABLE);
+	    KM_NATURAL_ALIGNMENT, PAGE_WRITE | PAGE_NOT_CACHEABLE);
 
 	return pci;
Index: kernel/genarch/include/genarch/drivers/amdm37x/gpt.h
===================================================================
--- kernel/genarch/include/genarch/drivers/amdm37x/gpt.h	(revision b1834a01038fc2eeb50637bb5cb48a741a03b9fb)
+++ kernel/genarch/include/genarch/drivers/amdm37x/gpt.h	(revision a1b9f63c506357f379bb6f1d9f633d5a740e941c)
@@ -208,5 +208,6 @@
 	// TODO find a nicer way to setup 32kHz clock source for timer1
 	// reg 0x48004C40 is CM_CLKSEL_WKUP see page 485 of the manual
-	ioport32_t *clksel = (void *) km_map(0x48004C40, 4, PAGE_NOT_CACHEABLE);
+	ioport32_t *clksel = (void *) km_map(0x48004C40, 4, PAGE_SIZE,
+	    PAGE_NOT_CACHEABLE);
 	*clksel &= ~1;
 	km_unmap((uintptr_t)clksel, 4);
@@ -214,5 +215,6 @@
 	assert(timer);
 	/* Map control register */
-	timer->regs = (void *) km_map(ioregs, iosize, PAGE_NOT_CACHEABLE);
+	timer->regs = (void *) km_map(ioregs, iosize, KM_NATURAL_ALIGNMENT,
+	    PAGE_NOT_CACHEABLE);
 
 	/* Reset the timer */
Index: kernel/genarch/src/acpi/acpi.c
===================================================================
--- kernel/genarch/src/acpi/acpi.c	(revision b1834a01038fc2eeb50637bb5cb48a741a03b9fb)
+++ kernel/genarch/src/acpi/acpi.c	(revision a1b9f63c506357f379bb6f1d9f633d5a740e941c)
@@ -105,9 +105,11 @@
 	/* Start with mapping the header only. */
 	vhdr = (struct acpi_sdt_header *) km_map((uintptr_t) psdt,
-	    sizeof(struct acpi_sdt_header), PAGE_READ | PAGE_NOT_CACHEABLE);
+	    sizeof(struct acpi_sdt_header), KM_NATURAL_ALIGNMENT,
+	    PAGE_READ | PAGE_NOT_CACHEABLE);
 
 	/* Now we can map the entire structure. */
 	vsdt = (struct acpi_sdt_header *) km_map((uintptr_t) psdt,
-	    vhdr->length, PAGE_WRITE | PAGE_NOT_CACHEABLE);
+	    vhdr->length, KM_NATURAL_ALIGNMENT,
+	    PAGE_WRITE | PAGE_NOT_CACHEABLE);
 
 	// TODO: do not leak vtmp
Index: kernel/genarch/src/drivers/am335x/timer.c
===================================================================
--- kernel/genarch/src/drivers/am335x/timer.c	(revision b1834a01038fc2eeb50637bb5cb48a741a03b9fb)
+++ kernel/genarch/src/drivers/am335x/timer.c	(revision a1b9f63c506357f379bb6f1d9f633d5a740e941c)
@@ -101,5 +101,6 @@
 	size = regs_map[id].size;
 
-	timer->regs = (void *) km_map(base_addr, size, PAGE_NOT_CACHEABLE);
+	timer->regs = (void *) km_map(base_addr, size, KM_NATURAL_ALIGNMENT,
+	    PAGE_NOT_CACHEABLE);
 	assert(timer->regs != NULL);
 
Index: kernel/genarch/src/drivers/bcm2835/mbox.c
===================================================================
--- kernel/genarch/src/drivers/bcm2835/mbox.c	(revision b1834a01038fc2eeb50637bb5cb48a741a03b9fb)
+++ kernel/genarch/src/drivers/bcm2835/mbox.c	(revision a1b9f63c506357f379bb6f1d9f633d5a740e941c)
@@ -93,5 +93,5 @@
 
 	fb_mbox = (void *) km_map(BCM2835_MBOX0_ADDR, sizeof(bcm2835_mbox_t),
-	    PAGE_NOT_CACHEABLE);
+	    KM_NATURAL_ALIGNMENT, PAGE_NOT_CACHEABLE);
 
 	fb_desc->width = 640;
Index: kernel/genarch/src/drivers/ega/ega.c
===================================================================
--- kernel/genarch/src/drivers/ega/ega.c	(revision b1834a01038fc2eeb50637bb5cb48a741a03b9fb)
+++ kernel/genarch/src/drivers/ega/ega.c	(revision a1b9f63c506357f379bb6f1d9f633d5a740e941c)
@@ -601,5 +601,5 @@
 	instance->base = base;
 	instance->addr = (uint8_t *) km_map(addr, EGA_VRAM_SIZE,
-	    PAGE_WRITE | PAGE_NOT_CACHEABLE);
+	    KM_NATURAL_ALIGNMENT, PAGE_WRITE | PAGE_NOT_CACHEABLE);
 	if (!instance->addr) {
 		LOG("Unable to EGA video memory.");
Index: kernel/genarch/src/drivers/omap/uart.c
===================================================================
--- kernel/genarch/src/drivers/omap/uart.c	(revision b1834a01038fc2eeb50637bb5cb48a741a03b9fb)
+++ kernel/genarch/src/drivers/omap/uart.c	(revision a1b9f63c506357f379bb6f1d9f633d5a740e941c)
@@ -88,5 +88,6 @@
 {
 	assert(uart);
-	uart->regs = (void *)km_map(addr, size, PAGE_NOT_CACHEABLE);
+	uart->regs = (void *)km_map(addr, size, KM_NATURAL_ALIGNMENT,
+	    PAGE_NOT_CACHEABLE);
 
 	assert(uart->regs);
Index: kernel/genarch/src/drivers/pl011/pl011.c
===================================================================
--- kernel/genarch/src/drivers/pl011/pl011.c	(revision b1834a01038fc2eeb50637bb5cb48a741a03b9fb)
+++ kernel/genarch/src/drivers/pl011/pl011.c	(revision a1b9f63c506357f379bb6f1d9f633d5a740e941c)
@@ -100,5 +100,5 @@
 	assert(uart);
 	uart->regs = (void *)km_map(addr, sizeof(pl011_uart_regs_t),
-	    PAGE_NOT_CACHEABLE);
+	    KM_NATURAL_ALIGNMENT, PAGE_NOT_CACHEABLE);
 	assert(uart->regs);
 
Index: kernel/genarch/src/drivers/s3c24xx/uart.c
===================================================================
--- kernel/genarch/src/drivers/s3c24xx/uart.c	(revision b1834a01038fc2eeb50637bb5cb48a741a03b9fb)
+++ kernel/genarch/src/drivers/s3c24xx/uart.c	(revision a1b9f63c506357f379bb6f1d9f633d5a740e941c)
@@ -116,5 +116,5 @@
 	uart_dev->data = uart;
 
-	uart->io = (s3c24xx_uart_io_t *) km_map(paddr, PAGE_SIZE,
+	uart->io = (s3c24xx_uart_io_t *) km_map(paddr, PAGE_SIZE, PAGE_SIZE,
 	    PAGE_WRITE | PAGE_NOT_CACHEABLE);
 	uart->indev = NULL;
Index: kernel/genarch/src/fb/fb.c
===================================================================
--- kernel/genarch/src/fb/fb.c	(revision b1834a01038fc2eeb50637bb5cb48a741a03b9fb)
+++ kernel/genarch/src/fb/fb.c	(revision a1b9f63c506357f379bb6f1d9f633d5a740e941c)
@@ -610,5 +610,5 @@
 
 	instance->addr = (uint8_t *) km_map((uintptr_t) props->addr, fbsize,
-	    PAGE_WRITE | PAGE_NOT_CACHEABLE);
+	    KM_NATURAL_ALIGNMENT, 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 b1834a01038fc2eeb50637bb5cb48a741a03b9fb)
+++ kernel/generic/include/mm/km.h	(revision a1b9f63c506357f379bb6f1d9f633d5a740e941c)
@@ -39,4 +39,6 @@
 #include <mm/frame.h>
 
+#define KM_NATURAL_ALIGNMENT	-1U
+
 extern void km_identity_init(void);
 extern void km_non_identity_init(void);
@@ -49,5 +51,5 @@
 extern bool km_is_non_identity(uintptr_t);
 
-extern uintptr_t km_map(uintptr_t, size_t, unsigned int);
+extern uintptr_t km_map(uintptr_t, size_t, size_t, unsigned int);
 extern void km_unmap(uintptr_t, size_t);
 
Index: kernel/generic/src/console/cmd.c
===================================================================
--- kernel/generic/src/console/cmd.c	(revision b1834a01038fc2eeb50637bb5cb48a741a03b9fb)
+++ kernel/generic/src/console/cmd.c	(revision a1b9f63c506357f379bb6f1d9f633d5a740e941c)
@@ -728,5 +728,5 @@
 #endif
 		ptr = (uint8_t *) km_map(argv[0].intval, sizeof(uint8_t),
-		    PAGE_NOT_CACHEABLE);
+		    PAGE_SIZE, PAGE_NOT_CACHEABLE);
 
 	const uint8_t val = pio_read_8(ptr);
@@ -758,5 +758,5 @@
 #endif
 		ptr = (uint16_t *) km_map(argv[0].intval, sizeof(uint16_t),
-		    PAGE_NOT_CACHEABLE);
+		    PAGE_SIZE, PAGE_NOT_CACHEABLE);
 
 	const uint16_t val = pio_read_16(ptr);
@@ -788,5 +788,5 @@
 #endif
 		ptr = (uint32_t *) km_map(argv[0].intval, sizeof(uint32_t),
-		    PAGE_NOT_CACHEABLE);
+		    PAGE_SIZE, PAGE_NOT_CACHEABLE);
 
 	const uint32_t val = pio_read_32(ptr);
@@ -818,5 +818,5 @@
 #endif
 		ptr = (uint8_t *) km_map(argv[0].intval, sizeof(uint8_t),
-		    PAGE_NOT_CACHEABLE);
+		    PAGE_SIZE, PAGE_NOT_CACHEABLE);
 
 	printf("write %" PRIxn ": %" PRIx8 "\n", argv[0].intval,
@@ -849,5 +849,5 @@
 #endif
 		ptr = (uint16_t *) km_map(argv[0].intval, sizeof(uint16_t),
-		    PAGE_NOT_CACHEABLE);
+		    PAGE_SIZE, PAGE_NOT_CACHEABLE);
 
 	printf("write %" PRIxn ": %" PRIx16 "\n", argv[0].intval,
@@ -880,5 +880,5 @@
 #endif
 		ptr = (uint32_t *) km_map(argv[0].intval, sizeof(uint32_t),
-		    PAGE_NOT_CACHEABLE);
+		    PAGE_SIZE, PAGE_NOT_CACHEABLE);
 
 	printf("write %" PRIxn ": %" PRIx32 "\n", argv[0].intval,
Index: kernel/generic/src/ipc/irq.c
===================================================================
--- kernel/generic/src/ipc/irq.c	(revision b1834a01038fc2eeb50637bb5cb48a741a03b9fb)
+++ kernel/generic/src/ipc/irq.c	(revision a1b9f63c506357f379bb6f1d9f633d5a740e941c)
@@ -95,4 +95,5 @@
 #endif
 		ranges[i].base = km_map(pbase[i], ranges[i].size,
+		    KM_NATURAL_ALIGNMENT,
 		    PAGE_READ | PAGE_WRITE | PAGE_KERNEL | PAGE_NOT_CACHEABLE);
 		if (!ranges[i].base) {
Index: kernel/generic/src/main/kinit.c
===================================================================
--- kernel/generic/src/main/kinit.c	(revision b1834a01038fc2eeb50637bb5cb48a741a03b9fb)
+++ kernel/generic/src/main/kinit.c	(revision a1b9f63c506357f379bb6f1d9f633d5a740e941c)
@@ -249,5 +249,5 @@
 		 */
 		uintptr_t page = km_map(init.tasks[i].paddr,
-		    init.tasks[i].size,
+		    init.tasks[i].size, KM_NATURAL_ALIGNMENT,
 		    PAGE_READ | PAGE_WRITE | PAGE_CACHEABLE);
 		assert(page);
Index: kernel/generic/src/mm/km.c
===================================================================
--- kernel/generic/src/mm/km.c	(revision b1834a01038fc2eeb50637bb5cb48a741a03b9fb)
+++ kernel/generic/src/mm/km.c	(revision a1b9f63c506357f379bb6f1d9f633d5a740e941c)
@@ -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) {
Index: kernel/test/mm/mapping1.c
===================================================================
--- kernel/test/mm/mapping1.c	(revision b1834a01038fc2eeb50637bb5cb48a741a03b9fb)
+++ kernel/test/mm/mapping1.c	(revision a1b9f63c506357f379bb6f1d9f633d5a740e941c)
@@ -43,10 +43,10 @@
 	uintptr_t frame = frame_alloc(1, FRAME_NONE, 0);
 
-	uintptr_t page0 = km_map(frame, FRAME_SIZE,
+	uintptr_t page0 = km_map(frame, FRAME_SIZE, FRAME_SIZE,
 	    PAGE_READ | PAGE_WRITE | PAGE_CACHEABLE);
 	TPRINTF("Virtual address %p mapped to physical address %p.\n",
 	    (void *) page0, (void *) frame);
 
-	uintptr_t page1 = km_map(frame, FRAME_SIZE,
+	uintptr_t page1 = km_map(frame, FRAME_SIZE, FRAME_SIZE,
 	    PAGE_READ | PAGE_WRITE | PAGE_CACHEABLE);
 	TPRINTF("Virtual address %p mapped to physical address %p.\n",
