]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blob - arch/arm/mm/abort-ev7.S
4812ad054214572ba6e7198247e2c190e469897d
[mirror_ubuntu-bionic-kernel.git] / arch / arm / mm / abort-ev7.S
1 #include <linux/linkage.h>
2 #include <asm/assembler.h>
3 /*
4 * Function: v7_early_abort
5 *
6 * Params : r2 = pt_regs
7 * : r4 = aborted context pc
8 * : r5 = aborted context psr
9 *
10 * Returns : r4 - r11, r13 preserved
11 *
12 * Purpose : obtain information about current aborted instruction.
13 */
14 .align 5
15 ENTRY(v7_early_abort)
16 mrc p15, 0, r1, c5, c0, 0 @ get FSR
17 mrc p15, 0, r0, c6, c0, 0 @ get FAR
18
19 /*
20 * V6 code adjusts the returned DFSR.
21 * New designs should not need to patch up faults.
22 */
23
24 #if defined(CONFIG_VERIFY_PERMISSION_FAULT)
25 /*
26 * Detect erroneous permission failures and fix
27 */
28 ldr r3, =0x40d @ On permission fault
29 and r3, r1, r3
30 cmp r3, #0x0d
31 bne do_DataAbort
32
33 mcr p15, 0, r0, c7, c8, 0 @ Retranslate FAR
34 isb
35 mrc p15, 0, ip, c7, c4, 0 @ Read the PAR
36 and r3, ip, #0x7b @ On translation fault
37 cmp r3, #0x0b
38 bne do_DataAbort
39 bic r1, r1, #0xf @ Fix up FSR FS[5:0]
40 and ip, ip, #0x7e
41 orr r1, r1, ip, LSR #1
42 #endif
43
44 b do_DataAbort
45 ENDPROC(v7_early_abort)