Index: /trunk/src/VBox/VMM/VMMAll/TRPMAll.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMAll/TRPMAll.cpp	(revision 42775)
+++ /trunk/src/VBox/VMM/VMMAll/TRPMAll.cpp	(revision 42776)
@@ -402,4 +402,7 @@
     }
 # endif /* VBOX_STRICT || LOG_ENABLED */
+#ifdef IN_RC
+    AssertReturn(CPUMIsGuestInRawMode(pVCpu), VINF_EM_RESCHEDULE);
+#endif
 
     /* Retrieve the eflags including the virtualized bits. */
@@ -657,4 +660,11 @@
                     /* Mask away dangerous flags for the trap/interrupt handler. */
                     eflags.u32 &= ~(X86_EFL_TF | X86_EFL_VM | X86_EFL_RF | X86_EFL_NT);
+
+                    /* Turn off interrupts for interrupt gates. */
+                    if (GuestIdte.Gen.u5Type2 == VBOX_IDTE_TYPE2_INT_32)
+                        eflags.Bits.u1IF = 0;
+
+                    CPUMRawSetEFlags(pVCpu, eflags.u32);
+
 #ifdef DEBUG
                     for (int j = idx; j < 0; j++)
@@ -670,5 +680,6 @@
 #endif
 
-                    Log(("PATM Handler %RRv Adjusted stack %08X new EFLAGS=%08X idx=%d dpl=%d cpl=%d\n", pVM->trpm.s.aGuestTrapHandler[iGate], esp_r0, eflags.u32, idx, dpl, cpl));
+                    Log(("TRPM: PATM Handler %RRv Adjusted stack %08X new EFLAGS=%08X/%08x idx=%d dpl=%d cpl=%d\n",
+                         pVM->trpm.s.aGuestTrapHandler[iGate], esp_r0, eflags.u32, CPUMRawGetEFlags(pVCpu), idx, dpl, cpl));
 
                     /* Make sure the internal guest context structure is up-to-date. */
@@ -677,10 +688,8 @@
 
 #ifdef IN_RC
-                    /* Turn off interrupts for interrupt gates. */
-                    if (GuestIdte.Gen.u5Type2 == VBOX_IDTE_TYPE2_INT_32)
-                        CPUMRawSetEFlags(pVCpu, eflags.u32 & ~X86_EFL_IF);
-
-                    /* The virtualized bits must be removed again!! */
+                    /* paranoia */
+                    Assert(pRegFrame->eflags.Bits.u1IF == 1);
                     eflags.Bits.u1IF   = 1;
+                    Assert(pRegFrame->eflags.Bits.u2IOPL == 0);
                     eflags.Bits.u2IOPL = 0;
 
@@ -697,10 +706,7 @@
                     /* does not return */
 #else
-                    /* Turn off interrupts for interrupt gates. */
-                    if (GuestIdte.Gen.u5Type2 == VBOX_IDTE_TYPE2_INT_32)
-                        eflags.Bits.u1IF = 0;
-
+
+                    Assert(!CPUMIsGuestInRawMode(pVCpu));
                     pRegFrame->eflags.u32 = eflags.u32;
-
                     pRegFrame->eip        = pVM->trpm.s.aGuestTrapHandler[iGate];
                     pRegFrame->cs.Sel     = GuestIdte.Gen.u16SegSel;
