Index: /trunk/src/VBox/VMM/VMMR0/GIMR0Hv.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR0/GIMR0Hv.cpp	(revision 51960)
+++ /trunk/src/VBox/VMM/VMMR0/GIMR0Hv.cpp	(revision 51961)
@@ -25,4 +25,5 @@
 #include <VBox/err.h>
 #include <VBox/vmm/gim.h>
+#include <VBox/vmm/tm.h>
 #include <VBox/vmm/vm.h>
 
@@ -103,14 +104,29 @@
     Assert(pRefTsc);
 
+    /*
+     * Hyper-V reports the reference time in 100 nanosecond units.
+     */
+    uint64_t u64Tsc100Ns = TMCpuTicksPerSecond(pVM) / UINT64_C(10000000); /* 100 ns */
+    int64_t i64TscOffset = (int64_t)u64Offset / u64Tsc100Ns;
+
+    /*
+     * The TSC page can be simulatenously read by other VCPUs in the guest. The
+     * spinlock is only for protecting simultaneous hypervisor writes from other
+     * EMTs.
+     */
     RTSpinlockAcquire(pcHv->hSpinlockR0);
-    pRefTsc->i64TscOffset = u64Offset;
-    if (pRefTsc->u32TscSequence < UINT32_C(0xfffffffe))
-        ASMAtomicIncU32(&pRefTsc->u32TscSequence);
-    else
-        ASMAtomicWriteU32(&pRefTsc->u32TscSequence, 1);
+    if (pRefTsc->i64TscOffset != i64TscOffset)
+    {
+        ASMAtomicWriteS64(&pRefTsc->i64TscOffset, i64TscOffset);
+        if (pRefTsc->u32TscSequence < UINT32_C(0xfffffffe))
+            ASMAtomicIncU32(&pRefTsc->u32TscSequence);
+        else
+            ASMAtomicWriteU32(&pRefTsc->u32TscSequence, 1);
+    }
     RTSpinlockRelease(pcHv->hSpinlockR0);
 
     Assert(pRefTsc->u32TscSequence != 0);
     Assert(pRefTsc->u32TscSequence != UINT32_C(0xffffffff));
+    AssertReturn(pRefTsc->u32TscSequence != 0xfffffffe, VERR_GIM_IPE_3);
     return VINF_SUCCESS;
 }
Index: /trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp	(revision 51960)
+++ /trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp	(revision 51961)
@@ -5589,5 +5589,5 @@
     if (fParavirtTsc)
     {
-#if 0
+#if 1
         uint64_t const u64CurTsc   = ASMReadTSC();
         uint64_t const u64LastTick = TMCpuTickGetLastSeen(pVCpu);
Index: /trunk/src/VBox/VMM/VMMR3/GIMHv.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR3/GIMHv.cpp	(revision 51960)
+++ /trunk/src/VBox/VMM/VMMR3/GIMHv.cpp	(revision 51961)
@@ -491,6 +491,6 @@
         pRefTsc->u64TscScale     = ((INT64_C(10000) << 32) / u64TscKHz) << 32;
 
-        LogRel(("GIM: HyperV: Enabled TSC page at %#RGp (u64TscScale=%#RX64 u64TscKHz=%#RX64)\n", GCPhysTscPage,
-                pRefTsc->u64TscScale, u64TscKHz));
+        LogRel(("GIM: HyperV: Enabled TSC page at %#RGp - u64TscScale=%#RX64 u64TscKHz=%#RX64 (%'RU64)\n", GCPhysTscPage,
+                pRefTsc->u64TscScale, u64TscKHz, u64TscKHz));
         return VINF_SUCCESS;
     }
@@ -602,5 +602,5 @@
         {
             /** @todo Handle raw-mode hypercall page patching. */
-            LogRelFunc(("Raw-mode not yet implemented!\n"));
+            LogRel(("GIM: HyperV: Raw-mode not yet implemented!\n"));
         }
         GIMR3Mmio2Unmap(pVM, pRegion);
Index: /trunk/src/VBox/VMM/include/GIMHvInternal.h
===================================================================
--- /trunk/src/VBox/VMM/include/GIMHvInternal.h	(revision 51960)
+++ /trunk/src/VBox/VMM/include/GIMHvInternal.h	(revision 51961)
@@ -425,5 +425,4 @@
 /**
  * MMIO2 region indices.
- * Note!! Saved-state are dependent on the index values, do -not- change!
  */
 /** The hypercall page region. */
