Merge branch 'v6v7' into devel
[linux/fpc-iii.git] / arch / arm / mm / abort-ev7.S
blobec88b157d3bb6893df82209b9ccc80302dbdc77b
1 #include <linux/linkage.h>
2 #include <asm/assembler.h>
3 /*
4  * Function: v7_early_abort
5  *
6  * Params  : r2 = address of aborted instruction
7  *         : r3 = saved SPSR
8  *
9  * Returns : r0 = address of abort
10  *         : r1 = FSR, bit 11 = write
11  *         : r2-r8 = corrupted
12  *         : r9 = preserved
13  *         : sp = pointer to registers
14  *
15  * Purpose : obtain information about current aborted instruction.
16  */
17         .align  5
18 ENTRY(v7_early_abort)
19         /*
20          * The effect of data aborts on on the exclusive access monitor are
21          * UNPREDICTABLE. Do a CLREX to clear the state
22          */
23         clrex
25         mrc     p15, 0, r1, c5, c0, 0           @ get FSR
26         mrc     p15, 0, r0, c6, c0, 0           @ get FAR
28         /*
29          * V6 code adjusts the returned DFSR.
30          * New designs should not need to patch up faults.
31          */
33 #if defined(CONFIG_VERIFY_PERMISSION_FAULT)
34         /*
35          * Detect erroneous permission failures and fix
36          */
37         ldr     r3, =0x40d                      @ On permission fault
38         and     r3, r1, r3
39         cmp     r3, #0x0d
40         movne   pc, lr
42         mcr     p15, 0, r0, c7, c8, 0           @ Retranslate FAR
43         isb
44         mrc     p15, 0, r2, c7, c4, 0           @ Read the PAR
45         and     r3, r2, #0x7b                   @ On translation fault
46         cmp     r3, #0x0b
47         movne   pc, lr
48         bic     r1, r1, #0xf                    @ Fix up FSR FS[5:0]
49         and     r2, r2, #0x7e
50         orr     r1, r1, r2, LSR #1
51 #endif
53         mov     pc, lr
54 ENDPROC(v7_early_abort)