From: Alex Hornung Date: Sat, 21 Aug 2010 12:11:30 +0000 (+0100) Subject: aesni - Port to DragonFly X-Git-Tag: v2.9.0~459 X-Git-Url: https://gitweb.dragonflybsd.org/~tuxillo/dragonfly.git/commitdiff_plain/e1e54cc37dd3935166fcb1026b24f75e77aef80d aesni - Port to DragonFly * Please note that this is completely *UNTESTED* --- diff --git a/sys/crypto/aesni/Makefile b/sys/crypto/aesni/Makefile index 4d032dfbfd..a845680649 100644 --- a/sys/crypto/aesni/Makefile +++ b/sys/crypto/aesni/Makefile @@ -1,6 +1,6 @@ KMOD= aesni SRCS= aesni.c aesni_wrap.c -SRCS+= aesencdec_$(MACHINE_CPUARCH).S aeskeys_$(MACHINE_CPUARCH).S +SRCS+= aesencdec_$(MACHINE_ARCH).S aeskeys_$(MACHINE_ARCH).S SRCS+= device_if.h bus_if.h opt_bus.h cryptodev_if.h .include diff --git a/sys/crypto/aesni/aesencdec_amd64.S b/sys/crypto/aesni/aesencdec_amd64.S index 5ae5c84a29..903ca59c8b 100644 --- a/sys/crypto/aesni/aesencdec_amd64.S +++ b/sys/crypto/aesni/aesencdec_amd64.S @@ -22,6 +22,8 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. + * + * FreeBSD: src/sys/crypto/aesni/aesencdec_amd64.S,v 1.1 2010/07/23 11:00:46 kib Exp */ #include @@ -131,5 +133,3 @@ ENTRY(aesni_decrypt_cbc) retq .cfi_endproc END(aesni_decrypt_cbc) - - .ident "$FreeBSD: src/sys/crypto/aesni/aesencdec_amd64.S,v 1.1 2010/07/23 11:00:46 kib Exp $" diff --git a/sys/crypto/aesni/aesencdec_i386.S b/sys/crypto/aesni/aesencdec_i386.S index da30aff1b8..04d8f215e5 100644 --- a/sys/crypto/aesni/aesencdec_i386.S +++ b/sys/crypto/aesni/aesencdec_i386.S @@ -22,6 +22,8 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. + * + * FreeBSD: src/sys/crypto/aesni/aesencdec_i386.S,v 1.1 2010/07/23 11:00:46 kib Exp */ #include @@ -162,5 +164,3 @@ ENTRY(aesni_decrypt_cbc) retl .cfi_endproc END(aesni_decrypt_cbc) - - .ident "$FreeBSD: src/sys/crypto/aesni/aesencdec_i386.S,v 1.1 2010/07/23 11:00:46 kib Exp $" diff --git a/sys/crypto/aesni/aeskeys_amd64.S b/sys/crypto/aesni/aeskeys_amd64.S index ca613d0ebc..fbe13d407e 100644 --- a/sys/crypto/aesni/aeskeys_amd64.S +++ b/sys/crypto/aesni/aeskeys_amd64.S @@ -35,6 +35,8 @@ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * FreeBSD: src/sys/crypto/aesni/aeskeys_amd64.S,v 1.1 2010/07/23 11:00:46 kib Exp */ #include @@ -251,5 +253,3 @@ ENTRY(aesni_set_deckey) retq .cfi_endproc END(aesni_set_deckey) - - .ident "$FreeBSD: src/sys/crypto/aesni/aeskeys_amd64.S,v 1.1 2010/07/23 11:00:46 kib Exp $" diff --git a/sys/crypto/aesni/aeskeys_i386.S b/sys/crypto/aesni/aeskeys_i386.S index ba3630f207..acff733fbf 100644 --- a/sys/crypto/aesni/aeskeys_i386.S +++ b/sys/crypto/aesni/aeskeys_i386.S @@ -35,6 +35,8 @@ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * FreeBSD: src/sys/crypto/aesni/aeskeys_i386.S,v 1.1 2010/07/23 11:00:46 kib Exp */ #include @@ -52,7 +54,7 @@ _key_expansion_256a: pxor %xmm1,%xmm0 movaps %xmm0,(%edx) addl $0x10,%edx - retq + ret /* was retq (?!!) */ .cfi_endproc END(_key_expansion_128) @@ -76,7 +78,7 @@ ENTRY(_key_expansion_192a) shufps $0b01001110,%xmm2,%xmm1 movaps %xmm1,0x10(%edx) addl $0x20,%edx - retq + ret /* was retq (?!!) */ .cfi_endproc END(_key_expansion_192a) @@ -269,5 +271,3 @@ ENTRY(aesni_set_deckey) retl .cfi_endproc END(aesni_set_deckey) - - .ident "$FreeBSD: src/sys/crypto/aesni/aeskeys_i386.S,v 1.1 2010/07/23 11:00:46 kib Exp $" diff --git a/sys/crypto/aesni/aesni.c b/sys/crypto/aesni/aesni.c index a8b1150ea7..010450f287 100644 --- a/sys/crypto/aesni/aesni.c +++ b/sys/crypto/aesni/aesni.c @@ -23,11 +23,11 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. + * + * FreeBSD: src/sys/crypto/aesni/aesni.c,v 1.1 2010/07/23 11:00:46 kib Exp */ #include -__FBSDID("$FreeBSD: src/sys/crypto/aesni/aesni.c,v 1.1 2010/07/23 11:00:46 kib Exp $"); - #include #include #include @@ -36,7 +36,8 @@ __FBSDID("$FreeBSD: src/sys/crypto/aesni/aesni.c,v 1.1 2010/07/23 11:00:46 kib E #include #include #include -#include +#include +#include #include #include #include @@ -46,7 +47,7 @@ struct aesni_softc { int32_t cid; uint32_t sid; TAILQ_HEAD(aesni_sessions_head, aesni_session) sessions; - struct rwlock lock; + struct spinlock lock; }; static int aesni_newsession(device_t, uint32_t *sidp, struct cryptoini *cri); @@ -62,7 +63,7 @@ aesni_identify(driver_t *drv, device_t parent) /* NB: order 10 is so we get attached after h/w devices */ if (device_find_child(parent, "aesni", -1) == NULL && - BUS_ADD_CHILD(parent, 10, "aesni", -1) == 0) + BUS_ADD_CHILD(parent, parent, 10, "aesni", -1) == 0) panic("aesni: could not attach"); } @@ -94,7 +95,7 @@ aesni_attach(device_t dev) return (ENOMEM); } - rw_init(&sc->lock, "aesni_lock"); + spin_init(&sc->lock); crypto_register(sc->cid, CRYPTO_AES_CBC, 0, 0); return (0); } @@ -106,10 +107,10 @@ aesni_detach(device_t dev) struct aesni_session *ses; sc = device_get_softc(dev); - rw_wlock(&sc->lock); + spin_lock_wr(&sc->lock); TAILQ_FOREACH(ses, &sc->sessions, next) { if (ses->used) { - rw_wunlock(&sc->lock); + spin_unlock_wr(&sc->lock); device_printf(dev, "Cannot detach, sessions still active.\n"); return (EBUSY); @@ -117,10 +118,10 @@ aesni_detach(device_t dev) } while ((ses = TAILQ_FIRST(&sc->sessions)) != NULL) { TAILQ_REMOVE(&sc->sessions, ses, next); - free(ses, M_AESNI); + kfree(ses, M_AESNI); } - rw_wunlock(&sc->lock); - rw_destroy(&sc->lock); + spin_unlock_wr(&sc->lock); + spin_uninit(&sc->lock); crypto_unregister_all(sc->cid); return (0); } @@ -153,33 +154,33 @@ aesni_newsession(device_t dev, uint32_t *sidp, struct cryptoini *cri) if (encini == NULL) return (EINVAL); - rw_wlock(&sc->lock); + spin_lock_wr(&sc->lock); /* * Free sessions goes first, so if first session is used, we need to * allocate one. */ ses = TAILQ_FIRST(&sc->sessions); if (ses == NULL || ses->used) { - ses = malloc(sizeof(*ses), M_AESNI, M_NOWAIT | M_ZERO); + ses = kmalloc(sizeof(*ses), M_AESNI, M_NOWAIT | M_ZERO); if (ses == NULL) { - rw_wunlock(&sc->lock); + spin_unlock_wr(&sc->lock); return (ENOMEM); } KASSERT(((uintptr_t)ses) % 0x10 == 0, - ("malloc returned unaligned pointer")); + ("kmalloc returned unaligned pointer")); ses->id = sc->sid++; } else { TAILQ_REMOVE(&sc->sessions, ses, next); } ses->used = 1; TAILQ_INSERT_TAIL(&sc->sessions, ses, next); - rw_wunlock(&sc->lock); + spin_unlock_wr(&sc->lock); error = aesni_cipher_setup(ses, encini); if (error != 0) { - rw_wlock(&sc->lock); + spin_lock_wr(&sc->lock); aesni_freesession_locked(sc, ses); - rw_wunlock(&sc->lock); + spin_unlock_wr(&sc->lock); return (error); } @@ -208,17 +209,17 @@ aesni_freesession(device_t dev, uint64_t tid) sc = device_get_softc(dev); sid = ((uint32_t)tid) & 0xffffffff; - rw_wlock(&sc->lock); + spin_lock_wr(&sc->lock); TAILQ_FOREACH_REVERSE(ses, &sc->sessions, aesni_sessions_head, next) { if (ses->id == sid) break; } if (ses == NULL) { - rw_wunlock(&sc->lock); + spin_unlock_wr(&sc->lock); return (EINVAL); } aesni_freesession_locked(sc, ses); - rw_wunlock(&sc->lock); + spin_unlock_wr(&sc->lock); return (0); } @@ -260,12 +261,12 @@ aesni_process(device_t dev, struct cryptop *crp, int hint __unused) goto out; } - rw_rlock(&sc->lock); + spin_lock_wr(&sc->lock); /* XXX: was rd lock */ TAILQ_FOREACH_REVERSE(ses, &sc->sessions, aesni_sessions_head, next) { if (ses->id == (crp->crp_sid & 0xffffffff)) break; } - rw_runlock(&sc->lock); + spin_unlock_wr(&sc->lock); /* XXX: was rd lock */ if (ses == NULL) { error = EINVAL; goto out; @@ -303,7 +304,7 @@ aesni_cipher_alloc(struct cryptodesc *enccrd, struct cryptop *crp, return (addr); alloc: - addr = malloc(enccrd->crd_len, M_AESNI, M_NOWAIT); + addr = kmalloc(enccrd->crd_len, M_AESNI, M_NOWAIT); if (addr != NULL) { *allocated = 1; crypto_copydata(crp->crp_flags, crp->crp_buf, enccrd->crd_skip, diff --git a/sys/crypto/aesni/aesni.h b/sys/crypto/aesni/aesni.h index 25f6dec443..99ca0ecae5 100644 --- a/sys/crypto/aesni/aesni.h +++ b/sys/crypto/aesni/aesni.h @@ -51,6 +51,7 @@ #define AES192_ROUNDS 12 #define AES256_ROUNDS 14 #define AES_SCHED_LEN ((AES256_ROUNDS + 1) * AES_BLOCK_LEN) +#define CPUID2_AESNI 0x02000000 struct aesni_session { uint8_t enc_schedule[AES_SCHED_LEN] __aligned(16); @@ -63,7 +64,9 @@ struct aesni_session { int used; uint32_t id; TAILQ_ENTRY(aesni_session) next; +#if 0 struct fpu_kern_ctx fpu_ctx; +#endif }; /* diff --git a/sys/crypto/aesni/aesni_wrap.c b/sys/crypto/aesni/aesni_wrap.c index d99c743f01..f1bddcbd51 100644 --- a/sys/crypto/aesni/aesni_wrap.c +++ b/sys/crypto/aesni/aesni_wrap.c @@ -22,10 +22,11 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. + * + * FreeBSD: src/sys/crypto/aesni/aesni_wrap.c,v 1.1 2010/07/23 11:00:46 kib Exp */ #include -__FBSDID("$FreeBSD: src/sys/crypto/aesni/aesni_wrap.c,v 1.1 2010/07/23 11:00:46 kib Exp $"); #include #include @@ -109,7 +110,7 @@ int aesni_cipher_setup(struct aesni_session *ses, struct cryptoini *encini) { struct thread *td; - int error; + int error = 0; switch (encini->cri_klen) { case 128: @@ -126,14 +127,18 @@ aesni_cipher_setup(struct aesni_session *ses, struct cryptoini *encini) } td = curthread; +#if 0 error = fpu_kern_enter(td, &ses->fpu_ctx, FPU_KERN_NORMAL); +#endif if (error == 0) { aesni_set_enckey(encini->cri_key, ses->enc_schedule, ses->rounds); aesni_set_deckey(ses->enc_schedule, ses->dec_schedule, ses->rounds); - arc4rand(ses->iv, sizeof(ses->iv), 0); + karc4rand(ses->iv, sizeof(ses->iv)); +#if 0 fpu_kern_leave(td, &ses->fpu_ctx); +#endif } return (error); } @@ -144,7 +149,7 @@ aesni_cipher_process(struct aesni_session *ses, struct cryptodesc *enccrd, { struct thread *td; uint8_t *buf; - int error, allocated; + int error = 0, allocated; buf = aesni_cipher_alloc(enccrd, crp, &allocated); if (buf == NULL) { @@ -153,7 +158,9 @@ aesni_cipher_process(struct aesni_session *ses, struct cryptodesc *enccrd, } td = curthread; +#if 0 error = fpu_kern_enter(td, &ses->fpu_ctx, FPU_KERN_NORMAL); +#endif if (error != 0) goto out1; @@ -176,7 +183,9 @@ aesni_cipher_process(struct aesni_session *ses, struct cryptodesc *enccrd, aesni_decrypt_cbc(ses->rounds, ses->dec_schedule, enccrd->crd_len, buf, ses->iv); } +#if 0 fpu_kern_leave(td, &ses->fpu_ctx); +#endif if (allocated) crypto_copyback(crp->crp_flags, crp->crp_buf, enccrd->crd_skip, enccrd->crd_len, buf); @@ -187,7 +196,7 @@ aesni_cipher_process(struct aesni_session *ses, struct cryptodesc *enccrd, out1: if (allocated) { bzero(buf, enccrd->crd_len); - free(buf, M_AESNI); + kfree(buf, M_AESNI); } out: return (error);