summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_linker.c
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>1999-05-08 13:01:59 +0000
committerpeter <peter@FreeBSD.org>1999-05-08 13:01:59 +0000
commite1866010a11f0ab9a9b5b3ca6b12ee0e0ac13ff5 (patch)
treef1eccaa4de460b2534627473986978168d12dc18 /sys/kern/kern_linker.c
parentc845ce79190131c6408f2278bcca8c51db40c01b (diff)
downloadFreeBSD-src-e1866010a11f0ab9a9b5b3ca6b12ee0e0ac13ff5.zip
FreeBSD-src-e1866010a11f0ab9a9b5b3ca6b12ee0e0ac13ff5.tar.gz
First stages of a module dependency cleanup. This part fixes a
particularly annoying hack, namely having the linker bash the moduledata to set the container pointer, preventing it being const. In the process, a stack of warnings were fixed and will probably allow a revisit of the const C_SYSINIT() changes. This explicitly registers modules in files or preload areas with the module system first, and let them initialize via SYSINIT/DECLARE_MODULE later in their SI_ORDER_xxx order. The kludge of finding the containing file is no longer needed since the registration of modules onto the modules list is done in the context of initializing the linker file.
Diffstat (limited to 'sys/kern/kern_linker.c')
-rw-r--r--sys/kern/kern_linker.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/sys/kern/kern_linker.c b/sys/kern/kern_linker.c
index ba60a8b..61d7aeb 100644
--- a/sys/kern/kern_linker.c
+++ b/sys/kern/kern_linker.c
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: kern_linker.c,v 1.30 1999/04/27 11:15:57 phk Exp $
+ * $Id: kern_linker.c,v 1.31 1999/04/28 01:04:28 luoqi Exp $
*/
#include "opt_ddb.h"
@@ -96,7 +96,8 @@ linker_file_sysinit(linker_file_t lf)
struct sysinit** sipp;
struct sysinit** xipp;
struct sysinit* save;
- moduledata_t *moddata;
+ const moduledata_t *moddata;
+ int error;
KLD_DPF(FILE, ("linker_file_sysinit: calling SYSINITs for %s\n",
lf->filename));
@@ -112,7 +113,10 @@ linker_file_sysinit(linker_file_t lf)
for (sipp = (struct sysinit **)sysinits->ls_items; *sipp; sipp++) {
if ((*sipp)->func == module_register_init) {
moddata = (*sipp)->udata;
- moddata->_file = lf;
+ error = module_register(moddata, lf);
+ if (error)
+ printf("linker_file_sysinit \"%s\" failed to register! %d\n",
+ lf->filename, error);
}
}
@@ -925,7 +929,7 @@ linker_preload(void* arg)
int error;
struct linker_set *sysinits;
struct sysinit **sipp;
- moduledata_t *moddata;
+ const moduledata_t *moddata;
modptr = NULL;
while ((modptr = preload_search_next_name(modptr)) != NULL) {
@@ -967,7 +971,10 @@ linker_preload(void* arg)
for (sipp = (struct sysinit **)sysinits->ls_items; *sipp; sipp++) {
if ((*sipp)->func == module_register_init) {
moddata = (*sipp)->udata;
- moddata->_file = lf;
+ error = module_register(moddata, lf);
+ if (error)
+ printf("Preloaded %s \"%s\" failed to register: %d\n",
+ modtype, modname, error);
}
}
sysinit_add((struct sysinit **)sysinits->ls_items);
OpenPOWER on IntegriCloud