Example #1
0
void
module_register_init(const void *arg)
{
    const moduledata_t* data = (const moduledata_t*) arg;
    int error;
    module_t mod;

    mod = module_lookupbyname(data->name);
    if (mod == NULL) {
#if 0
	panic("module_register_init: module named %s not found", 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) {
	module_unload(mod);	/* ignore error */
	module_release(mod);
	kprintf("module_register_init: MOD_LOAD (%s, %lx, %p) error %d\n",
	       data->name, (u_long)(uintfptr_t)data->evhand, data->priv, error);
    }
}
Example #2
0
int
module_register(const moduledata_t *data, linker_file_t container)
{
    size_t namelen;
    module_t newmod;

    newmod = module_lookupbyname(data->name);
    if (newmod != NULL) {
	kprintf("module_register: module %s already exists!\n", data->name);
	return EEXIST;
    }
    namelen = strlen(data->name) + 1;
    newmod = (module_t) kmalloc(sizeof(struct module) + namelen,
			       M_MODULE, M_WAITOK);

    newmod->refs = 1;
    newmod->id = nextid++;
    newmod->name = (char *) (newmod + 1);
    strcpy(newmod->name, data->name);
    newmod->handler = data->evhand ? data->evhand : modevent_nop;
    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)
	TAILQ_INSERT_TAIL(&container->modules, newmod, flink);
    newmod->file = container;

    return 0;
}
Example #3
0
int
modfind(struct proc* p, struct modfind_args* uap)
{
    int error = 0;
    char name[MAXMODNAME];
    module_t mod;

    if ((error = copyinstr(SCARG(uap, name), name, sizeof name, 0)) != 0)
	goto out;

    mod = module_lookupbyname(name);
    if (!mod)
	error = ENOENT;
    else
	p->p_retval[0] = mod->id;

out:
    return error;
}
Example #4
0
/*
 * MPALMOSTSAFE
 */
int
sys_modfind(struct modfind_args *uap)
{
    int error;
    char name[MAXMODNAME];
    module_t mod;

    lwkt_gettoken(&mod_token);
    if ((error = copyinstr(uap->name, name, sizeof name, 0)) != 0)
	goto out;

    mod = module_lookupbyname(name);
    if (!mod)
	error = ENOENT;
    else
	uap->sysmsg_result = mod->id;

out:
    lwkt_reltoken(&mod_token);

    return error;
}