Index: /trunk/src/VBox/VMM/VMMR3/SSM.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR3/SSM.cpp	(revision 42334)
+++ /trunk/src/VBox/VMM/VMMR3/SSM.cpp	(revision 42335)
@@ -465,6 +465,8 @@
     /** Number of compressed bytes left in the current data unit (V1). */
     uint64_t                cbUnitLeftV1;
-    /** The current uncompressed offset into the data unit. */
+    /** The current compressed? offset into the data unit. */
     uint64_t                offUnit;
+    /** The current user data offset into the unit (debug purposes). */
+    uint64_t                offUnitUser;
     /** Indicates that this is a live save or restore operation. */
     bool                    fLiveSave;
@@ -3068,5 +3070,6 @@
     if (RT_SUCCESS(rc))
     {
-        pSSM->offUnit = UINT64_MAX;
+        pSSM->offUnit     = UINT64_MAX;
+        pSSM->offUnitUser = UINT64_MAX;
         return VINF_SUCCESS;
     }
@@ -3088,5 +3091,6 @@
 static void ssmR3DataWriteBegin(PSSMHANDLE pSSM)
 {
-    pSSM->offUnit = 0;
+    pSSM->offUnit     = 0;
+    pSSM->offUnitUser = 0;
 }
 
@@ -3239,4 +3243,6 @@
     if (RT_SUCCESS(rc))
     {
+        pSSM->offUnitUser += cbBuf;
+
         /*
          * Split it up into compression blocks.
@@ -3347,4 +3353,5 @@
         memcpy(&pSSM->u.Write.abDataBuffer[0], pvBuf, cbBuf);
         pSSM->u.Write.offDataBuffer = (uint32_t)cbBuf;
+        pSSM->offUnitUser += cbBuf;
     }
     return rc;
@@ -3376,4 +3383,5 @@
     memcpy(&pSSM->u.Write.abDataBuffer[off], pvBuf, cbBuf);
     pSSM->u.Write.offDataBuffer = off + (uint32_t)cbBuf;
+    pSSM->offUnitUser += cbBuf;
     return VINF_SUCCESS;
 }
@@ -4868,4 +4876,5 @@
     pSSM->cbUnitLeftV1              = 0;
     pSSM->offUnit                   = UINT64_MAX;
+    pSSM->offUnitUser               = UINT64_MAX;
     pSSM->fLiveSave                 = false;
     pSSM->pfnProgress               = pfnProgress;
@@ -5599,5 +5608,6 @@
     {
         Log2(("ssmR3DataRead: pvBuf=%p cbBuf=%#x offUnit=%#llx %.*Rhxs%s\n", pvBuf, cbBuf, pSSM->offUnit, RT_MIN(cbBuf, SSM_LOG_BYTES), pvBuf, cbBuf > SSM_LOG_BYTES ? "..." : ""));
-        pSSM->offUnit += cbBuf;
+        pSSM->offUnit     += cbBuf;
+        pSSM->offUnitUser += cbBuf;
         return VINF_SUCCESS;
     }
@@ -5619,5 +5629,6 @@
     Assert(!pSSM->u.Read.cbRecLeft);
 
-    pSSM->offUnit = 0;
+    pSSM->offUnit     = 0;
+    pSSM->offUnitUser = 0;
     pSSM->u.Read.cbRecLeft      = 0;
     pSSM->u.Read.cbDataBuffer   = 0;
@@ -5648,5 +5659,8 @@
         if (   pSSM->u.Read.cbDataBuffer != pSSM->u.Read.offDataBuffer
             && pSSM->u.Read.cbDataBuffer > 0)
+        {
+            LogRel(("SSM: At least %#x bytes left to read\n", pSSM->u.Read.cbDataBuffer - pSSM->u.Read.offDataBuffer));
             rc = VERR_SSM_LOADED_TOO_LITTLE;
+        }
         else
         {
@@ -5655,4 +5669,5 @@
                 &&  !pSSM->u.Read.fEndOfData)
             {
+                LogRel(("SSM: At least %#x bytes left to read\n", pSSM->u.Read.cbDataBuffer));
                 rc = VERR_SSM_LOADED_TOO_LITTLE;
                 AssertFailed();
@@ -5667,5 +5682,5 @@
 
 /**
- * Read reader that keep works the progress indicator and unit offset.
+ * Read raw record bytes, work the progress indicator and unit offset.
  *
  * @returns VBox status code. Does NOT set pSSM->rc.
@@ -6078,4 +6093,5 @@
         }
 
+        pSSM->offUnitUser += cbToRead;
         cbBuf -= cbToRead;
         pvBuf = (uint8_t *)pvBuf + cbToRead;
@@ -6115,4 +6131,5 @@
         pvBuf  = (uint8_t *)pvBuf + cbToCopy;
         cbBuf -= cbToCopy;
+        pSSM->offUnitUser += cbToCopy;
         pSSM->u.Read.cbDataBuffer  = 0;
         pSSM->u.Read.offDataBuffer = 0;
@@ -6187,4 +6204,5 @@
         cbBuf -= cbToCopy;
         pvBuf = (uint8_t *)pvBuf + cbToCopy;
+        pSSM->offUnitUser       += cbToCopy;
         pSSM->u.Read.offDataBuffer = cbToCopy;
     } while (cbBuf > 0);
@@ -6228,4 +6246,5 @@
     memcpy(pvBuf, &pSSM->u.Read.abDataBuffer[off], cbBuf);
     pSSM->u.Read.offDataBuffer = off + (uint32_t)cbBuf;
+    pSSM->offUnitUser += cbBuf;
     Log4((cbBuf
           ? "ssmR3DataRead: %08llx|%08llx/%08x/%08x: cbBuf=%#x %.*Rhxs%s\n"
@@ -7680,4 +7699,5 @@
     pSSM->cbUnitLeftV1          = 0;
     pSSM->offUnit               = UINT64_MAX;
+    pSSM->offUnitUser           = UINT64_MAX;
     pSSM->fLiveSave             = false;
     pSSM->pfnProgress           = NULL;
@@ -7878,5 +7898,6 @@
                          */
                         pSSM->cbUnitLeftV1 = UnitHdr.cbUnit - RT_OFFSETOF(SSMFILEUNITHDRV1, szName[UnitHdr.cchName]);
-                        pSSM->offUnit = 0;
+                        pSSM->offUnit      = 0;
+                        pSSM->offUnitUser  = 0;
                         pSSM->u.Read.uCurUnitVer  = UnitHdr.u32Version;
                         pSSM->u.Read.uCurUnitPass = SSM_PASS_FINAL;
@@ -7940,5 +7961,6 @@
                             }
 
-                            pSSM->offUnit = UINT64_MAX;
+                            pSSM->offUnit     = UINT64_MAX;
+                            pSSM->offUnitUser = UINT64_MAX;
                         }
                         else
@@ -8173,5 +8195,8 @@
             rc = ssmR3DataReadFinishV2(pSSM);
             if (RT_SUCCESS(rc))
-                pSSM->offUnit = UINT64_MAX;
+            {
+                pSSM->offUnit     = UINT64_MAX;
+                pSSM->offUnitUser = UINT64_MAX;
+            }
             else
             {
@@ -8708,5 +8733,6 @@
                     rc = ssmR3StrmSeek(&pSSM->Strm, off + RT_OFFSETOF(SSMFILEUNITHDRV1, szName) + cbUnitNm, RTFILE_SEEK_BEGIN, 0);
                     pSSM->cbUnitLeftV1 = UnitHdr.cbUnit - RT_OFFSETOF(SSMFILEUNITHDRV1, szName[cbUnitNm]);
-                    pSSM->offUnit = 0;
+                    pSSM->offUnit      = 0;
+                    pSSM->offUnitUser  = 0;
                     if (piVersion)
                         *piVersion = UnitHdr.u32Version;
@@ -8891,4 +8917,5 @@
     pSSM->cbUnitLeftV1  = 0;
     pSSM->offUnit       = UINT64_MAX;
+    pSSM->offUnitUser   = UINT64_MAX;
 
     /*
