[Nouveau] [PATCH] nouveau: detect incompatible libglx.so
Marcin Slusarz
marcin.slusarz at gmail.com
Sun May 23 12:49:16 PDT 2010
Exit with proper message instead of crashing when user forgot
to uninstall the proprietary driver.
Signed-off-by: Marcin Slusarz <marcin.slusarz at gmail.com>
---
src/nv_driver.c | 35 +++++++++++++++++++++++++++++++++++
1 files changed, 35 insertions(+), 0 deletions(-)
diff --git a/src/nv_driver.c b/src/nv_driver.c
index f60b6d9..2c953da 100644
--- a/src/nv_driver.c
+++ b/src/nv_driver.c
@@ -194,6 +194,38 @@ NVIdentify(int flags)
}
}
+static Bool glxIsCompatible()
+{
+ XF86ModuleData *d = LoaderSymbol("glxModuleData");
+
+ if (!d) {
+ xf86DrvMsg(-1, X_INFO,
+ "NOUVEAU: Couldn't find glx module informations. "
+ "Assuming it is disabled.\n");
+ return TRUE;
+ }
+
+ if (!d->vers) {
+ xf86DrvMsg(-1, X_ERROR,
+ "NOUVEAU: glx module has no version information!\n");
+ return FALSE;
+ }
+
+ if (!d->vers->vendor) {
+ xf86DrvMsg(-1, X_ERROR,
+ "NOUVEAU: glx module has no vendor information!\n");
+ return FALSE;
+ }
+
+ Bool ok = strcmp(d->vers->vendor, MODULEVENDORSTRING) == 0;
+ if (!ok)
+ xf86DrvMsg(-1, X_ERROR,
+ "NOUVEAU: glx module comes from incompatible vendor: \"%s\"\n",
+ d->vers->vendor);
+
+ return ok;
+}
+
static Bool
NVPciProbe(DriverPtr drv, int entity_num, struct pci_device *pci_dev,
intptr_t match_data)
@@ -209,6 +241,9 @@ NVPciProbe(DriverPtr drv, int entity_num, struct pci_device *pci_dev,
int chipset, ret;
char *busid;
+ if (!glxIsCompatible())
+ return FALSE;
+
if (!xf86LoaderCheckSymbol("DRICreatePCIBusID")) {
xf86DrvMsg(-1, X_ERROR, "[drm] No DRICreatePCIBusID symbol\n");
return FALSE;
--
1.7.1
More information about the Nouveau
mailing list