summaryrefslogtreecommitdiff
path: root/src/arch/arm
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/arm')
-rw-r--r--src/arch/arm/armv7/exception.c6
-rw-r--r--src/arch/arm/include/armv7/arch/cache.h48
2 files changed, 54 insertions, 0 deletions
diff --git a/src/arch/arm/armv7/exception.c b/src/arch/arm/armv7/exception.c
index eedd47d1d5..4fac0bcd3c 100644
--- a/src/arch/arm/armv7/exception.c
+++ b/src/arch/arm/armv7/exception.c
@@ -100,6 +100,9 @@ void exception_prefetch_abort(uint32_t *regs)
printk(BIOS_ERR, "exception _prefetch_abort\n");
regs[15] -= 4;
print_regs(regs);
+ printk(BIOS_ERR, "IFAR = %#.8x\n", read_ifar());
+ printk(BIOS_ERR, "IFSR = %#.8x\n", read_ifsr());
+ printk(BIOS_ERR, "AIFSR = %#.8x\n", read_aifsr());
dump_stack(regs[13], 512);
die("exception");
}
@@ -109,6 +112,9 @@ void exception_data_abort(uint32_t *regs)
printk(BIOS_ERR, "exception _data_abort\n");
regs[15] -= 8;
print_regs(regs);
+ printk(BIOS_ERR, "DFAR = %#.8x\n", read_dfar());
+ printk(BIOS_ERR, "DFSR = %#.8x\n", read_dfsr());
+ printk(BIOS_ERR, "ADFSR = %#.8x\n", read_adfsr());
dump_stack(regs[13], 512);
die("exception");
}
diff --git a/src/arch/arm/include/armv7/arch/cache.h b/src/arch/arm/include/armv7/arch/cache.h
index f23dec1bbb..12df5c309f 100644
--- a/src/arch/arm/include/armv7/arch/cache.h
+++ b/src/arch/arm/include/armv7/arch/cache.h
@@ -295,6 +295,54 @@ static inline void write_sctlr(uint32_t val)
isb();
}
+/* read data fault address register (DFAR) */
+static inline uint32_t read_dfar(void)
+{
+ uint32_t val;
+ asm volatile ("mrc p15, 0, %0, c6, c0, 0" : "=r" (val));
+ return val;
+}
+
+/* read data fault status register (DFSR) */
+static inline uint32_t read_dfsr(void)
+{
+ uint32_t val;
+ asm volatile ("mrc p15, 0, %0, c5, c0, 0" : "=r" (val));
+ return val;
+}
+
+/* read instruction fault address register (IFAR) */
+static inline uint32_t read_ifar(void)
+{
+ uint32_t val;
+ asm volatile ("mrc p15, 0, %0, c6, c0, 2" : "=r" (val));
+ return val;
+}
+
+/* read instruction fault status register (IFSR) */
+static inline uint32_t read_ifsr(void)
+{
+ uint32_t val;
+ asm volatile ("mrc p15, 0, %0, c5, c0, 1" : "=r" (val));
+ return val;
+}
+
+/* read auxiliary data fault status register (ADFSR) */
+static inline uint32_t read_adfsr(void)
+{
+ uint32_t val;
+ asm volatile ("mrc p15, 0, %0, c5, c1, 0" : "=r" (val));
+ return val;
+}
+
+/* read auxiliary instruction fault status register (AIFSR) */
+static inline uint32_t read_aifsr(void)
+{
+ uint32_t val;
+ asm volatile ("mrc p15, 0, %0, c5, c1, 1" : "=r" (val));
+ return val;
+}
+
/*
* Cache maintenance API
*/