diff options
-rw-r--r-- | arch/arm/mm/Kconfig | 2 | ||||
-rw-r--r-- | arch/arm/mm/abort-ev7.S | 21 |
2 files changed, 23 insertions, 0 deletions
diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig index 5bd7c89a6045..d3022dabb4aa 100644 --- a/arch/arm/mm/Kconfig +++ b/arch/arm/mm/Kconfig | |||
@@ -572,6 +572,8 @@ config CPU_TLB_V6 | |||
572 | config CPU_TLB_V7 | 572 | config CPU_TLB_V7 |
573 | bool | 573 | bool |
574 | 574 | ||
575 | config VERIFY_PERMISSION_FAULT | ||
576 | bool | ||
575 | endif | 577 | endif |
576 | 578 | ||
577 | config CPU_HAS_ASID | 579 | config CPU_HAS_ASID |
diff --git a/arch/arm/mm/abort-ev7.S b/arch/arm/mm/abort-ev7.S index 2e6dc040c654..ec88b157d3bb 100644 --- a/arch/arm/mm/abort-ev7.S +++ b/arch/arm/mm/abort-ev7.S | |||
@@ -29,5 +29,26 @@ ENTRY(v7_early_abort) | |||
29 | * V6 code adjusts the returned DFSR. | 29 | * V6 code adjusts the returned DFSR. |
30 | * New designs should not need to patch up faults. | 30 | * New designs should not need to patch up faults. |
31 | */ | 31 | */ |
32 | |||
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 | ||
41 | |||
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 | ||
52 | |||
32 | mov pc, lr | 53 | mov pc, lr |
33 | ENDPROC(v7_early_abort) | 54 | ENDPROC(v7_early_abort) |