Index: /trunk/src/VBox/VMM/VMMAll/IOMAllMMIO.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMAll/IOMAllMMIO.cpp	(revision 61370)
+++ /trunk/src/VBox/VMM/VMMAll/IOMAllMMIO.cpp	(revision 61371)
@@ -754,7 +754,18 @@
     STAM_COUNTER_INC(&pVM->iom.s.StatR3MMIOHandler);
 
-    AssertMsg(cbBuf >= 1 && cbBuf <= 16, ("%zu\n", cbBuf));
+    NOREF(pvPhys); NOREF(enmOrigin);
     AssertPtr(pRange);
-    NOREF(pvPhys); NOREF(enmOrigin);
+    AssertMsg(cbBuf >= 1, ("%zu\n", cbBuf));
+
+
+#ifndef IN_RING3
+    /*
+     * If someone is doing FXSAVE, FXRSTOR, XSAVE, XRSTOR or other stuff dealing with
+     * large amounts of data, just go to ring-3 where we don't need to deal with partial
+     * successes.  No chance any of these will be problematic read-modify-write stuff.
+     */
+    if (cbBuf > sizeof(pVCpu->iom.s.PendingMmioWrite.abValue))
+        return enmAccessType == PGMACCESSTYPE_WRITE ? VINF_IOM_R3_MMIO_WRITE : VINF_IOM_R3_MMIO_READ;
+#endif
 
     /*
Index: /trunk/src/VBox/VMM/include/IOMInternal.h
===================================================================
--- /trunk/src/VBox/VMM/include/IOMInternal.h	(revision 61370)
+++ /trunk/src/VBox/VMM/include/IOMInternal.h	(revision 61371)
@@ -418,5 +418,5 @@
         RTGCPHYS                        GCPhys;
         /** The value to write. */
-        uint8_t                         abValue[24];
+        uint8_t                         abValue[128];
         /** The number of bytes to write (0 if nothing pending). */
         uint32_t                        cbValue;
