mips: Correct VInt vector generation
authorEdgar E. Iglesias <edgar.iglesias@gmail.com>
Mon, 29 Aug 2011 21:07:36 +0000 (23:07 +0200)
committerEdgar E. Iglesias <edgar.iglesias@gmail.com>
Tue, 6 Sep 2011 09:09:38 +0000 (11:09 +0200)
1. The pending need to pass the Status IM gating.
2. The priority is from seven (highest prio) down to zero.
   QEMU was doing the opposite.

Signed-off-by: Edgar E. Iglesias <edgar.iglesias@gmail.com>
target-mips/helper.c

index 024caa23c13b935f396c880744159653493a8d54..1c58e0cc210088f8275ddcaa3fc0d4916e548e94 100644 (file)
@@ -482,18 +482,18 @@ void do_interrupt (CPUState *env)
             unsigned int vector;
             unsigned int pending = (env->CP0_Cause & CP0Ca_IP_mask) >> 8;
 
+            pending &= env->CP0_Status >> 8;
             /* Compute the Vector Spacing.  */
             spacing = (env->CP0_IntCtl >> CP0IntCtl_VS) & ((1 << 6) - 1);
             spacing <<= 5;
 
             if (env->CP0_Config3 & (1 << CP0C3_VInt)) {
                 /* For VInt mode, the MIPS computes the vector internally.  */
-                for (vector = 0; vector < 8; vector++) {
-                    if (pending & 1) {
+                for (vector = 7; vector > 0; vector--) {
+                    if (pending & (1 << vector)) {
                         /* Found it.  */
                         break;
                     }
-                    pending >>= 1;
                 }
             } else {
                 /* For VEIC mode, the external interrupt controller feeds the