aesni - Port to DragonFly
authorAlex Hornung <ahornung@gmail.com>
Sat, 21 Aug 2010 12:11:30 +0000 (13:11 +0100)
committerAlex Hornung <ahornung@gmail.com>
Sat, 21 Aug 2010 13:13:41 +0000 (14:13 +0100)
* Please note that this is completely *UNTESTED*

sys/crypto/aesni/Makefile
sys/crypto/aesni/aesencdec_amd64.S
sys/crypto/aesni/aesencdec_i386.S
sys/crypto/aesni/aeskeys_amd64.S
sys/crypto/aesni/aeskeys_i386.S
sys/crypto/aesni/aesni.c
sys/crypto/aesni/aesni.h
sys/crypto/aesni/aesni_wrap.c

index 4d032df..a845680 100644 (file)
@@ -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 <bsd.kmod.mk>
index 5ae5c84..903ca59 100644 (file)
@@ -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 <machine/asmacros.h>
@@ -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 $"
index da30aff..04d8f21 100644 (file)
@@ -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 <machine/asmacros.h>
@@ -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 $"
index ca613d0..fbe13d4 100644 (file)
@@ -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 <machine/asmacros.h>
@@ -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 $"
index ba3630f..acff733 100644 (file)
@@ -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 <machine/asmacros.h>
@@ -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 $"
index a8b1150..010450f 100644 (file)
  * 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 <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/crypto/aesni/aesni.c,v 1.1 2010/07/23 11:00:46 kib Exp $");
-
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/kernel.h>
@@ -36,7 +36,8 @@ __FBSDID("$FreeBSD: src/sys/crypto/aesni/aesni.c,v 1.1 2010/07/23 11:00:46 kib E
 #include <sys/lock.h>
 #include <sys/module.h>
 #include <sys/malloc.h>
-#include <sys/rwlock.h>
+#include <sys/spinlock.h>
+#include <sys/spinlock2.h>
 #include <sys/bus.h>
 #include <sys/uio.h>
 #include <crypto/aesni/aesni.h>
@@ -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,
index 25f6dec..99ca0ec 100644 (file)
@@ -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
 };
 
 /*
index d99c743..f1bddcb 100644 (file)
  * 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 <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/crypto/aesni/aesni_wrap.c,v 1.1 2010/07/23 11:00:46 kib Exp $");
 
 #include <sys/param.h>
 #include <sys/libkern.h>
@@ -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);