Index: /trunk/src/VBox/Devices/Graphics/DevVGA.cpp
===================================================================
--- /trunk/src/VBox/Devices/Graphics/DevVGA.cpp	(revision 17296)
+++ /trunk/src/VBox/Devices/Graphics/DevVGA.cpp	(revision 17297)
@@ -128,4 +128,5 @@
 #include <iprt/asm.h>
 #include <iprt/file.h>
+#include <iprt/time.h>
 #include <iprt/string.h>
 
@@ -1377,4 +1378,18 @@
         VERIFY_VRAM_WRITE_OFF_RETURN(s, addr * 4 + 3);
 
+#ifdef IN_RING0
+        if (((++s->cLatchAccesses) & 0x3ff) == 0x3ff)
+        {
+            uint64_t u64CurTime = RTTimeSystemNanoTS();
+            /* About 1000 accesses per 10 ms or more will trigger a reschedule
+             * to the recompiler
+             */
+            if (u64CurTime - s->u64LastLatchedAccess < 10000000)
+                return VINF_EM_RAW_EMULATE_IO_BLOCK;
+
+            s->u64LastLatchedAccess = u64CurTime;            
+        }
+#endif
+
         write_mode = s->gr[5] & 3;
         switch(write_mode) {
Index: /trunk/src/VBox/Devices/Graphics/DevVGA.h
===================================================================
--- /trunk/src/VBox/Devices/Graphics/DevVGA.h	(revision 17296)
+++ /trunk/src/VBox/Devices/Graphics/DevVGA.h	(revision 17297)
@@ -301,4 +301,8 @@
     STAMPROFILE                 StatR3MemoryWrite;
 
+    /* Keep track of ring 0 latched accesses to the VGA MMIO memory. */
+    uint64_t                    u64LastLatchedAccess;
+    uint32_t                    cLatchAccesses;
+
 #ifdef VBE_BYTEWISE_IO
     /** VBE read/write data/index flags */
