Index: kernel/arch/abs32le/include/arch/mm/page.h
===================================================================
--- kernel/arch/abs32le/include/arch/mm/page.h	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/arch/abs32le/include/arch/mm/page.h	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -92,7 +92,7 @@
 	get_pt_flags((pte_t *) (ptl0), (size_t) (i))
 #define GET_PTL2_FLAGS_ARCH(ptl1, i) \
-	PAGE_PRESENT
+	0
 #define GET_PTL3_FLAGS_ARCH(ptl2, i) \
-	PAGE_PRESENT
+	0
 #define GET_FRAME_FLAGS_ARCH(ptl3, i) \
 	get_pt_flags((pte_t *) (ptl3), (size_t) (i))
@@ -154,7 +154,6 @@
 	return (
 	    ((unsigned int) (!p->page_cache_disable) << PAGE_CACHEABLE_SHIFT) |
-	    ((unsigned int) (!p->present) << PAGE_PRESENT_SHIFT) |
+	    ((unsigned int) (!p->present) << PAGE_NOT_PRESENT_SHIFT) |
 	    ((unsigned int) p->uaccessible << PAGE_USER_SHIFT) |
-	    (1 << PAGE_READ_SHIFT) |
 	    ((unsigned int) p->writeable << PAGE_WRITE_SHIFT) |
 	    (1 << PAGE_EXEC_SHIFT) |
Index: kernel/arch/amd64/include/arch/mm/page.h
===================================================================
--- kernel/arch/amd64/include/arch/mm/page.h	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/arch/amd64/include/arch/mm/page.h	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -212,7 +212,6 @@
 
 	return ((!p->page_cache_disable) << PAGE_CACHEABLE_SHIFT |
-	    (!p->present) << PAGE_PRESENT_SHIFT |
+	    (!p->present) << PAGE_NOT_PRESENT_SHIFT |
 	    p->uaccessible << PAGE_USER_SHIFT |
-	    1 << PAGE_READ_SHIFT |
 	    p->writeable << PAGE_WRITE_SHIFT |
 	    (!p->no_execute) << PAGE_EXEC_SHIFT |
Index: kernel/arch/amd64/src/mm/page.c
===================================================================
--- kernel/arch/amd64/src/mm/page.c	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/arch/amd64/src/mm/page.c	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -56,5 +56,5 @@
 	uintptr_t cur;
 	unsigned int identity_flags =
-	    PAGE_GLOBAL | PAGE_CACHEABLE | PAGE_EXEC | PAGE_WRITE | PAGE_READ;
+	    PAGE_GLOBAL | PAGE_CACHEABLE | PAGE_EXEC | PAGE_WRITE;
 
 	page_mapping_operations = &pt_mapping_operations;
Index: kernel/arch/amd64/src/vreg.c
===================================================================
--- kernel/arch/amd64/src/vreg.c	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/arch/amd64/src/vreg.c	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -67,5 +67,5 @@
 
 	page = (uint64_t *) km_map(frame, PAGE_SIZE,
-	    PAGE_READ | PAGE_WRITE | PAGE_USER | PAGE_CACHEABLE);
+	    PAGE_WRITE | PAGE_USER | PAGE_CACHEABLE);
 
 	write_msr(AMD_MSR_FS, (uintptr_t) page);
Index: kernel/arch/arm32/include/arch/mm/page.h
===================================================================
--- kernel/arch/arm32/include/arch/mm/page.h	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/arch/arm32/include/arch/mm/page.h	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -108,7 +108,7 @@
         get_pt_level0_flags((pte_t *) (ptl0), (size_t) (i))
 #define GET_PTL2_FLAGS_ARCH(ptl1, i) \
-        PAGE_PRESENT
+        0
 #define GET_PTL3_FLAGS_ARCH(ptl2, i) \
-        PAGE_PRESENT
+        0
 #define GET_FRAME_FLAGS_ARCH(ptl3, i) \
         get_pt_level1_flags((pte_t *) (ptl3), (size_t) (i))
Index: kernel/arch/arm32/include/arch/mm/page_armv4.h
===================================================================
--- kernel/arch/arm32/include/arch/mm/page_armv4.h	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/arch/arm32/include/arch/mm/page_armv4.h	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -138,6 +138,6 @@
 	int np = (p->descriptor_type == PTE_DESCRIPTOR_NOT_PRESENT);
 
-	return (np << PAGE_PRESENT_SHIFT) | (1 << PAGE_USER_SHIFT) |
-	    (1 << PAGE_READ_SHIFT) | (1 << PAGE_WRITE_SHIFT) |
+	return (np << PAGE_NOT_PRESENT_SHIFT) | (1 << PAGE_USER_SHIFT) |
+	    (1 << PAGE_WRITE_SHIFT) |
 	    (1 << PAGE_EXEC_SHIFT) | (1 << PAGE_CACHEABLE_SHIFT);
 }
@@ -156,10 +156,7 @@
 	int ap = p->access_permission_0;
 
-	return ((dt == PTE_DESCRIPTOR_NOT_PRESENT) << PAGE_PRESENT_SHIFT) |
-	    ((ap == PTE_AP_USER_RO_KERNEL_RW) << PAGE_READ_SHIFT) |
-	    ((ap == PTE_AP_USER_RW_KERNEL_RW) << PAGE_READ_SHIFT) |
+	return ((dt == PTE_DESCRIPTOR_NOT_PRESENT) << PAGE_NOT_PRESENT_SHIFT) |
 	    ((ap == PTE_AP_USER_RW_KERNEL_RW) << PAGE_WRITE_SHIFT) |
 	    ((ap != PTE_AP_USER_NO_KERNEL_RW) << PAGE_USER_SHIFT) |
-	    ((ap == PTE_AP_USER_NO_KERNEL_RW) << PAGE_READ_SHIFT) |
 	    ((ap == PTE_AP_USER_NO_KERNEL_RW) << PAGE_WRITE_SHIFT) |
 	    (1 << PAGE_EXEC_SHIFT) |
@@ -220,14 +217,13 @@
 
 	if (flags & PAGE_USER)  {
-		if (flags & PAGE_READ) {
+		if (flags & PAGE_WRITE) {
+			p->access_permission_0 = p->access_permission_1 =
+			    p->access_permission_2 = p->access_permission_3 =
+			    PTE_AP_USER_RW_KERNEL_RW;
+		} else {
 			p->access_permission_0 = p->access_permission_1 =
 			    p->access_permission_2 = p->access_permission_3 =
 			    PTE_AP_USER_RO_KERNEL_RW;
 		}
-		if (flags & PAGE_WRITE) {
-			p->access_permission_0 = p->access_permission_1 =
-			    p->access_permission_2 = p->access_permission_3 =
-			    PTE_AP_USER_RW_KERNEL_RW;
-		}
 	}
 }
Index: kernel/arch/arm32/include/arch/mm/page_armv6.h
===================================================================
--- kernel/arch/arm32/include/arch/mm/page_armv6.h	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/arch/arm32/include/arch/mm/page_armv6.h	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -171,6 +171,6 @@
 	const unsigned np = (p->descriptor_type == PTE_DESCRIPTOR_NOT_PRESENT);
 
-	return (np << PAGE_PRESENT_SHIFT) | (1 << PAGE_USER_SHIFT) |
-	    (1 << PAGE_READ_SHIFT) | (1 << PAGE_WRITE_SHIFT) |
+	return (np << PAGE_NOT_PRESENT_SHIFT) | (1 << PAGE_USER_SHIFT) |
+	    (1 << PAGE_WRITE_SHIFT) |
 	    (1 << PAGE_EXEC_SHIFT) | (1 << PAGE_CACHEABLE_SHIFT);
 }
@@ -190,9 +190,6 @@
 	const unsigned ap1 = p->access_permission_1;
 
-	return ((dt == PTE_DESCRIPTOR_NOT_PRESENT) << PAGE_PRESENT_SHIFT) |
+	return ((dt == PTE_DESCRIPTOR_NOT_PRESENT) << PAGE_NOT_PRESENT_SHIFT) |
 	    ((dt != PTE_DESCRIPTOR_SMALL_PAGE_NX) << PAGE_EXEC_SHIFT) |
-	    ((ap0 == PTE_AP0_USER_LIMITED_KERNEL_FULL) << PAGE_READ_SHIFT) |
-	    ((ap0 == PTE_AP0_USER_FULL_KERNEL_FULL) << PAGE_READ_SHIFT) |
-	    ((ap0 == PTE_AP0_USER_NO_KERNEL_FULL) << PAGE_READ_SHIFT) |
 	    ((ap0 != PTE_AP0_USER_NO_KERNEL_FULL) << PAGE_USER_SHIFT) |
 	    (((ap1 != PTE_AP1_RO) && (ap0 == PTE_AP0_USER_FULL_KERNEL_FULL)) << PAGE_WRITE_SHIFT) |
Index: kernel/arch/arm32/src/mach/beagleboardxm/beagleboardxm.c
===================================================================
--- kernel/arch/arm32/src/mach/beagleboardxm/beagleboardxm.c	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/arch/arm32/src/mach/beagleboardxm/beagleboardxm.c	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -101,5 +101,5 @@
 	beagleboard.irc_addr =
 	    (void *) km_map(AMDM37x_IRC_BASE_ADDRESS, AMDM37x_IRC_SIZE,
-	    PAGE_NOT_CACHEABLE);
+	    0);
 	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 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/arch/arm32/src/mach/beaglebone/beaglebone.c	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -87,14 +87,14 @@
 {
 	bbone.irc_addr = (void *) km_map(AM335x_IRC_BASE_ADDRESS,
-	    AM335x_IRC_SIZE, PAGE_NOT_CACHEABLE);
+	    AM335x_IRC_SIZE, 0);
 
 	bbone.cm_per_addr = (void *) km_map(AM335x_CM_PER_BASE_ADDRESS,
-	    AM335x_CM_PER_SIZE, PAGE_NOT_CACHEABLE);
+	    AM335x_CM_PER_SIZE, 0);
 
 	bbone.cm_dpll_addr = (void *) km_map(AM335x_CM_DPLL_BASE_ADDRESS,
-	    AM335x_CM_DPLL_SIZE, PAGE_NOT_CACHEABLE);
+	    AM335x_CM_DPLL_SIZE, 0);
 
 	bbone.ctrl_module = (void *) km_map(AM335x_CTRL_MODULE_BASE_ADDRESS,
-	    AM335x_CTRL_MODULE_SIZE, PAGE_NOT_CACHEABLE);
+	    AM335x_CTRL_MODULE_SIZE, 0);
 
 	assert(bbone.irc_addr != NULL);
Index: kernel/arch/arm32/src/mach/gta02/gta02.c
===================================================================
--- kernel/arch/arm32/src/mach/gta02/gta02.c	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/arch/arm32/src/mach/gta02/gta02.c	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -103,7 +103,7 @@
 
 	gta02_timer = (void *) km_map(S3C24XX_TIMER_ADDRESS, PAGE_SIZE,
-	    PAGE_NOT_CACHEABLE);
+	    0);
 	irqc_regs = (void *) km_map(S3C24XX_IRQC_ADDRESS, PAGE_SIZE,
-	    PAGE_NOT_CACHEABLE);
+	    0);
 
 	/* Initialize interrupt controller. */
Index: kernel/arch/arm32/src/mach/integratorcp/integratorcp.c
===================================================================
--- kernel/arch/arm32/src/mach/integratorcp/integratorcp.c	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/arch/arm32/src/mach/integratorcp/integratorcp.c	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -135,11 +135,11 @@
 {
 	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);
+	    PAGE_WRITE);
+	icp.hw_map.kbd_ctrl = km_map(ICP_KBD, PAGE_SIZE, 0);
 	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,
-	    PAGE_WRITE | PAGE_NOT_CACHEABLE);
+	    PAGE_WRITE);
 	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;
@@ -150,12 +150,12 @@
 
 	icp.hw_map.irqc = km_map(ICP_IRQC, PAGE_SIZE,
-	    PAGE_WRITE | PAGE_NOT_CACHEABLE);
+	    PAGE_WRITE);
 	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,
-	    PAGE_WRITE | PAGE_NOT_CACHEABLE);
+	    PAGE_WRITE);
 	icp.hw_map.sdramcr = icp.hw_map.cmcr + ICP_SDRAMCR_OFFSET;
 	icp.hw_map.vga = km_map(ICP_VGA, PAGE_SIZE,
-	    PAGE_WRITE | PAGE_NOT_CACHEABLE);
+	    PAGE_WRITE);
 
 	hw_map_init_called = true;
Index: kernel/arch/arm32/src/mach/raspberrypi/raspberrypi.c
===================================================================
--- kernel/arch/arm32/src/mach/raspberrypi/raspberrypi.c	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/arch/arm32/src/mach/raspberrypi/raspberrypi.c	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -102,5 +102,5 @@
 	/* Initialize interrupt controller */
 	raspi.irc = (void *) km_map(BCM2835_IRC_ADDR, sizeof(bcm2835_irc_t),
-				    PAGE_NOT_CACHEABLE);
+				    0);
 	assert(raspi.irc);
 	bcm2835_irc_init(raspi.irc);
@@ -109,5 +109,5 @@
 	raspi.timer = (void *) km_map(BCM2835_TIMER_ADDR,
 				      sizeof(bcm2835_timer_t),
-				      PAGE_NOT_CACHEABLE);
+				      0);
 }
 
Index: kernel/arch/arm32/src/ras.c
===================================================================
--- kernel/arch/arm32/src/ras.c	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/arch/arm32/src/ras.c	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -57,5 +57,5 @@
 
 	ras_page = (uintptr_t *) km_map(frame,
-	    PAGE_SIZE, PAGE_READ | PAGE_WRITE | PAGE_USER | PAGE_CACHEABLE);
+	    PAGE_SIZE, PAGE_WRITE | PAGE_USER | PAGE_CACHEABLE);
 
 	memsetb(ras_page, PAGE_SIZE, 0);
Index: kernel/arch/ia32/include/arch/mm/page.h
===================================================================
--- kernel/arch/ia32/include/arch/mm/page.h	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/arch/ia32/include/arch/mm/page.h	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -109,7 +109,7 @@
 	get_pt_flags((pte_t *) (ptl0), (size_t) (i))
 #define GET_PTL2_FLAGS_ARCH(ptl1, i) \
-	PAGE_PRESENT
+	0
 #define GET_PTL3_FLAGS_ARCH(ptl2, i) \
-	PAGE_PRESENT
+	0
 #define GET_FRAME_FLAGS_ARCH(ptl3, i) \
 	get_pt_flags((pte_t *) (ptl3), (size_t) (i))
@@ -185,7 +185,6 @@
 
 	return ((!p->page_cache_disable) << PAGE_CACHEABLE_SHIFT |
-	    (!p->present) << PAGE_PRESENT_SHIFT |
+	    (!p->present) << PAGE_NOT_PRESENT_SHIFT |
 	    p->uaccessible << PAGE_USER_SHIFT |
-	    1 << PAGE_READ_SHIFT |
 	    p->writeable << PAGE_WRITE_SHIFT |
 	    1 << PAGE_EXEC_SHIFT |
Index: kernel/arch/ia32/src/mm/page.c
===================================================================
--- kernel/arch/ia32/src/mm/page.c	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/arch/ia32/src/mm/page.c	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -70,5 +70,5 @@
 	for (cur = 0; cur < min(config.identity_size, config.physmem_end);
 	    cur += FRAME_SIZE) {
-		flags = PAGE_GLOBAL | PAGE_CACHEABLE | PAGE_WRITE | PAGE_READ;
+		flags = PAGE_GLOBAL | PAGE_CACHEABLE | PAGE_WRITE;
 		page_mapping_insert(AS_KERNEL, PA2KA(cur), cur, flags);
 	}
Index: kernel/arch/ia32/src/smp/smp.c
===================================================================
--- kernel/arch/ia32/src/smp/smp.c	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/arch/ia32/src/smp/smp.c	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -75,8 +75,8 @@
 
 	if (config.cpu_count > 1) {
-		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);
+		l_apic = (uint32_t *) km_map((uintptr_t) l_apic,
+		    PAGE_SIZE, PAGE_WRITE);
+		io_apic = (uint32_t *) km_map((uintptr_t) io_apic,
+		    PAGE_SIZE, PAGE_WRITE);
 	}
 }
Index: kernel/arch/ia32/src/vreg.c
===================================================================
--- kernel/arch/ia32/src/vreg.c	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/arch/ia32/src/vreg.c	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -68,5 +68,5 @@
 
 	page = (uint32_t *) km_map(frame, PAGE_SIZE,
-	    PAGE_READ | PAGE_WRITE | PAGE_USER | PAGE_CACHEABLE);
+	    PAGE_WRITE | PAGE_USER | PAGE_CACHEABLE);
 
 	gdt_setbase(&gdt_p[VREG_DES], (uintptr_t) page);
Index: kernel/arch/ia64/src/ia64.c
===================================================================
--- kernel/arch/ia64/src/ia64.c	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/arch/ia64/src/ia64.c	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -106,5 +106,5 @@
 {
 	uintptr_t IOSAPIC = km_map(iosapic_base, PAGE_SIZE,
-	    PAGE_WRITE | PAGE_NOT_CACHEABLE);
+	    PAGE_WRITE);
 	int i;
 
@@ -135,5 +135,5 @@
 		/* Map the page with legacy I/O. */
 		legacyio_virt_base = km_map(LEGACYIO_PHYS_BASE, LEGACYIO_SIZE,
-		    PAGE_WRITE | PAGE_NOT_CACHEABLE);
+		    PAGE_WRITE);
 
 		iosapic_init();
Index: kernel/arch/mips32/include/arch/mm/page.h
===================================================================
--- kernel/arch/mips32/include/arch/mm/page.h	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/arch/mips32/include/arch/mm/page.h	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -114,7 +114,7 @@
 	get_pt_flags((pte_t *) (ptl0), (size_t) (i))
 #define GET_PTL2_FLAGS_ARCH(ptl1, i) \
-	PAGE_PRESENT
+	0
 #define GET_PTL3_FLAGS_ARCH(ptl2, i) \
-	PAGE_PRESENT
+	0
 #define GET_FRAME_FLAGS_ARCH(ptl3, i) \
 	get_pt_flags((pte_t *) (ptl3), (size_t) (i))
@@ -167,7 +167,6 @@
 
 	return ((p->cacheable << PAGE_CACHEABLE_SHIFT) |
-	    ((!p->p) << PAGE_PRESENT_SHIFT) |
+	    ((!p->p) << PAGE_NOT_PRESENT_SHIFT) |
 	    (1 << PAGE_USER_SHIFT) |
-	    (1 << PAGE_READ_SHIFT) |
 	    ((p->w) << PAGE_WRITE_SHIFT) |
 	    (1 << PAGE_EXEC_SHIFT) |
Index: kernel/arch/ppc32/include/arch/mm/page.h
===================================================================
--- kernel/arch/ppc32/include/arch/mm/page.h	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/arch/ppc32/include/arch/mm/page.h	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -111,8 +111,8 @@
 
 #define GET_PTL2_FLAGS_ARCH(ptl1, i) \
-	PAGE_PRESENT
+	0
 
 #define GET_PTL3_FLAGS_ARCH(ptl2, i) \
-	PAGE_PRESENT
+	0
 
 #define GET_FRAME_FLAGS_ARCH(ptl3, i) \
@@ -167,7 +167,6 @@
 
 	return (((!entry->page_cache_disable) << PAGE_CACHEABLE_SHIFT) |
-	    ((!entry->present) << PAGE_PRESENT_SHIFT) |
+	    ((!entry->present) << PAGE_NOT_PRESENT_SHIFT) |
 	    (1 << PAGE_USER_SHIFT) |
-	    (1 << PAGE_READ_SHIFT) |
 	    (1 << PAGE_WRITE_SHIFT) |
 	    (1 << PAGE_EXEC_SHIFT) |
Index: kernel/arch/ppc32/src/drivers/pic.c
===================================================================
--- kernel/arch/ppc32/src/drivers/pic.c	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/arch/ppc32/src/drivers/pic.c	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -42,5 +42,5 @@
 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, PAGE_WRITE);
 	*cir = pic_ack_interrupt;
 	*cir_arg = NULL;
Index: kernel/arch/ppc32/src/ppc32.c
===================================================================
--- kernel/arch/ppc32/src/ppc32.c	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/arch/ppc32/src/ppc32.c	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -242,5 +242,5 @@
 
 		cuda_t *cuda = (cuda_t *) (km_map(aligned_addr, offset + size,
-		    PAGE_WRITE | PAGE_NOT_CACHEABLE) + offset);
+		    PAGE_WRITE) + offset);
 
 		/* Initialize I/O controller */
Index: kernel/arch/riscv64/include/arch/mm/page.h
===================================================================
--- kernel/arch/riscv64/include/arch/mm/page.h	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/arch/riscv64/include/arch/mm/page.h	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -82,5 +82,5 @@
 
 /* Flags mask for non-leaf page table entries */
-#define NON_LEAF_MASK  (~(PAGE_READ | PAGE_WRITE | PAGE_EXEC))
+#define NON_LEAF_MASK  (~(PAGE_WRITE | PAGE_EXEC))
 
 /* Get PTE address accessors for each level. */
@@ -183,7 +183,6 @@
 	pte_t *entry = &pt[i];
 
-	return (((!entry->valid) << PAGE_PRESENT_SHIFT) |
+	return (((!entry->valid) << PAGE_NOT_PRESENT_SHIFT) |
 	    (entry->user << PAGE_USER_SHIFT) |
-	    (entry->readable << PAGE_READ_SHIFT) |
 	    (entry->writable << PAGE_WRITE_SHIFT) |
 	    (entry->executable << PAGE_EXEC_SHIFT) |
@@ -196,5 +195,5 @@
 
 	entry->valid = !(flags & PAGE_NOT_PRESENT);
-	entry->readable = (flags & PAGE_READ) != 0;
+	entry->readable = 1;
 	entry->writable = (flags & PAGE_WRITE) != 0;
 	entry->executable = (flags & PAGE_EXEC) != 0;
Index: kernel/arch/riscv64/src/mm/page.c
===================================================================
--- kernel/arch/riscv64/src/mm/page.c	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/arch/riscv64/src/mm/page.c	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -63,5 +63,5 @@
 		    cur += FRAME_SIZE)
 			page_mapping_insert(AS_KERNEL, PA2KA(cur), cur,
-			    PAGE_GLOBAL | PAGE_CACHEABLE | PAGE_EXEC | PAGE_WRITE | PAGE_READ);
+			    PAGE_GLOBAL | PAGE_CACHEABLE | PAGE_EXEC | PAGE_WRITE);
 
 		page_table_unlock(AS_KERNEL, true);
Index: kernel/arch/sparc64/src/drivers/kbd.c
===================================================================
--- kernel/arch/sparc64/src/drivers/kbd.c	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/arch/sparc64/src/drivers/kbd.c	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -119,5 +119,5 @@
 
 	ioport8_t *ns16550 = (ioport8_t *) (km_map(aligned_addr, offset + size,
-	    PAGE_WRITE | PAGE_NOT_CACHEABLE) + offset);
+	    PAGE_WRITE) + 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 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/arch/sparc64/src/drivers/pci.c	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -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);
+	    PAGE_WRITE);
 
 	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);
+	    PAGE_WRITE);
 
 	return pci;
Index: kernel/genarch/include/genarch/drivers/amdm37x/gpt.h
===================================================================
--- kernel/genarch/include/genarch/drivers/amdm37x/gpt.h	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/genarch/include/genarch/drivers/amdm37x/gpt.h	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -208,5 +208,5 @@
 	// 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, 0);
 	*clksel &= ~1;
 	km_unmap((uintptr_t)clksel, 4);
@@ -214,5 +214,5 @@
 	assert(timer);
 	/* Map control register */
-	timer->regs = (void*) km_map(ioregs, iosize, PAGE_NOT_CACHEABLE);
+	timer->regs = (void*) km_map(ioregs, iosize, 0);
 
 	/* Reset the timer */
Index: kernel/genarch/src/acpi/acpi.c
===================================================================
--- kernel/genarch/src/acpi/acpi.c	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/genarch/src/acpi/acpi.c	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -104,9 +104,9 @@
 	/* 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), 0);
 
 	/* 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, PAGE_WRITE);
 
 	// TODO: do not leak vtmp
Index: kernel/genarch/src/drivers/am335x/timer.c
===================================================================
--- kernel/genarch/src/drivers/am335x/timer.c	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/genarch/src/drivers/am335x/timer.c	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -100,5 +100,5 @@
 	size = regs_map[id].size;
 
-	timer->regs = (void *) km_map(base_addr, size, PAGE_NOT_CACHEABLE);
+	timer->regs = (void *) km_map(base_addr, size, 0);
 	assert(timer->regs != NULL);
 
Index: kernel/genarch/src/drivers/bcm2835/mbox.c
===================================================================
--- kernel/genarch/src/drivers/bcm2835/mbox.c	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/genarch/src/drivers/bcm2835/mbox.c	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -91,5 +91,5 @@
 
 	fb_mbox = (void *) km_map(BCM2835_MBOX0_ADDR, sizeof(bcm2835_mbox_t),
-				  PAGE_NOT_CACHEABLE);
+				  0);
 
 	fb_desc->width = 640;
Index: kernel/genarch/src/drivers/ega/ega.c
===================================================================
--- kernel/genarch/src/drivers/ega/ega.c	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/genarch/src/drivers/ega/ega.c	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -601,5 +601,5 @@
 	instance->base = base;
 	instance->addr = (uint8_t *) km_map(addr, EGA_VRAM_SIZE,
-	    PAGE_WRITE | PAGE_NOT_CACHEABLE);
+	    PAGE_WRITE);
 	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 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/genarch/src/drivers/omap/uart.c	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -87,5 +87,5 @@
 {
 	assert(uart);
-	uart->regs = (void *)km_map(addr, size, PAGE_NOT_CACHEABLE);
+	uart->regs = (void *)km_map(addr, size, 0);
 
 	assert(uart->regs);
Index: kernel/genarch/src/drivers/pl011/pl011.c
===================================================================
--- kernel/genarch/src/drivers/pl011/pl011.c	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/genarch/src/drivers/pl011/pl011.c	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -100,5 +100,5 @@
 	assert(uart);
 	uart->regs = (void*)km_map(addr, sizeof(pl011_uart_regs_t),
-				   PAGE_NOT_CACHEABLE);
+				   0);
 	assert(uart->regs);
 
Index: kernel/genarch/src/drivers/s3c24xx/uart.c
===================================================================
--- kernel/genarch/src/drivers/s3c24xx/uart.c	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/genarch/src/drivers/s3c24xx/uart.c	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -117,5 +117,5 @@
 
 	uart->io = (s3c24xx_uart_io_t *) km_map(paddr, PAGE_SIZE,
-	    PAGE_WRITE | PAGE_NOT_CACHEABLE);
+	    PAGE_WRITE);
 	uart->indev = NULL;
 
Index: kernel/genarch/src/fb/fb.c
===================================================================
--- kernel/genarch/src/fb/fb.c	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/genarch/src/fb/fb.c	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -610,5 +610,5 @@
 
 	instance->addr = (uint8_t *) km_map((uintptr_t) props->addr, fbsize,
-	    PAGE_WRITE | PAGE_NOT_CACHEABLE);
+	    PAGE_WRITE);
 	if (!instance->addr) {
 		LOG("Unable to map framebuffer.");
Index: kernel/genarch/src/mm/page_ht.c
===================================================================
--- kernel/genarch/src/mm/page_ht.c	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/genarch/src/mm/page_ht.c	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -61,5 +61,5 @@
 static void ht_mapping_remove(as_t *, uintptr_t);
 static bool ht_mapping_find(as_t *, uintptr_t, bool, pte_t *);
-static void ht_mapping_update(as_t *, uintptr_t, bool, pte_t *);
+static void ht_mapping_update(as_t *, uintptr_t, bool, const pte_t *);
 static void ht_mapping_make_global(uintptr_t, size_t);
 
@@ -268,5 +268,5 @@
  * @param pte      New PTE.
  */
-void ht_mapping_update(as_t *as, uintptr_t page, bool nolock, pte_t *pte)
+void ht_mapping_update(as_t *as, uintptr_t page, bool nolock, const pte_t *pte)
 {
 	irq_spinlock_lock(&page_ht_lock, true);
Index: kernel/genarch/src/mm/page_pt.c
===================================================================
--- kernel/genarch/src/mm/page_pt.c	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/genarch/src/mm/page_pt.c	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -55,5 +55,5 @@
 static void pt_mapping_remove(as_t *, uintptr_t);
 static bool pt_mapping_find(as_t *, uintptr_t, bool, pte_t *pte);
-static void pt_mapping_update(as_t *, uintptr_t, bool, pte_t *pte);
+static void pt_mapping_update(as_t *, uintptr_t, bool, const pte_t *pte);
 static void pt_mapping_make_global(uintptr_t, size_t);
 
@@ -353,5 +353,5 @@
  * @param[in] pte  New PTE.
  */
-void pt_mapping_update(as_t *as, uintptr_t page, bool nolock, pte_t *pte)
+void pt_mapping_update(as_t *as, uintptr_t page, bool nolock, const pte_t *pte)
 {
 	pte_t *t = pt_mapping_find_internal(as, page, nolock);
@@ -431,6 +431,6 @@
 		SET_PTL1_ADDRESS(ptl0, PTL0_INDEX(addr), KA2PA(l1));
 		SET_PTL1_FLAGS(ptl0, PTL0_INDEX(addr),
-		    PAGE_PRESENT | PAGE_USER | PAGE_CACHEABLE |
-		    PAGE_EXEC | PAGE_WRITE | PAGE_READ);
+		    PAGE_USER | PAGE_CACHEABLE |
+		    PAGE_EXEC | PAGE_WRITE);
 	}
 }
Index: kernel/generic/include/mm/mm.h
===================================================================
--- kernel/generic/include/mm/mm.h	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/generic/include/mm/mm.h	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -37,27 +37,15 @@
 
 #define PAGE_CACHEABLE_SHIFT		0
-#define PAGE_NOT_CACHEABLE_SHIFT	PAGE_CACHEABLE_SHIFT
-#define PAGE_PRESENT_SHIFT		1
-#define PAGE_NOT_PRESENT_SHIFT		PAGE_PRESENT_SHIFT
+#define PAGE_NOT_PRESENT_SHIFT		1
 #define PAGE_USER_SHIFT			2
-#define PAGE_KERNEL_SHIFT		PAGE_USER_SHIFT
-#define PAGE_READ_SHIFT			3
 #define PAGE_WRITE_SHIFT		4
 #define PAGE_EXEC_SHIFT			5
 #define PAGE_GLOBAL_SHIFT		6
 
-#define PAGE_NOT_CACHEABLE		(0 << PAGE_CACHEABLE_SHIFT)
 #define PAGE_CACHEABLE			(1 << PAGE_CACHEABLE_SHIFT)
-
-#define PAGE_PRESENT			(0 << PAGE_PRESENT_SHIFT)
-#define PAGE_NOT_PRESENT		(1 << PAGE_PRESENT_SHIFT)
-
+#define PAGE_NOT_PRESENT		(1 << PAGE_NOT_PRESENT_SHIFT)
 #define PAGE_USER			(1 << PAGE_USER_SHIFT)
-#define PAGE_KERNEL			(0 << PAGE_USER_SHIFT)
-
-#define PAGE_READ			(1 << PAGE_READ_SHIFT)
 #define PAGE_WRITE			(1 << PAGE_WRITE_SHIFT)
 #define PAGE_EXEC			(1 << PAGE_EXEC_SHIFT)
-
 #define PAGE_GLOBAL			(1 << PAGE_GLOBAL_SHIFT)
 
Index: kernel/generic/include/mm/page.h
===================================================================
--- kernel/generic/include/mm/page.h	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/generic/include/mm/page.h	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -49,5 +49,5 @@
 	void (*mapping_remove)(as_t *, uintptr_t);
 	bool (*mapping_find)(as_t *, uintptr_t, bool, pte_t *);
-	void (*mapping_update)(as_t *, uintptr_t, bool, pte_t *);
+	void (*mapping_update)(as_t *, uintptr_t, bool, const pte_t *);
 	void (*mapping_make_global)(uintptr_t, size_t);
 } page_mapping_operations_t;
Index: kernel/generic/src/console/cmd.c
===================================================================
--- kernel/generic/src/console/cmd.c	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/generic/src/console/cmd.c	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -727,6 +727,6 @@
 	else
 #endif
-		ptr = (uint8_t *) km_map(argv[0].intval, sizeof(uint8_t),
-		    PAGE_NOT_CACHEABLE);
+		ptr = (uint8_t *) km_map(
+		    argv[0].intval, sizeof(uint8_t), 0);
 
 	const uint8_t val = pio_read_8(ptr);
@@ -749,4 +749,95 @@
  */
 static int cmd_pio_read_16(cmd_arg_t *argv)
+{
+	uint16_t *ptr = NULL;
+
+#ifdef IO_SPACE_BOUNDARY
+	if ((void *) argv->intval < IO_SPACE_BOUNDARY)
+		ptr = (void *) argv[0].intval;
+	else
+#endif
+		ptr = (uint16_t *) km_map(
+		    argv[0].intval, sizeof(uint16_t), 0);
+
+	const uint16_t val = pio_read_16(ptr);
+	printf("read %" PRIxn ": %" PRIx16 "\n", argv[0].intval, val);
+
+#ifdef IO_SPACE_BOUNDARY
+	if ((void *) argv->intval < IO_SPACE_BOUNDARY)
+		return 1;
+#endif
+
+	km_unmap((uintptr_t) ptr, sizeof(uint16_t));
+	return 1;
+}
+
+/** Read 4 bytes from phys memory or io port.
+ *
+ * @param argv Argument vector.
+ *
+ * @return 0 on failure, 1 on success.
+ */
+static int cmd_pio_read_32(cmd_arg_t *argv)
+{
+	uint32_t *ptr = NULL;
+
+#ifdef IO_SPACE_BOUNDARY
+	if ((void *) argv->intval < IO_SPACE_BOUNDARY)
+		ptr = (void *) argv[0].intval;
+	else
+#endif
+		ptr = (uint32_t *) km_map(
+		    argv[0].intval, sizeof(uint32_t), 0);
+
+	const uint32_t val = pio_read_32(ptr);
+	printf("read %" PRIxn ": %" PRIx32 "\n", argv[0].intval, val);
+
+#ifdef IO_SPACE_BOUNDARY
+	if ((void *) argv->intval < IO_SPACE_BOUNDARY)
+		return 1;
+#endif
+
+	km_unmap((uintptr_t) ptr, sizeof(uint32_t));
+	return 1;
+}
+
+/** Write 1 byte to phys memory or io port.
+ *
+ * @param argv Argument vector.
+ *
+ * @return 0 on failure, 1 on success.
+ */
+static int cmd_pio_write_8(cmd_arg_t *argv)
+{
+	uint8_t *ptr = NULL;
+
+#ifdef IO_SPACE_BOUNDARY
+	if ((void *) argv->intval < IO_SPACE_BOUNDARY)
+		ptr = (void *) argv[0].intval;
+	else
+#endif
+		ptr = (uint8_t *) km_map(argv[0].intval, sizeof(uint8_t),
+		    PAGE_WRITE);
+
+	printf("write %" PRIxn ": %" PRIx8 "\n", argv[0].intval,
+	    (uint8_t) argv[1].intval);
+	pio_write_8(ptr, (uint8_t) argv[1].intval);
+
+#ifdef IO_SPACE_BOUNDARY
+	if ((void *) argv->intval < IO_SPACE_BOUNDARY)
+		return 1;
+#endif
+
+	km_unmap((uintptr_t) ptr, sizeof(uint8_t));
+	return 1;
+}
+
+/** Write 2 bytes to phys memory or io port.
+ *
+ * @param argv Argument vector.
+ *
+ * @return 0 on failure, 1 on success.
+ */
+static int cmd_pio_write_16(cmd_arg_t *argv)
 {
 	uint16_t *ptr = NULL;
@@ -758,8 +849,9 @@
 #endif
 		ptr = (uint16_t *) km_map(argv[0].intval, sizeof(uint16_t),
-		    PAGE_NOT_CACHEABLE);
-
-	const uint16_t val = pio_read_16(ptr);
-	printf("read %" PRIxn ": %" PRIx16 "\n", argv[0].intval, val);
+		    PAGE_WRITE);
+
+	printf("write %" PRIxn ": %" PRIx16 "\n", argv[0].intval,
+	    (uint16_t) argv[1].intval);
+	pio_write_16(ptr, (uint16_t) argv[1].intval);
 
 #ifdef IO_SPACE_BOUNDARY
@@ -772,5 +864,5 @@
 }
 
-/** Read 4 bytes from phys memory or io port.
+/** Write 4 bytes to phys memory or io port.
  *
  * @param argv Argument vector.
@@ -778,5 +870,5 @@
  * @return 0 on failure, 1 on success.
  */
-static int cmd_pio_read_32(cmd_arg_t *argv)
+static int cmd_pio_write_32(cmd_arg_t *argv)
 {
 	uint32_t *ptr = NULL;
@@ -788,97 +880,5 @@
 #endif
 		ptr = (uint32_t *) km_map(argv[0].intval, sizeof(uint32_t),
-		    PAGE_NOT_CACHEABLE);
-
-	const uint32_t val = pio_read_32(ptr);
-	printf("read %" PRIxn ": %" PRIx32 "\n", argv[0].intval, val);
-
-#ifdef IO_SPACE_BOUNDARY
-	if ((void *) argv->intval < IO_SPACE_BOUNDARY)
-		return 1;
-#endif
-
-	km_unmap((uintptr_t) ptr, sizeof(uint32_t));
-	return 1;
-}
-
-/** Write 1 byte to phys memory or io port.
- *
- * @param argv Argument vector.
- *
- * @return 0 on failure, 1 on success.
- */
-static int cmd_pio_write_8(cmd_arg_t *argv)
-{
-	uint8_t *ptr = NULL;
-
-#ifdef IO_SPACE_BOUNDARY
-	if ((void *) argv->intval < IO_SPACE_BOUNDARY)
-		ptr = (void *) argv[0].intval;
-	else
-#endif
-		ptr = (uint8_t *) km_map(argv[0].intval, sizeof(uint8_t),
-		    PAGE_NOT_CACHEABLE);
-
-	printf("write %" PRIxn ": %" PRIx8 "\n", argv[0].intval,
-	    (uint8_t) argv[1].intval);
-	pio_write_8(ptr, (uint8_t) argv[1].intval);
-
-#ifdef IO_SPACE_BOUNDARY
-	if ((void *) argv->intval < IO_SPACE_BOUNDARY)
-		return 1;
-#endif
-
-	km_unmap((uintptr_t) ptr, sizeof(uint8_t));
-	return 1;
-}
-
-/** Write 2 bytes to phys memory or io port.
- *
- * @param argv Argument vector.
- *
- * @return 0 on failure, 1 on success.
- */
-static int cmd_pio_write_16(cmd_arg_t *argv)
-{
-	uint16_t *ptr = NULL;
-
-#ifdef IO_SPACE_BOUNDARY
-	if ((void *) argv->intval < IO_SPACE_BOUNDARY)
-		ptr = (void *) argv[0].intval;
-	else
-#endif
-		ptr = (uint16_t *) km_map(argv[0].intval, sizeof(uint16_t),
-		    PAGE_NOT_CACHEABLE);
-
-	printf("write %" PRIxn ": %" PRIx16 "\n", argv[0].intval,
-	    (uint16_t) argv[1].intval);
-	pio_write_16(ptr, (uint16_t) argv[1].intval);
-
-#ifdef IO_SPACE_BOUNDARY
-	if ((void *) argv->intval < IO_SPACE_BOUNDARY)
-		return 1;
-#endif
-
-	km_unmap((uintptr_t) ptr, sizeof(uint16_t));
-	return 1;
-}
-
-/** Write 4 bytes to phys memory or io port.
- *
- * @param argv Argument vector.
- *
- * @return 0 on failure, 1 on success.
- */
-static int cmd_pio_write_32(cmd_arg_t *argv)
-{
-	uint32_t *ptr = NULL;
-
-#ifdef IO_SPACE_BOUNDARY
-	if ((void *) argv->intval < IO_SPACE_BOUNDARY)
-		ptr = (void *) argv[0].intval;
-	else
-#endif
-		ptr = (uint32_t *) km_map(argv[0].intval, sizeof(uint32_t),
-		    PAGE_NOT_CACHEABLE);
+		    PAGE_WRITE);
 
 	printf("write %" PRIxn ": %" PRIx32 "\n", argv[0].intval,
Index: kernel/generic/src/ipc/irq.c
===================================================================
--- kernel/generic/src/ipc/irq.c	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/generic/src/ipc/irq.c	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -93,5 +93,5 @@
 #endif
 		ranges[i].base = km_map(pbase[i], ranges[i].size,
-		    PAGE_READ | PAGE_WRITE | PAGE_KERNEL | PAGE_NOT_CACHEABLE);
+		    PAGE_WRITE);
 		if (!ranges[i].base) {
 			ranges_unmap(ranges, i);
Index: kernel/generic/src/main/kinit.c
===================================================================
--- kernel/generic/src/main/kinit.c	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/generic/src/main/kinit.c	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -250,5 +250,5 @@
 		uintptr_t page = km_map(init.tasks[i].paddr,
 		    init.tasks[i].size,
-		    PAGE_READ | PAGE_WRITE | PAGE_CACHEABLE);
+		    PAGE_WRITE | PAGE_CACHEABLE);
 		assert(page);
 
Index: kernel/generic/src/mm/as.c
===================================================================
--- kernel/generic/src/mm/as.c	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/generic/src/mm/as.c	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -1217,8 +1217,8 @@
 NO_TRACE static unsigned int area_flags_to_page_flags(unsigned int aflags)
 {
-	unsigned int flags = PAGE_USER | PAGE_PRESENT;
-
-	if (aflags & AS_AREA_READ)
-		flags |= PAGE_READ;
+	unsigned int flags = PAGE_USER;
+
+	// TODO: AS_AREA_READ currently has no effect.
+	// Readability is implied.
 
 	if (aflags & AS_AREA_WRITE)
Index: kernel/generic/src/mm/km.c
===================================================================
--- kernel/generic/src/mm/km.c	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/generic/src/mm/km.c	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -257,5 +257,5 @@
 	if (frame) {
 		page = km_map(frame, PAGE_SIZE,
-		    PAGE_READ | PAGE_WRITE | PAGE_CACHEABLE);
+		    PAGE_WRITE | PAGE_CACHEABLE);
 		if (!page) {
 			frame_free(frame, 1);
Index: kernel/test/mm/mapping1.c
===================================================================
--- kernel/test/mm/mapping1.c	(revision 973be38782462a672111ff6833f8dbb40d2a44bf)
+++ kernel/test/mm/mapping1.c	(revision 4b1c7c6ff1e7b982f389a8f841b71af2a85e8cfb)
@@ -44,10 +44,10 @@
 
 	uintptr_t page0 = km_map(frame, FRAME_SIZE,
-	    PAGE_READ | PAGE_WRITE | PAGE_CACHEABLE);
+	    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,
-	    PAGE_READ | PAGE_WRITE | PAGE_CACHEABLE);
+	    PAGE_WRITE | PAGE_CACHEABLE);
 	TPRINTF("Virtual address %p mapped to physical address %p.\n",
 	    (void *) page1, (void *) frame);
