summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/kern/kern_linker.c17
-rw-r--r--sys/kern/kern_module.c54
-rw-r--r--sys/sys/module.h7
3 files changed, 48 insertions, 30 deletions
diff --git a/sys/kern/kern_linker.c b/sys/kern/kern_linker.c
index ba60a8bb03cd..61d7aeba4ed8 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);
diff --git a/sys/kern/kern_module.c b/sys/kern/kern_module.c
index 86a393d266a8..55c339d66423 100644
--- a/sys/kern/kern_module.c
+++ b/sys/kern/kern_module.c
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: kern_module.c,v 1.15 1999/01/27 21:49:56 dillon Exp $
+ * $Id: kern_module.c,v 1.16 1999/01/29 08:36:44 dillon Exp $
*/
#include <sys/param.h>
@@ -81,22 +81,43 @@ module_register_init(const void *arg)
{
const moduledata_t* data = (const moduledata_t*) arg;
int error;
+ module_t mod;
- error = module_register(data->name, data->evhand, data->priv, data->_file);
- if (error)
- printf("module_register_init: module_register(%s, %lx, %p) error %d\n",
+ mod = module_lookupbyname(data->name);
+ if (mod == NULL) {
+#if 0
+ panic("module_register_init: module named %s not found\n", data->name);
+#else
+ /* temporary kludge until kernel `file' attachment registers modules */
+ error = module_register(data, linker_kernel_file);
+ if (error)
+ panic("module_register_init: register of module failed! %d", error);
+ mod = module_lookupbyname(data->name);
+ if (mod == NULL)
+ panic("module_register_init: module STILL not found!");
+#endif
+ }
+ error = MOD_EVENT(mod, MOD_LOAD);
+ if (error) {
+ MOD_EVENT(mod, MOD_UNLOAD);
+ module_release(mod);
+ printf("module_register_init: MOD_LOAD (%s, %lx, %p) error %d\n",
data->name, (u_long)(uintfptr_t)data->evhand, data->priv, error);
+ }
}
int
-module_register(const char* name, modeventhand_t handler, void* arg, void *file)
+module_register(const moduledata_t *data, linker_file_t container)
{
size_t namelen;
module_t newmod;
- int error;
- linker_file_t container = file;
- namelen = strlen(name) + 1;
+ newmod = module_lookupbyname(data->name);
+ if (newmod != NULL) {
+ printf("module_register: module %s already exists!\n", data->name);
+ return EEXIST;
+ }
+ namelen = strlen(data->name) + 1;
newmod = (module_t) malloc(sizeof(struct module) + namelen,
M_MODULE, M_WAITOK);
if (newmod == 0)
@@ -105,25 +126,16 @@ module_register(const char* name, modeventhand_t handler, void* arg, void *file)
newmod->refs = 1;
newmod->id = nextid++;
newmod->name = (char *) (newmod + 1);
- strcpy(newmod->name, name);
- newmod->handler = handler;
- newmod->arg = arg;
+ strcpy(newmod->name, data->name);
+ newmod->handler = data->evhand;
+ newmod->arg = data->priv;
bzero(&newmod->data, sizeof(newmod->data));
TAILQ_INSERT_TAIL(&modules, newmod, link);
if (container == NULL)
container = linker_current_file;
- if (container) {
+ if (container)
TAILQ_INSERT_TAIL(&container->modules, newmod, flink);
- newmod->file = container;
- } else
- newmod->file = 0;
-
- if ((error = MOD_EVENT(newmod, MOD_LOAD)) != 0) {
- MOD_EVENT(newmod, MOD_UNLOAD);
- module_release(newmod);
- return error;
- }
return 0;
}
diff --git a/sys/sys/module.h b/sys/sys/module.h
index 05f48c297b27..45f3a405990d 100644
--- a/sys/sys/module.h
+++ b/sys/sys/module.h
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: module.h,v 1.9 1999/01/29 06:47:53 dillon Exp $
+ * $Id: module.h,v 1.10 1999/01/29 08:36:45 dillon Exp $
*/
#ifndef _SYS_MODULE_H_
@@ -47,7 +47,6 @@ typedef struct moduledata {
char *name; /* module name */
modeventhand_t evhand; /* event handler */
void *priv; /* extra data */
- void *_file; /* private; used by linker */
} moduledata_t;
/*
@@ -68,8 +67,8 @@ typedef union modspecific {
struct __hack
void module_register_init(const void *data);
-int module_register(const char *name, modeventhand_t callback, void *arg,
- void *file);
+struct linker_file;
+int module_register(const struct moduledata *data, struct linker_file *lf);
module_t module_lookupbyname(const char *name);
module_t module_lookupbyid(int modid);
void module_reference(module_t mod);