From 0f0a5a52b94ecf6093fb2ca412c1df99fb9ee05b Mon Sep 17 00:00:00 2001 From: q66 Date: Fri, 21 Feb 2020 13:32:54 +0100 Subject: [PATCH] xf86-video-ati: fix crash/hang when accel is unavailable + more archs Previously the ati driver would crash the xserver or hang when hw accel was unavailable (e.g. via Option "NoAccel" "true"). This has been fixed with the patch. Also, remove archs= restrictions because they don't make any sense. --- .../patches/null-deref-exa.patch | 77 +++++++++++++++++++ srcpkgs/xf86-video-ati/template | 3 +- 2 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 srcpkgs/xf86-video-ati/patches/null-deref-exa.patch diff --git a/srcpkgs/xf86-video-ati/patches/null-deref-exa.patch b/srcpkgs/xf86-video-ati/patches/null-deref-exa.patch new file mode 100644 index 0000000000..8900cfeec0 --- /dev/null +++ b/srcpkgs/xf86-video-ati/patches/null-deref-exa.patch @@ -0,0 +1,77 @@ +From a8168153037f2cfb9739285b92896c0e24872518 Mon Sep 17 00:00:00 2001 +From: Alexey Sheplyakov +Date: Wed, 27 Nov 2019 20:50:58 +0400 +Subject: [PATCH] Don't crash X server if GPU acceleration is not available + +Commit d1d8e3c8d0a0a0394d395eba171460501745209b causes X server +to fail on startup when GPU acceleration is not working (or is +disabled). The reason is that `radeon_get_pixmap_bo` function +gets called too early (before EXA has been initialized) and +fails with an assert: + + #0 __GI_raise (sig=) at ../sysdeps/unix/sysv/linux/raise.c:50 + #1 0x76ab1c6c in __GI_abort () at abort.c:79 + #2 0x76ac0b64 in __assert_fail_base (fmt=0x76bfbce4 "%s%s%s:%u: %s%sAssertion `%s' failed.\n%n", assertion=0x7658c80c "key->initialized", file=, line=121, + function=0x7658d040 <__PRETTY_FUNCTION__.10607> "dixGetPrivateAddr") at assert.c:92 + #3 0x76ac0c0c in __GI___assert_fail (assertion=0x7658c80c "key->initialized", file=0x7658c9d0 "../include/privates.h", line=121, + function=0x7658d040 <__PRETTY_FUNCTION__.10607> "dixGetPrivateAddr") at assert.c:101 + #4 0x76579e6c in dixGetPrivateAddr (key=, key=, privates=) at ../include/privates.h:121 + #5 0x7657a954 in dixGetPrivateAddr (key=, key=, privates=) at exa.c:70 + #6 dixGetPrivate (key=, privates=) at ../include/privates.h:136 + #7 exaGetPixmapDriverPrivate (pPix=) at exa.c:68 + #8 0x7623d460 in radeon_get_pixmap_bo (pPix=0x71c1b8) at radeon.h:804 + #9 radeon_get_pixmap_handle (pixmap=0x71c1b8, handle=0x7fa22328) at radeon_bo_helper.c:357 + #10 0x76244458 in radeon_pixmap_get_fb (pix=0x71c1b8) at radeon.h:886 + #11 drmmode_set_mode_major (crtc=0x691860, mode=0x69191c, rotation=, x=, y=) at drmmode_display.c:918 + #12 0x762467e8 in drmmode_set_desired_modes (pScrn=0x67c678, drmmode=, set_hw=1) at drmmode_display.c:3128 + #13 0x0047bfa4 in MapWindow (client=0x669ec8, pWin=0x7206c0) at window.c:2722 + #14 MapWindow (pWin=0x7206c0, client=0x669ec8) at window.c:2665 + #15 0x00449650 in dix_main (argc=3, argv=0x7fa22604, envp=) at main.c:247 + #16 0x76ab2198 in __libc_start_main (main=0x42db10
, argc=3, argv=0x7fa22604, init=, fini=0x606434 <__libc_csu_fini>, rtld_fini=0x77229930 <_dl_fini>, + stack_end=0x7fa225e0) at libc-start.c:308 + #17 0x0042db80 in __start () at ../sysdeps/mips/start.S:110 + +Don't call `exaGetPixmapDriverPrivate` if the acceleration (EXA) is not +enabled [yet] to avoid the problem. + +Closes: https://gitlab.freedesktop.org/xorg/driver/xf86-video-ati/issues/188 +Closes: https://bugzilla.altlinux.org/show_bug.cgi?id=37539 +--- + src/radeon.h | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/src/radeon.h b/src/radeon.h +index 2c913466..e4a2ba66 100644 +--- src/radeon.h ++++ src/radeon.h +@@ -790,8 +790,8 @@ static inline Bool radeon_set_pixmap_bo(PixmapPtr pPix, struct radeon_buffer *bo + + static inline struct radeon_buffer *radeon_get_pixmap_bo(PixmapPtr pPix) + { +-#ifdef USE_GLAMOR + RADEONInfoPtr info = RADEONPTR(xf86ScreenToScrn(pPix->drawable.pScreen)); ++#ifdef USE_GLAMOR + + if (info->use_glamor) { + struct radeon_pixmap *priv; +@@ -799,7 +799,7 @@ static inline struct radeon_buffer *radeon_get_pixmap_bo(PixmapPtr pPix) + return priv ? priv->bo : NULL; + } else + #endif +- { ++ if (info->accelOn) { + struct radeon_exa_pixmap_priv *driver_priv; + driver_priv = exaGetPixmapDriverPrivate(pPix); + return driver_priv ? driver_priv->bo : NULL; +@@ -896,7 +896,7 @@ radeon_pixmap_get_fb(PixmapPtr pix) + handle); + } + +- return *fb_ptr; ++ return fb_ptr ? *fb_ptr : NULL; + } + + +-- +2.24.1 + diff --git a/srcpkgs/xf86-video-ati/template b/srcpkgs/xf86-video-ati/template index 825b207602..4d1083e2f9 100644 --- a/srcpkgs/xf86-video-ati/template +++ b/srcpkgs/xf86-video-ati/template @@ -1,8 +1,7 @@ # Template file for 'xf86-video-ati' pkgname=xf86-video-ati version=19.1.0 -revision=2 -archs="i686* x86_64* ppc ppc-musl ppc64*" +revision=3 build_style=gnu-configure hostmakedepends="pkg-config" makedepends="xorgproto eudev-libudev-devel libpciaccess-devel