summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_lkm.c
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>1998-10-16 03:55:01 +0000
committerpeter <peter@FreeBSD.org>1998-10-16 03:55:01 +0000
commit464de37ce6099f409aa233200a94ac38216aa211 (patch)
tree59ed738c6bca93117593ea63241912064597c130 /sys/kern/kern_lkm.c
parentad0030e392049cd4f887968f40988dd6cf5e5ee0 (diff)
downloadFreeBSD-src-464de37ce6099f409aa233200a94ac38216aa211.zip
FreeBSD-src-464de37ce6099f409aa233200a94ac38216aa211.tar.gz
*gulp*. Jordan specifically OK'ed this..
This is the bulk of the support for doing kld modules. Two linker_sets were replaced by SYSINIT()'s. VFS's and exec handlers are self registered. kld is now a superset of lkm. I have converted most of them, they will follow as a seperate commit as samples. This all still works as a static a.out kernel using LKM's.
Diffstat (limited to 'sys/kern/kern_lkm.c')
-rw-r--r--sys/kern/kern_lkm.c47
1 files changed, 11 insertions, 36 deletions
diff --git a/sys/kern/kern_lkm.c b/sys/kern/kern_lkm.c
index 9061180..f7ca01d 100644
--- a/sys/kern/kern_lkm.c
+++ b/sys/kern/kern_lkm.c
@@ -30,7 +30,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: kern_lkm.c,v 1.55 1998/09/05 17:13:27 bde Exp $
+ * $Id: kern_lkm.c,v 1.56 1998/09/07 05:42:15 bde Exp $
*/
#include "opt_devfs.h"
@@ -650,11 +650,15 @@ _lkm_vfs(lkmtp, cmd)
/* like in vfs_op_init */
for(i = 0; args->lkm_vnodeops->ls_items[i]; i++) {
- const struct vnodeopv_desc *opv =
+ struct vnodeopv_desc *opv = (struct vnodeopv_desc *)
args->lkm_vnodeops->ls_items[i];
*(opv->opv_desc_vector_p) = NULL;
}
- vfs_opv_init((struct vnodeopv_desc **)args->lkm_vnodeops->ls_items);
+ for(i = 0; args->lkm_vnodeops->ls_items[i]; i++) {
+ struct vnodeopv_desc *opv = (struct vnodeopv_desc *)
+ args->lkm_vnodeops->ls_items[i];
+ vfs_opv_init(opv);
+ }
/*
* Call init function for this VFS...
@@ -834,40 +838,21 @@ _lkm_exec(lkmtp, cmd)
/* don't load twice! */
if (lkmexists(lkmtp))
return(EEXIST);
- if ((i = args->lkm_offset) == LKM_ANON) { /* auto */
- /*
- * Search the table looking for a slot...
- */
- for (i = 0; execsw[i] != NULL; i++)
- if (execsw[i]->ex_imgact == NULL)
- break; /* found it! */
- /* out of allocable slots? */
- if (execsw[i] == NULL) {
- err = ENFILE;
- break;
- }
- } else { /* assign */
+ if (args->lkm_offset != LKM_ANON) { /* auto */
err = EINVAL;
break;
}
- /* save old */
- bcopy(&execsw[i], &(args->lkm_oldexec), sizeof(struct execsw*));
-
- /* replace with new */
- bcopy(&(args->lkm_exec), &execsw[i], sizeof(struct execsw*));
+ err = exec_register(args->lkm_exec);
/* done! */
- args->lkm_offset = i; /* slot in execsw[] */
+ args->lkm_offset = 0; /* slot in execsw[] */
break;
case LKM_E_UNLOAD:
- /* current slot... */
- i = args->lkm_offset;
- /* replace current slot contents with old contents */
- bcopy(&(args->lkm_oldexec), &execsw[i], sizeof(struct execsw*));
+ err = exec_unregister(args->lkm_exec);
break;
@@ -877,16 +862,6 @@ _lkm_exec(lkmtp, cmd)
return(err);
}
-/* XXX: This is bogus. we should find a better method RSN! */
-static const struct execsw lkm_exec_dummy1 = { NULL, "lkm" };
-static const struct execsw lkm_exec_dummy2 = { NULL, "lkm" };
-static const struct execsw lkm_exec_dummy3 = { NULL, "lkm" };
-static const struct execsw lkm_exec_dummy4 = { NULL, "lkm" };
-TEXT_SET(execsw_set, lkm_exec_dummy1);
-TEXT_SET(execsw_set, lkm_exec_dummy2);
-TEXT_SET(execsw_set, lkm_exec_dummy3);
-TEXT_SET(execsw_set, lkm_exec_dummy4);
-
/*
* This code handles the per-module type "wiring-in" of loadable modules
* into existing kernel tables. For "LM_MISC" modules, wiring and unwiring
OpenPOWER on IntegriCloud