Index: /trunk/include/VBox/vmm/cpum.h
===================================================================
--- /trunk/include/VBox/vmm/cpum.h	(revision 43666)
+++ /trunk/include/VBox/vmm/cpum.h	(revision 43667)
@@ -414,4 +414,5 @@
 
 VMMR3DECL(int)          CPUMR3Init(PVM pVM);
+VMMR3DECL(int)          CPUMR3InitCompleted(PVM pVM);
 VMMR3DECL(void)         CPUMR3Relocate(PVM pVM);
 VMMR3DECL(int)          CPUMR3Term(PVM pVM);
Index: /trunk/src/VBox/VMM/VMMAll/CPUMAllRegs.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMAll/CPUMAllRegs.cpp	(revision 43666)
+++ /trunk/src/VBox/VMM/VMMAll/CPUMAllRegs.cpp	(revision 43667)
@@ -864,9 +864,11 @@
         {
             PVM pVM = pVCpu->CTX_SUFF(pVM);
-            if (   (    pVM->cpum.s.aGuestCpuIdStd[0].eax >= 1
+            if (   (    pVM->cpum.s.aGuestCpuIdStd[0].eax >= 1                                  /* APIC Std feature */
                     && (pVM->cpum.s.aGuestCpuIdStd[1].edx & X86_CPUID_FEATURE_EDX_APIC))
-                || (   pVM->cpum.s.aGuestCpuIdExt[0].eax >= 0x80000001
+                || (   pVM->cpum.s.aGuestCpuIdExt[0].eax >= 0x80000001                          /* APIC Ext feature (AMD) */
                     && pVM->cpum.s.enmGuestCpuVendor == CPUMCPUVENDOR_AMD
-                    && (pVM->cpum.s.aGuestCpuIdExt[1].edx & X86_CPUID_AMD_FEATURE_EDX_APIC)))
+                    && (pVM->cpum.s.aGuestCpuIdExt[1].edx & X86_CPUID_AMD_FEATURE_EDX_APIC))
+                || (    pVM->cpum.s.aGuestCpuIdStd[0].eax >= 1                                  /* x2APIC */
+                    && (pVM->cpum.s.aGuestCpuIdStd[1].ecx & X86_CPUID_FEATURE_ECX_X2APIC)))
             {
                 *puValue = pVCpu->cpum.s.Guest.msrApicBase;
Index: /trunk/src/VBox/VMM/VMMR3/CPUM.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR3/CPUM.cpp	(revision 43666)
+++ /trunk/src/VBox/VMM/VMMR3/CPUM.cpp	(revision 43667)
@@ -4382,2 +4382,20 @@
 }
 
+
+/**
+ * Called when the ring-3 init phase completes.
+ *
+ * @returns VBox status code.
+ * @param   pVM                 Pointer to the VM.
+ */
+VMMR3DECL(int) CPUMR3InitCompleted(PVM pVM)
+{
+    for (VMCPUID i = 0; i < pVM->cCpus; i++)
+    {
+        /* Cache the APIC base (from the APIC device) once it has been initialized. */
+        PDMApicGetBase(&pVM->aCpus[i], &pVM->aCpus[i].cpum.s.Guest.msrApicBase);
+        Log(("CPUMR3InitCompleted pVM=%p APIC base[%u]=%RX64\n", pVM, (unsigned)i, pVM->aCpus[i].cpum.s.Guest.msrApicBase));
+    }
+    return VINF_SUCCESS;
+}
+
Index: /trunk/src/VBox/VMM/VMMR3/VMM.cpp
===================================================================
--- /trunk/src/VBox/VMM/VMMR3/VMM.cpp	(revision 43666)
+++ /trunk/src/VBox/VMM/VMMR3/VMM.cpp	(revision 43667)
@@ -627,4 +627,10 @@
         {
             /*
+             * CPUM's post-initialization (APIC base MSR caching).
+             */
+            rc = CPUMR3InitCompleted(pVM);
+            AssertRCReturn(rc, rc);
+
+            /*
              * Set page attributes to r/w for stack pages.
              */
