PERFORCE change 111160 for review
Sam Leffler
sam at FreeBSD.org
Tue Dec 5 13:31:06 PST 2006
http://perforce.freebsd.org/chv.cgi?CH=111160
Change 111160 by sam at sam_ebb on 2006/12/05 21:30:35
Plan B: instead of splitting the cryptosoft driver out as
a separate driver/module lump it back into the crypto module
as done prior to kobj'ification of crypto drivers. To deal
with the ordering requirements of module unload and driver
detach use explicit metadata linkage. A tad awkward but
seesm to work. Thanks to jhb for guidance.
Affected files ...
.. //depot/projects/crypto/sys/conf/files#4 edit
.. //depot/projects/crypto/sys/modules/Makefile#3 edit
.. //depot/projects/crypto/sys/modules/crypto/Makefile#4 edit
.. //depot/projects/crypto/sys/modules/cryptosoft/Makefile#2 delete
.. //depot/projects/crypto/sys/opencrypto/crypto.c#7 edit
.. //depot/projects/crypto/sys/opencrypto/cryptosoft.c#4 edit
Differences ...
==== //depot/projects/crypto/sys/conf/files#4 (text+ko) ====
@@ -1902,7 +1902,7 @@
opencrypto/crypto.c optional crypto
opencrypto/cryptodev.c optional cryptodev
opencrypto/cryptodev_if.m optional crypto
-opencrypto/cryptosoft.c optional cryptosoft
+opencrypto/cryptosoft.c optional crypto
opencrypto/deflate.c optional crypto
opencrypto/rmd160.c optional crypto | ipsec
opencrypto/skipjack.c optional crypto
==== //depot/projects/crypto/sys/modules/Makefile#3 (text+ko) ====
@@ -58,7 +58,6 @@
${_cpufreq} \
${_crypto} \
${_cryptodev} \
- ${_cryptosoft} \
${_cs} \
${_ctau} \
cue \
@@ -313,7 +312,6 @@
.if exists(${.CURDIR}/../opencrypto)
_crypto= crypto
_cryptodev= cryptodev
-_cryptosoft= cryptosoft
.endif
.if exists(${.CURDIR}/../crypto)
_random= random
==== //depot/projects/crypto/sys/modules/crypto/Makefile#4 (text+ko) ====
@@ -9,7 +9,7 @@
KMOD = crypto
SRCS = crypto.c cryptodev_if.c
-SRCS += criov.c xform.c
+SRCS += criov.c cryptosoft.c xform.c
SRCS += cast.c deflate.c rmd160.c rijndael-alg-fst.c rijndael-api.c
SRCS += skipjack.c bf_enc.c bf_skey.c
SRCS += des_ecb.c des_enc.c des_setkey.c
==== //depot/projects/crypto/sys/opencrypto/crypto.c#7 (text+ko) ====
@@ -286,38 +286,6 @@
mtx_destroy(&crypto_drivers_mtx);
}
-/*
- * Initialization code, both for static and dynamic loading.
- */
-static int
-crypto_modevent(module_t mod, int type, void *unused)
-{
- int error = EINVAL;
-
- switch (type) {
- case MOD_LOAD:
- error = crypto_init();
- if (error == 0 && bootverbose)
- printf("crypto: <crypto core>\n");
- break;
- case MOD_UNLOAD:
- /*XXX disallow if active sessions */
- error = 0;
- crypto_destroy();
- return 0;
- }
- return error;
-}
-
-static moduledata_t crypto_mod = {
- "crypto",
- crypto_modevent,
- 0
-};
-MODULE_VERSION(crypto, 1);
-DECLARE_MODULE(crypto, crypto_mod, SI_SUB_DRIVERS, SI_ORDER_FIRST);
-MODULE_DEPEND(crypto, zlib, 1, 1, 1);
-
static struct cryptocap *
crypto_checkdriver(u_int32_t hid)
{
@@ -1462,3 +1430,34 @@
crypto_finis(&crp_ret_q);
}
+
+int crypto_modevent(module_t mod, int type, void *unused);
+
+/*
+ * Initialization code, both for static and dynamic loading.
+ * Note this is not invoked with the usual MODULE_DECLARE
+ * mechanism but instead is listed as a dependency by the
+ * cryptosoft driver. This guarantees proper ordering of
+ * calls on module load/unload.
+ */
+int
+crypto_modevent(module_t mod, int type, void *unused)
+{
+ int error = EINVAL;
+
+ switch (type) {
+ case MOD_LOAD:
+ error = crypto_init();
+ if (error == 0 && bootverbose)
+ printf("crypto: <crypto core>\n");
+ break;
+ case MOD_UNLOAD:
+ /*XXX disallow if active sessions */
+ error = 0;
+ crypto_destroy();
+ return 0;
+ }
+ return error;
+}
+MODULE_VERSION(crypto, 1);
+MODULE_DEPEND(crypto, zlib, 1, 1, 1);
==== //depot/projects/crypto/sys/opencrypto/cryptosoft.c#4 (text+ko) ====
@@ -1053,7 +1053,15 @@
};
static devclass_t swcr_devclass;
+/*
+ * NB: We explicitly reference the crypto module so we
+ * get the necessary ordering when built as a loadable
+ * module. This is required because we bundle the crypto
+ * module code together with the cryptosoft driver (otherwise
+ * normal module dependencies would handle things).
+ */
+extern int crypto_modevent(struct module *, int, void *);
/* XXX where to attach */
-DRIVER_MODULE(cryptosoft, nexus, swcr_driver, swcr_devclass, 0, 0);
+DRIVER_MODULE(cryptosoft, nexus, swcr_driver, swcr_devclass, crypto_modevent,0);
MODULE_VERSION(cryptosoft, 1);
MODULE_DEPEND(cryptosoft, crypto, 1, 1, 1);
More information about the p4-projects
mailing list