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

Reply via email to