Index: /trunk/src/VBox/VMM/VMMAll/GIMAllHv.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMAll/GIMAllHv.cpp	(revision 58330)
+++ /trunk/src/VBox/VMM/VMMAll/GIMAllHv.cpp	(revision 58331)
@@ -247,8 +247,8 @@
                     if (rcHv == GIM_HV_STATUS_SUCCESS)
                     {
-                        if (!fFlags)
+                        if (fFlags)
+                            LogRelMax(1, ("GIM: HyperV: Resetting debug session via hypercall\n"));
+                        else
                             rcHv = GIM_HV_STATUS_INVALID_PARAMETER;
-                        else
-                            LogRelMax(1, ("GIM: HyperV: Resetting debug session via hypercall\n"));
                     }
                 }
@@ -492,12 +492,12 @@
 
         case MSR_GIM_HV_CRASH_CTL:
-            *puValue = pHv->uCrashCtl;
-            return VINF_SUCCESS;
-
-        case MSR_GIM_HV_CRASH_P0: *puValue = pHv->uCrashP0;   return VINF_SUCCESS;
-        case MSR_GIM_HV_CRASH_P1: *puValue = pHv->uCrashP1;   return VINF_SUCCESS;
-        case MSR_GIM_HV_CRASH_P2: *puValue = pHv->uCrashP2;   return VINF_SUCCESS;
-        case MSR_GIM_HV_CRASH_P3: *puValue = pHv->uCrashP3;   return VINF_SUCCESS;
-        case MSR_GIM_HV_CRASH_P4: *puValue = pHv->uCrashP4;   return VINF_SUCCESS;
+            *puValue = pHv->uCrashCtlMsr;
+            return VINF_SUCCESS;
+
+        case MSR_GIM_HV_CRASH_P0: *puValue = pHv->uCrashP0Msr;   return VINF_SUCCESS;
+        case MSR_GIM_HV_CRASH_P1: *puValue = pHv->uCrashP1Msr;   return VINF_SUCCESS;
+        case MSR_GIM_HV_CRASH_P2: *puValue = pHv->uCrashP2Msr;   return VINF_SUCCESS;
+        case MSR_GIM_HV_CRASH_P3: *puValue = pHv->uCrashP3Msr;   return VINF_SUCCESS;
+        case MSR_GIM_HV_CRASH_P4: *puValue = pHv->uCrashP4Msr;   return VINF_SUCCESS;
 
         case MSR_GIM_HV_DEBUG_OPTIONS_MSR:
@@ -716,5 +716,5 @@
             {
                 LogRel(("GIM: HyperV: Guest indicates a fatal condition! P0=%#RX64 P1=%#RX64 P2=%#RX64 P3=%#RX64 P4=%#RX64\n",
-                        pHv->uCrashP0, pHv->uCrashP1, pHv->uCrashP2, pHv->uCrashP3, pHv->uCrashP4));
+                        pHv->uCrashP0Msr, pHv->uCrashP1Msr, pHv->uCrashP2Msr, pHv->uCrashP3Msr, pHv->uCrashP4Msr));
             }
             return VINF_SUCCESS;
@@ -924,9 +924,9 @@
         }
 
-        case MSR_GIM_HV_CRASH_P0:  pHv->uCrashP0 = uRawValue;  return VINF_SUCCESS;
-        case MSR_GIM_HV_CRASH_P1:  pHv->uCrashP1 = uRawValue;  return VINF_SUCCESS;
-        case MSR_GIM_HV_CRASH_P2:  pHv->uCrashP2 = uRawValue;  return VINF_SUCCESS;
-        case MSR_GIM_HV_CRASH_P3:  pHv->uCrashP3 = uRawValue;  return VINF_SUCCESS;
-        case MSR_GIM_HV_CRASH_P4:  pHv->uCrashP4 = uRawValue;  return VINF_SUCCESS;
+        case MSR_GIM_HV_CRASH_P0:  pHv->uCrashP0Msr = uRawValue;  return VINF_SUCCESS;
+        case MSR_GIM_HV_CRASH_P1:  pHv->uCrashP1Msr = uRawValue;  return VINF_SUCCESS;
+        case MSR_GIM_HV_CRASH_P2:  pHv->uCrashP2Msr = uRawValue;  return VINF_SUCCESS;
+        case MSR_GIM_HV_CRASH_P3:  pHv->uCrashP3Msr = uRawValue;  return VINF_SUCCESS;
+        case MSR_GIM_HV_CRASH_P4:  pHv->uCrashP4Msr = uRawValue;  return VINF_SUCCESS;
 
         case MSR_GIM_HV_TIME_REF_COUNT:     /* Read-only MSRs. */
Index: /trunk/src/VBox/VMM/VMMR3/GIMHv.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR3/GIMHv.cpp	(revision 58330)
+++ /trunk/src/VBox/VMM/VMMR3/GIMHv.cpp	(revision 58331)
@@ -45,5 +45,7 @@
  * GIM Hyper-V saved-state version.
  */
-#define GIM_HV_SAVED_STATE_VERSION          UINT32_C(1)
+#define GIM_HV_SAVED_STATE_VERSION                UINT32_C(2)
+/** Vanilla saved states, prior to any debug support. */
+#define GIM_HV_SAVED_STATE_VERSION_PRE_DEBUG      UINT32_C(1)
 
 #ifdef VBOX_WITH_STATISTICS
@@ -426,5 +428,5 @@
      */
     if (pHv->uMiscFeat & GIM_HV_MISC_FEAT_GUEST_CRASH_MSRS)
-        pHv->uCrashCtl = MSR_GIM_HV_CRASH_CTL_NOTIFY_BIT;
+        pHv->uCrashCtlMsr = MSR_GIM_HV_CRASH_CTL_NOTIFY_BIT;
     for (VMCPUID i = 0; i < pVM->cCpus; i++)
         pVM->aCpus[i].gim.s.u.HvCpu.uSint2Msr = MSR_GIM_HV_SINT_MASKED_BIT;
@@ -560,9 +562,9 @@
     pHv->u64HypercallMsr        = 0;
     pHv->u64TscPageMsr          = 0;
-    pHv->uCrashP0               = 0;
-    pHv->uCrashP1               = 0;
-    pHv->uCrashP2               = 0;
-    pHv->uCrashP3               = 0;
-    pHv->uCrashP4               = 0;
+    pHv->uCrashP0Msr            = 0;
+    pHv->uCrashP1Msr            = 0;
+    pHv->uCrashP2Msr            = 0;
+    pHv->uCrashP3Msr            = 0;
+    pHv->uCrashP4Msr            = 0;
     pHv->uDebugStatusMsr        = 0;
     pHv->uDebugPendingBufferMsr = 0;
@@ -656,6 +658,25 @@
         uTscSequence = pcRefTsc->u32TscSequence;
     }
-
-    return SSMR3PutU32(pSSM, uTscSequence);
+    SSMR3PutU32(pSSM, uTscSequence);
+
+    /*
+     * Save debug support data.
+     */
+    SSMR3PutU64(pSSM, pcHv->uDebugPendingBufferMsr);
+    SSMR3PutU64(pSSM, pcHv->uDebugSendBufferMsr);
+    SSMR3PutU64(pSSM, pcHv->uDebugRecvBufferMsr);
+    SSMR3PutU64(pSSM, pcHv->uDebugStatusMsr);
+    SSMR3PutU32(pSSM, pcHv->enmDebugReply);
+    SSMR3PutU32(pSSM, pcHv->uBootpXId);
+    SSMR3PutU32(pSSM, pcHv->DbgGuestIp4Addr.u);
+
+    for (VMCPUID i = 0; i < pVM->cCpus; i++)
+    {
+        PGIMHVCPU pHvCpu = &pVM->aCpus[i].gim.s.u.HvCpu;
+        SSMR3PutU64(pSSM, pHvCpu->uSimpMsr);
+        SSMR3PutU64(pSSM, pHvCpu->uSint2Msr);
+    }
+
+    return SSMR3PutU8(pSSM, UINT8_MAX);;
 }
 
@@ -677,7 +698,8 @@
     int rc = SSMR3GetU32(pSSM, &uHvSavedStatVersion);
     AssertRCReturn(rc, rc);
-    if (uHvSavedStatVersion != GIM_HV_SAVED_STATE_VERSION)
+    if (   uHvSavedStatVersion != GIM_HV_SAVED_STATE_VERSION
+        && uHvSavedStatVersion != GIM_HV_SAVED_STATE_VERSION_PRE_DEBUG)
         return SSMR3SetLoadError(pSSM, VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION, RT_SRC_POS,
-                                 N_("Unsupported Hyper-V saved-state version %u (expected %u)."), uHvSavedStatVersion,
+                                 N_("Unsupported Hyper-V saved-state version %u (current %u)!"), uHvSavedStatVersion,
                                  GIM_HV_SAVED_STATE_VERSION);
 
@@ -765,5 +787,28 @@
     }
 
-    return rc;
+    /*
+     * Load the debug support data.
+     */
+    if (uHvSavedStatVersion > GIM_HV_SAVED_STATE_VERSION_PRE_DEBUG)
+    {
+        SSMR3GetU64(pSSM, &pHv->uDebugPendingBufferMsr);
+        SSMR3GetU64(pSSM, &pHv->uDebugSendBufferMsr);
+        SSMR3GetU64(pSSM, &pHv->uDebugRecvBufferMsr);
+        SSMR3GetU64(pSSM, &pHv->uDebugStatusMsr);
+        SSMR3GetU32(pSSM, (uint32_t *)&pHv->enmDebugReply);
+        SSMR3GetU32(pSSM, &pHv->uBootpXId);
+        rc = SSMR3GetU32(pSSM, &pHv->DbgGuestIp4Addr.u);
+        AssertRCReturn(rc, rc);
+
+        for (VMCPUID i = 0; i < pVM->cCpus; i++)
+        {
+            PGIMHVCPU pHvCpu = &pVM->aCpus[i].gim.s.u.HvCpu;
+            SSMR3GetU64(pSSM, &pHvCpu->uSimpMsr);
+            SSMR3GetU64(pSSM, &pHvCpu->uSint2Msr);
+        }
+    }
+
+    uint8_t bDelim;
+    return SSMR3GetU8(pSSM, &bDelim);
 }
 
@@ -1169,5 +1214,5 @@
                         pIpHdr->ip_sum     = 0;
                         pIpHdr->ip_src.u   = 0;
-                        pIpHdr->ip_dst.u   = pHv->DbgGuestAddr.u;
+                        pIpHdr->ip_dst.u   = pHv->DbgGuestIp4Addr.u;
                         pIpHdr->ip_sum     = RTNetIPv4HdrChecksum(pIpHdr);
                         /* UDP */
@@ -1379,6 +1424,6 @@
                                 pbData  += cbFrameHdr;
                                 cbWrite -= cbFrameHdr;
-                                pHv->DbgGuestAddr = pIp4Hdr->ip_src;
-                                pHv->enmDebugReply = GIMHVDEBUGREPLY_UDP;
+                                pHv->DbgGuestIp4Addr = pIp4Hdr->ip_src;
+                                pHv->enmDebugReply   = GIMHVDEBUGREPLY_UDP;
                             }
                             else
Index: /trunk/src/VBox/VMM/include/GIMHvInternal.h
===================================================================
--- /trunk/src/VBox/VMM/include/GIMHvInternal.h	(revision 58330)
+++ /trunk/src/VBox/VMM/include/GIMHvInternal.h	(revision 58331)
@@ -944,4 +944,7 @@
 /**
  * Type of the next reply to be sent to the debug connection of the guest.
+ *
+ * @remarks This is saved as part of saved-state, so don't re-order or
+ *          alter the size!
  */
 typedef enum GIMHVDEBUGREPLY
@@ -964,5 +967,5 @@
     GIMHVDEBUGREPLY_32BIT_HACK = 0x7fff0000
 } GIMHVDEBUGREPLY;
-AssertCompileSize(GIMHVDEBUGREPLY, 4);
+AssertCompileSize(GIMHVDEBUGREPLY, sizeof(uint32_t));
 
 /**
@@ -1002,15 +1005,15 @@
      */
     /** Guest crash control MSR. */
-    uint64_t                    uCrashCtl;
+    uint64_t                    uCrashCtlMsr;
     /** Guest crash parameter 0 MSR. */
-    uint64_t                    uCrashP0;
+    uint64_t                    uCrashP0Msr;
     /** Guest crash parameter 1 MSR. */
-    uint64_t                    uCrashP1;
+    uint64_t                    uCrashP1Msr;
     /** Guest crash parameter 2 MSR. */
-    uint64_t                    uCrashP2;
+    uint64_t                    uCrashP2Msr;
     /** Guest crash parameter 3 MSR. */
-    uint64_t                    uCrashP3;
+    uint64_t                    uCrashP3Msr;
     /** Guest crash parameter 4 MSR. */
-    uint64_t                    uCrashP4;
+    uint64_t                    uCrashP4Msr;
     /** @} */
 
@@ -1046,5 +1049,5 @@
     bool                        afAlignment0[6];
     /** The auto IP address last chosen by the guest after failed ARP queries. */
-    RTNETADDRIPV4               DbgGuestAddr;
+    RTNETADDRIPV4               DbgGuestIp4Addr;
     /** The action to take while sending replies. */
     GIMHVDEBUGREPLY             enmDebugReply;
