diff options
| -rw-r--r-- | sys/kern/kern_linker.c | 17 | ||||
| -rw-r--r-- | sys/kern/kern_module.c | 54 | ||||
| -rw-r--r-- | sys/sys/module.h | 7 |
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); |
