summaryrefslogtreecommitdiffstats
path: root/sys/crypto/via/padlock_hash.c
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2010-11-26 14:35:20 +0000
committerkib <kib@FreeBSD.org>2010-11-26 14:35:20 +0000
commitb2984c404f1844039344b6aa018d21ed4ee9d388 (patch)
tree3cada752f4ff050d46fb92b050a75e4c7dcdb757 /sys/crypto/via/padlock_hash.c
parentfcb29e8cf319437f0df38186db6b3659c43f441d (diff)
downloadFreeBSD-src-b2984c404f1844039344b6aa018d21ed4ee9d388.zip
FreeBSD-src-b2984c404f1844039344b6aa018d21ed4ee9d388.tar.gz
MFaesni r215427:
Only save FPU context when not executing in the context of the crypto thread. Tested by: Mike Tancsa MFC after: 1 week
Diffstat (limited to 'sys/crypto/via/padlock_hash.c')
-rw-r--r--sys/crypto/via/padlock_hash.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/sys/crypto/via/padlock_hash.c b/sys/crypto/via/padlock_hash.c
index 58c58b2..0fe182b 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);
}
OpenPOWER on IntegriCloud