MIPS: Use per-mm page to execute branch delay slot instructions
[cascardo/linux.git] / arch / mips / kernel / mips-r2-to-r6-emul.c
index 3fff89a..ef23c61 100644 (file)
@@ -28,6 +28,7 @@
 #include <asm/inst.h>
 #include <asm/mips-r2-to-r6-emul.h>
 #include <asm/local.h>
+#include <asm/mipsregs.h>
 #include <asm/ptrace.h>
 #include <asm/uaccess.h>
 
@@ -282,7 +283,7 @@ static int jr_func(struct pt_regs *regs, u32 ir)
                err = mipsr6_emul(regs, nir);
                if (err > 0) {
                        regs->cp0_epc = nepc;
-                       err = mips_dsemul(regs, nir, cepc);
+                       err = mips_dsemul(regs, nir, epc, cepc);
                        if (err == SIGILL)
                                err = SIGEMT;
                        MIPS_R2_STATS(dsemul);
@@ -1032,7 +1033,7 @@ repeat:
                        if (nir) {
                                err = mipsr6_emul(regs, nir);
                                if (err > 0) {
-                                       err = mips_dsemul(regs, nir, cpc);
+                                       err = mips_dsemul(regs, nir, epc, cpc);
                                        if (err == SIGILL)
                                                err = SIGEMT;
                                        MIPS_R2_STATS(dsemul);
@@ -1081,7 +1082,7 @@ repeat:
                        if (nir) {
                                err = mipsr6_emul(regs, nir);
                                if (err > 0) {
-                                       err = mips_dsemul(regs, nir, cpc);
+                                       err = mips_dsemul(regs, nir, epc, cpc);
                                        if (err == SIGILL)
                                                err = SIGEMT;
                                        MIPS_R2_STATS(dsemul);
@@ -1148,7 +1149,7 @@ repeat:
                if (nir) {
                        err = mipsr6_emul(regs, nir);
                        if (err > 0) {
-                               err = mips_dsemul(regs, nir, cpc);
+                               err = mips_dsemul(regs, nir, epc, cpc);
                                if (err == SIGILL)
                                        err = SIGEMT;
                                MIPS_R2_STATS(dsemul);
@@ -1251,10 +1252,10 @@ fpu_emul:
                        "       j       10b\n"
                        "       .previous\n"
                        "       .section        __ex_table,\"a\"\n"
-                       "       .word   1b,8b\n"
-                       "       .word   2b,8b\n"
-                       "       .word   3b,8b\n"
-                       "       .word   4b,8b\n"
+                       STR(PTR) " 1b,8b\n"
+                       STR(PTR) " 2b,8b\n"
+                       STR(PTR) " 3b,8b\n"
+                       STR(PTR) " 4b,8b\n"
                        "       .previous\n"
                        "       .set    pop\n"
                        : "+&r"(rt), "=&r"(rs),
@@ -1326,10 +1327,10 @@ fpu_emul:
                        "       j       10b\n"
                        "       .previous\n"
                        "       .section        __ex_table,\"a\"\n"
-                       "       .word   1b,8b\n"
-                       "       .word   2b,8b\n"
-                       "       .word   3b,8b\n"
-                       "       .word   4b,8b\n"
+                       STR(PTR) " 1b,8b\n"
+                       STR(PTR) " 2b,8b\n"
+                       STR(PTR) " 3b,8b\n"
+                       STR(PTR) " 4b,8b\n"
                        "       .previous\n"
                        "       .set    pop\n"
                        : "+&r"(rt), "=&r"(rs),
@@ -1397,10 +1398,10 @@ fpu_emul:
                        "       j       9b\n"
                        "       .previous\n"
                        "       .section        __ex_table,\"a\"\n"
-                       "       .word   1b,8b\n"
-                       "       .word   2b,8b\n"
-                       "       .word   3b,8b\n"
-                       "       .word   4b,8b\n"
+                       STR(PTR) " 1b,8b\n"
+                       STR(PTR) " 2b,8b\n"
+                       STR(PTR) " 3b,8b\n"
+                       STR(PTR) " 4b,8b\n"
                        "       .previous\n"
                        "       .set    pop\n"
                        : "+&r"(rt), "=&r"(rs),
@@ -1467,10 +1468,10 @@ fpu_emul:
                        "       j       9b\n"
                        "       .previous\n"
                        "       .section        __ex_table,\"a\"\n"
-                       "       .word   1b,8b\n"
-                       "       .word   2b,8b\n"
-                       "       .word   3b,8b\n"
-                       "       .word   4b,8b\n"
+                       STR(PTR) " 1b,8b\n"
+                       STR(PTR) " 2b,8b\n"
+                       STR(PTR) " 3b,8b\n"
+                       STR(PTR) " 4b,8b\n"
                        "       .previous\n"
                        "       .set    pop\n"
                        : "+&r"(rt), "=&r"(rs),
@@ -1582,14 +1583,14 @@ fpu_emul:
                        "       j       9b\n"
                        "       .previous\n"
                        "       .section        __ex_table,\"a\"\n"
-                       "       .word   1b,8b\n"
-                       "       .word   2b,8b\n"
-                       "       .word   3b,8b\n"
-                       "       .word   4b,8b\n"
-                       "       .word   5b,8b\n"
-                       "       .word   6b,8b\n"
-                       "       .word   7b,8b\n"
-                       "       .word   0b,8b\n"
+                       STR(PTR) " 1b,8b\n"
+                       STR(PTR) " 2b,8b\n"
+                       STR(PTR) " 3b,8b\n"
+                       STR(PTR) " 4b,8b\n"
+                       STR(PTR) " 5b,8b\n"
+                       STR(PTR) " 6b,8b\n"
+                       STR(PTR) " 7b,8b\n"
+                       STR(PTR) " 0b,8b\n"
                        "       .previous\n"
                        "       .set    pop\n"
                        : "+&r"(rt), "=&r"(rs),
@@ -1701,14 +1702,14 @@ fpu_emul:
                        "       j      9b\n"
                        "       .previous\n"
                        "       .section        __ex_table,\"a\"\n"
-                       "       .word  1b,8b\n"
-                       "       .word  2b,8b\n"
-                       "       .word  3b,8b\n"
-                       "       .word  4b,8b\n"
-                       "       .word  5b,8b\n"
-                       "       .word  6b,8b\n"
-                       "       .word  7b,8b\n"
-                       "       .word  0b,8b\n"
+                       STR(PTR) " 1b,8b\n"
+                       STR(PTR) " 2b,8b\n"
+                       STR(PTR) " 3b,8b\n"
+                       STR(PTR) " 4b,8b\n"
+                       STR(PTR) " 5b,8b\n"
+                       STR(PTR) " 6b,8b\n"
+                       STR(PTR) " 7b,8b\n"
+                       STR(PTR) " 0b,8b\n"
                        "       .previous\n"
                        "       .set    pop\n"
                        : "+&r"(rt), "=&r"(rs),
@@ -1820,14 +1821,14 @@ fpu_emul:
                        "       j       9b\n"
                        "       .previous\n"
                        "       .section        __ex_table,\"a\"\n"
-                       "       .word   1b,8b\n"
-                       "       .word   2b,8b\n"
-                       "       .word   3b,8b\n"
-                       "       .word   4b,8b\n"
-                       "       .word   5b,8b\n"
-                       "       .word   6b,8b\n"
-                       "       .word   7b,8b\n"
-                       "       .word   0b,8b\n"
+                       STR(PTR) " 1b,8b\n"
+                       STR(PTR) " 2b,8b\n"
+                       STR(PTR) " 3b,8b\n"
+                       STR(PTR) " 4b,8b\n"
+                       STR(PTR) " 5b,8b\n"
+                       STR(PTR) " 6b,8b\n"
+                       STR(PTR) " 7b,8b\n"
+                       STR(PTR) " 0b,8b\n"
                        "       .previous\n"
                        "       .set    pop\n"
                        : "+&r"(rt), "=&r"(rs),
@@ -1938,14 +1939,14 @@ fpu_emul:
                        "       j       9b\n"
                        "       .previous\n"
                        "       .section        __ex_table,\"a\"\n"
-                       "       .word   1b,8b\n"
-                       "       .word   2b,8b\n"
-                       "       .word   3b,8b\n"
-                       "       .word   4b,8b\n"
-                       "       .word   5b,8b\n"
-                       "       .word   6b,8b\n"
-                       "       .word   7b,8b\n"
-                       "       .word   0b,8b\n"
+                       STR(PTR) " 1b,8b\n"
+                       STR(PTR) " 2b,8b\n"
+                       STR(PTR) " 3b,8b\n"
+                       STR(PTR) " 4b,8b\n"
+                       STR(PTR) " 5b,8b\n"
+                       STR(PTR) " 6b,8b\n"
+                       STR(PTR) " 7b,8b\n"
+                       STR(PTR) " 0b,8b\n"
                        "       .previous\n"
                        "       .set    pop\n"
                        : "+&r"(rt), "=&r"(rs),
@@ -2000,7 +2001,7 @@ fpu_emul:
                        "j      2b\n"
                        ".previous\n"
                        ".section        __ex_table,\"a\"\n"
-                       ".word  1b, 3b\n"
+                       STR(PTR) " 1b,3b\n"
                        ".previous\n"
                        : "=&r"(res), "+&r"(err)
                        : "r"(vaddr), "i"(SIGSEGV)
@@ -2058,7 +2059,7 @@ fpu_emul:
                        "j      2b\n"
                        ".previous\n"
                        ".section        __ex_table,\"a\"\n"
-                       ".word  1b, 3b\n"
+                       STR(PTR) " 1b,3b\n"
                        ".previous\n"
                        : "+&r"(res), "+&r"(err)
                        : "r"(vaddr), "i"(SIGSEGV));
@@ -2119,7 +2120,7 @@ fpu_emul:
                        "j      2b\n"
                        ".previous\n"
                        ".section        __ex_table,\"a\"\n"
-                       ".word  1b, 3b\n"
+                       STR(PTR) " 1b,3b\n"
                        ".previous\n"
                        : "=&r"(res), "+&r"(err)
                        : "r"(vaddr), "i"(SIGSEGV)
@@ -2182,7 +2183,7 @@ fpu_emul:
                        "j      2b\n"
                        ".previous\n"
                        ".section        __ex_table,\"a\"\n"
-                       ".word  1b, 3b\n"
+                       STR(PTR) " 1b,3b\n"
                        ".previous\n"
                        : "+&r"(res), "+&r"(err)
                        : "r"(vaddr), "i"(SIGSEGV));
@@ -2201,7 +2202,7 @@ fpu_emul:
        }
 
        /*
-        * Lets not return to userland just yet. It's constly and
+        * Let's not return to userland just yet. It's costly and
         * it's likely we have more R2 instructions to emulate
         */
        if (!err && (pass++ < MIPS_R2_EMUL_TOTAL_PASS)) {