Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 6 Jan 2012 01:23:26 +0000 (UTC)
From:      Oleksandr Tymoshenko <gonzo@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r229677 - in head/sys/mips: cavium cavium/cryptocteon include mips
Message-ID:  <201201060123.q061NQoM065373@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: gonzo
Date: Fri Jan  6 01:23:26 2012
New Revision: 229677
URL: http://svn.freebsd.org/changeset/base/229677

Log:
  - Add better COP2 (crypto coprocessor) context handler for Octeon. Keep
      COP2 disabled and lazily allocate COP2 context structure in exception
      handler. Keep kernel and userland contexts separated.

Added:
  head/sys/mips/cavium/octeon_cop2.S   (contents, props changed)
  head/sys/mips/cavium/octeon_cop2.h   (contents, props changed)
  head/sys/mips/include/octeon_cop2.h   (contents, props changed)
  head/sys/mips/mips/octeon_cop2.c   (contents, props changed)
  head/sys/mips/mips/octeon_cop2_swtch.S   (contents, props changed)
Modified:
  head/sys/mips/cavium/cryptocteon/cavium_crypto.c
  head/sys/mips/cavium/files.octeon1
  head/sys/mips/include/cpuregs.h
  head/sys/mips/include/frame.h
  head/sys/mips/include/proc.h
  head/sys/mips/mips/exception.S
  head/sys/mips/mips/genassym.c
  head/sys/mips/mips/locore.S
  head/sys/mips/mips/pm_machdep.c
  head/sys/mips/mips/swtch.S
  head/sys/mips/mips/trap.c
  head/sys/mips/mips/vm_machdep.c

Modified: head/sys/mips/cavium/cryptocteon/cavium_crypto.c
==============================================================================
--- head/sys/mips/cavium/cryptocteon/cavium_crypto.c	Fri Jan  6 01:20:48 2012	(r229676)
+++ head/sys/mips/cavium/cryptocteon/cavium_crypto.c	Fri Jan  6 01:23:26 2012	(r229677)
@@ -87,22 +87,6 @@ __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
@@ -252,14 +236,12 @@ octo_calc_hash(uint8_t auth, unsigned ch
     uint64_t *key1;
     register uint64_t xor1 = 0x3636363636363636ULL;
     register uint64_t xor2 = 0x5c5c5c5c5c5c5c5cULL;
-    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;
-    s = octeon_crypto_enable();
     if (auth) {
        CVMX_MT_HSH_IV(0x67452301EFCDAB89ULL, 0);
        CVMX_MT_HSH_IV(0x98BADCFE10325476ULL, 1);
@@ -332,7 +314,6 @@ octo_calc_hash(uint8_t auth, unsigned ch
       outer[2] = 0;
       CVMX_MF_HSH_IV(outer[2], 2);
     }
-    octeon_crypto_disable(s);
     return;
 }
 
@@ -349,7 +330,6 @@ octo_des_cbc_encrypt(
 {
     uint64_t *data;
     int data_i, data_l;
-    register_t s;
 
     dprintf("%s()\n", __func__);
 
@@ -367,7 +347,6 @@ octo_des_cbc_encrypt(
     CVMX_PREFETCH0(ivp);
     CVMX_PREFETCH0(od->octo_enckey);
 
-    s = octeon_crypto_enable();
 
     /* load 3DES Key */
     CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 0);
@@ -378,7 +357,6 @@ 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(s);
 	dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen);
 	return -EINVAL;
     }
@@ -397,7 +375,6 @@ octo_des_cbc_encrypt(
 	crypt_len -= 8;
     }
 
-    octeon_crypto_disable(s);
     return 0;
 }
 
@@ -412,7 +389,6 @@ octo_des_cbc_decrypt(
 {
     uint64_t *data;
     int data_i, data_l;
-    register_t s;
 
     dprintf("%s()\n", __func__);
 
@@ -430,8 +406,6 @@ octo_des_cbc_decrypt(
     CVMX_PREFETCH0(ivp);
     CVMX_PREFETCH0(od->octo_enckey);
 
-    s = octeon_crypto_enable();
-
     /* load 3DES Key */
     CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 0);
     if (od->octo_encklen == 24) {
@@ -441,7 +415,6 @@ 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(s);
 	dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen);
 	return -EINVAL;
     }
@@ -460,7 +433,6 @@ octo_des_cbc_decrypt(
 	crypt_len -= 8;
     }
 
-    octeon_crypto_disable(s);
     return 0;
 }
 
@@ -477,7 +449,6 @@ octo_aes_cbc_encrypt(
 {
     uint64_t *data, *pdata;
     int data_i, data_l;
-    register_t s;
 
     dprintf("%s()\n", __func__);
 
@@ -495,8 +466,6 @@ octo_aes_cbc_encrypt(
     CVMX_PREFETCH0(ivp);
     CVMX_PREFETCH0(od->octo_enckey);
 
-    s = octeon_crypto_enable();
-
     /* load AES Key */
     CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[0], 0);
     CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[1], 1);
@@ -511,7 +480,6 @@ 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(s);
 	dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen);
 	return -EINVAL;
     }
@@ -536,7 +504,6 @@ octo_aes_cbc_encrypt(
 	crypt_len -= 16;
     }
 
-    octeon_crypto_disable(s);
     return 0;
 }
 
@@ -551,7 +518,6 @@ octo_aes_cbc_decrypt(
 {
     uint64_t *data, *pdata;
     int data_i, data_l;
-    register_t s;
 
     dprintf("%s()\n", __func__);
 
@@ -569,8 +535,6 @@ octo_aes_cbc_decrypt(
     CVMX_PREFETCH0(ivp);
     CVMX_PREFETCH0(od->octo_enckey);
 
-    s = octeon_crypto_enable();
-
     /* load AES Key */
     CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[0], 0);
     CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[1], 1);
@@ -585,7 +549,6 @@ 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(s);
 	dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen);
 	return -EINVAL;
     }
@@ -610,7 +573,6 @@ octo_aes_cbc_decrypt(
 	crypt_len -= 16;
     }
 
-    octeon_crypto_disable(s);
     return 0;
 }
 
@@ -629,7 +591,6 @@ octo_null_md5_encrypt(
     uint64_t *data;
     uint64_t tmp1, tmp2;
     int data_i, data_l, alen = auth_len;
-    register_t s;
 
     dprintf("%s()\n", __func__);
 
@@ -644,8 +605,6 @@ octo_null_md5_encrypt(
 
     IOV_INIT(iov, data, data_i, data_l);
 
-    s = octeon_crypto_enable();
-
     /* Load MD5 IV */
     CVMX_MT_HSH_IV(od->octo_hminner[0], 0);
     CVMX_MT_HSH_IV(od->octo_hminner[1], 1);
@@ -716,7 +675,6 @@ octo_null_md5_encrypt(
     CVMX_MF_HSH_IV(tmp1, 1);
     *(uint32_t *)data = (uint32_t) (tmp1 >> 32);
 
-    octeon_crypto_disable(s);
     return 0;
 }
 
@@ -735,7 +693,6 @@ octo_null_sha1_encrypt(
     uint64_t *data;
     uint64_t tmp1, tmp2, tmp3;
     int data_i, data_l, alen = auth_len;
-    register_t s;
 
     dprintf("%s()\n", __func__);
 
@@ -750,8 +707,6 @@ octo_null_sha1_encrypt(
 
     IOV_INIT(iov, data, data_i, data_l);
 
-    s = octeon_crypto_enable();
-
     /* Load SHA1 IV */
     CVMX_MT_HSH_IV(od->octo_hminner[0], 0);
     CVMX_MT_HSH_IV(od->octo_hminner[1], 1);
@@ -825,7 +780,6 @@ octo_null_sha1_encrypt(
     CVMX_MF_HSH_IV(tmp1, 1);
     *(uint32_t *)data = (uint32_t) (tmp1 >> 32);
 
-    octeon_crypto_disable(s);
     return 0;
 }
 
@@ -849,7 +803,6 @@ octo_des_cbc_md5_encrypt(
     uint32_t *data32;
     uint64_t tmp1, tmp2;
     int data_i, data_l, alen = auth_len;
-    register_t s;
 
     dprintf("%s()\n", __func__);
 
@@ -870,8 +823,6 @@ octo_des_cbc_md5_encrypt(
     CVMX_PREFETCH0(ivp);
     CVMX_PREFETCH0(od->octo_enckey);
 
-    s = octeon_crypto_enable();
-
     /* load 3DES Key */
     CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 0);
     if (od->octo_encklen == 24) {
@@ -881,7 +832,6 @@ 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(s);
 	dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen);
 	return -EINVAL;
     }
@@ -981,7 +931,6 @@ octo_des_cbc_md5_encrypt(
     CVMX_MF_HSH_IV(tmp1, 1);
     *data32 = (uint32_t) (tmp1 >> 32);
 
-    octeon_crypto_disable(s);
     return 0;
 }
 
@@ -1002,7 +951,6 @@ octo_des_cbc_md5_decrypt(
     uint32_t *data32;
     uint64_t tmp1, tmp2;
     int data_i, data_l, alen = auth_len;
-    register_t s;
 
     dprintf("%s()\n", __func__);
 
@@ -1023,8 +971,6 @@ octo_des_cbc_md5_decrypt(
     CVMX_PREFETCH0(ivp);
     CVMX_PREFETCH0(od->octo_enckey);
 
-    s = octeon_crypto_enable();
-
     /* load 3DES Key */
     CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 0);
     if (od->octo_encklen == 24) {
@@ -1034,7 +980,6 @@ 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(s);
 	dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen);
 	return -EINVAL;
     }
@@ -1134,7 +1079,6 @@ octo_des_cbc_md5_decrypt(
     CVMX_MF_HSH_IV(tmp1, 1);
     *data32 = (uint32_t) (tmp1 >> 32);
 
-    octeon_crypto_disable(s);
     return 0;
 }
 
@@ -1158,7 +1102,6 @@ octo_des_cbc_sha1_encrypt(
     uint32_t *data32;
     uint64_t tmp1, tmp2, tmp3;
     int data_i, data_l, alen = auth_len;
-    register_t s;
 
     dprintf("%s()\n", __func__);
 
@@ -1179,8 +1122,6 @@ octo_des_cbc_sha1_encrypt(
     CVMX_PREFETCH0(ivp);
     CVMX_PREFETCH0(od->octo_enckey);
 
-    s = octeon_crypto_enable();
-
     /* load 3DES Key */
     CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 0);
     if (od->octo_encklen == 24) {
@@ -1190,7 +1131,6 @@ 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(s);
 	dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen);
 	return -EINVAL;
     }
@@ -1293,7 +1233,6 @@ octo_des_cbc_sha1_encrypt(
     CVMX_MF_HSH_IV(tmp1, 1);
     *data32 = (uint32_t) (tmp1 >> 32);
 
-    octeon_crypto_disable(s);
     return 0;
 }
 
@@ -1314,7 +1253,6 @@ octo_des_cbc_sha1_decrypt(
     uint32_t *data32;
     uint64_t tmp1, tmp2, tmp3;
     int data_i, data_l, alen = auth_len;
-    register_t s;
 
     dprintf("%s()\n", __func__);
 
@@ -1335,8 +1273,6 @@ octo_des_cbc_sha1_decrypt(
     CVMX_PREFETCH0(ivp);
     CVMX_PREFETCH0(od->octo_enckey);
 
-    s = octeon_crypto_enable();
-
     /* load 3DES Key */
     CVMX_MT_3DES_KEY(((uint64_t *) od->octo_enckey)[0], 0);
     if (od->octo_encklen == 24) {
@@ -1346,7 +1282,6 @@ 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(s);
 	dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen);
 	return -EINVAL;
     }
@@ -1448,7 +1383,6 @@ octo_des_cbc_sha1_decrypt(
     CVMX_MF_HSH_IV(tmp1, 1);
     *data32 = (uint32_t) (tmp1 >> 32);
 
-    octeon_crypto_disable(s);
     return 0;
 }
 
@@ -1473,7 +1407,6 @@ octo_aes_cbc_md5_encrypt(
     uint32_t *data32;
     uint64_t tmp1, tmp2;
     int data_i, data_l, alen = auth_len;
-    register_t s;
 
     dprintf("%s()\n", __func__);
 
@@ -1494,8 +1427,6 @@ octo_aes_cbc_md5_encrypt(
     CVMX_PREFETCH0(ivp);
     CVMX_PREFETCH0(od->octo_enckey);
 
-    s = octeon_crypto_enable();
-
     /* load AES Key */
     CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[0], 0);
     CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[1], 1);
@@ -1510,7 +1441,6 @@ 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(s);
 	dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen);
 	return -EINVAL;
     }
@@ -1633,7 +1563,6 @@ octo_aes_cbc_md5_encrypt(
     CVMX_MF_HSH_IV(tmp1, 1);
     *data32 = (uint32_t) (tmp1 >> 32);
 
-    octeon_crypto_disable(s);
     return 0;
 }
 
@@ -1655,7 +1584,6 @@ octo_aes_cbc_md5_decrypt(
     uint32_t *data32;
     uint64_t tmp1, tmp2;
     int data_i, data_l, alen = auth_len;
-    register_t s;
 
     dprintf("%s()\n", __func__);
 
@@ -1676,8 +1604,6 @@ octo_aes_cbc_md5_decrypt(
     CVMX_PREFETCH0(ivp);
     CVMX_PREFETCH0(od->octo_enckey);
 
-    s = octeon_crypto_enable();
-
     /* load AES Key */
     CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[0], 0);
     CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[1], 1);
@@ -1692,7 +1618,6 @@ 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(s);
 	dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen);
 	return -EINVAL;
     }
@@ -1811,7 +1736,6 @@ octo_aes_cbc_md5_decrypt(
     CVMX_MF_HSH_IV(tmp1, 1);
     *data32 = (uint32_t) (tmp1 >> 32);
 
-    octeon_crypto_disable(s);
     return 0;
 }
 
@@ -1836,7 +1760,6 @@ octo_aes_cbc_sha1_encrypt(
     uint32_t *data32;
     uint64_t tmp1, tmp2, tmp3;
     int data_i, data_l, alen = auth_len;
-    register_t s;
 
     dprintf("%s()\n", __func__);
 
@@ -1857,8 +1780,6 @@ octo_aes_cbc_sha1_encrypt(
     CVMX_PREFETCH0(ivp);
     CVMX_PREFETCH0(od->octo_enckey);
 
-    s = octeon_crypto_enable();
-
     /* load AES Key */
     CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[0], 0);
     CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[1], 1);
@@ -1873,7 +1794,6 @@ 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(s);
 	dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen);
 	return -EINVAL;
     }
@@ -2015,7 +1935,6 @@ octo_aes_cbc_sha1_encrypt(
     CVMX_MF_HSH_IV(tmp1, 1);
     *data32 = (uint32_t) (tmp1 >> 32);
 
-    octeon_crypto_disable(s);
     return 0;
 }
 
@@ -2037,7 +1956,6 @@ octo_aes_cbc_sha1_decrypt(
     uint32_t *data32;
     uint64_t tmp1, tmp2, tmp3;
     int data_i, data_l, alen = auth_len;
-    register_t s;
 
     dprintf("%s()\n", __func__);
 
@@ -2058,8 +1976,6 @@ octo_aes_cbc_sha1_decrypt(
     CVMX_PREFETCH0(ivp);
     CVMX_PREFETCH0(od->octo_enckey);
 
-    s = octeon_crypto_enable();
-
     /* load AES Key */
     CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[0], 0);
     CVMX_MT_AES_KEY(((uint64_t *) od->octo_enckey)[1], 1);
@@ -2074,7 +1990,6 @@ 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(s);
 	dprintf("%s: Bad key length %d\n", __func__, od->octo_encklen);
 	return -EINVAL;
     }
@@ -2215,7 +2130,6 @@ octo_aes_cbc_sha1_decrypt(
     CVMX_MF_HSH_IV(tmp1, 1);
     *data32 = (uint32_t) (tmp1 >> 32);
 
-    octeon_crypto_disable(s);
     return 0;
 }
 

Modified: head/sys/mips/cavium/files.octeon1
==============================================================================
--- head/sys/mips/cavium/files.octeon1	Fri Jan  6 01:20:48 2012	(r229676)
+++ head/sys/mips/cavium/files.octeon1	Fri Jan  6 01:23:26 2012	(r229677)
@@ -21,6 +21,8 @@ mips/cavium/octeon_nmi.S			optional octe
 
 mips/cavium/cryptocteon/cavium_crypto.c		optional cryptocteon
 mips/cavium/cryptocteon/cryptocteon.c		optional cryptocteon
+mips/mips/octeon_cop2_swtch.S			standard
+mips/mips/octeon_cop2.c				standard
 
 mips/cavium/octe/ethernet.c			optional octe
 mips/cavium/octe/ethernet-mv88e61xx.c		optional octe octeon_vendor_lanner

Added: head/sys/mips/cavium/octeon_cop2.S
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/mips/cavium/octeon_cop2.S	Fri Jan  6 01:23:26 2012	(r229677)
@@ -0,0 +1,225 @@
+/*-
+ * Copyright (c) 2011 Oleksandr Tymoshenko
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF 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$
+ */
+
+#include <machine/asm.h>
+#include <mips/cavium/octeon_cop2.h>
+
+#include "assym.s"
+
+.set noreorder
+
+#define SAVE_COP2_REGISTER(reg)				\
+	dmfc2	t1, reg; sd	t1, reg##_OFFSET(a0)
+
+
+#define RESTORE_COP2_REGISTER(reg)			\
+	ld	t1, reg##_OFFSET(a0); dmtc2	t1, reg##_SET
+ 
+LEAF(octeon_cop2_save)
+	/* Get CvmCtl register */
+	dmfc0	t0, $9, 7
+
+	/* CRC state */
+	SAVE_COP2_REGISTER(COP2_CRC_IV)
+	SAVE_COP2_REGISTER(COP2_CRC_LENGTH)
+	SAVE_COP2_REGISTER(COP2_CRC_POLY)
+
+	/* if CvmCtl[NODFA_CP2] -> save_nodfa */
+	bbit1	t0, 28, save_nodfa
+	nop
+
+	/* LLM state */
+	SAVE_COP2_REGISTER(COP2_LLM_DAT0)
+	SAVE_COP2_REGISTER(COP2_LLM_DAT1)
+
+save_nodfa:
+	/* crypto stuff is irrelevant if CvmCtl[NOCRYPTO]  */
+	bbit1	t0, 26, save_done
+	nop
+
+	SAVE_COP2_REGISTER(COP2_3DES_IV)
+	SAVE_COP2_REGISTER(COP2_3DES_KEY0)
+	SAVE_COP2_REGISTER(COP2_3DES_KEY1)
+	SAVE_COP2_REGISTER(COP2_3DES_KEY2)
+	SAVE_COP2_REGISTER(COP2_3DES_RESULT)
+
+	SAVE_COP2_REGISTER(COP2_AES_INP0)
+	SAVE_COP2_REGISTER(COP2_AES_IV0)
+	SAVE_COP2_REGISTER(COP2_AES_IV1)
+	SAVE_COP2_REGISTER(COP2_AES_KEY0)
+	SAVE_COP2_REGISTER(COP2_AES_KEY1)
+	SAVE_COP2_REGISTER(COP2_AES_KEY2)
+	SAVE_COP2_REGISTER(COP2_AES_KEY3)
+	SAVE_COP2_REGISTER(COP2_AES_KEYLEN)
+	SAVE_COP2_REGISTER(COP2_AES_RESULT0)
+	SAVE_COP2_REGISTER(COP2_AES_RESULT1)
+
+	dmfc0	t0, $15
+	li	t1, 0x000d0000 /* Octeon Pass1 */
+	beq	t0, t1, save_pass1
+	nop
+
+	SAVE_COP2_REGISTER(COP2_HSH_DATW0)
+	SAVE_COP2_REGISTER(COP2_HSH_DATW1)
+	SAVE_COP2_REGISTER(COP2_HSH_DATW2)
+	SAVE_COP2_REGISTER(COP2_HSH_DATW3)
+	SAVE_COP2_REGISTER(COP2_HSH_DATW4)
+	SAVE_COP2_REGISTER(COP2_HSH_DATW5)
+	SAVE_COP2_REGISTER(COP2_HSH_DATW6)
+	SAVE_COP2_REGISTER(COP2_HSH_DATW7)
+	SAVE_COP2_REGISTER(COP2_HSH_DATW8)
+	SAVE_COP2_REGISTER(COP2_HSH_DATW9)
+	SAVE_COP2_REGISTER(COP2_HSH_DATW10)
+	SAVE_COP2_REGISTER(COP2_HSH_DATW11)
+	SAVE_COP2_REGISTER(COP2_HSH_DATW12)
+	SAVE_COP2_REGISTER(COP2_HSH_DATW13)
+	SAVE_COP2_REGISTER(COP2_HSH_DATW14)
+	SAVE_COP2_REGISTER(COP2_HSH_IVW0)
+	SAVE_COP2_REGISTER(COP2_HSH_IVW1)
+	SAVE_COP2_REGISTER(COP2_HSH_IVW2)
+	SAVE_COP2_REGISTER(COP2_HSH_IVW3)
+	SAVE_COP2_REGISTER(COP2_HSH_IVW4)
+	SAVE_COP2_REGISTER(COP2_HSH_IVW5)
+	SAVE_COP2_REGISTER(COP2_HSH_IVW6)
+	SAVE_COP2_REGISTER(COP2_HSH_IVW7)
+	SAVE_COP2_REGISTER(COP2_GFM_MULT0)
+	SAVE_COP2_REGISTER(COP2_GFM_MULT1)
+	SAVE_COP2_REGISTER(COP2_GFM_POLY)
+	SAVE_COP2_REGISTER(COP2_GFM_RESULT0)
+	SAVE_COP2_REGISTER(COP2_GFM_RESULT1)
+	jr ra
+	nop
+
+save_pass1:
+	SAVE_COP2_REGISTER(COP2_HSH_DATW0_PASS1)
+	SAVE_COP2_REGISTER(COP2_HSH_DATW1_PASS1)
+	SAVE_COP2_REGISTER(COP2_HSH_DATW2_PASS1)
+	SAVE_COP2_REGISTER(COP2_HSH_DATW3_PASS1)
+	SAVE_COP2_REGISTER(COP2_HSH_DATW4_PASS1)
+	SAVE_COP2_REGISTER(COP2_HSH_DATW5_PASS1)
+	SAVE_COP2_REGISTER(COP2_HSH_DATW6_PASS1)
+	SAVE_COP2_REGISTER(COP2_HSH_IVW0_PASS1)
+	SAVE_COP2_REGISTER(COP2_HSH_IVW1_PASS1)
+	SAVE_COP2_REGISTER(COP2_HSH_IVW2_PASS1)
+
+save_done:	
+	jr ra
+	nop
+END(octeon_cop2_save)
+
+LEAF(octeon_cop2_restore)
+	/* Get CvmCtl register */
+	dmfc0	t0, $9, 7
+
+	/* CRC state */
+	RESTORE_COP2_REGISTER(COP2_CRC_IV)
+	RESTORE_COP2_REGISTER(COP2_CRC_LENGTH)
+	RESTORE_COP2_REGISTER(COP2_CRC_POLY)
+
+	/* if CvmCtl[NODFA_CP2] -> save_nodfa */
+	bbit1	t0, 28, restore_nodfa
+	nop
+
+	/* LLM state */
+	RESTORE_COP2_REGISTER(COP2_LLM_DAT0)
+	RESTORE_COP2_REGISTER(COP2_LLM_DAT1)
+
+restore_nodfa:
+	/* crypto stuff is irrelevant if CvmCtl[NOCRYPTO]  */
+	bbit1	t0, 26, restore_done
+	nop
+
+	RESTORE_COP2_REGISTER(COP2_3DES_IV)
+	RESTORE_COP2_REGISTER(COP2_3DES_KEY0)
+	RESTORE_COP2_REGISTER(COP2_3DES_KEY1)
+	RESTORE_COP2_REGISTER(COP2_3DES_KEY2)
+	RESTORE_COP2_REGISTER(COP2_3DES_RESULT)
+
+	RESTORE_COP2_REGISTER(COP2_AES_INP0)
+	RESTORE_COP2_REGISTER(COP2_AES_IV0)
+	RESTORE_COP2_REGISTER(COP2_AES_IV1)
+	RESTORE_COP2_REGISTER(COP2_AES_KEY0)
+	RESTORE_COP2_REGISTER(COP2_AES_KEY1)
+	RESTORE_COP2_REGISTER(COP2_AES_KEY2)
+	RESTORE_COP2_REGISTER(COP2_AES_KEY3)
+	RESTORE_COP2_REGISTER(COP2_AES_KEYLEN)
+	RESTORE_COP2_REGISTER(COP2_AES_RESULT0)
+	RESTORE_COP2_REGISTER(COP2_AES_RESULT1)
+
+	dmfc0	t0, $15
+	li	t1, 0x000d0000 /* Octeon Pass1 */
+	beq	t0, t1, restore_pass1
+	nop
+
+	RESTORE_COP2_REGISTER(COP2_HSH_DATW0)
+	RESTORE_COP2_REGISTER(COP2_HSH_DATW1)
+	RESTORE_COP2_REGISTER(COP2_HSH_DATW2)
+	RESTORE_COP2_REGISTER(COP2_HSH_DATW3)
+	RESTORE_COP2_REGISTER(COP2_HSH_DATW4)
+	RESTORE_COP2_REGISTER(COP2_HSH_DATW5)
+	RESTORE_COP2_REGISTER(COP2_HSH_DATW6)
+	RESTORE_COP2_REGISTER(COP2_HSH_DATW7)
+	RESTORE_COP2_REGISTER(COP2_HSH_DATW8)
+	RESTORE_COP2_REGISTER(COP2_HSH_DATW9)
+	RESTORE_COP2_REGISTER(COP2_HSH_DATW10)
+	RESTORE_COP2_REGISTER(COP2_HSH_DATW11)
+	RESTORE_COP2_REGISTER(COP2_HSH_DATW12)
+	RESTORE_COP2_REGISTER(COP2_HSH_DATW13)
+	RESTORE_COP2_REGISTER(COP2_HSH_DATW14)
+	RESTORE_COP2_REGISTER(COP2_HSH_IVW0)
+	RESTORE_COP2_REGISTER(COP2_HSH_IVW1)
+	RESTORE_COP2_REGISTER(COP2_HSH_IVW2)
+	RESTORE_COP2_REGISTER(COP2_HSH_IVW3)
+	RESTORE_COP2_REGISTER(COP2_HSH_IVW4)
+	RESTORE_COP2_REGISTER(COP2_HSH_IVW5)
+	RESTORE_COP2_REGISTER(COP2_HSH_IVW6)
+	RESTORE_COP2_REGISTER(COP2_HSH_IVW7)
+	RESTORE_COP2_REGISTER(COP2_GFM_MULT0)
+	RESTORE_COP2_REGISTER(COP2_GFM_MULT1)
+	RESTORE_COP2_REGISTER(COP2_GFM_POLY)
+	RESTORE_COP2_REGISTER(COP2_GFM_RESULT0)
+	RESTORE_COP2_REGISTER(COP2_GFM_RESULT1)
+	jr ra
+	nop
+
+restore_pass1:
+	RESTORE_COP2_REGISTER(COP2_HSH_DATW0_PASS1)
+	RESTORE_COP2_REGISTER(COP2_HSH_DATW1_PASS1)
+	RESTORE_COP2_REGISTER(COP2_HSH_DATW2_PASS1)
+	RESTORE_COP2_REGISTER(COP2_HSH_DATW3_PASS1)
+	RESTORE_COP2_REGISTER(COP2_HSH_DATW4_PASS1)
+	RESTORE_COP2_REGISTER(COP2_HSH_DATW5_PASS1)
+	RESTORE_COP2_REGISTER(COP2_HSH_DATW6_PASS1)
+	RESTORE_COP2_REGISTER(COP2_HSH_IVW0_PASS1)
+	RESTORE_COP2_REGISTER(COP2_HSH_IVW1_PASS1)
+	RESTORE_COP2_REGISTER(COP2_HSH_IVW2_PASS1)
+
+restore_done:	
+	jr ra
+	nop
+END(octeon_cop2_restore)

Added: head/sys/mips/cavium/octeon_cop2.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/mips/cavium/octeon_cop2.h	Fri Jan  6 01:23:26 2012	(r229677)
@@ -0,0 +1,210 @@
+/*-
+ * Copyright (c) 2011, Oleksandr Tymoshenko <gonzo@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice unmodified, this list of conditions, and the following
+ *    disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF 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$
+ *
+ */
+
+#ifndef __OCTEON_COP2_H__
+#define __OCTEON_COP2_H__
+
+/*
+ * COP2 registers of interest
+ */
+#define	COP2_CRC_IV		0x201
+#define	COP2_CRC_IV_SET		COP2_CRC_IV
+#define	COP2_CRC_LENGTH		0x202
+#define	COP2_CRC_LENGTH_SET	0x1202
+#define	COP2_CRC_POLY		0x200
+#define	COP2_CRC_POLY_SET	0x4200
+#define	COP2_LLM_DAT0		0x402
+#define	COP2_LLM_DAT0_SET	COP2_LLM_DAT0
+#define	COP2_LLM_DAT1		0x40A
+#define	COP2_LLM_DAT1_SET	COP2_LLM_DAT1
+#define	COP2_3DES_IV		0x084
+#define	COP2_3DES_IV_SET	COP2_3DES_IV
+#define	COP2_3DES_KEY0		0x080
+#define	COP2_3DES_KEY0_SET	COP2_3DES_KEY0
+#define	COP2_3DES_KEY1		0x081
+#define	COP2_3DES_KEY1_SET	COP2_3DES_KEY1
+#define	COP2_3DES_KEY2		0x082
+#define	COP2_3DES_KEY2_SET	COP2_3DES_KEY2
+#define	COP2_3DES_RESULT	0x088
+#define	COP2_3DES_RESULT_SET	0x098
+#define	COP2_AES_INP0		0x111
+#define	COP2_AES_INP0_SET	COP2_AES_INP0
+#define	COP2_AES_IV0		0x102
+#define	COP2_AES_IV0_SET	COP2_AES_IV0
+#define	COP2_AES_IV1		0x103
+#define	COP2_AES_IV1_SET	COP2_AES_IV1
+#define	COP2_AES_KEY0		0x104
+#define	COP2_AES_KEY0_SET	COP2_AES_KEY0
+#define	COP2_AES_KEY1		0x105
+#define	COP2_AES_KEY1_SET	COP2_AES_KEY1
+#define	COP2_AES_KEY2		0x106
+#define	COP2_AES_KEY2_SET	COP2_AES_KEY2
+#define	COP2_AES_KEY3		0x107
+#define	COP2_AES_KEY3_SET	COP2_AES_KEY3
+#define	COP2_AES_KEYLEN		0x110
+#define	COP2_AES_KEYLEN_SET	COP2_AES_KEYLEN
+#define	COP2_AES_RESULT0	0x100
+#define	COP2_AES_RESULT0_SET	COP2_AES_RESULT0
+#define	COP2_AES_RESULT1	0x101
+#define	COP2_AES_RESULT1_SET	COP2_AES_RESULT1
+#define	COP2_HSH_DATW0		0x240
+#define	COP2_HSH_DATW0_SET	COP2_HSH_DATW0
+#define	COP2_HSH_DATW1		0x241
+#define	COP2_HSH_DATW1_SET	COP2_HSH_DATW1
+#define	COP2_HSH_DATW2		0x242
+#define	COP2_HSH_DATW2_SET	COP2_HSH_DATW2
+#define	COP2_HSH_DATW3		0x243
+#define	COP2_HSH_DATW3_SET	COP2_HSH_DATW3
+#define	COP2_HSH_DATW4		0x244
+#define	COP2_HSH_DATW4_SET	COP2_HSH_DATW4
+#define	COP2_HSH_DATW5		0x245
+#define	COP2_HSH_DATW5_SET	COP2_HSH_DATW5
+#define	COP2_HSH_DATW6		0x246
+#define	COP2_HSH_DATW6_SET	COP2_HSH_DATW6
+#define	COP2_HSH_DATW7		0x247
+#define	COP2_HSH_DATW7_SET	COP2_HSH_DATW7
+#define	COP2_HSH_DATW8		0x248
+#define	COP2_HSH_DATW8_SET	COP2_HSH_DATW8
+#define	COP2_HSH_DATW9		0x249
+#define	COP2_HSH_DATW9_SET	COP2_HSH_DATW9
+#define	COP2_HSH_DATW10		0x24A
+#define	COP2_HSH_DATW10_SET	COP2_HSH_DATW10
+#define	COP2_HSH_DATW11		0x24B
+#define	COP2_HSH_DATW11_SET	COP2_HSH_DATW11
+#define	COP2_HSH_DATW12		0x24C
+#define	COP2_HSH_DATW12_SET	COP2_HSH_DATW12
+#define	COP2_HSH_DATW13		0x24D
+#define	COP2_HSH_DATW13_SET	COP2_HSH_DATW13
+#define	COP2_HSH_DATW14		0x24E
+#define	COP2_HSH_DATW14_SET	COP2_HSH_DATW14
+#define	COP2_HSH_IVW0		0x250
+#define	COP2_HSH_IVW0_SET	COP2_HSH_IVW0
+#define	COP2_HSH_IVW1		0x251
+#define	COP2_HSH_IVW1_SET	COP2_HSH_IVW1
+#define	COP2_HSH_IVW2		0x252
+#define	COP2_HSH_IVW2_SET	COP2_HSH_IVW2
+#define	COP2_HSH_IVW3		0x253
+#define	COP2_HSH_IVW3_SET	COP2_HSH_IVW3
+#define	COP2_HSH_IVW4		0x254
+#define	COP2_HSH_IVW4_SET	COP2_HSH_IVW4
+#define	COP2_HSH_IVW5		0x255
+#define	COP2_HSH_IVW5_SET	COP2_HSH_IVW5
+#define	COP2_HSH_IVW6		0x256
+#define	COP2_HSH_IVW6_SET	COP2_HSH_IVW6
+#define	COP2_HSH_IVW7		0x257
+#define	COP2_HSH_IVW7_SET	COP2_HSH_IVW7
+#define	COP2_GFM_MULT0		0x258
+#define	COP2_GFM_MULT0_SET	COP2_GFM_MULT0
+#define	COP2_GFM_MULT1		0x259
+#define	COP2_GFM_MULT1_SET	COP2_GFM_MULT1
+#define	COP2_GFM_POLY		0x25E
+#define	COP2_GFM_POLY_SET	COP2_GFM_POLY
+#define	COP2_GFM_RESULT0	0x25A
+#define	COP2_GFM_RESULT0_SET	COP2_GFM_RESULT0
+#define	COP2_GFM_RESULT1	0x25B
+#define	COP2_GFM_RESULT1_SET	COP2_GFM_RESULT1
+#define	COP2_HSH_DATW0_PASS1	0x040
+#define	COP2_HSH_DATW0_PASS1_SET	COP2_HSH_DATW0_PASS1
+#define	COP2_HSH_DATW1_PASS1	0x041
+#define	COP2_HSH_DATW1_PASS1_SET	COP2_HSH_DATW1_PASS1
+#define	COP2_HSH_DATW2_PASS1	0x042
+#define	COP2_HSH_DATW2_PASS1_SET	COP2_HSH_DATW2_PASS1
+#define	COP2_HSH_DATW3_PASS1	0x043
+#define	COP2_HSH_DATW3_PASS1_SET	COP2_HSH_DATW3_PASS1
+#define	COP2_HSH_DATW4_PASS1	0x044
+#define	COP2_HSH_DATW4_PASS1_SET	COP2_HSH_DATW4_PASS1
+#define	COP2_HSH_DATW5_PASS1	0x045
+#define	COP2_HSH_DATW5_PASS1_SET	COP2_HSH_DATW5_PASS1
+#define	COP2_HSH_DATW6_PASS1	0x046
+#define	COP2_HSH_DATW6_PASS1_SET	COP2_HSH_DATW6_PASS1
+#define	COP2_HSH_IVW0_PASS1	0x048
+#define	COP2_HSH_IVW0_PASS1_SET	COP2_HSH_IVW0_PASS1
+#define	COP2_HSH_IVW1_PASS1	0x049
+#define	COP2_HSH_IVW1_PASS1_SET	COP2_HSH_IVW1_PASS1
+#define	COP2_HSH_IVW2_PASS1	0x04A
+#define	COP2_HSH_IVW2_PASS1_SET	COP2_HSH_IVW2_PASS1
+
+#ifndef LOCORE
+
+struct octeon_cop2_state {
+	/* 3DES */
+        /* 0x0084 */
+        unsigned long   _3des_iv;
+        /* 0x0080..0x0082 */
+        unsigned long   _3des_key[3];
+        /* 0x0088, set: 0x0098 */
+        unsigned long   _3des_result;
+
+	/* AES */
+        /* 0x0111 */
+        unsigned long   aes_inp0;
+        /* 0x0102..0x0103 */
+        unsigned long   aes_iv[2];
+        /* 0x0104..0x0107 */
+        unsigned long   aes_key[4];
+        /* 0x0110 */
+        unsigned long   aes_keylen;
+        /* 0x0100..0x0101 */
+        unsigned long   aes_result[2];
+
+	/* CRC */
+        /*  0x0201 */
+        unsigned long   crc_iv;
+        /* 0x0202, set: 0x1202 */
+        unsigned long   crc_length;
+        /* 0x0200, set: 0x4200 */
+        unsigned long   crc_poly;
+
+	/* Low-latency memory stuff */
+        /* 0x0402, 0x040A */
+        unsigned long   llm_dat[2];
+
+	/* SHA & MD5 */
+        /* 0x0240..0x024E */
+        unsigned long   hsh_datw[15];
+        /* 0x0250..0x0257 */
+        unsigned long   hsh_ivw[8];
+
+	/* GFM */
+        /*  0x0258..0x0259 */
+        unsigned long   gfm_mult[2];
+        /* 0x025E */
+        unsigned long   gfm_poly;
+        /* 0x025A..0x025B */
+        unsigned long   gfm_result[2];
+};
+
+/* Prototypes */
+
+void octeon_cop2_save(struct octeon_cop2_state *);
+void octeon_cop2_restore(struct octeon_cop2_state *);
+
+#endif /* LOCORE */
+#endif /* __OCTEON_COP2_H__ */

Modified: head/sys/mips/include/cpuregs.h
==============================================================================
--- head/sys/mips/include/cpuregs.h	Fri Jan  6 01:20:48 2012	(r229676)
+++ head/sys/mips/include/cpuregs.h	Fri Jan  6 01:23:26 2012	(r229677)
@@ -233,6 +233,7 @@
 #define	MIPS3_CR_EXC_CODE	0x0000007C	/* five bits */
 #define	MIPS_CR_IP		0x0000FF00
 #define	MIPS_CR_EXC_CODE_SHIFT	2
+#define	MIPS_CR_COP_ERR_SHIFT	28
 
 /*
  * The bits in the status register.  All bits are active when set to 1.

Modified: head/sys/mips/include/frame.h
==============================================================================
--- head/sys/mips/include/frame.h	Fri Jan  6 01:20:48 2012	(r229676)
+++ head/sys/mips/include/frame.h	Fri Jan  6 01:23:26 2012	(r229677)
@@ -122,11 +122,6 @@ struct trapframe {
 	f_register_t	f31;
 	register_t	fsr;
         register_t   fdummy;
-	/*
-	 * COP2 registers may need to be saved here based on the CPU, and those
-	 * might need to be per process, or even for the kernel, so we need
-	 * some thought here.
-	 */
 };
 
 /* REVISIT */

Added: head/sys/mips/include/octeon_cop2.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/mips/include/octeon_cop2.h	Fri Jan  6 01:23:26 2012	(r229677)
@@ -0,0 +1,215 @@
+/*-
+ * Copyright (c) 2011, Oleksandr Tymoshenko <gonzo@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice unmodified, this list of conditions, and the following
+ *    disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF 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$
+ *

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201201060123.q061NQoM065373>