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");

Reply via email to