diff options
author | Rafaël Carré <rafael.carre@gmail.com> | 2010-03-09 16:19:50 +0000 |
---|---|---|
committer | Rafaël Carré <rafael.carre@gmail.com> | 2010-03-09 16:19:50 +0000 |
commit | 8d720f4d4e956a0c97466def1f3600ae5c10f268 (patch) | |
tree | fa2c5f58cfaf2cd4549f0c951b2fb21861060afe /firmware/target/arm | |
parent | 226cd04f742f36e72b110848694a5d80233a0b78 (diff) | |
download | rockbox-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')
-rw-r--r-- | firmware/target/arm/system-arm.c | 42 |
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); |