Date: Mon, 21 Jun 2010 04:06:01 +0000 (UTC) From: Juli Mallett <jmallett@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r209382 - user/jmallett/octeon/sys/mips/cavium/cryptocteon Message-ID: <201006210406.o5L4616N010075@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: jmallett Date: Mon Jun 21 04:06:01 2010 New Revision: 209382 URL: http://svn.freebsd.org/changeset/base/209382 Log: o) Actually, we don't reenable COP2 access when entering the kernel from userland, so we need to enable it here along with disabling interrupts during crypto operations. o) Rather than trying to allocate a shocking amount of stack space, put the iovecs for crypto operations in the session structure. o) Remove a debugging panic. With this the crypto coprocessor seems to be working. Modified: user/jmallett/octeon/sys/mips/cavium/cryptocteon/cavium_crypto.c user/jmallett/octeon/sys/mips/cavium/cryptocteon/cryptocteon.c user/jmallett/octeon/sys/mips/cavium/cryptocteon/cryptocteonvar.h Modified: user/jmallett/octeon/sys/mips/cavium/cryptocteon/cavium_crypto.c ============================================================================== --- user/jmallett/octeon/sys/mips/cavium/cryptocteon/cavium_crypto.c Mon Jun 21 03:05:31 2010 (r209381) +++ user/jmallett/octeon/sys/mips/cavium/cryptocteon/cavium_crypto.c Mon Jun 21 04:06:01 2010 (r209382) @@ -87,6 +87,22 @@ __FBSDID("$FreeBSD$"); } \ } while (0) +static inline unsigned long octeon_crypto_enable(void) +{ + register_t s; + + s = intr_disable(); + mips_wr_status(mips_rd_status() | MIPS_SR_COP_2_BIT); + + return (s); +} + +static inline void octeon_crypto_disable(register_t s) +{ + mips_wr_status(mips_rd_status() & ~MIPS_SR_COP_2_BIT); + intr_restore(s); +} + #define ESP_HEADER_LENGTH 8 #define DES_CBC_IV_LENGTH 8 #define AES_CBC_IV_LENGTH 16 @@ -243,7 +259,7 @@ octo_calc_hash(uint8_t auth, unsigned ch memset(hash_key, 0, sizeof(hash_key)); memcpy(hash_key, (uint8_t *) key, (auth ? 20 : 16)); key1 = (uint64_t *) hash_key; - s = intr_disable(); + s = octeon_crypto_enable(); if (auth) { CVMX_MT_HSH_IV(0x67452301EFCDAB89ULL, 0); CVMX_MT_HSH_IV(0x98BADCFE10325476ULL, 1); @@ -316,7 +332,7 @@ octo_calc_hash(uint8_t auth, unsigned ch outer[2] = 0; CVMX_MF_HSH_IV(outer[2], 2); } - intr_restore(s); + octeon_crypto_disable(s); return; } @@ -351,7 +367,7 @@ octo_des_cbc_encrypt( CVMX_PREFETCH0(ivp); CVMX_PREFETCH0(od->octo_enckey); - s = intr_disable(); + s = octeon_crypto_enable(); /* load 3DES Key */ CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 0); @@ -362,7 +378,7 @@ octo_des_cbc_encrypt( CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 1); CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 2); } else { - intr_restore(s); + octeon_crypto_disable(s); dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen); return -EINVAL; } @@ -381,7 +397,7 @@ octo_des_cbc_encrypt( crypt_len -= 8; } - intr_restore(s); + octeon_crypto_disable(s); return 0; } @@ -414,7 +430,7 @@ octo_des_cbc_decrypt( CVMX_PREFETCH0(ivp); CVMX_PREFETCH0(od->octo_enckey); - s = intr_disable(); + s = octeon_crypto_enable(); /* load 3DES Key */ CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 0); @@ -425,7 +441,7 @@ octo_des_cbc_decrypt( CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 1); CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 2); } else { - intr_restore(s); + octeon_crypto_disable(s); dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen); return -EINVAL; } @@ -444,7 +460,7 @@ octo_des_cbc_decrypt( crypt_len -= 8; } - intr_restore(s); + octeon_crypto_disable(s); return 0; } @@ -479,7 +495,7 @@ octo_aes_cbc_encrypt( CVMX_PREFETCH0(ivp); CVMX_PREFETCH0(od->octo_enckey); - s = intr_disable(); + s = octeon_crypto_enable(); /* load AES Key */ CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[0], 0); @@ -495,7 +511,7 @@ octo_aes_cbc_encrypt( CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[2], 2); CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[3], 3); } else { - intr_restore(s); + octeon_crypto_disable(s); dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen); return -EINVAL; } @@ -520,7 +536,7 @@ octo_aes_cbc_encrypt( crypt_len -= 16; } - intr_restore(s); + octeon_crypto_disable(s); return 0; } @@ -553,7 +569,7 @@ octo_aes_cbc_decrypt( CVMX_PREFETCH0(ivp); CVMX_PREFETCH0(od->octo_enckey); - s = intr_disable(); + s = octeon_crypto_enable(); /* load AES Key */ CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[0], 0); @@ -569,7 +585,7 @@ octo_aes_cbc_decrypt( CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[2], 2); CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[3], 3); } else { - intr_restore(s); + octeon_crypto_disable(s); dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen); return -EINVAL; } @@ -594,7 +610,7 @@ octo_aes_cbc_decrypt( crypt_len -= 16; } - intr_restore(s); + octeon_crypto_disable(s); return 0; } @@ -628,7 +644,7 @@ octo_null_md5_encrypt( IOV_INIT(iov, data, data_i, data_l); - s = intr_disable(); + s = octeon_crypto_enable(); /* Load MD5 IV */ CVMX_MT_HSH_IV(od->octo_hminner[0], 0); @@ -700,7 +716,7 @@ octo_null_md5_encrypt( CVMX_MF_HSH_IV(tmp1, 1); *(uint32_t *)data = (uint32_t) (tmp1 >> 32); - intr_restore(s); + octeon_crypto_disable(s); return 0; } @@ -734,7 +750,7 @@ octo_null_sha1_encrypt( IOV_INIT(iov, data, data_i, data_l); - s = intr_disable(); + s = octeon_crypto_enable(); /* Load SHA1 IV */ CVMX_MT_HSH_IV(od->octo_hminner[0], 0); @@ -809,7 +825,7 @@ octo_null_sha1_encrypt( CVMX_MF_HSH_IV(tmp1, 1); *(uint32_t *)data = (uint32_t) (tmp1 >> 32); - intr_restore(s); + octeon_crypto_disable(s); return 0; } @@ -854,7 +870,7 @@ octo_des_cbc_md5_encrypt( CVMX_PREFETCH0(ivp); CVMX_PREFETCH0(od->octo_enckey); - s = intr_disable(); + s = octeon_crypto_enable(); /* load 3DES Key */ CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 0); @@ -865,7 +881,7 @@ octo_des_cbc_md5_encrypt( CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 1); CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 2); } else { - intr_restore(s); + octeon_crypto_disable(s); dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen); return -EINVAL; } @@ -965,7 +981,7 @@ octo_des_cbc_md5_encrypt( CVMX_MF_HSH_IV(tmp1, 1); *data32 = (uint32_t) (tmp1 >> 32); - intr_restore(s); + octeon_crypto_disable(s); return 0; } @@ -1007,7 +1023,7 @@ octo_des_cbc_md5_decrypt( CVMX_PREFETCH0(ivp); CVMX_PREFETCH0(od->octo_enckey); - s = intr_disable(); + s = octeon_crypto_enable(); /* load 3DES Key */ CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 0); @@ -1018,7 +1034,7 @@ octo_des_cbc_md5_decrypt( CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 1); CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 2); } else { - intr_restore(s); + octeon_crypto_disable(s); dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen); return -EINVAL; } @@ -1118,7 +1134,7 @@ octo_des_cbc_md5_decrypt( CVMX_MF_HSH_IV(tmp1, 1); *data32 = (uint32_t) (tmp1 >> 32); - intr_restore(s); + octeon_crypto_disable(s); return 0; } @@ -1163,7 +1179,7 @@ octo_des_cbc_sha1_encrypt( CVMX_PREFETCH0(ivp); CVMX_PREFETCH0(od->octo_enckey); - s = intr_disable(); + s = octeon_crypto_enable(); /* load 3DES Key */ CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 0); @@ -1174,7 +1190,7 @@ octo_des_cbc_sha1_encrypt( CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 1); CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 2); } else { - intr_restore(s); + octeon_crypto_disable(s); dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen); return -EINVAL; } @@ -1277,7 +1293,7 @@ octo_des_cbc_sha1_encrypt( CVMX_MF_HSH_IV(tmp1, 1); *data32 = (uint32_t) (tmp1 >> 32); - intr_restore(s); + octeon_crypto_disable(s); return 0; } @@ -1319,7 +1335,7 @@ octo_des_cbc_sha1_decrypt( CVMX_PREFETCH0(ivp); CVMX_PREFETCH0(od->octo_enckey); - s = intr_disable(); + s = octeon_crypto_enable(); /* load 3DES Key */ CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 0); @@ -1330,7 +1346,7 @@ octo_des_cbc_sha1_decrypt( CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 1); CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 2); } else { - intr_restore(s); + octeon_crypto_disable(s); dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen); return -EINVAL; } @@ -1432,7 +1448,7 @@ octo_des_cbc_sha1_decrypt( CVMX_MF_HSH_IV(tmp1, 1); *data32 = (uint32_t) (tmp1 >> 32); - intr_restore(s); + octeon_crypto_disable(s); return 0; } @@ -1478,7 +1494,7 @@ octo_aes_cbc_md5_encrypt( CVMX_PREFETCH0(ivp); CVMX_PREFETCH0(od->octo_enckey); - s = intr_disable(); + s = octeon_crypto_enable(); /* load AES Key */ CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[0], 0); @@ -1494,7 +1510,7 @@ octo_aes_cbc_md5_encrypt( CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[2], 2); CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[3], 3); } else { - intr_restore(s); + octeon_crypto_disable(s); dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen); return -EINVAL; } @@ -1617,7 +1633,7 @@ octo_aes_cbc_md5_encrypt( CVMX_MF_HSH_IV(tmp1, 1); *data32 = (uint32_t) (tmp1 >> 32); - intr_restore(s); + octeon_crypto_disable(s); return 0; } @@ -1660,7 +1676,7 @@ octo_aes_cbc_md5_decrypt( CVMX_PREFETCH0(ivp); CVMX_PREFETCH0(od->octo_enckey); - s = intr_disable(); + s = octeon_crypto_enable(); /* load AES Key */ CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[0], 0); @@ -1676,7 +1692,7 @@ octo_aes_cbc_md5_decrypt( CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[2], 2); CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[3], 3); } else { - intr_restore(s); + octeon_crypto_disable(s); dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen); return -EINVAL; } @@ -1795,7 +1811,7 @@ octo_aes_cbc_md5_decrypt( CVMX_MF_HSH_IV(tmp1, 1); *data32 = (uint32_t) (tmp1 >> 32); - intr_restore(s); + octeon_crypto_disable(s); return 0; } @@ -1841,7 +1857,7 @@ octo_aes_cbc_sha1_encrypt( CVMX_PREFETCH0(ivp); CVMX_PREFETCH0(od->octo_enckey); - s = intr_disable(); + s = octeon_crypto_enable(); /* load AES Key */ CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[0], 0); @@ -1857,7 +1873,7 @@ octo_aes_cbc_sha1_encrypt( CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[2], 2); CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[3], 3); } else { - intr_restore(s); + octeon_crypto_disable(s); dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen); return -EINVAL; } @@ -1999,7 +2015,7 @@ octo_aes_cbc_sha1_encrypt( CVMX_MF_HSH_IV(tmp1, 1); *data32 = (uint32_t) (tmp1 >> 32); - intr_restore(s); + octeon_crypto_disable(s); return 0; } @@ -2042,7 +2058,7 @@ octo_aes_cbc_sha1_decrypt( CVMX_PREFETCH0(ivp); CVMX_PREFETCH0(od->octo_enckey); - s = intr_disable(); + s = octeon_crypto_enable(); /* load AES Key */ CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[0], 0); @@ -2058,7 +2074,7 @@ octo_aes_cbc_sha1_decrypt( CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[2], 2); CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[3], 3); } else { - intr_restore(s); + octeon_crypto_disable(s); dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen); return -EINVAL; } @@ -2199,7 +2215,7 @@ octo_aes_cbc_sha1_decrypt( CVMX_MF_HSH_IV(tmp1, 1); *data32 = (uint32_t) (tmp1 >> 32); - intr_restore(s); + octeon_crypto_disable(s); return 0; } Modified: user/jmallett/octeon/sys/mips/cavium/cryptocteon/cryptocteon.c ============================================================================== --- user/jmallett/octeon/sys/mips/cavium/cryptocteon/cryptocteon.c Mon Jun 21 03:05:31 2010 (r209381) +++ user/jmallett/octeon/sys/mips/cavium/cryptocteon/cryptocteon.c Mon Jun 21 04:06:01 2010 (r209382) @@ -343,7 +343,6 @@ cryptocteon_process(device_t dev, struct struct cryptodesc *crd; struct octo_sess *od; u_int32_t lid; - struct iovec iov[UIO_MAXIOV]; size_t iovcnt, iovlen; struct mbuf *m = NULL; struct uio *uiop = NULL; @@ -444,30 +443,30 @@ cryptocteon_process(device_t dev, struct /* * setup the I/O vector to cover the buffer */ - memset(iov, 0, sizeof iov); + memset(od->octo_iov, 0, sizeof od->octo_iov); if (crp->crp_flags & CRYPTO_F_IMBUF) { iovcnt = 0; iovlen = 0; while (m != NULL) { - iov[iovcnt].iov_base = mtod(m, void *); - iov[iovcnt].iov_len = m->m_len; + od->octo_iov[iovcnt].iov_base = mtod(m, void *); + od->octo_iov[iovcnt].iov_len = m->m_len; m = m->m_next; - iovlen += iov[iovcnt++].iov_len; + iovlen += od->octo_iov[iovcnt++].iov_len; } } else if (crp->crp_flags & CRYPTO_F_IOV) { iovlen = 0; for (iovcnt = 0; iovcnt < uiop->uio_iovcnt; iovcnt++) { - iov[iovcnt].iov_base = uiop->uio_iov[iovcnt].iov_base; - iov[iovcnt].iov_len = uiop->uio_iov[iovcnt].iov_len; + od->octo_iov[iovcnt].iov_base = uiop->uio_iov[iovcnt].iov_base; + od->octo_iov[iovcnt].iov_len = uiop->uio_iov[iovcnt].iov_len; - iovlen += iov[iovcnt].iov_len; + iovlen += od->octo_iov[iovcnt].iov_len; } } else { iovlen = crp->crp_ilen; - iov[0].iov_base = crp->crp_buf; - iov[0].iov_len = crp->crp_ilen; + od->octo_iov[0].iov_base = crp->crp_buf; + od->octo_iov[0].iov_len = crp->crp_ilen; iovcnt = 1; } @@ -496,12 +495,11 @@ cryptocteon_process(device_t dev, struct if (!enccrd || (enccrd->crd_flags & CRD_F_ENCRYPT)) - (*od->octo_encrypt)(od, iov, iovcnt, iovlen, + (*od->octo_encrypt)(od, od->octo_iov, iovcnt, iovlen, auth_off, auth_len, crypt_off, crypt_len, icv_off, ivp); else - (*od->octo_decrypt)(od, iov, iovcnt, iovlen, + (*od->octo_decrypt)(od, od->octo_iov, iovcnt, iovlen, auth_off, auth_len, crypt_off, crypt_len, icv_off, ivp); - panic("%s: pass I/O vectors to encrypt/decrypt functions.", __func__); done: crypto_done(crp); Modified: user/jmallett/octeon/sys/mips/cavium/cryptocteon/cryptocteonvar.h ============================================================================== --- user/jmallett/octeon/sys/mips/cavium/cryptocteon/cryptocteonvar.h Mon Jun 21 03:05:31 2010 (r209381) +++ user/jmallett/octeon/sys/mips/cavium/cryptocteon/cryptocteonvar.h Mon Jun 21 04:06:01 2010 (r209382) @@ -55,6 +55,8 @@ struct octo_sess { uint64_t octo_hminner[3]; uint64_t octo_hmouter[3]; + + struct iovec octo_iov[UIO_MAXIOV]; }; #define dprintf(fmt, ...) \
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201006210406.o5L4616N010075>