Eigentlich 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
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.
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