Index: xorg-server-1.6.3.901/hw/xfree86/common/xf86Bus.c =================================================================== --- xorg-server-1.6.3.901.orig/hw/xfree86/common/xf86Bus.c +++ xorg-server-1.6.3.901/hw/xfree86/common/xf86Bus.c @@ -429,7 +429,7 @@ xf86GetEntityInfo(int entityIndex) EntityInfoPtr pEnt; int i; - if (entityIndex >= xf86NumEntities) + if (entityIndex < 0 || entityIndex >= xf86NumEntities) return NULL; pEnt = xnfcalloc(1,sizeof(EntityInfoRec)); @@ -1816,6 +1816,20 @@ checkRoutingForScreens(xf86State state) xf86FreeResList(pResVGA); } +CARD16 +xf86BusesClaimed(void) +{ + CARD16 ret = 0; + + if (pciSlotClaimed) ret |= 1 << BUS_PCI; + if (fbSlotClaimed) ret |= 1 << BUS_NONE; +#if (defined(__sparc__) || defined(__sparc)) && !defined(__OpenBSD__) + if (sbusSlotClaimed) ret |= 1 << BUS_SBUS; +#endif + + return ret; +} + /* * xf86PostProbe() -- Allocate all non conflicting resources * This function gets called by xf86Init(). Index: xorg-server-1.6.3.901/hw/xfree86/common/xf86Priv.h =================================================================== --- xorg-server-1.6.3.901.orig/hw/xfree86/common/xf86Priv.h +++ xorg-server-1.6.3.901/hw/xfree86/common/xf86Priv.h @@ -123,6 +123,7 @@ extern RootWinPropPtr *xf86RegisteredPro /* xf86Bus.c */ +CARD16 xf86BusesClaimed(void); void xf86BusProbe(void); void xf86ChangeBusIndex(int oldIndex, int newIndex); void xf86AccessInit(void); Index: xorg-server-1.6.3.901/hw/xfree86/common/xf86fbBus.c =================================================================== --- xorg-server-1.6.3.901.orig/hw/xfree86/common/xf86fbBus.c +++ xorg-server-1.6.3.901/hw/xfree86/common/xf86fbBus.c @@ -58,7 +58,10 @@ xf86ClaimFbSlot(DriverPtr drvp, int chip { EntityPtr p; int num; - + + if (xf86BusesClaimed() & ~(1 << BUS_NONE)) + return -1; + num = xf86AllocateEntity(); p = xf86Entities[num]; p->driver = drvp;