Index: /trunk/src/VBox/Devices/Bus/DevPCI.cpp
===================================================================
--- /trunk/src/VBox/Devices/Bus/DevPCI.cpp	(revision 76984)
+++ /trunk/src/VBox/Devices/Bus/DevPCI.cpp	(revision 76985)
@@ -495,6 +495,5 @@
                     goto default_map;
                 /* VGA: map frame buffer to default Bochs VBE address */
-                int iRegion = devpciR3GetWord(pPciDev, VBOX_PCI_SUBSYSTEM_VENDOR_ID) == 0x15ad ? 1 : 0;
-                devpciR3BiosInitSetRegionAddress(pBus, pPciDev, iRegion, 0xe0000000);
+                devpciR3BiosInitSetRegionAddress(pBus, pPciDev, 0, 0xe0000000);
                 /*
                  * Legacy VGA I/O ports are implicitly decoded by a VGA class device. But
Index: /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.cpp
===================================================================
--- /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.cpp	(revision 76984)
+++ /trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.cpp	(revision 76985)
@@ -5022,5 +5022,5 @@
     if (enmType == PCI_ADDRESS_SPACE_IO)
     {
-        AssertReturn(iRegion == 0, VERR_INTERNAL_ERROR);
+        AssertReturn(iRegion == pThis->pciRegions.iIO, VERR_INTERNAL_ERROR);
         rc = PDMDevHlpIOPortRegister(pDevIns, (RTIOPORT)GCPhysAddress, cb, 0,
                                      vmsvgaIOWrite, vmsvgaIORead, NULL /* OutStr */, NULL /* InStr */, "VMSVGA");
@@ -5047,5 +5047,5 @@
     else
     {
-        AssertReturn(iRegion == 2 && enmType == PCI_ADDRESS_SPACE_MEM, VERR_INTERNAL_ERROR);
+        AssertReturn(iRegion == pThis->pciRegions.iFIFO && enmType == PCI_ADDRESS_SPACE_MEM, VERR_INTERNAL_ERROR);
         if (GCPhysAddress != NIL_RTGCPHYS)
         {
Index: /trunk/src/VBox/Devices/Graphics/DevVGA.cpp
===================================================================
--- /trunk/src/VBox/Devices/Graphics/DevVGA.cpp	(revision 76984)
+++ /trunk/src/VBox/Devices/Graphics/DevVGA.cpp	(revision 76985)
@@ -5469,9 +5469,9 @@
     Log(("vgaR3IORegionMap: iRegion=%d GCPhysAddress=%RGp cb=%RGp enmType=%d\n", iRegion, GCPhysAddress, cb, enmType));
 #ifdef VBOX_WITH_VMSVGA
-    AssertReturn(   iRegion == (pThis->fVMSVGAEnabled ? 1U : 0U)
+    AssertReturn(   iRegion == pThis->pciRegions.iVRAM
                  && enmType == (pThis->fVMSVGAEnabled ? PCI_ADDRESS_SPACE_MEM : PCI_ADDRESS_SPACE_MEM_PREFETCH),
                  VERR_INTERNAL_ERROR);
 #else
-    AssertReturn(iRegion == 0 && enmType == PCI_ADDRESS_SPACE_MEM_PREFETCH, VERR_INTERNAL_ERROR);
+    AssertReturn(iRegion == pThis->pciRegions.iVRAM && enmType == PCI_ADDRESS_SPACE_MEM_PREFETCH, VERR_INTERNAL_ERROR);
 #endif
 
@@ -5546,5 +5546,5 @@
     if (pThis->fVMSVGAEnabled)
     {
-        if (iRegion == 2 /*FIFO*/)
+        if (iRegion == pThis->pciRegions.iFIFO)
         {
             /* Make sure it's still 32-bit memory.  Ignore fluxtuations in the prefetch flag */
@@ -5575,7 +5575,7 @@
         else if (iRegion == UINT32_MAX)
         {
-            int rc = vgaR3PciRegionLoadChangeHook(pDevIns, pPciDev, 2, VMSVGA_FIFO_SIZE_OLD, PCI_ADDRESS_SPACE_MEM, NULL);
+            int rc = vgaR3PciRegionLoadChangeHook(pDevIns, pPciDev, pThis->pciRegions.iFIFO, VMSVGA_FIFO_SIZE_OLD, PCI_ADDRESS_SPACE_MEM, NULL);
             if (RT_SUCCESS(rc))
-                rc = pfnOldSetter(pPciDev, 2, VMSVGA_FIFO_SIZE_OLD, PCI_ADDRESS_SPACE_MEM);
+                rc = pfnOldSetter(pPciDev, pThis->pciRegions.iFIFO, VMSVGA_FIFO_SIZE_OLD, PCI_ADDRESS_SPACE_MEM);
             return rc;
         }
@@ -6190,4 +6190,5 @@
                                           "VMSVGAEnabled\0"
                                           "VMSVGAPciId\0"
+                                          "VMSVGAPciBarLayout\0"
                                           "VMSVGAFifoSize\0"
 #endif
@@ -6239,4 +6240,8 @@
     Log(("VMSVGA: VMSVGAPciId   = %d\n", pThis->fVMSVGAPciId));
 
+    rc = CFGMR3QueryBoolDef(pCfg, "VMSVGAPciBarLayout", &pThis->fVMSVGAPciBarLayout, false);
+    AssertLogRelRCReturn(rc, rc);
+    Log(("VMSVGA: VMSVGAPciBarLayout = %d\n", pThis->fVMSVGAPciBarLayout));
+
     rc = CFGMR3QueryU32Def(pCfg, "VMSVGAFifoSize", &pThis->svga.cbFIFO, VMSVGA_FIFO_SIZE);
     AssertLogRelRCReturn(rc, rc);
@@ -6251,4 +6256,22 @@
     AssertLogRelRCReturn(rc, rc);
     Log(("VMSVGA: VMSVGA3dEnabled = %d\n", pThis->svga.f3DEnabled));
+#endif
+
+    
+#ifdef VBOX_WITH_VMSVGA
+    if (pThis->fVMSVGAPciBarLayout)
+    {
+        pThis->pciRegions.iIO   = 0;
+        pThis->pciRegions.iVRAM = 1;
+        pThis->pciRegions.iFIFO = 2;
+    }
+    else
+    {
+        pThis->pciRegions.iVRAM = 0;
+        pThis->pciRegions.iIO   = 1;
+        pThis->pciRegions.iFIFO = 2;
+    }
+#else
+    pThis->pciRegions.iVRAM = 0;
 #endif
 
@@ -6360,13 +6383,13 @@
     {
         /* Register the io command ports. */
-        rc = PDMDevHlpPCIIORegionRegister (pDevIns, 0 /* iRegion */, 0x10, PCI_ADDRESS_SPACE_IO, vmsvgaR3IORegionMap);
+        rc = PDMDevHlpPCIIORegionRegister (pDevIns, pThis->pciRegions.iIO, 0x10, PCI_ADDRESS_SPACE_IO, vmsvgaR3IORegionMap);
         if (RT_FAILURE (rc))
             return rc;
         /* VMware's MetalKit doesn't like PCI_ADDRESS_SPACE_MEM_PREFETCH */
-        rc = PDMDevHlpPCIIORegionRegister(pDevIns, 1 /* iRegion */, pThis->vram_size,
+        rc = PDMDevHlpPCIIORegionRegister(pDevIns, pThis->pciRegions.iVRAM, pThis->vram_size,
                                           PCI_ADDRESS_SPACE_MEM /* PCI_ADDRESS_SPACE_MEM_PREFETCH */, vgaR3IORegionMap);
         if (RT_FAILURE(rc))
             return rc;
-        rc = PDMDevHlpPCIIORegionRegister(pDevIns, 2 /* iRegion */, pThis->svga.cbFIFO,
+        rc = PDMDevHlpPCIIORegionRegister(pDevIns, pThis->pciRegions.iFIFO, pThis->svga.cbFIFO,
                                           PCI_ADDRESS_SPACE_MEM /* PCI_ADDRESS_SPACE_MEM_PREFETCH */, vmsvgaR3IORegionMap);
         if (RT_FAILURE(rc))
@@ -6377,10 +6400,5 @@
 #endif /* VBOX_WITH_VMSVGA */
     {
-#ifdef VBOX_WITH_VMSVGA
-        int iPCIRegionVRAM = (pThis->fVMSVGAEnabled) ? 1 : 0;
-#else
-        int iPCIRegionVRAM = 0;
-#endif
-        rc = PDMDevHlpPCIIORegionRegister(pDevIns, iPCIRegionVRAM, pThis->vram_size,
+        rc = PDMDevHlpPCIIORegionRegister(pDevIns, pThis->pciRegions.iVRAM, pThis->vram_size,
                                           PCI_ADDRESS_SPACE_MEM_PREFETCH, vgaR3IORegionMap);
         if (RT_FAILURE(rc))
@@ -6392,6 +6410,4 @@
      */
 #ifdef VBOX_WITH_VMSVGA
-    int iPCIRegionVRAM = (pThis->fVMSVGAEnabled) ? 1 : 0;
-
     if (pThis->fVMSVGAEnabled)
     {
@@ -6399,5 +6415,5 @@
          * Allocate and initialize the FIFO MMIO2 memory.
          */
-        rc = PDMDevHlpMMIO2Register(pDevIns, &pThis->Dev, 2 /*iRegion*/, pThis->svga.cbFIFO,
+        rc = PDMDevHlpMMIO2Register(pDevIns, &pThis->Dev, pThis->pciRegions.iFIFO, pThis->svga.cbFIFO,
                                     0 /*fFlags*/, (void **)&pThis->svga.pFIFOR3, "VMSVGA-FIFO");
         if (RT_FAILURE(rc))
@@ -6406,8 +6422,6 @@
         pThis->svga.pFIFOR0 = (RTR0PTR)pThis->svga.pFIFOR3;
     }
-#else
-    int iPCIRegionVRAM = 0;
-#endif
-    rc = PDMDevHlpMMIO2Register(pDevIns, &pThis->Dev, iPCIRegionVRAM, pThis->vram_size, 0, (void **)&pThis->vram_ptrR3, "VRam");
+#endif
+    rc = PDMDevHlpMMIO2Register(pDevIns, &pThis->Dev, pThis->pciRegions.iVRAM, pThis->vram_size, 0, (void **)&pThis->vram_ptrR3, "VRam");
     AssertLogRelMsgRCReturn(rc, ("PDMDevHlpMMIO2Register(%#x,) -> %Rrc\n", pThis->vram_size, rc), rc);
     pThis->vram_ptrR0 = (RTR0PTR)pThis->vram_ptrR3; /** @todo @bugref{1865} Map parts into R0 or just use PGM access (Mac only). */
@@ -6416,5 +6430,5 @@
     {
         RTRCPTR pRCMapping = 0;
-        rc = PDMDevHlpMMHyperMapMMIO2(pDevIns, &pThis->Dev, iPCIRegionVRAM, 0 /* off */,  VGA_MAPPING_SIZE,
+        rc = PDMDevHlpMMHyperMapMMIO2(pDevIns, &pThis->Dev, pThis->pciRegions.iVRAM, 0 /* off */,  VGA_MAPPING_SIZE,
                                       "VGA VRam", &pRCMapping);
         AssertLogRelMsgRCReturn(rc, ("PDMDevHlpMMHyperMapMMIO2(%#x,) -> %Rrc\n", VGA_MAPPING_SIZE, rc), rc);
@@ -6436,5 +6450,5 @@
         {
             RTR0PTR pR0Mapping = 0;
-            rc = PDMDevHlpMMIO2MapKernel(pDevIns, 2 /* iRegion */, 0 /* off */,  pThis->svga.cbFIFO, "VMSVGA-FIFO", &pR0Mapping);
+            rc = PDMDevHlpMMIO2MapKernel(pDevIns, pThis->pciRegions.iFIFO, 0 /* off */,  pThis->svga.cbFIFO, "VMSVGA-FIFO", &pR0Mapping);
             AssertLogRelMsgRCReturn(rc, ("PDMDevHlpMapMMIO2IntoR0(%#x,) -> %Rrc\n", pThis->svga.cbFIFO, rc), rc);
             pThis->svga.pFIFOR0 = pR0Mapping;
Index: /trunk/src/VBox/Devices/Graphics/DevVGA.h
===================================================================
--- /trunk/src/VBox/Devices/Graphics/DevVGA.h	(revision 76984)
+++ /trunk/src/VBox/Devices/Graphics/DevVGA.h	(revision 76985)
@@ -350,8 +350,18 @@
     bool                        fVMSVGAEnabled;
     bool                        fVMSVGAPciId;
-    bool                        Padding4[0+3];
+    bool                        fVMSVGAPciBarLayout;
+    bool                        Padding4[0+2];
 # else
     bool                        Padding4[1+4];
 # endif
+
+    struct {
+        uint32_t                    u32Padding1;
+        uint32_t                    iVRAM;
+# ifdef VBOX_WITH_VMSVGA
+        uint32_t                    iIO;
+        uint32_t                    iFIFO;
+# endif
+    } pciRegions;
 
     /** Physical access type for the linear frame buffer dirty page tracking. */
Index: /trunk/src/VBox/Main/src-client/ConsoleImpl2.cpp
===================================================================
--- /trunk/src/VBox/Main/src-client/ConsoleImpl2.cpp	(revision 76984)
+++ /trunk/src/VBox/Main/src-client/ConsoleImpl2.cpp	(revision 76985)
@@ -3823,5 +3823,8 @@
             InsertConfigInteger(pCfg, "VMSVGAEnabled", true);
             if (enmGraphicsController == GraphicsControllerType_VMSVGA)
+            {
+                InsertConfigInteger(pCfg, "VMSVGAPciBarLayout", true);
                 InsertConfigInteger(pCfg, "VMSVGAPciId", true);
+            }
 #ifdef VBOX_WITH_VMSVGA3D
             InsertConfigInteger(pCfg, "VMSVGA3dEnabled", f3DEnabled);
