On Wed, Mar 08, 2006 at 05:54:02PM -0500, David Dawes wrote:
>On Wed, Mar 08, 2006 at 08:23:17AM -0800, Tom Williams wrote:
>>Hi! I just installed the XFree86 4.5.99.901 snapshot (which fixed my
>>xterm installation problem, thanks guys! :)) and it runs fine. I
>>wanted to try the "-autoconfig" option to see what it would do and it
>>generated these messages:
>
>Autoconfigure works by loading a bunch of drivers, using the one
>that proves to be the best choice, and unloading the others.
>
>The problem is that fbdev registers that it needs fbdevhw. When
>it is unloaded it doesn't notify the loader that fbdevhw is no
>longer needed. Since the nv driver refers to fbdevhw (even though
>it isn't using it), these references are being reported as fatal
>unresolved symbols.
>
>The new loader now invalidates symbol references to modules that
>have been unloaded. To fix this problem, the fbdev module (and all
>modules, really) needs to be modified to register its fbdevhw
>requirements as being specific to itself so that those requirements
>get removed when it is unloaded.
>
>I'll take a look at doing this, and post a patch.
>
>Tom, thanks for reporting the problem!
The attached patch should fix this problem.
David
Index: fbdev.c
===================================================================
RCS file: /home/dhd-cvs/xc/programs/Xserver/hw/xfree86/drivers/fbdev/fbdev.c,v
retrieving revision 1.1.1.6.2.3
diff -u -r1.1.1.6.2.3 fbdev.c
--- fbdev.c 8 Aug 2005 23:38:36 -0000 1.1.1.6.2.3
+++ fbdev.c 9 Mar 2006 01:40:39 -0000
@@ -176,6 +176,8 @@
NULL
};
+static void *fbdevModule = NULL;
+
#ifdef XFree86LOADER
MODULESETUPPROTO(FBDevSetup);
@@ -204,8 +206,9 @@
if (!setupDone) {
setupDone = TRUE;
xf86AddDriver(&FBDEV, module, 0);
- LoaderRefSymLists(afbSymbols, fbSymbols,
- shadowSymbols, fbdevHWSymbols, NULL);
+ LoaderModRefSymLists(module, afbSymbols, fbSymbols,
+ shadowSymbols, fbdevHWSymbols, NULL);
+ fbdevModule = module;
return (pointer)1;
} else {
if (errmaj) *errmaj = LDR_ONCEONLY;
@@ -293,7 +296,7 @@
if (!xf86LoadDrvSubModule(drv, "fbdevhw"))
return FALSE;
- xf86LoaderReqSymLists(fbdevHWSymbols, NULL);
+ xf86LoaderModReqSymLists(fbdevModule, fbdevHWSymbols, NULL);
for (i = 0; i < numDevSections; i++) {
Bool isIsa = FALSE;
@@ -577,7 +580,7 @@
return FALSE;
}
if (mod && syms) {
- xf86LoaderReqSymLists(syms, NULL);
+ xf86LoaderModReqSymLists(fbdevModule, syms, NULL);
}
/* Load shadow if needed */
@@ -587,7 +590,7 @@
FBDevFreeRec(pScrn);
return FALSE;
}
- xf86LoaderReqSymLists(shadowSymbols, NULL);
+ xf86LoaderModReqSymLists(fbdevModule, shadowSymbols, NULL);
}
TRACE_EXIT("PreInit");