summaryrefslogtreecommitdiff
path: root/firmware/target/arm/system-arm.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target/arm/system-arm.c')
-rw-r--r--firmware/target/arm/system-arm.c42
1 files changed, 40 insertions, 2 deletions
diff --git a/firmware/target/arm/system-arm.c b/firmware/target/arm/system-arm.c
index 60e57cf9ff..e83b7c585d 100644
--- a/firmware/target/arm/system-arm.c
+++ b/firmware/target/arm/system-arm.c
@@ -42,12 +42,50 @@ void __attribute__((noreturn)) UIE(unsigned int pc, unsigned int num)
42 lcd_set_foreground(LCD_BLACK); 42 lcd_set_foreground(LCD_BLACK);
43 lcd_set_background(LCD_WHITE); 43 lcd_set_background(LCD_WHITE);
44#endif 44#endif
45 unsigned line = 0;
46
45 lcd_setfont(FONT_SYSFIXED); 47 lcd_setfont(FONT_SYSFIXED);
46 lcd_set_viewport(NULL); 48 lcd_set_viewport(NULL);
47 lcd_clear_display(); 49 lcd_clear_display();
48 lcd_puts(0, 0, uiename[num]); 50 lcd_puts(0, line++, uiename[num]);
49 lcd_putsf(0, 1, "at %08x" IF_COP(" (%d)"), pc 51 lcd_putsf(0, line++, "at %08x" IF_COP(" (%d)"), pc
50 IF_COP(, CURRENT_CORE)); 52 IF_COP(, CURRENT_CORE));
53
54#if !defined(CPU_ARM7TDMI) /* arm7tdmi has no MPU/MMU */
55 if(num == 1 || num == 2) /* prefetch / data abort */
56 {
57 register unsigned status;
58
59#if ARM_ARCH >= 6
60 /* ARMv6 has 2 different registers for prefetch & data aborts */
61 if(num == 1) /* instruction prefetch abort */
62 asm volatile( "mrc p15, 0, %0, c5, c0, 1\n" : "=r"(status));
63 else
64#endif
65 asm volatile( "mrc p15, 0, %0, c5, c0, 0\n" : "=r"(status));
66
67 lcd_putsf(0, line++, "FSR 0x%x", status);
68
69 unsigned int domain = (status >> 4) & 0xf;
70 unsigned int fault = status & 0xf;
71#if ARM_ARCH >= 6
72 fault |= (status & (1<<10)) >> 6; /* fault is 5 bits on armv6 */
73#endif
74 lcd_putsf(0, line++, "(domain %d, fault %d)", domain, fault);
75
76 if(num == 2) /* data abort */
77 {
78 register unsigned address;
79 /* read FAR (fault address register) */
80 asm volatile( "mrc p15, 0, %0, c6, c0\n" : "=r"(address));
81 lcd_putsf(0, line++, "address 0x%8x", address);
82#if ARM_ARCH >= 6
83 lcd_putsf(0, line++, (status & (1<<11)) ? "(write)" : "(read)");
84#endif
85 }
86 } /* num == 1 || num == 2 // prefetch/data abort */
87#endif /* !defined(CPU_ARM7TDMI */
88
51 lcd_update(); 89 lcd_update();
52 90
53 disable_interrupt(IRQ_FIQ_STATUS); 91 disable_interrupt(IRQ_FIQ_STATUS);