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.
This commit is contained in:
Peter Wemm 1999-05-08 13:01:59 +00:00
parent 05aec5db24
commit b5b15c3ff0
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=46693
3 changed files with 48 additions and 30 deletions

View File

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

View File

@ -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;
}

View File

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