These changes are a raw update to a vanilla kernel 4.1.10, with the
[kvmfornfv.git] / kernel / arch / mips / math-emu / cp1emu.c
index 6983fcd..2b95e34 100644 (file)
@@ -1137,7 +1137,7 @@ emul:
                        break;
 
                case mfhc_op:
-                       if (!cpu_has_mips_r2)
+                       if (!cpu_has_mips_r2_r6)
                                goto sigill;
 
                        /* copregister rd -> gpr[rt] */
@@ -1148,7 +1148,7 @@ emul:
                        break;
 
                case mthc_op:
-                       if (!cpu_has_mips_r2)
+                       if (!cpu_has_mips_r2_r6)
                                goto sigill;
 
                        /* copregister rd <- gpr[rt] */
@@ -1181,6 +1181,24 @@ emul:
                        }
                        break;
 
+               case bc1eqz_op:
+               case bc1nez_op:
+                       if (!cpu_has_mips_r6 || delay_slot(xcp))
+                               return SIGILL;
+
+                       cond = likely = 0;
+                       switch (MIPSInst_RS(ir)) {
+                       case bc1eqz_op:
+                               if (get_fpr32(&current->thread.fpu.fpr[MIPSInst_RT(ir)], 0) & 0x1)
+                                   cond = 1;
+                               break;
+                       case bc1nez_op:
+                               if (!(get_fpr32(&current->thread.fpu.fpr[MIPSInst_RT(ir)], 0) & 0x1))
+                                   cond = 1;
+                               break;
+                       }
+                       goto branch_common;
+
                case bc_op:
                        if (delay_slot(xcp))
                                return SIGILL;
@@ -1207,7 +1225,7 @@ emul:
                        case bct_op:
                                break;
                        }
-
+branch_common:
                        set_delay_slot(xcp);
                        if (cond) {
                                /*