我最近通过 dnf 插件从 Fedora 22 升级到 23,除了图形之外,其他一切都工作正常。 fglrx 模块似乎加载正常,但 X 服务器在尝试打开屏幕时崩溃。我已经多次尝试重新安装 fglrx。
以下是 Xorg 日志中的相关错误部分:
[141.208](EE)
[141.208](EE)回溯:
[141.208](EE)0:/usr/libexec/Xorg(OsLookupColor+0x139)[0x59afb9]
[141.209](EE)1:/lib64/libc.so .6 (__restore_rt+0x0) [0x7f1a9bf0cb1f]
[ 141.210] (EE) 2: /usr/lib64/xorg/modules/drivers/fglrx_drv.so (xs117SetPrivate+0x27) [0x7f1a98eaa9f7]
[ 141.211] (EE) 3: /usr /lib64/xorg/modules/drivers/fglrx_drv.so (xclSetPrivate+0xd) [0x7f1a986f850d]
[ 141.212] (EE) 4: /usr/lib64/xorg/modules/drivers/fglrx_drv.so (xdl_xs117_swlDriScreenInit+0x124) [0x7] f1a98960764]
[141.213](EE)5:/usr/lib64/xorg/modules/drivers/fglrx_drv.so(xdl_xs117_atiddxDriScreenInit+0x32a)[0x7f1a98948c9a]
[141.214](EE)6:/usr/lib64/xorg/modules/drivers/fglrx_d房车.so (xdl_xs117_atiddxScreenInit+0x118b) [0x7f1a98942dcb]
[ 141.214] (EE) 7: /usr/libexec/Xorg (AddScreen+0x101) [0x436cd1]
[ 141.214] (EE) 8: /usr/libexec/Xorg (InitOutput+0x3e1) ) [0x47ab41]
[ 141.215] (EE) 9: /usr/libexec/Xorg (remove_fs_handlers+0x264) [0x43a7f4]
[ 141.215] (EE) 10: /lib64/libc.so.6 (__libc_start_main+0xf0) [0x7f1a9bef8580]
[141.215](EE)11:/usr/libexec/Xorg(_start + 0x29)[0x424ce9]
[141.215](EE)12:? (?+0x29) [0x29]
[ 141.215] (EE)
[ 141.215] (EE) 地址 0x10 处出现分段错误
[ 141.215] (EE)
致命服务器错误:
[ 141.215] (EE) 捕获信号 11 (分段错误)。服务器中止
[141.216](EE)
它之前已经在这个内核(4.1.10)上成功运行,这让我认为这是 Xorg 问题而不是 fglrx 问题。
我怎样才能让 Xorg 再次工作?
答案1
我不确定你之前是如何在 4.x 内核下安装 fglrx 的,但 fglrx 并不正式支持 4.x 内核。直到最近,您还可以修补安装程序以使用最新的内核:
然而,最近有消息称,在 Linux 4.2 或更高版本下使用 gcc5 编译该驱动程序时会损坏。由于Fedora 23默认使用4.2.x内核和gcc5,因此没有解决方案。
也许可以手动编译 gcc49 并使用它来编译驱动程序,但我个人无法完成这项工作。
现在我在同一条船上。
答案2
firegl_public.c
我已经获得了用于最新内核的补丁:
--- ../firegl_public.c 2016-06-04 23:00:11.938899758 -0400
+++ firegl_public.c 2016-06-06 21:30:45.942122307 -0400
@@ -136,6 +136,9 @@
#include <asm/processor.h>
#include <asm/tlbflush.h> // for flush_tlb_page
#include <asm/cpufeature.h>
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,3,0)
+#undef CONFIG_MTRR
+#endif
#ifdef CONFIG_MTRR
#include <asm/mtrr.h>
#endif
@@ -631,7 +634,12 @@
len = snprintf(buf, request, "%d\n", major);
#else
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,3,0)
len = seq_printf(m, "%d\n", major);
+#else
+ seq_printf(m, "%d\n", major);
+ len = 0;
+#endif
#endif
KCL_DEBUG1(FN_FIREGL_PROC, "return len=%i\n",len);
@@ -3424,7 +3432,7 @@
int ATI_API_CALL KCL_MEM_MTRR_AddRegionWc(unsigned long base, unsigned long size)
{
#ifdef CONFIG_MTRR
- return mtrr_add(base, size, MTRR_TYPE_WRCOMB, 1);
+ return -EPERM;/*return mtrr_add(base, size, MTRR_TYPE_WRCOMB, 1);*/
#else /* !CONFIG_MTRR */
return -EPERM;
#endif /* !CONFIG_MTRR */
@@ -3433,7 +3441,7 @@
int ATI_API_CALL KCL_MEM_MTRR_DeleteRegion(int reg, unsigned long base, unsigned long size)
{
#ifdef CONFIG_MTRR
- return mtrr_del(reg, base, size);
+ return -EPERM;/*return mtrr_del(reg, base, size);*/
#else /* !CONFIG_MTRR */
return -EPERM;
#endif /* !CONFIG_MTRR */
@@ -6452,10 +6460,10 @@
if(static_cpu_has(X86_FEATURE_XSAVE)) {
#if LINUX_VERSION_CODE < KERNEL_VERSION(4,2,0)
fpu_xsave(fpu);
- if (!(fpu->state->xsave.xsave_hdr.xstate_bv & XSTATE_FP))
+ if (!(fpu->state->xsave.xsave_hdr.xstate_bv))
#else
copy_xregs_to_kernel(&fpu->state.xsave);
- if (!(fpu->state.xsave.header.xfeatures & XSTATE_FP))
+ if (!(fpu->state.xsave.header.xfeatures))
#endif
return 1;
} else if (static_cpu_has(X86_FEATURE_FXSR)) {