consistent update of ERL and EXL
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Mon, 26 Jun 2006 20:29:47 +0000 (20:29 +0000)
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Mon, 26 Jun 2006 20:29:47 +0000 (20:29 +0000)
(Dirk Behme)

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2028 c046a42c-6fe2-441c-8c8c-71466251a162

target-mips/helper.c
target-mips/op.c
target-mips/op_helper.c

index 8325d4843884eacd9cae5ae304a51dec5bbd1bba..9c8e4f68df5113c9bef1fd886e631948adca6a65 100644 (file)
@@ -332,7 +332,8 @@ void do_interrupt (CPUState *env)
         } else {
             env->CP0_ErrorEPC = env->PC;
         }
-        env->hflags = MIPS_HFLAG_ERL;
+        env->hflags |= MIPS_HFLAG_ERL;
+       env->CP0_Status |= (1 << CP0St_ERL);
         pc = 0xBFC00000;
         break;
     case EXCP_MCHECK:
@@ -396,6 +397,7 @@ void do_interrupt (CPUState *env)
             pc = 0x80000000;
         }
         env->hflags |= MIPS_HFLAG_EXL;
+       env->CP0_Status |= (1 << CP0St_EXL);
         pc += offset;
         env->CP0_Cause = (env->CP0_Cause & ~0x7C) | (cause << 2);
         if (env->hflags & MIPS_HFLAG_BMASK) {
index bc7f81949f5c3d1b7698c7d8ab403f0458d44c10..457551725db69642f1ed359ff543330ce1090a56 100644 (file)
@@ -1104,9 +1104,11 @@ void op_eret (void)
     if (env->hflags & MIPS_HFLAG_ERL) {
         env->PC = env->CP0_ErrorEPC;
         env->hflags &= ~MIPS_HFLAG_ERL;
+       env->CP0_Status &= ~(1 << CP0St_ERL);
     } else {
         env->PC = env->CP0_EPC;
         env->hflags &= ~MIPS_HFLAG_EXL;
+       env->CP0_Status &= ~(1 << CP0St_EXL);
     }
     env->CP0_LLAddr = 1;
 }
index 37f260430cb424a95d3a03cd1efa135bf82c4ec7..bf397c9b44345590f90e6ba2a79b53fd1ff6d7e4 100644 (file)
@@ -219,10 +219,6 @@ void do_mfc0 (int reg, int sel)
         T0 = env->CP0_Status;
         if (env->hflags & MIPS_HFLAG_UM)
             T0 |= (1 << CP0St_UM);
-        if (env->hflags & MIPS_HFLAG_ERL)
-            T0 |= (1 << CP0St_ERL);
-        if (env->hflags & MIPS_HFLAG_EXL)
-            T0 |= (1 << CP0St_EXL);
         rn = "Status";
         break;
     case 13: