Index: /trunk/src/VBox/VMM/VMMAll/GIMAllHv.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMAll/GIMAllHv.cpp	(revision 51979)
+++ /trunk/src/VBox/VMM/VMMAll/GIMAllHv.cpp	(revision 51980)
@@ -29,4 +29,5 @@
 #include <VBox/vmm/pgm.h>
 #include <VBox/vmm/pdmdev.h>
+#include <VBox/vmm/pdmapi.h>
 
 #include <iprt/asm-amd64-x86.h>
@@ -92,4 +93,16 @@
             return VINF_SUCCESS;
 
+        case MSR_GIM_HV_TPR:
+            PDMApicReadMSR(pVM, pVCpu->idCpu, 0x80, puValue);
+            return VINF_SUCCESS;
+
+        case MSR_GIM_HV_EOI:
+            PDMApicReadMSR(pVM, pVCpu->idCpu, 0x0B, puValue);
+            return VINF_SUCCESS;
+
+        case MSR_GIM_HV_ICR:
+            PDMApicReadMSR(pVM, pVCpu->idCpu, 0x30, puValue);
+            return VINF_SUCCESS;
+
         case MSR_GIM_HV_GUEST_OS_ID:
             *puValue = pHv->u64GuestOsIdMsr;
@@ -118,8 +131,13 @@
 
         default:
+#ifdef IN_RING3
+            static uint32_t s_cTimes = 0;
+            if (s_cTimes++ < 20)
+                LogRel(("GIM: HyperV: Unknown/invalid RdMsr (%#x) -> #GP(0)\n", idMsr));
+#endif
+            LogFunc(("Unknown/invalid RdMsr (%#RX32) -> #GP(0)\n", idMsr));
             break;
     }
 
-    LogRel(("GIMHvReadMsr: Unknown/invalid RdMsr %#RX32 -> #GP(0)\n", idMsr));
     return VERR_CPUM_RAISE_GP_0;
 }
@@ -143,4 +161,16 @@
     switch (idMsr)
     {
+        case MSR_GIM_HV_TPR:
+            PDMApicWriteMSR(pVM, pVCpu->idCpu, 0x80, uRawValue);
+            return VINF_SUCCESS;
+
+        case MSR_GIM_HV_EOI:
+            PDMApicWriteMSR(pVM, pVCpu->idCpu, 0x0B, uRawValue);
+            return VINF_SUCCESS;
+
+        case MSR_GIM_HV_ICR:
+            PDMApicWriteMSR(pVM, pVCpu->idCpu, 0x30, uRawValue);
+            return VINF_SUCCESS;
+
         case MSR_GIM_HV_GUEST_OS_ID:
         {
@@ -233,5 +263,5 @@
             if (MSR_GIM_HV_RESET_IS_SET(uRawValue))
             {
-                LogRel(("GIM: HyperV: Reset initiated by MSR.\n"));
+                LogRel(("GIM: HyperV: Reset initiated through MSR.\n"));
                 int rc = PDMDevHlpVMReset(pVM->gim.s.pDevInsR3);
                 AssertRC(rc);
@@ -253,5 +283,5 @@
             static uint32_t s_cTimes = 0;
             if (s_cTimes++ < 20)
-                LogRel(("GIM: Unknown/invalid WrMsr (%#x,%#x`%08x) -> #GP(0)\n", idMsr, uRawValue & UINT64_C(0xffffffff00000000),
+                LogRel(("GIM: HyperV: Unknown/invalid WrMsr (%#x,%#x`%08x) -> #GP(0)\n", idMsr, uRawValue & UINT64_C(0xffffffff00000000),
                         uRawValue & UINT64_C(0xffffffff)));
 #endif
Index: /trunk/src/VBox/VMM/VMMR3/GIMHv.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR3/GIMHv.cpp	(revision 51979)
+++ /trunk/src/VBox/VMM/VMMR3/GIMHv.cpp	(revision 51980)
@@ -93,5 +93,5 @@
                        //| GIM_HV_BASE_FEAT_BASIC_SYNTH_IC
                        //| GIM_HV_BASE_FEAT_SYNTH_TIMER_MSRS
-                       //| GIM_HV_BASE_FEAT_APIC_ACCESS_MSRS
+                       | GIM_HV_BASE_FEAT_APIC_ACCESS_MSRS
                        | GIM_HV_BASE_FEAT_HYPERCALL_MSRS
                        | GIM_HV_BASE_FEAT_VP_ID_MSR
@@ -105,4 +105,6 @@
 
         pHv->uMiscFeat = GIM_HV_MISC_FEAT_TIMER_FREQ;
+
+        pHv->uHyperHints = GIM_HV_HINT_MSR_FOR_SYS_RESET;
     }
 
@@ -190,4 +192,12 @@
     HyperLeaf.uEcx         = pHv->uPowMgmtFeat;
     HyperLeaf.uEdx         = pHv->uMiscFeat;
+    rc = CPUMR3CpuIdInsert(pVM, &HyperLeaf);
+    AssertLogRelRCReturn(rc, rc);
+
+    HyperLeaf.uLeaf        = UINT32_C(0x40000004);
+    HyperLeaf.uEax         = pHv->uHyperHints;
+    HyperLeaf.uEbx         = 0xffffffff;
+    HyperLeaf.uEcx         = 0;
+    HyperLeaf.uEdx         = 0;
     rc = CPUMR3CpuIdInsert(pVM, &HyperLeaf);
     AssertLogRelRCReturn(rc, rc);
