Package: xserver-xfree86 Version: 4.3.0.dfsg.1-8 Severity: normal Tags: patch
It appears this change: xfree86 (4.3.0.dfsg.1-5) unstable; urgency=low Changes by Branden Robinson: * Fix XFree86 X server's PCI bus support code to be able to cope with both Linux 2.4 and Linux 2.6 styles of organization for /proc/bus/pci, checking for the 2.6 style first (thanks, Daniel Seyffer and Ciaran McCreesh). (Closes: #225526) is keeping X from working on my machine. That machine is a bit unusual in the sense that it has no PCI bus numbered 0: $ ls /proc/bus/pci/ 40/ 60/ 80/ 81/ devices Due to this, the workaround for bug #225526 actually ends up breaking X on my machine: > - if (bus < 256) > - sprintf(file, "/proc/bus/pci/%02x/%02x.%1x", > - bus, dev, func); > - else > - sprintf(file, "/proc/bus/pci/%04x/%02x.%1x", > - bus, dev, func); > + if (bus < 256) { > + if (stat("/proc/bus/pci/00", &ignored) < 0) > + sprintf(file, "/proc/bus/pci/0000:%02x/%02x.%1x\ ", > + bus, dev, func); > + else > + sprintf(file, "/proc/bus/pci/%02x/%02x.%1x", > + bus, dev, func); > + } else { > + if (stat("/proc/bus/pci/00", &ignored) < 0) > + sprintf(file, "/proc/bus/pci/0000:%04x/%02x.%1x\ ", > + bus, dev, func); > + else > + sprintf(file, "/proc/bus/pci/%04x/%02x.%1x", > + bus, dev, func); > + } So, on my machine (bus is < 256), the stat("/proc/bus/pci/00", &ignored) call fails and then X attempts to use PCI-domain numbers, which is wrong for my machine. As far as I know, it is bogus to assume every machine has a PCI bus numbered 0. My proposal is to avoid that assumption by using a patch along these lines: --- orig/xfree86-4.3.0.dfsg.1/build-tree/xc/programs/Xserver/hw/xfree86/os-support/bus/linuxPci.c 2004-11-02 17:46:20.629996688 -0800 +++ xfree86-4.3.0.dfsg.1/build-tree/xc/programs/Xserver/hw/xfree86/os-support/bus/linuxPci.c 2004-11-02 13:52:36.465824860 -0800 @@ -101,10 +101,21 @@ static int linuxPciOpenFile(PCITAG tag) { - static int lbus,ldev,lfunc,fd = -1; + static int lbus,ldev,lfunc,fd = -1,with_domain = 0; + static const char *format_string[2][2] = { + /* without PCI domain #: */ + { + "/proc/bus/pci/%02x/%02x.%1x", /* bus # < 256 */ + "/proc/bus/pci/%04x/%02x.%1x" /* bus # >= 256 */ + }, + /* with PCI domain #: */ + { + "/proc/bus/pci/0000:%02x/%02x.%1x", /* bus # < 256 */ + "/proc/bus/pci/0000:%04x/%02x.%1x" /* bus # >= 256 */ + } + }; int bus, dev, func; char file[32]; - struct stat ignored; bus = PCI_BUS_FROM_TAG(tag); dev = PCI_DEV_FROM_TAG(tag); @@ -112,22 +123,20 @@ if (fd == -1 || bus != lbus || dev != ldev || func != lfunc) { if (fd != -1) close(fd); - if (bus < 256) { - if (stat("/proc/bus/pci/00", &ignored) < 0) - sprintf(file, "/proc/bus/pci/0000:%02x/%02x.%1x", - bus, dev, func); - else - sprintf(file, "/proc/bus/pci/%02x/%02x.%1x", - bus, dev, func); - } else { - if (stat("/proc/bus/pci/00", &ignored) < 0) - sprintf(file, "/proc/bus/pci/0000:%04x/%02x.%1x", - bus, dev, func); - else - sprintf(file, "/proc/bus/pci/%04x/%02x.%1x", - bus, dev, func); - } + retry: + sprintf(file, format_string[with_domain][bus >= 256], + bus, dev, func); fd = open(file,O_RDWR); + + if (fd < 0) { + if (!with_domain) { + /* try again, this time with domains */ + with_domain = 1; + goto retry; + } + /* failed even with domains; fall back again */ + with_domain = 0; + } lbus = bus; ldev = dev; lfunc = func; This fixes the problem on my machine and should still do the right thing on PCI-domain-enabled SPARC kernels, though I cannot test that myself. If it looks OK, please merge this patch. It would be really nice to have X work out-of-the-box again. Thanks, --david -- Package-specific info: Contents of /var/lib/xfree86/X.roster: xserver-xfree86 X server symlink status: lrwxr-xr-x 1 root root 20 Aug 25 2003 /etc/X11/X -> /usr/bin/X11/XFree86 -rwxr-xr-x 3 root root 26364440 Nov 2 13:53 /usr/bin/X11/XFree86 Contents of /var/lib/xfree86/XF86Config-4.roster: xserver-xfree86 VGA-compatible devices on PCI bus: 0000:81:00.0 VGA compatible controller: ATI Technologies Inc R300 AG [FireGL Z1/X1] (rev 80) /var/lib/xfree86/XF86Config-4.md5sum does not exist. XFree86 X server configuration file status: -rw-r--r-- 1 root root 6239 Nov 1 13:48 /etc/X11/XF86Config-4 -- System Information: Debian Release: 3.1 APT prefers unstable APT policy: (990, 'unstable'), (500, 'testing') Architecture: ia64 Kernel: Linux 2.6.7 Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968) Versions of packages xserver-xfree86 depends on: ii debconf [debconf-2.0] 1.4.39 Debian configuration management sy ii libc6.1 2.3.2.ds1-18 GNU C Library: Shared libraries an ii libgcc1 1:3.4.2-3 GCC support library ii xserver-common 4.3.0.dfsg.1-8 files and utilities common to all ii zlib1g 1:1.2.2-1 compression library - runtime -- debconf information excluded