Index: /trunk/src/recompiler/VBoxREMWrapper.cpp
===================================================================
--- /trunk/src/recompiler/VBoxREMWrapper.cpp	(revision 39698)
+++ /trunk/src/recompiler/VBoxREMWrapper.cpp	(revision 39699)
@@ -662,4 +662,9 @@
     { REMPARMDESC_FLAGS_INT,        sizeof(int),                NULL }
 };
+static const REMPARMDESC g_aArgsEMSetInhibitInterruptsPC[] =
+{
+    { REMPARMDESC_FLAGS_INT,        sizeof(PVMCPU),             NULL },
+    { REMPARMDESC_FLAGS_INT,        sizeof(RTGCPTR),            NULL }
+};
 static const REMPARMDESC g_aArgsHWACCMR3CanExecuteGuest[] =
 {
@@ -1220,4 +1225,6 @@
     { "EMRemUnlock",                            VMM_FN(EMRemUnlock),                    &g_aArgsVM[0],                              RT_ELEMENTS(g_aArgsVM),                                REMFNDESC_FLAGS_RET_VOID,   0,                  NULL },
     { "EMRemIsLockOwner",                       VMM_FN(EMRemIsLockOwner),               &g_aArgsVM[0],                              RT_ELEMENTS(g_aArgsVM),                                REMFNDESC_FLAGS_RET_VOID,   sizeof(bool),       NULL },
+    { "EMGetInhibitInterruptsPC",               VMM_FN(EMGetInhibitInterruptsPC),       &g_aArgsVMCPU[0],                           RT_ELEMENTS(g_aArgsVMCPU),                             REMFNDESC_FLAGS_RET_INT,    sizeof(RTGCPTR),    NULL },
+    { "EMSetInhibitInterruptsPC",               VMM_FN(EMSetInhibitInterruptsPC),       &g_aArgsEMSetInhibitInterruptsPC[0],        RT_ELEMENTS(g_aArgsEMSetInhibitInterruptsPC),          REMFNDESC_FLAGS_RET_INT,    sizeof(int),        NULL },
     { "HWACCMR3CanExecuteGuest",                VMM_FN(HWACCMR3CanExecuteGuest),        &g_aArgsHWACCMR3CanExecuteGuest[0],         RT_ELEMENTS(g_aArgsHWACCMR3CanExecuteGuest),           REMFNDESC_FLAGS_RET_INT,    sizeof(int),        NULL },
     { "IOMIOPortRead",                          VMM_FN(IOMIOPortRead),                  &g_aArgsIOMIOPortRead[0],                   RT_ELEMENTS(g_aArgsIOMIOPortRead),                     REMFNDESC_FLAGS_RET_INT,    sizeof(int),        NULL },
Index: /trunk/src/recompiler/VBoxRecompiler.c
===================================================================
--- /trunk/src/recompiler/VBoxRecompiler.c	(revision 39698)
+++ /trunk/src/recompiler/VBoxRecompiler.c	(revision 39699)
@@ -2165,4 +2165,18 @@
 #endif
 
+    /* Update the inhibit IRQ mask. */
+    pVM->rem.s.Env.hflags &= ~HF_INHIBIT_IRQ_MASK;
+    if (VMCPU_FF_ISSET(pVCpu, VMCPU_FF_INHIBIT_INTERRUPTS))
+    {
+        RTGCPTR InhibitPC = EMGetInhibitInterruptsPC(pVCpu);
+        if (InhibitPC == pCtx->rip)
+            pVM->rem.s.Env.hflags |= HF_INHIBIT_IRQ_MASK;
+        else
+        {
+            Log(("Clearing VMCPU_FF_INHIBIT_INTERRUPTS at %RGv - successor %RGv (REM#1)\n", (RTGCPTR)pCtx->rip, InhibitPC));
+            VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_INHIBIT_INTERRUPTS);
+        }
+    }
+
     /*
      * Sync the A20 gate.
@@ -2709,4 +2723,17 @@
     pCtx->msrKERNELGSBASE  = pVM->rem.s.Env.kernelgsbase;
 #endif
+
+    /* Inhibit interrupt flag. */
+    if (pVM->rem.s.Env.hflags & HF_INHIBIT_IRQ_MASK)
+    {
+        Log(("Settings VMCPU_FF_INHIBIT_INTERRUPTS at %RGv (REM)\n", (RTGCPTR)pCtx->rip));
+        EMSetInhibitInterruptsPC(pVCpu, pCtx->rip);
+        VMCPU_FF_SET(pVCpu, VMCPU_FF_INHIBIT_INTERRUPTS);
+    }
+    else if (VMCPU_FF_ISSET(pVCpu, VMCPU_FF_INHIBIT_INTERRUPTS))
+    {
+        Log(("Clearing VMCPU_FF_INHIBIT_INTERRUPTS at %RGv - successor %RGv (REM#2)\n", (RTGCPTR)pCtx->rip, EMGetInhibitInterruptsPC(pVCpu)));
+        VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_INHIBIT_INTERRUPTS);
+    }
 
     remR3TrapClear(pVM);
