1#include <linux/linkage.h>
2#include <asm/assembler.h>
3#include "abort-macro.S"
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 .align 5
19ENTRY(v6_early_abort)
20#ifdef CONFIG_CPU_V6
21 sub r1, sp,
22 strex r0, r1, [r1] @ Clear the exclusive monitor
23
24 clrex
25#endif
26 mrc p15, 0, r1, c5, c0, 0 @ get FSR
27 mrc p15, 0, r0, c6, c0, 0 @ get FAR
28
29
30
31#ifdef CONFIG_ARM_ERRATA_326103
32 ldr ip, =0x4107b36
33 mrc p15, 0, r3, c0, c0, 0 @ get processor id
34 teq ip, r3, lsr
35 bne do_DataAbort
36 tst r5,
37 tsteq r5,
38 bne do_DataAbort
39 bic r1, r1,
40 ldr r3, [r4] @ read aborted ARM instruction
41#ifdef CONFIG_CPU_ENDIAN_BE8
42 rev r3, r3
43#endif
44 do_ldrd_abort tmp=ip, insn=r3
45 tst r3,
46 orreq r1, r1,
47#endif
48 b do_DataAbort
49