MIPS: Use dedicated exception handler if CPU supports RI/XI exceptions
authorLeonid Yegoshin <Leonid.Yegoshin@imgtec.com>
Tue, 15 Jul 2014 13:09:56 +0000 (14:09 +0100)
committerRalf Baechle <ralf@linux-mips.org>
Fri, 1 Aug 2014 22:06:39 +0000 (00:06 +0200)
Use the regular tlb_do_page_fault_0 (no write) handler to handle
the RI and XI exceptions. Also skip the RI/XI validation check
on TLB load handler since it's redundant when the CPU has
unique RI/XI exceptions.

Singed-off-by: Leonid Yegoshin <Leonid.Yegoshin@imgtec.com>
Signed-off-by: Markos Chandras <markos.chandras@imgtec.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/7339/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/kernel/traps.c
arch/mips/mm/tlbex.c

index 51706d6dd5b07a9c7dc075c828ce3f7ca524c39c..1a328b1e288b088d0e7117d4fc2907e57db78296 100644 (file)
@@ -90,6 +90,7 @@ extern asmlinkage void handle_mt(void);
 extern asmlinkage void handle_dsp(void);
 extern asmlinkage void handle_mcheck(void);
 extern asmlinkage void handle_reserved(void);
+extern void tlb_do_page_fault_0(void);
 
 void (*board_be_init)(void);
 int (*board_be_handler)(struct pt_regs *regs, int is_fixup);
@@ -2114,6 +2115,12 @@ void __init trap_init(void)
                set_except_vector(15, handle_fpe);
 
        set_except_vector(16, handle_ftlb);
+
+       if (cpu_has_rixiex) {
+               set_except_vector(19, tlb_do_page_fault_0);
+               set_except_vector(20, tlb_do_page_fault_0);
+       }
+
        set_except_vector(21, handle_msa);
        set_except_vector(22, handle_mdmx);
 
index 0d9d0f06dbb2283f0bb341063a6df38de64a7ec4..ccf8298e7ab26bfc62134462087f623a9a896c43 100644 (file)
@@ -1919,7 +1919,7 @@ static void build_r4000_tlb_load_handler(void)
        if (m4kc_tlbp_war())
                build_tlb_probe_entry(&p);
 
-       if (cpu_has_rixi) {
+       if (cpu_has_rixi && !cpu_has_rixiex) {
                /*
                 * If the page is not _PAGE_VALID, RI or XI could not
                 * have triggered it.  Skip the expensive test..
@@ -1986,7 +1986,7 @@ static void build_r4000_tlb_load_handler(void)
        build_pte_present(&p, &r, wr.r1, wr.r2, wr.r3, label_nopage_tlbl);
        build_tlb_probe_entry(&p);
 
-       if (cpu_has_rixi) {
+       if (cpu_has_rixi && !cpu_has_rixiex) {
                /*
                 * If the page is not _PAGE_VALID, RI or XI could not
                 * have triggered it.  Skip the expensive test..