summaryrefslogtreecommitdiff
path: root/firmware/target/arm/system-arm.c
diff options
context:
space:
mode:
authorRafaël Carré <rafael.carre@gmail.com>2010-03-09 16:19:50 +0000
committerRafaël Carré <rafael.carre@gmail.com>2010-03-09 16:19:50 +0000
commit8d720f4d4e956a0c97466def1f3600ae5c10f268 (patch)
treefa2c5f58cfaf2cd4549f0c951b2fb21861060afe /firmware/target/arm/system-arm.c
parent226cd04f742f36e72b110848694a5d80233a0b78 (diff)
downloadrockbox-8d720f4d4e956a0c97466def1f3600ae5c10f268.tar.gz
rockbox-8d720f4d4e956a0c97466def1f3600ae5c10f268.zip
Display Fault status address register on data/prefetch aborts
Display Address status address register on data aborts Work on all ARM cpus but arm7tdmi (no MMU/MPU there) FlySpray: FS#10296 Author: myself with help of Torne Wuff git-svn-id: svn://svn.rockbox.org/rockbox/trunk@25087 a1c6a512-1295-4272-9138-f99709370657
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);