Index: kernel/arch/arm32/include/mm/page_fault.h
===================================================================
--- kernel/arch/arm32/include/mm/page_fault.h	(revision c5b69a5e9fd7b8727cdb839bd6311e2db9fd9873)
+++ kernel/arch/arm32/include/mm/page_fault.h	(revision ecd1a0aa0746649b810764037fa03dca950f5122)
@@ -40,18 +40,26 @@
 
 
-/** Decribes CP15 "fault status register" (FSR). */
-typedef struct {
-	unsigned status : 3;
-	unsigned domain : 4;
-	unsigned zero : 1;
-	unsigned should_be_zero : 24;
-} ATTRIBUTE_PACKED fault_status_t;
-
-
-/** Help union used for casting integer value into #fault_status_t. */
+/** Decribes CP15 "fault status register" (FSR).
+ *
+ * See ARM Architecture Reference Manual ch. B4.9.6 (pdf p.743).
+ */
 typedef union {
-	fault_status_t fs;
-	uint32_t dummy;
-} fault_status_union_t;
+	struct {
+		unsigned status : 4;
+		unsigned domain : 4;
+		unsigned zero : 1;
+		unsigned sbz0 : 1;
+		unsigned fs : 1; /**< armv6+ mandated, earlier IPLM. DEFINED */
+		unsigned wr : 1; /**< armv6+ only */
+		unsigned should_be_zero : 20;
+	} ATTRIBUTE_PACKED data;
+	struct {
+		unsigned status : 4;
+		unsigned sbz0 : 6;
+		unsigned fs : 1;
+		unsigned should_be_zero : 21;
+	} ATTRIBUTE_PACKED inst;
+	uint32_t raw;
+} fault_status_t;
 
 
Index: kernel/arch/arm32/src/mm/page_fault.c
===================================================================
--- kernel/arch/arm32/src/mm/page_fault.c	(revision c5b69a5e9fd7b8727cdb839bd6311e2db9fd9873)
+++ kernel/arch/arm32/src/mm/page_fault.c	(revision ecd1a0aa0746649b810764037fa03dca950f5122)
@@ -42,27 +42,38 @@
 #include <print.h>
 
-/** Returns value stored in fault status register.
+/** Returns value stored in comnbined/data fault status register.
  *
  *  @return Value stored in CP15 fault status register (FSR).
- */
-static inline fault_status_t read_fault_status_register(void)
-{
-	fault_status_union_t fsu;
-	
-	/* fault status is stored in CP15 register 5 */
+ *
+ *  "VMSAv6 added a fifth fault status bit (bit[10]) to both the IFSR and DFSR.
+ *  It is IMPLEMENTATION DEFINED how this bit is encoded in earlier versions of
+ *  the architecture. A write flag (bit[11] of the DFSR) has also been
+ *  introduced."
+ *  ARM Architecture Reference Manual version i ch. B4.6 (PDF p. 719)
+ *
+ *  See ch. B4.9.6 for location of data/instruction FSR.
+ *
+ */
+static inline fault_status_t read_data_fault_status_register(void)
+{
+	fault_status_t fsu;
+	
+	/* Combined/Data fault status is stored in CP15 register 5, c0. */
 	asm volatile (
 		"mrc p15, 0, %[dummy], c5, c0, 0"
-		: [dummy] "=r" (fsu.dummy)
+		: [dummy] "=r" (fsu.raw)
 	);
 	
-	return fsu.fs;
-}
-
-/** Returns FAR (fault address register) content.
- *
- * @return FAR (fault address register) content (address that caused a page
+	return fsu;
+}
+
+/** Returns DFAR (fault address register) content.
+ *
+ * This register is equivalent to FAR on pre armv6 machines.
+ *
+ * @return DFAR (fault address register) content (address that caused a page
  *         fault)
  */
-static inline uintptr_t read_fault_address_register(void)
+static inline uintptr_t read_data_fault_address_register(void)
 {
 	uintptr_t ret;
@@ -122,4 +133,5 @@
 }
 
+#if defined(PROCESSOR_armv4) | defined(PROCESSOR_armv5)
 /** Decides whether read or write into memory is requested.
  *
@@ -166,4 +178,5 @@
 	return PF_ACCESS_EXEC;
 }
+#endif
 
 /** Handles "data abort" exception (load or store at invalid address).
@@ -175,10 +188,15 @@
 void data_abort(unsigned int exc_no, istate_t *istate)
 {
-	fault_status_t fsr __attribute__ ((unused)) =
-	    read_fault_status_register();
-	uintptr_t badvaddr = read_fault_address_register();
-
-	pf_access_t access = get_memory_access_type(istate->pc, badvaddr);
-
+	uintptr_t badvaddr = read_data_fault_address_register();
+
+#if defined(PROCESSOR_armv6) | defined(PROCESSOR_armv7_a)
+	fault_status_t fsr = read_data_fault_status_register();
+	const pf_access_t access =
+	    fsr.data.wr ? PF_ACCESS_WRITE : PF_ACCESS_READ;
+#elif defined(PROCESSOR_armv4) | defined(PROCESSOR_armv5)
+	const pf_access_t access = get_memory_access_type(istate->pc, badvaddr);
+#else
+#error "Unsupported architecture"
+#endif
 	int ret = as_page_fault(badvaddr, access, istate);
 
@@ -197,4 +215,5 @@
 void prefetch_abort(unsigned int exc_no, istate_t *istate)
 {
+	/* NOTE: We should use IFAR and IFSR here. */
 	int ret = as_page_fault(istate->pc, PF_ACCESS_EXEC, istate);
 
