Index: /trunk/src/VBox/Devices/EFI/Firmware/UefiCpuPkg/Library/MpInitLib/MpLib.c
===================================================================
--- /trunk/src/VBox/Devices/EFI/Firmware/UefiCpuPkg/Library/MpInitLib/MpLib.c	(revision 85950)
+++ /trunk/src/VBox/Devices/EFI/Firmware/UefiCpuPkg/Library/MpInitLib/MpLib.c	(revision 85951)
@@ -10,4 +10,8 @@
 
 #include "MpLib.h"
+#ifdef VBOX
+# include <Library/IoLib.h>
+# include "../../../../DevEFI.h"
+#endif
 
 EFI_GUID mCpuInitMpLibHobGuid = CPU_INIT_MP_LIB_HOB_GUID;
@@ -476,4 +480,22 @@
 }
 
+#ifdef VBOX
+/*
+ *   @todo move this function to the library.
+ */
+UINT32 VBoxGetVmVariable(UINT32 Variable, CHAR8* Buffer, UINT32 Size)
+{
+    UINT32 VarLen, i;
+
+    IoWrite32(EFI_INFO_PORT, Variable);
+    VarLen = IoRead32(EFI_INFO_PORT);
+
+    for (i = 0; i < VarLen && i < Size; i++)
+        Buffer[i] = IoRead8(EFI_INFO_PORT);
+
+    return VarLen;
+}
+#endif
+
 /**
   This function will get CPU count in the system.
@@ -491,4 +513,7 @@
   CPU_INFO_IN_HOB        *CpuInfoInHob;
   BOOLEAN                X2Apic;
+#ifdef VBOX
+  CHAR8                  u8ApicMode;
+#endif
 
   //
@@ -527,4 +552,10 @@
     }
   }
+#ifdef VBOX
+  /* Force x2APIC mode if the VM config forces it. */
+  VBoxGetVmVariable(EFI_INFO_INDEX_APIC_MODE, &u8ApicMode, sizeof(u8ApicMode));
+  if (u8ApicMode == EFI_APIC_MODE_X2APIC)
+    X2Apic = TRUE;
+#endif
 
   if (X2Apic) {
