Index: kernel/arch/ia64/src/ivt.S
===================================================================
--- kernel/arch/ia64/src/ivt.S	(revision 98000fb4ea6015506f059c9b121e417ce991ecfd)
+++ kernel/arch/ia64/src/ivt.S	(revision 8619f25f028ddffad4600e71ac3a6f36b95ebd7c)
@@ -537,5 +537,5 @@
 	HEAVYWEIGHT_HANDLER 0x5100
 	HEAVYWEIGHT_HANDLER 0x5200
-	HEAVYWEIGHT_HANDLER 0x5300
+	HEAVYWEIGHT_HANDLER 0x5300 data_access_rights_fault
 	HEAVYWEIGHT_HANDLER 0x5400 general_exception
 	HEAVYWEIGHT_HANDLER 0x5500 disabled_fp_register
Index: kernel/arch/ia64/src/mm/tlb.c
===================================================================
--- kernel/arch/ia64/src/mm/tlb.c	(revision 98000fb4ea6015506f059c9b121e417ce991ecfd)
+++ kernel/arch/ia64/src/mm/tlb.c	(revision 8619f25f028ddffad4600e71ac3a6f36b95ebd7c)
@@ -711,4 +711,35 @@
 }
 
+/** Data access rights fault handler.
+ *
+ * @param vector Interruption vector.
+ * @param istate Structure with saved interruption state.
+ */
+void data_access_rights_fault(uint64_t vector, istate_t *istate)
+{
+	region_register rr;
+	rid_t rid;
+	uintptr_t va;
+	pte_t *t;
+
+	va = istate->cr_ifa;	/* faulting address */
+	rr.word = rr_read(VA2VRN(va));
+	rid = rr.map.rid;
+
+	/*
+	 * Assume a write to a read-only page.
+	 */
+	page_table_lock(AS, true);
+	t = page_mapping_find(AS, va);
+	ASSERT(t && t->p);
+	ASSERT(!t->w);
+	if (as_page_fault(va, PF_ACCESS_WRITE, istate) == AS_PF_FAULT) {
+		fault_if_from_uspace(istate, "Page fault at %p.", va);
+		panic("%s: va=%p, rid=%d, iip=%p.", __func__, va, rid,
+		    istate->cr_iip);
+	}
+	page_table_unlock(AS, true);
+}
+
 /** Page not present fault handler.
  *
