aboutsummaryrefslogtreecommitdiff
path: root/sys/crypto/via
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2010-11-26 14:35:20 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2010-11-26 14:35:20 +0000
commit3e07b6217f345672c7c38407f974d514317f870d (patch)
tree3cada752f4ff050d46fb92b050a75e4c7dcdb757 /sys/crypto/via
parentd7e6be692496522b468be4f103684d71eac0740a (diff)
downloadsrc-3e07b6217f345672c7c38407f974d514317f870d.tar.gz
src-3e07b6217f345672c7c38407f974d514317f870d.zip
MFaesni r215427:
Only save FPU context when not executing in the context of the crypto thread. Tested by: Mike Tancsa MFC after: 1 week
Notes
Notes: svn path=/head/; revision=215864
Diffstat (limited to 'sys/crypto/via')
-rw-r--r--sys/crypto/via/padlock.c14
-rw-r--r--sys/crypto/via/padlock_cipher.c13
-rw-r--r--sys/crypto/via/padlock_hash.c13
3 files changed, 31 insertions, 9 deletions
diff --git a/sys/crypto/via/padlock.c b/sys/crypto/via/padlock.c
index 77e059bf1eb2..ba630937ae28 100644
--- a/sys/crypto/via/padlock.c
+++ b/sys/crypto/via/padlock.c
@@ -170,7 +170,7 @@ padlock_newsession(device_t dev, uint32_t *sidp, struct cryptoini *cri)
struct padlock_session *ses = NULL;
struct cryptoini *encini, *macini;
struct thread *td;
- int error;
+ int error, saved_ctx;
if (sidp == NULL || cri == NULL)
return (EINVAL);
@@ -238,10 +238,18 @@ padlock_newsession(device_t dev, uint32_t *sidp, struct cryptoini *cri)
if (macini != NULL) {
td = curthread;
- error = fpu_kern_enter(td, &ses->ses_fpu_ctx, FPU_KERN_NORMAL);
+ if (!is_fpu_kern_thread(0)) {
+ error = fpu_kern_enter(td, &ses->ses_fpu_ctx,
+ FPU_KERN_NORMAL);
+ saved_ctx = 1;
+ } else {
+ error = 0;
+ saved_ctx = 0;
+ }
if (error == 0) {
error = padlock_hash_setup(ses, macini);
- fpu_kern_leave(td, &ses->ses_fpu_ctx);
+ if (saved_ctx)
+ fpu_kern_leave(td, &ses->ses_fpu_ctx);
}
if (error != 0) {
padlock_freesession_one(sc, ses, 0);
diff --git a/sys/crypto/via/padlock_cipher.c b/sys/crypto/via/padlock_cipher.c
index 0ae26c8a6985..1456ddfa46c7 100644
--- a/sys/crypto/via/padlock_cipher.c
+++ b/sys/crypto/via/padlock_cipher.c
@@ -205,7 +205,7 @@ padlock_cipher_process(struct padlock_session *ses, struct cryptodesc *enccrd,
struct thread *td;
u_char *buf, *abuf;
uint32_t *key;
- int allocated, error;
+ int allocated, error, saved_ctx;
buf = padlock_cipher_alloc(enccrd, crp, &allocated);
if (buf == NULL)
@@ -250,14 +250,21 @@ padlock_cipher_process(struct padlock_session *ses, struct cryptodesc *enccrd,
}
td = curthread;
- error = fpu_kern_enter(td, &ses->ses_fpu_ctx, FPU_KERN_NORMAL);
+ if (!is_fpu_kern_thread(0)) {
+ error = fpu_kern_enter(td, &ses->ses_fpu_ctx, FPU_KERN_NORMAL);
+ saved_ctx = 1;
+ } else {
+ error = 0;
+ saved_ctx = 0;
+ }
if (error != 0)
goto out;
padlock_cbc(abuf, abuf, enccrd->crd_len / AES_BLOCK_LEN, key, cw,
ses->ses_iv);
- fpu_kern_leave(td, &ses->ses_fpu_ctx);
+ if (saved_ctx)
+ fpu_kern_leave(td, &ses->ses_fpu_ctx);
if (allocated) {
crypto_copyback(crp->crp_flags, crp->crp_buf, enccrd->crd_skip,
diff --git a/sys/crypto/via/padlock_hash.c b/sys/crypto/via/padlock_hash.c
index 58c58b2243fc..0fe182b4b57b 100644
--- a/sys/crypto/via/padlock_hash.c
+++ b/sys/crypto/via/padlock_hash.c
@@ -366,17 +366,24 @@ padlock_hash_process(struct padlock_session *ses, struct cryptodesc *maccrd,
struct cryptop *crp)
{
struct thread *td;
- int error;
+ int error, saved_ctx;
td = curthread;
- error = fpu_kern_enter(td, &ses->ses_fpu_ctx, FPU_KERN_NORMAL);
+ if (!is_fpu_kern_thread(0)) {
+ error = fpu_kern_enter(td, &ses->ses_fpu_ctx, FPU_KERN_NORMAL);
+ saved_ctx = 1;
+ } else {
+ error = 0;
+ saved_ctx = 0;
+ }
if (error != 0)
return (error);
if ((maccrd->crd_flags & CRD_F_KEY_EXPLICIT) != 0)
padlock_hash_key_setup(ses, maccrd->crd_key, maccrd->crd_klen);
error = padlock_authcompute(ses, maccrd, crp->crp_buf, crp->crp_flags);
- fpu_kern_leave(td, &ses->ses_fpu_ctx);
+ if (saved_ctx)
+ fpu_kern_leave(td, &ses->ses_fpu_ctx);
return (error);
}