arm: Invalidate BTB on prefetch abort outside of user mapping on Cortex A8, A9, A12...
[linux-3.10.git] / arch / arm / mm / fsr-2level.c
1 static struct fsr_info fsr_info[] = {
2         /*
3          * The following are the standard ARMv3 and ARMv4 aborts.  ARMv5
4          * defines these to be "precise" aborts.
5          */
6         { do_bad,               SIGSEGV, 0,             "vector exception"                 },
7         { do_bad,               SIGBUS,  BUS_ADRALN,    "alignment exception"              },
8         { do_bad,               SIGKILL, 0,             "terminal exception"               },
9         { do_bad,               SIGBUS,  BUS_ADRALN,    "alignment exception"              },
10         { do_bad,               SIGBUS,  0,             "external abort on linefetch"      },
11         { do_translation_fault, SIGSEGV, SEGV_MAPERR,   "section translation fault"        },
12         { do_bad,               SIGBUS,  0,             "external abort on linefetch"      },
13         { do_page_fault,        SIGSEGV, SEGV_MAPERR,   "page translation fault"           },
14         { do_bad,               SIGBUS,  0,             "external abort on non-linefetch"  },
15         { do_bad,               SIGSEGV, SEGV_ACCERR,   "section domain fault"             },
16         { do_bad,               SIGBUS,  0,             "external abort on non-linefetch"  },
17         { do_bad,               SIGSEGV, SEGV_ACCERR,   "page domain fault"                },
18         { do_bad,               SIGBUS,  0,             "external abort on translation"    },
19         { do_sect_fault,        SIGSEGV, SEGV_ACCERR,   "section permission fault"         },
20         { do_bad,               SIGBUS,  0,             "external abort on translation"    },
21         { do_page_fault,        SIGSEGV, SEGV_ACCERR,   "page permission fault"            },
22         /*
23          * The following are "imprecise" aborts, which are signalled by bit
24          * 10 of the FSR, and may not be recoverable.  These are only
25          * supported if the CPU abort handler supports bit 10.
26          */
27         { do_bad,               SIGBUS,  0,             "unknown 16"                       },
28         { do_bad,               SIGBUS,  0,             "unknown 17"                       },
29         { do_bad,               SIGBUS,  0,             "unknown 18"                       },
30         { do_bad,               SIGBUS,  0,             "unknown 19"                       },
31         { do_bad,               SIGBUS,  0,             "lock abort"                       }, /* xscale */
32         { do_bad,               SIGBUS,  0,             "unknown 21"                       },
33         { do_bad,               SIGBUS,  BUS_OBJERR,    "imprecise external abort"         }, /* xscale */
34         { do_bad,               SIGBUS,  0,             "unknown 23"                       },
35         { do_bad,               SIGBUS,  0,             "dcache parity error"              }, /* xscale */
36         { do_bad,               SIGBUS,  0,             "unknown 25"                       },
37         { do_bad,               SIGBUS,  0,             "unknown 26"                       },
38         { do_bad,               SIGBUS,  0,             "unknown 27"                       },
39         { do_bad,               SIGBUS,  0,             "unknown 28"                       },
40         { do_bad,               SIGBUS,  0,             "unknown 29"                       },
41         { do_bad,               SIGBUS,  0,             "unknown 30"                       },
42         { do_bad,               SIGBUS,  0,             "unknown 31"                       },
43 };
44
45 static struct fsr_info ifsr_info[] = {
46         { do_bad,               SIGBUS,  0,             "unknown 0"                        },
47         { do_bad,               SIGBUS,  0,             "unknown 1"                        },
48         { do_bad,               SIGBUS,  0,             "debug event"                      },
49         { do_bad,               SIGSEGV, SEGV_ACCERR,   "section access flag fault"        },
50         { do_bad,               SIGBUS,  0,             "unknown 4"                        },
51         { do_translation_fault, SIGSEGV, SEGV_MAPERR,   "section translation fault"        },
52         { do_bad,               SIGSEGV, SEGV_ACCERR,   "page access flag fault"           },
53         { do_pabt_page_fault,   SIGSEGV, SEGV_MAPERR,   "page translation fault"           },
54         { do_bad,               SIGBUS,  0,             "external abort on non-linefetch"  },
55         { do_bad,               SIGSEGV, SEGV_ACCERR,   "section domain fault"             },
56         { do_bad,               SIGBUS,  0,             "unknown 10"                       },
57         { do_bad,               SIGSEGV, SEGV_ACCERR,   "page domain fault"                },
58         { do_bad,               SIGBUS,  0,             "external abort on translation"    },
59         { do_sect_fault,        SIGSEGV, SEGV_ACCERR,   "section permission fault"         },
60         { do_bad,               SIGBUS,  0,             "external abort on translation"    },
61         { do_pabt_page_fault,   SIGSEGV, SEGV_ACCERR,   "page permission fault"            },
62         { do_bad,               SIGBUS,  0,             "unknown 16"                       },
63         { do_bad,               SIGBUS,  0,             "unknown 17"                       },
64         { do_bad,               SIGBUS,  0,             "unknown 18"                       },
65         { do_bad,               SIGBUS,  0,             "unknown 19"                       },
66         { do_bad,               SIGBUS,  0,             "unknown 20"                       },
67         { do_bad,               SIGBUS,  0,             "unknown 21"                       },
68         { do_bad,               SIGBUS,  0,             "unknown 22"                       },
69         { do_bad,               SIGBUS,  0,             "unknown 23"                       },
70         { do_bad,               SIGBUS,  0,             "unknown 24"                       },
71         { do_bad,               SIGBUS,  0,             "unknown 25"                       },
72         { do_bad,               SIGBUS,  0,             "unknown 26"                       },
73         { do_bad,               SIGBUS,  0,             "unknown 27"                       },
74         { do_bad,               SIGBUS,  0,             "unknown 28"                       },
75         { do_bad,               SIGBUS,  0,             "unknown 29"                       },
76         { do_bad,               SIGBUS,  0,             "unknown 30"                       },
77         { do_bad,               SIGBUS,  0,             "unknown 31"                       },
78 };