svn commit: r209381 - user/jmallett/octeon/sys/mips/cavium/cryptocteon

Juli Mallett jmallett at FreeBSD.org
Mon Jun 21 03:05:31 UTC 2010


Author: jmallett
Date: Mon Jun 21 03:05:31 2010
New Revision: 209381
URL: http://svn.freebsd.org/changeset/base/209381

Log:
  o) We always run with COP2 access enabled, as far as I can tell, so we just
     need to disable interrupts for now for safe use of the crypto coprocessor
     within the kernel.
  
     XXX We shouldn't always have COP2 access enabled, we should trap on first
         access and enable it and do something like with fpcurthread.  I now
         have a good idea of how to handle this generically via some arrays in
         the pcpu struct, but as I only need to use COP2 in the kernel, it's
         not a priority for me to do anything that makes userland COP2 use
         work.

Modified:
  user/jmallett/octeon/sys/mips/cavium/cryptocteon/cavium_crypto.c

Modified: user/jmallett/octeon/sys/mips/cavium/cryptocteon/cavium_crypto.c
==============================================================================
--- user/jmallett/octeon/sys/mips/cavium/cryptocteon/cavium_crypto.c	Mon Jun 21 02:32:41 2010	(r209380)
+++ user/jmallett/octeon/sys/mips/cavium/cryptocteon/cavium_crypto.c	Mon Jun 21 03:05:31 2010	(r209381)
@@ -87,22 +87,6 @@ __FBSDID("$FreeBSD$");
 	    }								\
 	} while (0)
 
-/*
- * XXX
- * Not yet.
- */
-struct octeon_cop2_state {
-};
-
-static inline unsigned long octeon_crypto_enable(struct octeon_cop2_state *state)
-{
-    return (0);
-}
-
-static inline void octeon_crypto_disable(struct octeon_cop2_state *state, unsigned long flags)
-{
-}
-
 #define ESP_HEADER_LENGTH     8
 #define DES_CBC_IV_LENGTH     8
 #define AES_CBC_IV_LENGTH     16
@@ -252,15 +236,14 @@ octo_calc_hash(uint8_t auth, unsigned ch
     uint64_t *key1;
     register uint64_t xor1 = 0x3636363636363636ULL;
     register uint64_t xor2 = 0x5c5c5c5c5c5c5c5cULL;
-    struct octeon_cop2_state state;
-    unsigned long flags;
+    register_t s;
 
     dprintf("%s()\n", __func__);
 
     memset(hash_key, 0, sizeof(hash_key));
     memcpy(hash_key, (uint8_t *) key, (auth ? 20 : 16));
     key1 = (uint64_t *) hash_key;
-    flags = octeon_crypto_enable(&state);
+    s = intr_disable();
     if (auth) {
        CVMX_MT_HSH_IV(0x67452301EFCDAB89ULL, 0);
        CVMX_MT_HSH_IV(0x98BADCFE10325476ULL, 1);
@@ -333,7 +316,7 @@ octo_calc_hash(uint8_t auth, unsigned ch
       outer[2] = 0;
       CVMX_MF_HSH_IV(outer[2], 2);
     }
-    octeon_crypto_disable(&state, flags);
+    intr_restore(s);
     return;
 }
 
@@ -350,8 +333,7 @@ octo_des_cbc_encrypt(
 {
     uint64_t *data;
     int data_i, data_l;
-    struct octeon_cop2_state state;
-    unsigned long flags;
+    register_t s;
 
     dprintf("%s()\n", __func__);
 
@@ -369,7 +351,7 @@ octo_des_cbc_encrypt(
     CVMX_PREFETCH0(ivp);
     CVMX_PREFETCH0(od->octo_enckey);
 
-    flags = octeon_crypto_enable(&state);
+    s = intr_disable();
 
     /* load 3DES Key */
     CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 0);
@@ -380,7 +362,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 {
-	octeon_crypto_disable(&state, flags);
+	intr_restore(s);
 	dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen);
 	return -EINVAL;
     }
@@ -399,7 +381,7 @@ octo_des_cbc_encrypt(
 	crypt_len -= 8;
     }
 
-    octeon_crypto_disable(&state, flags);
+    intr_restore(s);
     return 0;
 }
 
@@ -414,8 +396,7 @@ octo_des_cbc_decrypt(
 {
     uint64_t *data;
     int data_i, data_l;
-    struct octeon_cop2_state state;
-    unsigned long flags;
+    register_t s;
 
     dprintf("%s()\n", __func__);
 
@@ -433,7 +414,7 @@ octo_des_cbc_decrypt(
     CVMX_PREFETCH0(ivp);
     CVMX_PREFETCH0(od->octo_enckey);
 
-    flags = octeon_crypto_enable(&state);
+    s = intr_disable();
 
     /* load 3DES Key */
     CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 0);
@@ -444,7 +425,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 {
-	octeon_crypto_disable(&state, flags);
+	intr_restore(s);
 	dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen);
 	return -EINVAL;
     }
@@ -463,7 +444,7 @@ octo_des_cbc_decrypt(
 	crypt_len -= 8;
     }
 
-    octeon_crypto_disable(&state, flags);
+    intr_restore(s);
     return 0;
 }
 
@@ -480,8 +461,7 @@ octo_aes_cbc_encrypt(
 {
     uint64_t *data, *pdata;
     int data_i, data_l;
-    struct octeon_cop2_state state;
-    unsigned long flags;
+    register_t s;
 
     dprintf("%s()\n", __func__);
 
@@ -499,7 +479,7 @@ octo_aes_cbc_encrypt(
     CVMX_PREFETCH0(ivp);
     CVMX_PREFETCH0(od->octo_enckey);
 
-    flags = octeon_crypto_enable(&state);
+    s = intr_disable();
 
     /* load AES Key */
     CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[0], 0);
@@ -515,7 +495,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 {
-	octeon_crypto_disable(&state, flags);
+	intr_restore(s);
 	dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen);
 	return -EINVAL;
     }
@@ -540,7 +520,7 @@ octo_aes_cbc_encrypt(
 	crypt_len -= 16;
     }
 
-    octeon_crypto_disable(&state, flags);
+    intr_restore(s);
     return 0;
 }
 
@@ -555,8 +535,7 @@ octo_aes_cbc_decrypt(
 {
     uint64_t *data, *pdata;
     int data_i, data_l;
-    struct octeon_cop2_state state;
-    unsigned long flags;
+    register_t s;
 
     dprintf("%s()\n", __func__);
 
@@ -574,7 +553,7 @@ octo_aes_cbc_decrypt(
     CVMX_PREFETCH0(ivp);
     CVMX_PREFETCH0(od->octo_enckey);
 
-    flags = octeon_crypto_enable(&state);
+    s = intr_disable();
 
     /* load AES Key */
     CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[0], 0);
@@ -590,7 +569,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 {
-	octeon_crypto_disable(&state, flags);
+	intr_restore(s);
 	dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen);
 	return -EINVAL;
     }
@@ -615,7 +594,7 @@ octo_aes_cbc_decrypt(
 	crypt_len -= 16;
     }
 
-    octeon_crypto_disable(&state, flags);
+    intr_restore(s);
     return 0;
 }
 
@@ -634,8 +613,7 @@ octo_null_md5_encrypt(
     uint64_t *data;
     uint64_t tmp1, tmp2;
     int data_i, data_l, alen = auth_len;
-    struct octeon_cop2_state state;
-    unsigned long flags;
+    register_t s;
 
     dprintf("%s()\n", __func__);
 
@@ -650,7 +628,7 @@ octo_null_md5_encrypt(
 
     IOV_INIT(iov, data, data_i, data_l);
 
-    flags = octeon_crypto_enable(&state);
+    s = intr_disable();
 
     /* Load MD5 IV */
     CVMX_MT_HSH_IV(od->octo_hminner[0], 0);
@@ -722,7 +700,7 @@ octo_null_md5_encrypt(
     CVMX_MF_HSH_IV(tmp1, 1);
     *(uint32_t *)data = (uint32_t) (tmp1 >> 32);
 
-    octeon_crypto_disable(&state, flags);
+    intr_restore(s);
     return 0;
 }
 
@@ -741,8 +719,7 @@ octo_null_sha1_encrypt(
     uint64_t *data;
     uint64_t tmp1, tmp2, tmp3;
     int data_i, data_l, alen = auth_len;
-    struct octeon_cop2_state state;
-    unsigned long flags;
+    register_t s;
 
     dprintf("%s()\n", __func__);
 
@@ -757,7 +734,7 @@ octo_null_sha1_encrypt(
 
     IOV_INIT(iov, data, data_i, data_l);
 
-    flags = octeon_crypto_enable(&state);
+    s = intr_disable();
 
     /* Load SHA1 IV */
     CVMX_MT_HSH_IV(od->octo_hminner[0], 0);
@@ -832,7 +809,7 @@ octo_null_sha1_encrypt(
     CVMX_MF_HSH_IV(tmp1, 1);
     *(uint32_t *)data = (uint32_t) (tmp1 >> 32);
 
-    octeon_crypto_disable(&state, flags);
+    intr_restore(s);
     return 0;
 }
 
@@ -856,8 +833,7 @@ octo_des_cbc_md5_encrypt(
     uint32_t *data32;
     uint64_t tmp1, tmp2;
     int data_i, data_l, alen = auth_len;
-    struct octeon_cop2_state state;
-    unsigned long flags;
+    register_t s;
 
     dprintf("%s()\n", __func__);
 
@@ -878,7 +854,7 @@ octo_des_cbc_md5_encrypt(
     CVMX_PREFETCH0(ivp);
     CVMX_PREFETCH0(od->octo_enckey);
 
-    flags = octeon_crypto_enable(&state);
+    s = intr_disable();
 
     /* load 3DES Key */
     CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 0);
@@ -889,7 +865,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 {
-	octeon_crypto_disable(&state, flags);
+	intr_restore(s);
 	dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen);
 	return -EINVAL;
     }
@@ -989,7 +965,7 @@ octo_des_cbc_md5_encrypt(
     CVMX_MF_HSH_IV(tmp1, 1);
     *data32 = (uint32_t) (tmp1 >> 32);
 
-    octeon_crypto_disable(&state, flags);
+    intr_restore(s);
     return 0;
 }
 
@@ -1010,8 +986,7 @@ octo_des_cbc_md5_decrypt(
     uint32_t *data32;
     uint64_t tmp1, tmp2;
     int data_i, data_l, alen = auth_len;
-    struct octeon_cop2_state state;
-    unsigned long flags;
+    register_t s;
 
     dprintf("%s()\n", __func__);
 
@@ -1032,7 +1007,7 @@ octo_des_cbc_md5_decrypt(
     CVMX_PREFETCH0(ivp);
     CVMX_PREFETCH0(od->octo_enckey);
 
-    flags = octeon_crypto_enable(&state);
+    s = intr_disable();
 
     /* load 3DES Key */
     CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 0);
@@ -1043,7 +1018,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 {
-	octeon_crypto_disable(&state, flags);
+	intr_restore(s);
 	dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen);
 	return -EINVAL;
     }
@@ -1143,7 +1118,7 @@ octo_des_cbc_md5_decrypt(
     CVMX_MF_HSH_IV(tmp1, 1);
     *data32 = (uint32_t) (tmp1 >> 32);
 
-    octeon_crypto_disable(&state, flags);
+    intr_restore(s);
     return 0;
 }
 
@@ -1167,8 +1142,7 @@ octo_des_cbc_sha1_encrypt(
     uint32_t *data32;
     uint64_t tmp1, tmp2, tmp3;
     int data_i, data_l, alen = auth_len;
-    struct octeon_cop2_state state;
-    unsigned long flags;
+    register_t s;
 
     dprintf("%s()\n", __func__);
 
@@ -1189,7 +1163,7 @@ octo_des_cbc_sha1_encrypt(
     CVMX_PREFETCH0(ivp);
     CVMX_PREFETCH0(od->octo_enckey);
 
-    flags = octeon_crypto_enable(&state);
+    s = intr_disable();
 
     /* load 3DES Key */
     CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 0);
@@ -1200,7 +1174,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 {
-	octeon_crypto_disable(&state, flags);
+	intr_restore(s);
 	dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen);
 	return -EINVAL;
     }
@@ -1303,7 +1277,7 @@ octo_des_cbc_sha1_encrypt(
     CVMX_MF_HSH_IV(tmp1, 1);
     *data32 = (uint32_t) (tmp1 >> 32);
 
-    octeon_crypto_disable(&state, flags);
+    intr_restore(s);
     return 0;
 }
 
@@ -1324,8 +1298,7 @@ octo_des_cbc_sha1_decrypt(
     uint32_t *data32;
     uint64_t tmp1, tmp2, tmp3;
     int data_i, data_l, alen = auth_len;
-    struct octeon_cop2_state state;
-    unsigned long flags;
+    register_t s;
 
     dprintf("%s()\n", __func__);
 
@@ -1346,7 +1319,7 @@ octo_des_cbc_sha1_decrypt(
     CVMX_PREFETCH0(ivp);
     CVMX_PREFETCH0(od->octo_enckey);
 
-    flags = octeon_crypto_enable(&state);
+    s = intr_disable();
 
     /* load 3DES Key */
     CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 0);
@@ -1357,7 +1330,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 {
-	octeon_crypto_disable(&state, flags);
+	intr_restore(s);
 	dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen);
 	return -EINVAL;
     }
@@ -1459,7 +1432,7 @@ octo_des_cbc_sha1_decrypt(
     CVMX_MF_HSH_IV(tmp1, 1);
     *data32 = (uint32_t) (tmp1 >> 32);
 
-    octeon_crypto_disable(&state, flags);
+    intr_restore(s);
     return 0;
 }
 
@@ -1484,8 +1457,7 @@ octo_aes_cbc_md5_encrypt(
     uint32_t *data32;
     uint64_t tmp1, tmp2;
     int data_i, data_l, alen = auth_len;
-    struct octeon_cop2_state state;
-    unsigned long flags;
+    register_t s;
 
     dprintf("%s()\n", __func__);
 
@@ -1506,7 +1478,7 @@ octo_aes_cbc_md5_encrypt(
     CVMX_PREFETCH0(ivp);
     CVMX_PREFETCH0(od->octo_enckey);
 
-    flags = octeon_crypto_enable(&state);
+    s = intr_disable();
 
     /* load AES Key */
     CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[0], 0);
@@ -1522,7 +1494,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 {
-	octeon_crypto_disable(&state, flags);
+	intr_restore(s);
 	dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen);
 	return -EINVAL;
     }
@@ -1645,7 +1617,7 @@ octo_aes_cbc_md5_encrypt(
     CVMX_MF_HSH_IV(tmp1, 1);
     *data32 = (uint32_t) (tmp1 >> 32);
 
-    octeon_crypto_disable(&state, flags);
+    intr_restore(s);
     return 0;
 }
 
@@ -1667,8 +1639,7 @@ octo_aes_cbc_md5_decrypt(
     uint32_t *data32;
     uint64_t tmp1, tmp2;
     int data_i, data_l, alen = auth_len;
-    struct octeon_cop2_state state;
-    unsigned long flags;
+    register_t s;
 
     dprintf("%s()\n", __func__);
 
@@ -1689,7 +1660,7 @@ octo_aes_cbc_md5_decrypt(
     CVMX_PREFETCH0(ivp);
     CVMX_PREFETCH0(od->octo_enckey);
 
-    flags = octeon_crypto_enable(&state);
+    s = intr_disable();
 
     /* load AES Key */
     CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[0], 0);
@@ -1705,7 +1676,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 {
-	octeon_crypto_disable(&state, flags);
+	intr_restore(s);
 	dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen);
 	return -EINVAL;
     }
@@ -1824,7 +1795,7 @@ octo_aes_cbc_md5_decrypt(
     CVMX_MF_HSH_IV(tmp1, 1);
     *data32 = (uint32_t) (tmp1 >> 32);
 
-    octeon_crypto_disable(&state, flags);
+    intr_restore(s);
     return 0;
 }
 
@@ -1849,8 +1820,7 @@ octo_aes_cbc_sha1_encrypt(
     uint32_t *data32;
     uint64_t tmp1, tmp2, tmp3;
     int data_i, data_l, alen = auth_len;
-    struct octeon_cop2_state state;
-    unsigned long flags;
+    register_t s;
 
     dprintf("%s()\n", __func__);
 
@@ -1871,7 +1841,7 @@ octo_aes_cbc_sha1_encrypt(
     CVMX_PREFETCH0(ivp);
     CVMX_PREFETCH0(od->octo_enckey);
 
-    flags = octeon_crypto_enable(&state);
+    s = intr_disable();
 
     /* load AES Key */
     CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[0], 0);
@@ -1887,7 +1857,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 {
-	octeon_crypto_disable(&state, flags);
+	intr_restore(s);
 	dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen);
 	return -EINVAL;
     }
@@ -2029,7 +1999,7 @@ octo_aes_cbc_sha1_encrypt(
     CVMX_MF_HSH_IV(tmp1, 1);
     *data32 = (uint32_t) (tmp1 >> 32);
 
-    octeon_crypto_disable(&state, flags);
+    intr_restore(s);
     return 0;
 }
 
@@ -2051,8 +2021,7 @@ octo_aes_cbc_sha1_decrypt(
     uint32_t *data32;
     uint64_t tmp1, tmp2, tmp3;
     int data_i, data_l, alen = auth_len;
-    struct octeon_cop2_state state;
-    unsigned long flags;
+    register_t s;
 
     dprintf("%s()\n", __func__);
 
@@ -2073,7 +2042,7 @@ octo_aes_cbc_sha1_decrypt(
     CVMX_PREFETCH0(ivp);
     CVMX_PREFETCH0(od->octo_enckey);
 
-    flags = octeon_crypto_enable(&state);
+    s = intr_disable();
 
     /* load AES Key */
     CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[0], 0);
@@ -2089,7 +2058,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 {
-	octeon_crypto_disable(&state, flags);
+	intr_restore(s);
 	dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen);
 	return -EINVAL;
     }
@@ -2230,7 +2199,7 @@ octo_aes_cbc_sha1_decrypt(
     CVMX_MF_HSH_IV(tmp1, 1);
     *data32 = (uint32_t) (tmp1 >> 32);
 
-    octeon_crypto_disable(&state, flags);
+    intr_restore(s);
     return 0;
 }
 


More information about the svn-src-user mailing list