ATI Catalyst 10.9 – Schon wieder Probleme mit fglrx bei der Installation

Catalyst_1Eigentlich liesen sich die propritären AMD-Treiber fglrx mit dem fglrx-Installer, wie schon seit Catalyst 10-7 gewohnt ohne Probleme bauen. Egal unter welcher Kernel-Version, es wird immer ein Set von DEB-Paketen erstellt. Nur leider klappt es nicht, nach Installation des aktuellen Update-Kernels 2.6.32-25, das fglrx-Kernel-Modul zu installieren. Die Installation bricht mit einer DKMS-Fehlermeldung mit Verweis auf die make.log ab.

DKMS make.log for fglrx-8.771 for kernel 2.6.32-25-generic (x86_64)
Do 30. Sep 17:26:23 CEST 2010
AMD kernel module generator version 2.1
doing Makefile based build for kernel 2.6.x and higher
rm -rf *.c *.h *.o *.ko *.GCC* .??* *.symvers
make -C /lib/modules/2.6.32-25-generic/build SUBDIRS=/var/lib/dkms/fglrx/8.771/build/2.6.x modules
make[1]: Betrete Verzeichnis '/usr/src/linux-headers-2.6.32-25-generic'
  CC [M]  /var/lib/dkms/fglrx/8.771/build/2.6.x/firegl_public.o
In file included from /var/lib/dkms/fglrx/8.771/build/2.6.x/firegl_public.c:451:
/var/lib/dkms/fglrx/8.771/build/2.6.x/drm_proc.h: In function ‘FGLDRM__vma_info’:
/var/lib/dkms/fglrx/8.771/build/2.6.x/drm_proc.h:497: warning: format ‘%08lx’ expects type ‘long unsigned int’, but argument 5 has type ‘phys_addr_t’
  CC [M]  /var/lib/dkms/fglrx/8.771/build/2.6.x/kcl_acpi.o
  CC [M]  /var/lib/dkms/fglrx/8.771/build/2.6.x/kcl_agp.o
  CC [M]  /var/lib/dkms/fglrx/8.771/build/2.6.x/kcl_debug.o
  CC [M]  /var/lib/dkms/fglrx/8.771/build/2.6.x/kcl_ioctl.o
/var/lib/dkms/fglrx/8.771/build/2.6.x/kcl_ioctl.c: In function ‘KCL_IOCTL_AllocUserSpace32’:
/var/lib/dkms/fglrx/8.771/build/2.6.x/kcl_ioctl.c:196: error: implicit declaration of function ‘compat_alloc_user_space’
/var/lib/dkms/fglrx/8.771/build/2.6.x/kcl_ioctl.c:196: warning: return makes pointer from integer without a cast
make[2]: *** [/var/lib/dkms/fglrx/8.771/build/2.6.x/kcl_ioctl.o] Fehler 1
make[1]: *** [_module_/var/lib/dkms/fglrx/8.771/build/2.6.x] Fehler 2
make[1]: Verlasse Verzeichnis '/usr/src/linux-headers-2.6.32-25-generic'
make: *** [kmod_build] Fehler 2
build failed with return value 2

Und um das Chaos perfekt zu machen, schlagen auch alle Versuche fehl Pakete älterer Catalyst-Treiber zu installieren, die bislang funktionierten (10-8, 10-7, etc).  Also heisst es wieder mal sich auf die Suche nach Patches machen, um wieder ein voll funktionierendes System zu bekommen.

Der Patch

Findige Leute hatten schnell das Problem isoliert und einen Patch bereitgestellt, der auch auf einer größeren Zahl von Kerneln funktioniert. Der Einfachheit halber kann man ihn hier auch herunterladen.

From f267c9e42aa1780f26bebd641b53fc2182f3bd12 Mon Sep 17 00:00:00 2001
From: Alberto Milone
Date: Mon, 20 Sep 2010 17:47:27 +0200
Subject: [PATCH 1/1] Get the driver to build again despite the fix for CVE-2010-3081

Work around the lack of compat_alloc_user_space() in asm/compat.h
after the fix for CVE-2010-3081.

Thanks to Evan Broder and Stefan Bader for the patch.

Signed-off-by: Alberto Milone
---
 2.6.x/Makefile |    5 +++++
 kcl_ioctl.c    |   17 ++++++++++++++++-
 make.sh        |   21 +++++++++++++++++++++
 3 files changed, 42 insertions(+), 1 deletions(-)

diff -Naur fglrx-install.orig/common/lib/modules/fglrx/build_mod/2.6.x/Makefile fglrx-install.patched/common/lib/modules/fglrx/build_mod/2.6.x/Makefile
--- fglrx-install.orig/common/lib/modules/fglrx/build_mod/2.6.x/Makefile        2010-09-01 16:05:31.000000000 +0200
+++ fglrx-install.patched/common/lib/modules/fglrx/build_mod/2.6.x/Makefile     2010-10-01 03:40:24.000000000 +0200
@@ -67,6 +67,11 @@
                 -DFGL_LINUX253P1_VMA_API \
                 -DPAGE_ATTR_FIX=$(PAGE_ATTR_FIX) \

+
+ifeq ($(ARCH_COMPAT_ALLOC_USER_SPACE), 1)
+       EXTRA_CFLAGS +=-DARCH_COMPAT_ALLOC_USER_SPACE
+endif
+
 ifeq ($(KERNELRELEASE),)
 # on first call from remote location we get into this path
 # whilst on second call all is managed by the embedding kernel makefile
diff -Naur fglrx-install.orig/common/lib/modules/fglrx/build_mod/kcl_ioctl.c fglrx-install.patched/common/lib/modules/fglrx/build_mod/kcl_ioctl.c
--- fglrx-install.orig/common/lib/modules/fglrx/build_mod/kcl_ioctl.c   2010-09-01 16:05:31.000000000 +0200
+++ fglrx-install.patched/common/lib/modules/fglrx/build_mod/kcl_ioctl.c        2010-10-01 03:40:24.000000000 +0200
@@ -193,7 +193,22 @@
  */
 void* ATI_API_CALL KCL_IOCTL_AllocUserSpace32(long size)
 {
-    return compat_alloc_user_space(size);
+    void __user *ptr;
+
+    /* If len occupies more than half of the entire compat space... */
+    if (unlikely(((unsigned long) size) > (((compat_uptr_t)~0) >> 1)))
+        return NULL;
+
+#ifdef ARCH_COMPAT_ALLOC_USER_SPACE
+    ptr = arch_compat_alloc_user_space(size);
+#else
+    ptr = compat_alloc_user_space(size);
+#endif
+
+    if (unlikely(!access_ok(VERIFY_WRITE, ptr, size)))
+        return NULL;
+
+    return ptr;
 }

 #endif // __x86_64__
diff -Naur fglrx-install.orig/common/lib/modules/fglrx/build_mod/make.sh fglrx-install.patched/common/lib/modules/fglrx/build_mod/make.sh
--- fglrx-install.orig/common/lib/modules/fglrx/build_mod/make.sh       2010-09-01 16:05:31.000000000 +0200
+++ fglrx-install.patched/common/lib/modules/fglrx/build_mod/make.sh    2010-10-01 03:40:24.000000000 +0200
@@ -391,6 +391,26 @@
 fi

 # ==============================================================
+# resolve if we have compat_alloc_user_space is in linux/compat.h
+
+ARCH_COMPAT_ALLOC_USER_SPACE=0
+
+src_file=$linuxincludes/linux/compat.h
+if [ ! -e $src_file ];
+then
+  echo "Warning:"                                                  >> $logfile
+  echo "kernel includes at $linuxincludes not found or incomplete" >> $logfile
+  echo "file: $src_file"                                           >> $logfile
+  echo ""                                                          >> $logfile
+else
+  if grep -q compat_alloc_user_space $src_file;
+  then
+    ARCH_COMPAT_ALLOC_USER_SPACE=1
+    echo "file $src_file says: ARCH_COMPAT_ALLOC_USER_SPACE=$ARCH_COMPAT_ALLOC_USER_SPACE" >> $logfile
+  fi
+fi
+
+# ==============================================================
 # break down OsRelease string into its components

 major=`echo $OsRelease | sed -n -e s/"^\([[:digit:]]*\)\.\([[:digit:]]*\)\.\([[:digit:]]*\)\(.*\)"/"\\1"/p`
@@ -429,6 +449,7 @@
     MODFLAGS="-DMODULE -DATI -DFGL -DPAGE_ATTR_FIX=$PAGE_ATTR_FIX $def_smp $def_modversions" \
     KVER=${uname_r} \
     PAGE_ATTR_FIX=$PAGE_ATTR_FIX \
+    ARCH_COMPAT_ALLOC_USER_SPACE=$ARCH_COMPAT_ALLOC_USER_SPACE \
     > tlog 2>&1

 res=$?

Im Prinzip kann jeder selber den Patch anwenden indem man einfach den ATI-Installer entpackt, den patch anweden und schliesslich die Catalyst Treiber baut und installiert. Da dies (leider) schon öfters vorkam, hatte ich mir schon ein Shellscript gebastelt, was diesen Vorgang komplett in einem Rutsch erledigt.

Update 2010-10-02

Es gibt Berichte das Google Earth mit dem Catalyst 10-9 beim Starten abstürzt. Davon scheint nur die Version 5.1.3533 aus dem Medibuntu repository betroffen zu sein. Die aktuellere von Google erhältiche Version 5.2.1 läuft dagegen einwandfrei. Auch die unter Catalyst 10-7 noch bestehenden Vsync-Probleme

 

Quellen

http://support.amd.com/us/kbarticles/Pages/GPU83ATICatalystLinuxHotfix.aspx

http://www.phoronix.com/forums/showpost.php?p=150456&postcount=3

http://www.phoronix.com/forums/showthread.php?t=26227

2 Kommentare.

  1. Hi,

    habe genau das Problem, nur verstehe ich von dem meisten was du schreibst nur Bahnhof. Wie und wo muss ich den Quellcode reinpacken? Kannst du etwas mehr ins Detail gehen?

    gruß

    JF

    • Hallo JF,
      sorry wenn die Anleitung diese mal etwas zu kurz ausgefallen ist.
      Hier für alle, die des Patches und Compilierens insbesondere des fglrx-Treibers noch nicht ganz firm sind, die ganze Befehlsabfolge für die Linux-Konsole nochmal in aller Ausführlichkeit.

      # Am Besten erstmal nach /tmp wechseln .. dort macht man nix kaputt beim Basteln
      mkdir /tmp/fglrx
      cd /tmp/fglrx
      
      # fglrx-catalyst-installer von AMD runterladen, falls noch nicht geschehen
      wget https://a248.e.akamai.net/f/674/9206/0/www2.ati.com/drivers/linux/ati-driver-installer-10-9-x86.x86_64.run
      
      # Patch herunterladen
      wget http://www.rootz.de/wp-content/uploads/2010/10/fglrx_10-9-2.6.32-25-compatibility.patch
      
      # Installer entpacken
      chmod 755 ./ati-driver-installer-10-9-x86.x86_64.run
      ./ati-driver-installer-10-9-x86.x86_64.run --extract
      
      # entpackten Installer patchen
      cd fglrx-install.*
      patch -p1 --ignore-whitespace <../fglrx_10-9-2.6.32-25-compatibility.patch
      
      # DEB-Pakete bauen lassen (ggf. Distribution anpassen)
      ./ati-installer.sh 10-9 --buildpkg 'Ubuntu/lucid'
      cd ..
      
      # DEB-Paket installieren
      sudo dpkg -i fglrx*.deb
      

      Ich hoffe ich habe jetzt nichts übersehen. Sollte was mit dem Treiber-Bau nicht klappt, kannst du ja gerne noch mal schreiben.

      Grüße Stefan